static inline void drawTestPage( uint8 drawing_stripe_index, const analysis::PrintableMilsValue& printable_voltage, const analysis::PrintablePpmValue& printable_current, uint16 charge_register, boolean is_button_pressed) { u8g.setFont(u8g_font_8x13); if (drawing_stripe_index == 0) { const uint8 kBaseY = 10; u8g.drawStrP(0, kBaseY, U8G_PSTR("V")); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%2u.%03u"), printable_voltage.units, printable_voltage.mils); u8g.drawStr(49, kBaseY, formatting_buffer); } if (drawing_stripe_index == 1) { const uint8 kBaseY = 27; u8g.drawStrP(0, kBaseY, U8G_PSTR("I")); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%u.%03u"), printable_current.units, printable_current.mils); u8g.drawStr(57, kBaseY, formatting_buffer); } if (drawing_stripe_index == 2) { const uint8 kBaseY = 44; u8g.drawStrP(0, kBaseY, U8G_PSTR("R")); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%04X"), charge_register); u8g.drawStr(57, kBaseY, formatting_buffer); } if (drawing_stripe_index == 3) { const uint8 kBaseY = 61; u8g.drawStrP(0, kBaseY, U8G_PSTR("B")); u8g.drawStr(57, kBaseY, (is_button_pressed ? "*" : "_")); } }
// The picture loop function. Check u8glib documentation for restrictions. This function // is called multiple time per a single screen draw. static inline void drawSummary1Page(uint8 drawing_stripe_index, uint32 current_micro_amps, uint32 average_current_micro_amps, uint16 total_charge_mah, uint16 time_seconds) { u8g.setFont(u8g_font_8x13); if (drawing_stripe_index == 0) { const uint8 kBaseY = 10; u8g.drawStrP(0, kBaseY, U8G_PSTR("I")); drawFraction(52, kBaseY, current_micro_amps, 100); u8g.drawStrP(103, kBaseY, U8G_PSTR("ma")); } if (drawing_stripe_index == 1) { const uint8 kBaseY = 27; u8g.drawStrP(0, kBaseY, U8G_PSTR("Iavg")); drawFraction(52, kBaseY, average_current_micro_amps, 100); u8g.drawStrP(103, kBaseY, U8G_PSTR("ma")); } if (drawing_stripe_index == 2) { const uint8 kBaseY = 44; u8g.drawStrP(0, kBaseY, U8G_PSTR("Q")); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%4u"), total_charge_mah); u8g.drawStr(65, kBaseY, formatting_buffer); u8g.drawStrP(103, kBaseY, U8G_PSTR("mah")); } if (drawing_stripe_index == 3) { const uint8 kBaseY = 61; u8g.drawStrP(0, kBaseY, U8G_PSTR("T")); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%6u"), time_seconds); u8g.drawStr(49, kBaseY, formatting_buffer); u8g.drawStrP(101, kBaseY, U8G_PSTR("sec")); } }
// The picture loop function. Check u8glib documentation for restrictions. This function // is called multiple time per onw screen draw. static inline void drawGraphPage(uint8 drawing_stripe_index, uint32 current_micro_amps, uint32 average_current_micro_amps) { if (drawing_stripe_index == 0) { const uint8 kBaseY = 10; u8g.drawStrP(0, kBaseY, U8G_PSTR("I")); drawFraction(62, kBaseY, current_micro_amps, 100); u8g.drawStrP(113, kBaseY, U8G_PSTR("ma")); } if (drawing_stripe_index == 1) { const uint8 kBaseY = 25; u8g.drawStrP(0, kBaseY, U8G_PSTR("Iavg")); drawFraction(62, kBaseY, average_current_micro_amps, 100); u8g.drawStrP(113, kBaseY, U8G_PSTR("ma")); } if (drawing_stripe_index >= 2) { // If the buffer is empty, this is still valid. uint8 last_y = graph_y_points[graph_first_y_index]; uint8 last_x = 0; uint8 index = graph_first_y_index; // We iterate starting from the second point. // If the buffer has less than two points, this will have zero iterations. for (uint8 i = 1; i < graph_active_y_count; i++) { // Increment to next point index++; if (index >= kGraphMaxPoints) { index = 0; } uint8 y = graph_y_points[index]; uint8 x = last_x + 2; u8g.drawLine(last_x, last_y, x, y); last_y = y; last_x = x; } u8g.drawLine(last_x+1, 63, last_x+1, 32); } if (drawing_stripe_index == 3) { u8g.drawLine(0, 63, 127, 63); } }
// Draw a value with one digit after the decimal point. Users formatting_buffer. static void drawFraction(uint8 x, uint8 y, uint32 value, uint16 divider) { const uint32 actual_value = value / divider; const uint16 units = actual_value / 10; const uint16 fraction = actual_value - (10L * units); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%4u"), units); u8g.drawStr(x, y, formatting_buffer); u8g.drawStrP(x + 31, y, U8G_PSTR(".")); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%01u"), fraction); u8g.drawStr(x + 37, y, formatting_buffer); }
static void drawCurrentDisplayMessage() { u8g.setFont(u8g_font_8x13); // NOTE: drawRFrame adds about 600 bytes to the flash size compared to drawFrame. // May be pulling the circle code for the rounded corners. u8g.drawRFrame(0, 0, 128, 64, 5); if (current_display_message_code == display_messages::code::kSplashScreen) { u8g.drawStrP(22, 25, U8G_PSTR("POWER PLAY")); // NOTE: using compile time literal string concatenation. u8g.drawStrP(27, 46, U8G_PSTR("Ver " FIRMWARE_VERSION)); return; } if (current_display_message_code == display_messages::code::kAnalysisReset) { u8g.drawStrP(21, 26, U8G_PSTR("Restarting")); u8g.drawStrP(21, 45, U8G_PSTR("analysis...")); return; } if (current_display_message_code == display_messages::code::kLtc2943InitError) { u8g.drawStrP(11, 26, U8G_PSTR("Current sense")); u8g.drawStrP(11, 45, U8G_PSTR("comm error.")); return; } if (current_display_message_code == display_messages::code::kGeneralError) { u8g.drawStrP(11, 26, U8G_PSTR("Error")); u8g.drawStrP(11, 45, U8G_PSTR("detected.")); return; } if (current_display_message_code == display_messages::code::kTestMode) { u8g.drawStrP(27, 37, U8G_PSTR("Test Mode")); return; } // Else, unknown message. Show message code. u8g.drawStrP(15, 33, U8G_PSTR("Message: ")); char bfr[12]; snprintf_P(bfr, sizeof(bfr), PSTR("%4d"), current_display_message_code); u8g.drawStr(65, 33, bfr); }
static inline void drawSummary2Page( uint8 drawing_stripe_index, const analysis::PrintableMilsValue& printable_voltage, boolean is_awake, uint32 awake_count, uint16 awake_charge_mah, uint16 time_seconds) { u8g.setFont(u8g_font_8x13); if (drawing_stripe_index == 0) { const uint8 kBaseY = 10; u8g.drawStrP(0, kBaseY, U8G_PSTR("V")); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%2u.%02u"), printable_voltage.units, printable_voltage.mils/10); u8g.drawStr(57, kBaseY, formatting_buffer); u8g.drawStrP(103, kBaseY, U8G_PSTR("v")); } if (drawing_stripe_index == 1) { const uint8 kBaseY = 27; u8g.drawStrP(0, kBaseY, U8G_PSTR("Nwake")); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%5lu"), awake_count); u8g.drawStr(57, kBaseY, formatting_buffer); if (is_awake) { u8g.drawStrP(103, kBaseY, U8G_PSTR("*")); } } if (drawing_stripe_index == 2) { const uint8 kBaseY = 44; u8g.drawStrP(0, kBaseY, U8G_PSTR("Qwake")); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%4u"), awake_charge_mah); u8g.drawStr(65, kBaseY, formatting_buffer); u8g.drawStrP(103, kBaseY, U8G_PSTR("mah")); } if (drawing_stripe_index == 3) { const uint8 kBaseY = 61; u8g.drawStrP(0, kBaseY, U8G_PSTR("T")); snprintf_P(formatting_buffer, sizeof(formatting_buffer), PSTR("%6u"), time_seconds); u8g.drawStr(49, kBaseY, formatting_buffer); u8g.drawStrP(101, kBaseY, U8G_PSTR("sec")); } }
static void drawCurrentDisplayMessage() { u8g.setFont(u8g_font_8x13); u8g.drawFrame(0, 0, 128, 64); if (current_display_message_code == display_messages::code::kSplashScreen) { u8g.drawStrP(22, 25, U8G_PSTR("POWER PLAY")); // NOTE: using compile time literal string concatenation. u8g.drawStrP(27, 46, U8G_PSTR("Ver " POWER_PLAY_VERSION_STRING)); return; } if (current_display_message_code == display_messages::code::kAnalysisReset) { u8g.drawStrP(21, 26, U8G_PSTR("Restarting")); u8g.drawStrP(21, 45, U8G_PSTR("analysis...")); return; } if (current_display_message_code == display_messages::code::kCheckReverseCurrentError) { u8g.drawStrP(21, 26, U8G_PSTR("Reversed")); u8g.drawStrP(21, 45, U8G_PSTR("Current!!!")); return; } if (current_display_message_code == display_messages::code::kLtc2943InitError) { u8g.drawStrP(11, 26, U8G_PSTR("Current sense")); u8g.drawStrP(11, 45, U8G_PSTR("comm error.")); return; } if (current_display_message_code == display_messages::code::kGeneralError) { u8g.drawStrP(11, 26, U8G_PSTR("Error")); u8g.drawStrP(11, 45, U8G_PSTR("detected.")); return; } if (current_display_message_code == display_messages::code::kTestMode) { u8g.drawStrP(27, 37, U8G_PSTR("Test Mode")); return; } // Else, unknown message. Show message code. u8g.drawStrP(15, 33, U8G_PSTR("Message: ")); char bfr[12]; snprintf_P(bfr, sizeof(bfr), PSTR("%4d"), current_display_message_code); u8g.drawStr(65, 33, bfr); }
void Clock::lcdInfo(){ char buff[BUFF_LCD_MSG]; byte t; // read values dht22->loadFromSensor(); switch(dht22->error()){ case DHT_ERROR_NONE: case DHT_ERROR_TOOQUICK: break; default: // FIXME better error reporting ledMatrix->fill(RED); ledMatrix->show(); while(1); break; } bmp085->loadFromSensor(); humidityInside.loadFromSensor(); // LCD lcd->firstPage(); do { byte x; byte y; // Week day y=-2; lcd->setFont(u8g_font_6x12); lcd->setFontPosTop(); x=lcd->getWidth()/2-lcd->getStrWidthP((u8g_pgm_uint8_t *)time->getWeekDayName())/2; lcd->drawStrP(x, y, (const u8g_pgm_uint8_t*)time->getWeekDayName()); // Date strcpy_P(buff, time->getMonthName()); t=strlen(buff); buff[t++]=' '; itoa(date.mday, buff+t, 10); t=strlen(buff); buff[t++]=' '; itoa(date.year, buff+t, 10); y+=lcd->getFontAscent()+2; x=lcd->getWidth()/2-lcd->getStrWidth(buff)/2; lcd->drawStr(x, y, buff); // Pressure ltoa(pressure.getPa(), buff, 10); t=strlen(buff); buff[t++]='P'; buff[t++]='a'; buff[t++]=' '; buff[t++]='('; double d=pressure.getPa()-pressure.expectedPressure(AVERAGE_SEA_LEVEL_PRESSURE, ALTITUDE); if(d>0) buff[t++]='+'; ltoa(d, buff+t, 10); t=strlen(buff); buff[t++]='P'; buff[t++]='a'; buff[t++]=')'; buff[t]='\0'; y+=lcd->getFontAscent()+1; lcd->setFont(u8g_font_7x13B); lcd->setFontPosTop(); x=lcd->getWidth()/2-lcd->getStrWidth(buff)/2; lcd->drawStr(x, y, buff); // Temperature names y+=lcd->getFontAscent()+1; lcd->setFont(u8g_font_5x7); lcd->setFontPosTop(); x=lcd->getWidth()/4-lcd->getStrWidthP(U8G_PSTR("Outside"))/2; lcd->drawStrP(x, y, U8G_PSTR("Outside")); x=lcd->getWidth()*3/4-lcd->getStrWidthP(U8G_PSTR("Inside"))/2; lcd->drawStrP(x, y, U8G_PSTR("Inside")); // Temperature outside x=0; y+=lcd->getFontAscent()+1; lcd->setFont(u8g_font_fub14); lcd->setFontPosTop(); lcd->drawStr(x, y, dtostrf(temperatureOutside.getC(), -2, 1, buff)); x+=lcd->getStrWidth(dtostrf(temperatureOutside.getC(), -2, 1, buff)); buff[0]=176; buff[1]='C'; buff[2]='\0'; lcd->drawStr(x, y, buff); // Temperature inside dtostrf(temperatureInside.getC(), -2, 1, buff); t=strlen(buff); buff[t++]=176; buff[t++]='C'; buff[t]='\0'; x=lcd->getWidth()-lcd->getStrWidth(buff); lcd->drawStr(x, y, buff); // Humidity outside y+=lcd->getFontAscent()+1; ltoa(humidityOutside.getRH(), buff, 10); t=strlen(buff); buff[t++]='%'; buff[t]='\0'; x=lcd->getWidth()/4-lcd->getStrWidth(buff)/2; lcd->drawStr(x, y, buff); // Humidity inside ltoa(humidityInside.getRH(), buff, 10); t=strlen(buff); buff[t++]='%'; buff[t]='\0'; x=lcd->getWidth()*3/4-lcd->getStrWidth(buff)/2; lcd->drawStr(x, y, buff); } while( lcd->nextPage() ); }