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);
}
Beispiel #5
0
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);
}
Beispiel #8
0
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() );
}