Index: extras/lcd/examples/README =================================================================== --- extras/lcd/examples/README (revision 2626) +++ extras/lcd/examples/README (revision 2627) @@ -9,10 +9,10 @@ Building The Makefile in this directory is for the top level packager. So -to "build" the project, do this: +to "build" lcd_mod.cod`, do this: -$ gpasm lcd_mod.asm +$ make -f makefile This should assemble with no errors. Index: extras/lcd/examples/makefile =================================================================== --- extras/lcd/examples/makefile (nonexistent) +++ extras/lcd/examples/makefile (revision 2627) @@ -0,0 +1,16 @@ + +all : lcd_mod.cod + +ifdef EXTENDED_INSTRUCTIONS + ASM_FLAGS = -c --extended +else + ASM_FLAGS = -c +endif + + +%.o : %.asm + gpasm $(ASM_FLAGS) $< + +%.cod : %.o + gplink --map -q -o $@ $< + Index: extras/lcd/lcd.h =================================================================== --- extras/lcd/lcd.h (revision 2626) +++ extras/lcd/lcd.h (revision 2627) @@ -60,6 +60,7 @@ typedef char _5X7 [7][6]; typedef char _5X8 [8][6]; +struct raw_font { _5X8 C_5X8;}; class LcdFont { public: Index: extras/lcd/lcdfont.h =================================================================== --- extras/lcd/lcdfont.h (revision 2626) +++ extras/lcd/lcdfont.h (revision 2627) @@ -1,5 +1,5 @@ #define FONT_LEN 256 -_5X8 test[FONT_LEN] = { +raw_font font_list[FONT_LEN] = { { /* 0 */ " ", " ", Index: extras/lcd/lcdgui.cc =================================================================== --- extras/lcd/lcdgui.cc (revision 2626) +++ extras/lcd/lcdgui.cc (revision 2627) @@ -31,29 +31,32 @@ cairo_surface_t *LcdFont::create_image(LcdDisplay *lcdP, _5X8 *ch) { - int rows = 6 + lcdP->dots.y * lcdP->pixels.y; - int cols = 1 + lcdP->dots.x * lcdP->pixels.x; - cairo_surface_t *image = gdk_window_create_similar_surface(mywindow, - CAIRO_CONTENT_COLOR_ALPHA, cols, rows); - cairo_t *cr = cairo_create(image); - cairo_set_line_width(cr, 0.5); + int rows = 6 + lcdP->dots.y * lcdP->pixels.y; + int cols = 1 + lcdP->dots.x * lcdP->pixels.x; + cairo_surface_t *image = gdk_window_create_similar_surface(mywindow, + CAIRO_CONTENT_COLOR_ALPHA, cols, rows); + cairo_t *cr = cairo_create(image); + cairo_set_line_width(cr, 0.5); - for (int j = 0; j < lcdP->dots.y; j++) { - for (int i = 0; i < lcdP->dots.x; i++) { - if (ch[0][j][i] == '.') { - double y = 5 + lcdP->pixels.y * j; - double x = i * lcdP->pixels.x; - cairo_set_source_rgb(cr, double(0x11) / 255, double(0x33) / 255, double(0x11) / 255); - cairo_rectangle(cr, x, y, lcdP->pixels.x, lcdP->pixels.y); - cairo_fill_preserve(cr); - cairo_set_source_rgb(cr, double(0x66) / 255, double(0x88) / 255, double(0x66) / 255); - cairo_stroke(cr); - } + for (int j = 0; j < lcdP->dots.y; j++) + { + for (int i = 0; i < lcdP->dots.x; i++) + { + if (ch[0][j][i] == '.') + { + double y = 5 + lcdP->pixels.y * j; + double x = i * lcdP->pixels.x; + cairo_set_source_rgb(cr, double(0x11) / 255, double(0x33) / 255, double(0x11) / 255); + cairo_rectangle(cr, x, y, lcdP->pixels.x, lcdP->pixels.y); + cairo_fill_preserve(cr); + cairo_set_source_rgb(cr, double(0x66) / 255, double(0x88) / 255, double(0x66) / 255); + cairo_stroke(cr); + } + } } - } - cairo_destroy(cr); - return image; + cairo_destroy(cr); + return image; } @@ -66,147 +69,169 @@ LcdFont::LcdFont(gint characters, GtkWidget *parent_window, LcdDisplay *lcdP) { - pixmaps.reserve(characters); - mywindow = gtk_widget_get_window(parent_window); + pixmaps.reserve(characters); + mywindow = gtk_widget_get_window(parent_window); - for (gint i = 0; i < characters; i++) { - if (strlen(test[i][0]) < 5) { - pixmaps.push_back(nullptr); + for (gint i = 0; i < characters; i++) + { + if (strlen(font_list[i].C_5X8[0]) < 5) + { + pixmaps.push_back(nullptr); - } else { - pixmaps.push_back(create_image(lcdP, &test[i])); + } + else + { + pixmaps.push_back(create_image(lcdP, &font_list[i].C_5X8)); + } } - } } LcdFont::~LcdFont() { - for (size_t i = 0; i < pixmaps.size(); ++i) { - if (pixmaps[i]) { - cairo_surface_destroy(pixmaps[i]); + for (size_t i = 0; i < pixmaps.size(); ++i) + { + if (pixmaps[i]) + { + cairo_surface_destroy(pixmaps[i]); + } } - } } void LcdFont::update_pixmap(int pos, _5X8 *tempchar, LcdDisplay *lcdP) { - if (pixmaps[pos]) { - cairo_surface_destroy(pixmaps[pos]); - pixmaps[pos] = nullptr; - } + if (pixmaps[pos]) + { + cairo_surface_destroy(pixmaps[pos]); + pixmaps[pos] = nullptr; + } - pixmaps[pos] = create_image(lcdP, tempchar); + pixmaps[pos] = create_image(lcdP, tempchar); } cairo_surface_t *LcdFont::getPixMap(unsigned int index) { - return ((index < pixmaps.size()) && pixmaps[index]) ? pixmaps[index] : pixmaps[0]; + return ((index < pixmaps.size()) && pixmaps[index]) ? pixmaps[index] : pixmaps[0]; } void LcdDisplay::update_cgram_pixmaps() { - int i, j, k; - _5X8 tempchar; + int i, j, k; + _5X8 tempchar; - if (fontP == nullptr) { - return; - } + if (fontP == nullptr) + { + return; + } - for (i = 0; i < CGRAM_SIZE / 8; i++) { - for (j = 0; j < 8; j++) { - for (k = 0; k < 5; k++) { - if (m_hd44780->getCGRam(8 * i + j) & (1 << (4 - k))) { - tempchar[j][k] = '.'; + for (i = 0; i < CGRAM_SIZE / 8; i++) + { + for (j = 0; j < 8; j++) + { + for (k = 0; k < 5; k++) + { + if (m_hd44780->getCGRam(8 * i + j) & (1 << (4 - k))) + { + tempchar[j][k] = '.'; - } else { - tempchar[j][k] = ' '; + } + else + { + tempchar[j][k] = ' '; + } + } + + tempchar[j][5] = 0; } - } - tempchar[j][5] = 0; + fontP->update_pixmap(i, &tempchar, this); + fontP->update_pixmap(i + 8, &tempchar, this); } - fontP->update_pixmap(i, &tempchar, this); - fontP->update_pixmap(i + 8, &tempchar, this); - } - - m_hd44780->setCGRamupdate(false); + m_hd44780->setCGRamupdate(false); } cairo_surface_t *LcdDisplay::get_pixmap(gint row, gint col) { - if (m_hd44780->CGRamupdate()) { - update_cgram_pixmaps(); - } + if (m_hd44780->CGRamupdate()) + { + update_cgram_pixmaps(); + } - return fontP ? fontP->getPixMap(m_hd44780->getDDRam(row, col)) : nullptr; + return fontP ? fontP->getPixMap(m_hd44780->getDDRam(row, col)) : nullptr; } -static gboolean lcd_expose_event(GtkWidget *widget, GdkEvent * , gpointer user_data) +static gboolean lcd_expose_event(GtkWidget *widget, GdkEvent *, gpointer user_data) { - LcdDisplay *lcdP = static_cast(user_data); - // If there is no font, then go create it. + LcdDisplay *lcdP = static_cast(user_data); + // If there is no font, then go create it. - if (!lcdP->fontP) { - lcdP->fontP = new LcdFont(FONT_LEN, widget, lcdP); - } + if (!lcdP->fontP) + { + lcdP->fontP = new LcdFont(FONT_LEN, widget, lcdP); + } - GtkAllocation allocation; - gtk_widget_get_allocation(widget, &allocation); - lcdP->w_width = allocation.width; - lcdP->w_height = allocation.height; - cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(widget)); - lcdP->update(cr); - cairo_destroy(cr); - return FALSE; + GtkAllocation allocation; + gtk_widget_get_allocation(widget, &allocation); + lcdP->w_width = allocation.width; + lcdP->w_height = allocation.height; + cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(widget)); + lcdP->update(cr); + cairo_destroy(cr); + return FALSE; } void LcdDisplay::update(cairo_t *cr) { - guint i, j; - cairo_set_source_rgb(cr, - double(0x78) / 255, double(0xa8) / 255, double(0x78) / 255); - cairo_rectangle(cr, 0.0, 0.0, w_width, w_height); - cairo_fill(cr); - gint cw = get_char_width(); - gint ch = get_char_height(); - gint border = get_border(); + guint i, j; + cairo_set_source_rgb(cr, + double(0x78) / 255, double(0xa8) / 255, double(0x78) / 255); + cairo_rectangle(cr, 0.0, 0.0, w_width, w_height); + cairo_fill(cr); + gint cw = get_char_width(); + gint ch = get_char_height(); + gint border = get_border(); - if (!(disp_type & TWO_ROWS_IN_ONE)) { - for (j = 0; j < rows; j++) - for (i = 0; i < cols; i++) { - cairo_set_source_surface(cr, get_pixmap(j, i), border + i * cw, border + j * (ch)); - cairo_paint(cr); - } + if (!(disp_type & TWO_ROWS_IN_ONE)) + { + for (j = 0; j < rows; j++) + for (i = 0; i < cols; i++) + { + cairo_set_source_surface(cr, get_pixmap(j, i), border + i * cw, border + j * (ch)); + cairo_paint(cr); + } - } else { - guint pos; + } + else + { + guint pos; - for (pos = 0, j = 0; j < rows; j++) - for (i = 0; i < cols; pos++, i++) { - cairo_set_source_surface(cr, get_pixmap(j, i), border + pos * cw, border); - cairo_paint(cr); - } - } + for (pos = 0, j = 0; j < rows; j++) + for (i = 0; i < cols; pos++, i++) + { + cairo_set_source_surface(cr, get_pixmap(j, i), border + pos * cw, border); + cairo_paint(cr); + } + } } -static gint cursor_event(GtkWidget * , GdkEvent *event, gpointer * ) +static gint cursor_event(GtkWidget *, GdkEvent *event, gpointer * ) { - if ((event->type == GDK_BUTTON_PRESS) && - ((event->button.button == 1) || - (event->button.button == 3))) { - return TRUE; - } + if ((event->type == GDK_BUTTON_PRESS) && + ((event->button.button == 1) || + (event->button.button == 3))) + { + return TRUE; + } - return FALSE; + return FALSE; } @@ -217,63 +242,68 @@ void LcdDisplay::CreateGraphics() { - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - if (window) { - char title[128]; - g_snprintf(title, sizeof(title), "%d X %d", rows, cols); + if (window) + { + char title[128]; + g_snprintf(title, sizeof(title), "%d X %d", rows, cols); - if (disp_type & TWO_ROWS_IN_ONE) { - g_strlcat(title, " (in one row)", sizeof(title)); - } + if (disp_type & TWO_ROWS_IN_ONE) + { + g_strlcat(title, " (in one row)", sizeof(title)); + } - gtk_widget_realize(window); - gtk_window_set_title(GTK_WINDOW(window), "LCD"); - GtkWidget *main_vbox = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 0); - gtk_container_add(GTK_CONTAINER(window), main_vbox); - GtkWidget *vbox = - gtk_widget_new(gtk_vbox_get_type(), - "GtkBox::homogeneous", FALSE, - //"GtkBox::spacing", 5, - //"GtkContainer::border_width", 10, - "GtkWidget::parent", main_vbox, - "GtkWidget::visible", TRUE, - nullptr); - GtkWidget *frame = - gtk_widget_new(gtk_frame_get_type(), - "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN, - "GtkFrame::label_xalign", 0.5, - "GtkFrame::label", title, - //"GtkContainer::border_width", 10, - "GtkWidget::parent", vbox, - "GtkWidget::visible", TRUE, - nullptr); - darea = gtk_drawing_area_new(); + gtk_widget_realize(window); + gtk_window_set_title(GTK_WINDOW(window), "LCD"); + GtkWidget *main_vbox = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 0); + gtk_container_add(GTK_CONTAINER(window), main_vbox); + GtkWidget *vbox = + gtk_widget_new(gtk_vbox_get_type(), + "GtkBox::homogeneous", FALSE, + //"GtkBox::spacing", 5, + //"GtkContainer::border_width", 10, + "GtkWidget::parent", main_vbox, + "GtkWidget::visible", TRUE, + nullptr); + GtkWidget *frame = + gtk_widget_new(gtk_frame_get_type(), + "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN, + "GtkFrame::label_xalign", 0.5, + "GtkFrame::label", title, + //"GtkContainer::border_width", 10, + "GtkWidget::parent", vbox, + "GtkWidget::visible", TRUE, + nullptr); + darea = gtk_drawing_area_new(); - if (!(disp_type & TWO_ROWS_IN_ONE)) { - gtk_widget_set_size_request(darea, - cols * get_char_width() + 2 * get_border(), - rows * (get_char_height() + get_border()) + get_border()); + if (!(disp_type & TWO_ROWS_IN_ONE)) + { + gtk_widget_set_size_request(darea, + cols * get_char_width() + 2 * get_border(), + rows * (get_char_height() + get_border()) + get_border()); - } else { - gtk_widget_set_size_request(darea, - rows * cols * get_char_width() + 2 * get_border(), - get_char_height() + 2 * get_border()); + } + else + { + gtk_widget_set_size_request(darea, + rows * cols * get_char_width() + 2 * get_border(), + get_char_height() + 2 * get_border()); + } + + gtk_container_add(GTK_CONTAINER(frame), darea); + g_signal_connect(darea, + "expose_event", + G_CALLBACK(lcd_expose_event), + this); + gtk_widget_add_events(darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); + g_signal_connect(darea, + "button_press_event", + G_CALLBACK(cursor_event), + nullptr); + gtk_widget_show_all(window); } - - gtk_container_add(GTK_CONTAINER(frame), darea); - g_signal_connect(darea, - "expose_event", - G_CALLBACK(lcd_expose_event), - this); - gtk_widget_add_events(darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); - g_signal_connect(darea, - "button_press_event", - G_CALLBACK(cursor_event), - nullptr); - gtk_widget_show_all(window); - } } #endif //HAVE_GUI