// Showing the record screen void showRecordScreen(void){ char lengthStr[4], totLenTimeStr[9], curLenTimeStr[9]; itoa(currentLength, lengthStr, 10); timeToString(totLenTime, totLenTimeStr); timeToString(curLenTime, curLenTimeStr); u8g_FirstPage(&u8g); u8g_SetDefaultForegroundColor(&u8g); u8g_SetFont(&u8g, u8g_font_6x13); do{ // Draw boxes u8g_DrawLine(&u8g, 64, 0, 64, 64); u8g_DrawLine(&u8g, 64, 32, 128, 32); // Draw text u8g_DrawFrame(&u8g, 0, 0, 128, 64); u8g_DrawStr(&u8g, (64 - u8g_GetStrWidth(&u8g, "Length"))/2, 5, "Length"); u8g_DrawStr(&u8g, (64 - u8g_GetStrWidth(&u8g, lengthStr))/2, 32+5, lengthStr); u8g_DrawStr(&u8g, 64+(64 - u8g_GetStrWidth(&u8g, "Total"))/2, 5, "Total"); u8g_DrawStr(&u8g, 64+(64 - u8g_GetStrWidth(&u8g, totLenTimeStr))/2, 5+15, totLenTimeStr); u8g_DrawStr(&u8g, 64+(64 - u8g_GetStrWidth(&u8g, "Last len"))/2, 5+32, "Last len"); //u8g_DrawStr(&u8g, 64+(64 - u8g_GetStrWidth(&u8g, timeToString(lastLengthTime, rS)))/2, 5+32+15, timeToString(lastLengthTime, rS)); } while (u8g_NextPage(&u8g)); }
void showHistoryTotal(void){ EEOpen(); uint8_t lengths = EEReadByte(2); history.totalLength = lengths; history.showLength = 255; // This will be wrong till I update the record length uint16_t totalTime = EEReadByte(3) << 8; totalTime += EEReadByte(4); // Creating the times for the history display char lengthStr[4], totalTimeStr[10]; itoa(lengths, lengthStr, 10); timeToString(totalTime, totalTimeStr); u8g_FirstPage(&u8g); u8g_SetDefaultForegroundColor(&u8g); do { u8g_DrawFrame(&u8g, 0, 0, 128, 64); u8g_DrawLine(&u8g, 64, 0, 64, 64); u8g_DrawStr(&u8g, (64 - u8g_GetStrWidth(&u8g, "Lengths"))/2, 5, "Lengths"); u8g_DrawStr(&u8g, (64 - u8g_GetStrWidth(&u8g, lengthStr))/2, 5+20, lengthStr); u8g_DrawStr(&u8g, 64+(64 - u8g_GetStrWidth(&u8g, "Time"))/2, 5, "Time"); u8g_DrawStr(&u8g, 64+(64 - u8g_GetStrWidth(&u8g, totalTimeStr))/2, 5+20, totalTimeStr); } while (u8g_NextPage(&u8g)); }
void drawMainMenu(uint8_t menuPosition){ char *mainMenuStrings[MAIN_MENU_ITEMS] = {"Last swim", "New Swim"}; uint8_t i, h; u8g_uint_t w, d; u8g_SetFont(&u8g, u8g_font_6x13); u8g_SetFontRefHeightText(&u8g); u8g_SetFontPosTop(&u8g); h = u8g_GetFontAscent(&u8g) - u8g_GetFontDescent(&u8g); w = u8g_GetWidth(&u8g); char vccChar[10]; my_itoa(vcc, vccChar, 10); // Doing the actual drawing u8g_FirstPage(&u8g); do{ for (i = 0; i < MAIN_MENU_ITEMS; i++){ d = (w - u8g_GetStrWidth(&u8g, mainMenuStrings[i])) / 2; u8g_SetDefaultForegroundColor(&u8g); if (i == menuPosition){ u8g_DrawBox(&u8g, 0, i*h+1, w, h); u8g_SetDefaultBackgroundColor(&u8g); } u8g_DrawStr(&u8g, d, i*h, mainMenuStrings[i]); } u8g_SetDefaultForegroundColor(&u8g); u8g_DrawFrame(&u8g, 0, 0, 128, 64); u8g_DrawStr(&u8g, 5, 50, vccChar); } while (u8g_NextPage(&u8g)); }
uint8_t m2_u8g_get_font_icon_width(uint8_t font, uint8_t icon) { char s[2]; s[1] = '\0'; if ( icon == M2_ICON_TOGGLE_ACTIVE || icon == M2_ICON_TOGGLE_INACTIVE ) { s[0] = m2_u8g_toggle_active; u8g_SetFont(m2_u8g, m2_u8g_toggle_icon_font); return u8g_GetStrWidth(m2_u8g, s); } if ( icon == M2_ICON_RADIO_ACTIVE || icon == M2_ICON_RADIO_INACTIVE ) { s[0] = m2_u8g_radio_active; u8g_SetFont(m2_u8g, m2_u8g_radio_icon_font); return u8g_GetStrWidth(m2_u8g, s); } return 0; }
void showLength(void){ uint8_t curTime = EEReadByte(5+history.showLength); char lengthStr[4], timeStr[9]; itoa(history.showLength+1, lengthStr, 10); timeToString(curTime, timeStr); u8g_FirstPage(&u8g); u8g_SetDefaultForegroundColor(&u8g); do { u8g_DrawFrame(&u8g, 0, 0, 128, 64); u8g_DrawLine(&u8g, 64, 0, 64, 64); u8g_DrawStr(&u8g, (64 - u8g_GetStrWidth(&u8g, "Length"))/2, 5, "Length"); u8g_DrawStr(&u8g, (64 - u8g_GetStrWidth(&u8g, lengthStr))/2, 5+20, lengthStr); u8g_DrawStr(&u8g, 64+(64 - u8g_GetStrWidth(&u8g, "Time"))/2, 5, "Time"); u8g_DrawStr(&u8g, 64+(64 - u8g_GetStrWidth(&u8g, timeStr))/2, 5+20, timeStr); } while (u8g_NextPage(&u8g)); }
void menu_draw(menu_t *menu, u8g_t *u8g) { uint8_t i, h; static char ramstr[32]; menu_buttons_t *b; u8g_uint_t w, d; if(!menu) return; // Calculate text size u8g_SetFont(u8g, u8g_font_5x7); u8g_SetFontRefHeightText(u8g); u8g_SetFontPosTop(u8g); h = u8g_GetFontAscent(u8g)-u8g_GetFontDescent(u8g); w = u8g_GetWidth(u8g); for( i = 0;; i++ ) { // draw all menu items // Copy string from program memory to a work string in RAM strncpy_P(ramstr, (PGM_P)pgm_read_word(&(menu->strings[i])), sizeof(ramstr)); ramstr[31] = 0; // Zero length string marks end of string list. if(!ramstr[0]) break; // Get its length in pixels d = (w-u8g_GetStrWidth(u8g, ramstr))/2; // Set foreground color u8g_SetDefaultForegroundColor(u8g); // If item selected if ( i == menu->selected ) { // current selected menu item u8g_DrawBox(u8g, 0, i*h+1, w, h); // draw cursor bar u8g_SetDefaultBackgroundColor(u8g); } // Display the string u8g_DrawStr(u8g, d, i*h, ramstr); } // Remember menu item count menu->item_count = i; // Ensure text and background are set back to normal u8g_SetDefaultForegroundColor(u8g); // If there are soft buttons, draw them here if(menu->buttons){ for(b = menu->buttons; b; b = b->next){ strncpy_P(ramstr, b->label, sizeof(ramstr)); ramstr[31] = 0; u8g_DrawStr(u8g, b->col, b->row, ramstr); } } }
void showChargingScreen(void){ char vccChar[10]; my_itoa(vcc, vccChar, 10); u8g_FirstPage(&u8g); u8g_SetDefaultForegroundColor(&u8g); do { u8g_DrawFrame(&u8g, 0, 0, 128, 64); // Show the first length u8g_DrawStr(&u8g, (124 - u8g_GetStrWidth(&u8g, "Charging"))/2, 5, "Charging"); u8g_DrawStr(&u8g, 60, 20, vccChar); } while (u8g_NextPage(&u8g)); }
// Lua: width = u8g.getStrWidth( self, string ) static int lu8g_getStrWidth( lua_State *L ) { lu8g_userdata_t *lud; if ((lud = get_lud( L )) == NULL) return 0; const char *s = luaL_checkstring( L, 2 ); if (s == NULL) return 0; lua_pushinteger( L, u8g_GetStrWidth( LU8G, s ) ); return 1; }
static void draw_menu( ui_menu_t * menu ) { // Render title bar and background: draw_page( menu->title ); // Draw list: u8g_SetFont( u8g, menu_list_font ); int y = page_body_start + menu_list_vpad + menu_list_font_height + 1; int step = menu_list_font_vsize + ( menu_list_vpad << 1 ) + 1; int indent = menu_list_hpad + u8g_GetStrWidth( u8g, "2. " ); ui_menu_item_t * items = menu->items; for ( int i = 0; i < menu->num_items; i++ ) { // Check if y descends beyond bottom of display: if ( y > 127 ) { break; } // Set item color: ui_menu_item_t * item = &items[ i ]; switch ( item->type ) { case UI_DUMMY: display_set_draw_color( &menu_list_disabled_color_fg ); break; case UI_FLAG: if ( ! get_flag_state( item->number, item->bit ) ) { display_set_draw_color( &menu_list_disabled_color_fg ); break; } default: display_set_draw_color( &menu_list_color_fg ); } // Draw item number: char number[] = "n. "; number[ 0 ] = 0x31 + i; u8g_DrawStr( u8g, menu_list_hpad, y, number ); // Draw item label: u8g_DrawStr( u8g, indent, y, item->label ); y += step; } }
/** * @brief draw a UTF-8 string */ void u8g_DrawUtf8Str1 (u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg) { int len; uint8_t *pend = NULL; uint8_t *p; wchar_t val; uint8_t buf[2] = {0, 0}; u8g_fntpgm_uint8_t * fntpqm = NULL; if (! fontinfo_isinited1()) { u8g_DrawStr(pu8g, x, y, "Err: pls init font first."); return; } //u8g_DrawStr(pu8g, x, y, utf8_msg); len = strlen(utf8_msg); pend = (uint8_t *)utf8_msg + len; for (p = (uint8_t *)utf8_msg; p < pend; ) { val = 0; p = get_utf8_value(p, &val); if (NULL == p) { TRACE("No more char, break ..."); break; } TRACE("got char=%d", (int)val); buf[0] = (uint8_t)(val & 0x7F); fntpqm = (u8g_fntpgm_uint8_t *)fontinfo_find (val); if (NULL == fntpqm) { //continue; buf[0] = '?'; fntpqm = (u8g_fntpgm_uint8_t *)DEFAULT_FONT; TRACE("Unknown char, use default font"); } if (DEFAULT_FONT != fntpqm) { buf[0] |= 0x80; // use upper page to avoid 0x00 error in C. you may want to generate the font data } TRACE("set font: %p; (default=%p)", fntpqm, DEFAULT_FONT); u8g_SetFont (pu8g, fntpqm); u8g_DrawStr(pu8g, x, y, (char *) buf); x += u8g_GetStrWidth(pu8g, (char *)buf); TRACE("next pos= %d", x); } }
static void draw_num_selector() { char number[ 6 ] = " "; char * num; // Render title bar and background: draw_page( num_widget_title ); // Compute first line y pos and line height: int y = page_body_start + num_font_height + num_vpad - 1; int step = ( menu_list_vpad << 1 ) + num_font_vsize - 1; // Create string from value: int val = num_widget_value; int num_digits = 0; num = &number[ 0 ] + 5; for ( int i = 0; i < 5; i++ ) { num--; *num = 0x30 + val % 10; num_digits++; val /= 10; if ( ! val ) break; } if ( ! num_digits ) { *num = '0'; } // Draw current value: display_set_draw_color( &menu_list_color_fg ); u8g_SetFont( u8g, num_selector_num_font ); u8g_DrawStr( u8g, // Make sure this is positive if using a very wide font: ( 128 - u8g_GetStrWidth( u8g, num ) ) / 2, y, num ); }
void draw_menu(void) { uint8_t i, h; u8g_uint_t w, d; u8g_SetFont(&u8g, u8g_font_6x13); u8g_SetFontRefHeightText(&u8g); u8g_SetFontPosTop(&u8g); h = u8g_GetFontAscent(&u8g)-u8g_GetFontDescent(&u8g); w = u8g_GetWidth(&u8g); for( i = 0; i < MENU_ITEMS; i++ ) { d = (w-u8g_GetStrWidth(&u8g, menu_strings[i]))/2; u8g_SetDefaultForegroundColor(&u8g); if ( i == menu_current ) { u8g_DrawBox(&u8g, 0, i*h+1, w, h); u8g_SetDefaultBackgroundColor(&u8g); } u8g_DrawStr(&u8g, d, i*h, menu_strings[i]); } }
uint8_t m2_gh_u8g_base(m2_gfx_arg_p arg) { /* Do a safety check here: Abort if m2_SetU8g has not been called */ if ( m2_u8g_dev_variables.m2_u8g == NULL ) return 0; /* Proceed with normal message processing */ switch(arg->msg) { case M2_GFX_MSG_INIT: break; case M2_GFX_MSG_START: /* check for proper setup */ break; case M2_GFX_MSG_END: break; case M2_GFX_MSG_DRAW_HLINE: u8g_DrawHLine(m2_u8g_dev_variables.m2_u8g, arg->x, m2_u8g_dev_variables.m2_u8g_height_minus_one - arg->y, arg->w); break; case M2_GFX_MSG_DRAW_VLINE: u8g_DrawVLine(m2_u8g_dev_variables.m2_u8g, arg->x, m2_u8g_dev_variables.m2_u8g_height_minus_one - arg->y, arg->h); break; case M2_GFX_MSG_DRAW_BOX: m2_u8g_draw_box(arg->x, arg->y, arg->w, arg->h); break; case M2_GFX_MSG_DRAW_TEXT: { u8g_uint_t x = arg->x; u8g_uint_t y; u8g_SetColorIndex(m2_u8g_dev_variables.m2_u8g, m2_u8g_dev_variables.m2_u8g_current_text_color); u8g_SetFont(m2_u8g_dev_variables.m2_u8g, m2_u8g_get_font(arg->font)); u8g_SetFontPosBottom(m2_u8g_dev_variables.m2_u8g); if ( (arg->font & 8) != 0 ) { if ( arg->w != 0 ) { x = arg->w; x -= u8g_GetStrWidth(m2_u8g_dev_variables.m2_u8g, arg->s); x >>= 1; x += arg->x; } } y = m2_u8g_dev_variables.m2_u8g_height_minus_one; y -= arg->y; y++; /* 13 Jan 2013: Issue 95, problem 2 */ x -= u8g_GetStrX(m2_u8g_dev_variables.m2_u8g, arg->s); //x += m2_gh_u8g_additional_text_border_x_size; u8g_DrawStr(m2_u8g_dev_variables.m2_u8g, x, y, arg->s); // printf("DRAW_TEXT: x=%d y=%d s=%s\n", x, y, arg->s); } break; case M2_GFX_MSG_DRAW_TEXT_P: { u8g_uint_t x = arg->x; u8g_uint_t y; u8g_SetColorIndex(m2_u8g_dev_variables.m2_u8g, m2_u8g_dev_variables.m2_u8g_current_text_color); u8g_SetFont(m2_u8g_dev_variables.m2_u8g, m2_u8g_get_font(arg->font)); u8g_SetFontPosBottom(m2_u8g_dev_variables.m2_u8g); if ( (arg->font & 8) != 0 ) { if ( arg->w != 0 ) { x = arg->w; x -= u8g_GetStrWidthP(m2_u8g_dev_variables.m2_u8g, (const u8g_pgm_uint8_t *)arg->s); x >>= 1; x += arg->x; } } y = m2_u8g_dev_variables.m2_u8g_height_minus_one; y -= arg->y; x -= u8g_GetStrXP(m2_u8g_dev_variables.m2_u8g, (const u8g_pgm_uint8_t *)arg->s); //x += m2_gh_u8g_additional_text_border_x_size; y++; /* 13 Jan 2013: Issue 95, problem 2 */ u8g_DrawStrP(m2_u8g_dev_variables.m2_u8g, x, y, (const u8g_pgm_uint8_t *)arg->s); }
uint8_t dog_GetStrWidth(DOG_PGM_P font, const char *s) { u8g_SetFont(&u8g_dogm128_obj, font); return u8g_GetStrWidth(&u8g_dogm128_obj, s); }
static void draw_rgb_config() { int frame_width = 1; // Render title bar and background: draw_page( rgb_widget_title ); // Compute first line y pos and line height: int y = ( page_body_start + frame_width + widget_focus_frame_pad + menu_list_font_height + menu_list_hpad - 1 ); int step = ( frame_width << 1 ) + ( widget_focus_frame_pad << 1 ) + menu_list_font_vsize - 1; // Compute x pos for numbers: u8g_SetFont( u8g, menu_list_font ); int char_width = u8g_GetStrWidth( u8g, "w" ); int num_chars = 3; if ( rgb_max_value > 255 ) { num_chars = 4; } int num_x = 128 - menu_list_hpad - frame_width - num_chars * char_width; // Compute bar dimensions: int bar_frame_x = menu_list_hpad; int bar_x = bar_frame_x + frame_width + widget_focus_frame_pad; uint16_t max_bar_width = num_x - bar_x - ( widget_focus_frame_pad << 1 ) - 1; uint32_t bar_width = 0; // Draw bars: display_set_draw_color( &rgb_red ); int y_red = y; bar_width = max_bar_width; bar_width *= rgb_widget_color[ 0 ]; bar_width /= rgb_max_value; u8g_DrawBox( u8g, bar_x, y_red - menu_list_font_height, bar_width, menu_list_font_vsize ); display_set_draw_color( &rgb_green ); int y_green = y_red + step; bar_width = max_bar_width; bar_width *= rgb_widget_color[ 1 ]; bar_width /= rgb_max_value; u8g_DrawBox( u8g, bar_x, y_green - menu_list_font_height, bar_width, menu_list_font_vsize ); display_set_draw_color( &rgb_blue ); int y_blue = y_green + step; bar_width = max_bar_width; bar_width *= rgb_widget_color[ 2 ]; bar_width /= rgb_max_value; u8g_DrawBox( u8g, bar_x, y_blue - menu_list_font_height, bar_width, menu_list_font_vsize ); // Draw numbers: display_set_draw_color( &menu_title_color_fg ); char digits[] = " "; if ( rgb_max_value < 256 ) { digits[ 2 ] = 0; } int d = 0; if ( rgb_max_value > 255 ) { digits[ d++ ] = nibchar( rgb_widget_color[ 0 ] >> 8 ); }
ICACHE_FLASH_ATTR static void draw_normal(DrawingState *state) { uint8_t buf[50]; u8g_SetColorIndex(&(state->u8g), 1); drawingRefreshIcons(state); uint8_t iconWidth = 40; //current measured temperature u8g_SetFont(&(state->u8g), u8g_font_helvB18); u8g_SetFontPosTop(&(state->u8g)); os_sprintf(buf, "%d", state->currentTemp / 100); uint8_t currentTempWidth = u8g_GetStrWidth(&(state->u8g), buf); uint8_t cWidth = u8g_GetStrWidth(&(state->u8g), "C"); uint8_t strHeight = u8g_GetFontAscent(&(state->u8g)); u8g_SetFont(&(state->u8g), u8g_font_helvR08); u8g_SetFontPosBaseline(&(state->u8g)); os_sprintf(buf, "%02d", abs(state->currentTemp % 100)); uint8_t webTempWidth = u8g_GetStrWidth(&(state->u8g), buf); u8g_DrawStr(&(state->u8g), iconWidth + (128 - iconWidth) / 2 - (currentTempWidth + cWidth + webTempWidth) / 2 + currentTempWidth, 16 + strHeight, buf); u8g_SetFont(&(state->u8g), u8g_font_helvB18); u8g_SetFontPosTop(&(state->u8g)); os_sprintf(buf, "%d", state->currentTemp / 100); u8g_DrawStr(&(state->u8g), iconWidth + (128 - iconWidth) / 2 - (currentTempWidth + cWidth + webTempWidth) / 2, 16, buf); u8g_DrawStr(&(state->u8g), iconWidth + (128 - iconWidth) / 2 - (currentTempWidth + cWidth + webTempWidth) / 2 + currentTempWidth + webTempWidth, 16, "C"); //web text if (state->weather.code != 255) { u8g_SetFont(&(state->u8g), u8g_font_6x10); u8g_SetFontPosBottom(&(state->u8g)); os_sprintf(buf, "%s", state->weather.text); currentTempWidth = u8g_GetStrWidth(&(state->u8g), buf); strHeight = u8g_GetFontBBXHeight(&(state->u8g)); u8g_DrawStr(&(state->u8g), iconWidth + (128 - iconWidth) / 2 - currentTempWidth / 2, 64, buf); } //web temperature u8g_SetFont(&(state->u8g), u8g_font_6x10); u8g_SetFontPosBottom(&(state->u8g)); os_sprintf(buf, "%dC", state->weather.temp); uint8_t outsideTempWidth = u8g_GetStrWidth(&(state->u8g), buf); u8g_DrawStr(&(state->u8g), iconWidth + (128 - iconWidth) / 2 - outsideTempWidth / 2, 64 - strHeight, buf); u8g_SetFont(&(state->u8g), u8g_font_6x10); u8g_SetFontPosCenter(&(state->u8g)); if (state->temperatureMode == MANUAL) { os_sprintf(buf, "Manual: %d.%02dC", state->manualTemp / 100, abs(state->manualTemp % 100)); } else if (state->temperatureMode == AUTOMATIC) { if (state->automaticTempCurrentState == NULL) { os_sprintf(buf, "Auto"); } else { os_sprintf(buf, "A:%d.%02dC, %d:%02d", state->automaticTempCurrentState->temp / 100, abs(state->automaticTempCurrentState->temp % 100), state->automaticTempCurrentState->time / 60, state->automaticTempCurrentState->time % 60); } } u8g_DrawStr(&(state->u8g), 0, 8, buf); }