From e45617d6b21b1854a234d7bd0a0cfa7904ee6269 Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Tue, 12 May 2026 23:40:22 +0200 Subject: [PATCH] new graphics --- fw/display.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++ fw/display.h | 1 + fw/main.c | 14 ++++++-- 3 files changed, 108 insertions(+), 2 deletions(-) diff --git a/fw/display.c b/fw/display.c index 74d1c4e..6f743e7 100644 --- a/fw/display.c +++ b/fw/display.c @@ -254,3 +254,98 @@ static char str_buf[32]; uint8_t str_len; int buf_putc(char c) { str_buf[str_len++] = c; return 0; } const char* buf_get(void) { str_buf[str_len] = '\0'; str_len = 0; return str_buf; } + + +// 7 segment display segments +static const uint8_t seg_left_xbm[] = {0x01,0x03,0x03,0x03,0x03,0x01}; +static const uint8_t seg_right_xbm[] = {0x02,0x03,0x03,0x03,0x03,0x02}; +static const uint8_t seg_top_xbm[] = {0x3f,0x1e}; +static const uint8_t seg_bot_xbm[] = {0x1e,0x3f}; +static const uint8_t seg_center_xbm[] = {0x1e,0x3f,0x1e}; + +static void draw_7seg(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t n) +{ + switch (n) { + case 0: + u8g2_DrawXBM(u8g2, x+1, y+0, 6, 2, seg_top_xbm); + u8g2_DrawXBM(u8g2, x+6, y+1, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+6, y+8, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+1, y+13, 6, 2, seg_bot_xbm); + u8g2_DrawXBM(u8g2, x+0, y+1, 2, 6, seg_left_xbm); + u8g2_DrawXBM(u8g2, x+0, y+8, 2, 6, seg_left_xbm); + break; + case 1: + u8g2_DrawXBM(u8g2, x+6, y+1, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+6, y+8, 2, 6, seg_right_xbm); + break; + case 2: + u8g2_DrawXBM(u8g2, x+1, y+0, 6, 2, seg_top_xbm); + u8g2_DrawXBM(u8g2, x+6, y+1, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+1, y+13, 6, 2, seg_bot_xbm); + u8g2_DrawXBM(u8g2, x+0, y+8, 2, 6, seg_left_xbm); + u8g2_DrawXBM(u8g2, x+1, y+6, 6, 3, seg_center_xbm); + break; + case 3: + u8g2_DrawXBM(u8g2, x+1, y+0, 6, 2, seg_top_xbm); + u8g2_DrawXBM(u8g2, x+6, y+1, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+6, y+8, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+1, y+13, 6, 2, seg_bot_xbm); + u8g2_DrawXBM(u8g2, x+1, y+6, 6, 3, seg_center_xbm); + break; + case 4: + u8g2_DrawXBM(u8g2, x+6, y+1, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+6, y+8, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+0, y+1, 2, 6, seg_left_xbm); + u8g2_DrawXBM(u8g2, x+1, y+6, 6, 3, seg_center_xbm); + break; + case 5: + u8g2_DrawXBM(u8g2, x+1, y+0, 6, 2, seg_top_xbm); + u8g2_DrawXBM(u8g2, x+6, y+8, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+1, y+13, 6, 2, seg_bot_xbm); + u8g2_DrawXBM(u8g2, x+0, y+1, 2, 6, seg_left_xbm); + u8g2_DrawXBM(u8g2, x+1, y+6, 6, 3, seg_center_xbm); + break; + case 6: + u8g2_DrawXBM(u8g2, x+1, y+0, 6, 2, seg_top_xbm); + u8g2_DrawXBM(u8g2, x+6, y+8, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+1, y+13, 6, 2, seg_bot_xbm); + u8g2_DrawXBM(u8g2, x+0, y+1, 2, 6, seg_left_xbm); + u8g2_DrawXBM(u8g2, x+0, y+8, 2, 6, seg_left_xbm); + u8g2_DrawXBM(u8g2, x+1, y+6, 6, 3, seg_center_xbm); + break; + case 7: + u8g2_DrawXBM(u8g2, x+1, y+0, 6, 2, seg_top_xbm); + u8g2_DrawXBM(u8g2, x+6, y+1, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+6, y+8, 2, 6, seg_right_xbm); + break; + case 8: + u8g2_DrawXBM(u8g2, x+1, y+0, 6, 2, seg_top_xbm); + u8g2_DrawXBM(u8g2, x+6, y+1, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+6, y+8, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+1, y+13, 6, 2, seg_bot_xbm); + u8g2_DrawXBM(u8g2, x+0, y+1, 2, 6, seg_left_xbm); + u8g2_DrawXBM(u8g2, x+0, y+8, 2, 6, seg_left_xbm); + u8g2_DrawXBM(u8g2, x+1, y+6, 6, 3, seg_center_xbm); + break; + case 9: + u8g2_DrawXBM(u8g2, x+1, y+0, 6, 2, seg_top_xbm); + u8g2_DrawXBM(u8g2, x+6, y+1, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+6, y+8, 2, 6, seg_right_xbm); + u8g2_DrawXBM(u8g2, x+1, y+13, 6, 2, seg_bot_xbm); + u8g2_DrawXBM(u8g2, x+0, y+1, 2, 6, seg_left_xbm); + u8g2_DrawXBM(u8g2, x+1, y+6, 6, 3, seg_center_xbm); + break; + default: + break; + } +} + + +void draw_temp(u8g2_t *u8g2, uint8_t x, uint8_t y, int16_t temp) +{ + if (temp > 999 || temp < 0) temp = 0; + const char *s = u8x8_u16toa(temp, 3); + draw_7seg(u8g2, x+0, y+0, s[0]-'0'); + draw_7seg(u8g2, x+9, y+0, s[1]-'0'); + draw_7seg(u8g2, x+18, y+0, s[2]-'0'); +} diff --git a/fw/display.h b/fw/display.h index fcd77b3..a1213c0 100644 --- a/fw/display.h +++ b/fw/display.h @@ -12,6 +12,7 @@ const char* i16toa(int16_t value); const char* u16toa(uint16_t value); int buf_putc(char c); const char* buf_get(void); +void draw_temp(u8g2_t *u8g2, uint8_t x, uint8_t y, int16_t temp); #endif // _DISPLAY_H diff --git a/fw/main.c b/fw/main.c index 5226be7..18d9e6f 100644 --- a/fw/main.c +++ b/fw/main.c @@ -569,6 +569,7 @@ __attribute__((noreturn)) int main(void) } break; case STATE_HEATING: +#if 0 // Display tip temperature u8g2_DrawStr(u8g2, x_off+0, y_off+7, "TIP:"); u8g2_DrawStr(u8g2, x_off+20, y_off+7, i16toa(tip_temp_c)); @@ -584,7 +585,16 @@ __attribute__((noreturn)) int main(void) // u8g2_DrawStr(u8g2, x_off+55, y_off+15, u16toa(current_ma)); u8g2_DrawStr(u8g2, x_off+45, y_off+15, "W:"); u8g2_DrawStr(u8g2, x_off+55, y_off+15, u16toa(power)); - +#else + draw_temp(u8g2, x_off+0, y_off+0, tip_temp_c); + u8g2_DrawStr(u8g2, x_off+32, y_off+6, "W:"); + u8g2_DrawStr(u8g2, x_off+42, y_off+6, u16toa(power)); + u8g2_DrawStr(u8g2, x_off+60, y_off+6, "V:"); + u8g2_DrawStr(u8g2, x_off+70, y_off+6, u16toa((vbus_mv+500)/1000)); + uint8_t p = (power*100)/pd_profile.set_power; + uint8_t w = (uint16_t)(p*64)/100; + u8g2_DrawBox(u8g2, x_off+32, y_off+14, w, 5); +#endif if (enabled) { funDigitalWrite(PIN_12V, 1); @@ -613,7 +623,7 @@ __attribute__((noreturn)) int main(void) if (pwm) { const uint16_t tim_max = FUNCONF_SYSTEM_CORE_CLOCK / PWM_FREQ_HZ - 1; pwm_set(((u32)duty*tim_max)/100); - u8g2_DrawBox(u8g2, x_off+92, y_off+12, 4, 4); + u8g2_DrawBox(u8g2, x_off+92, y_off+0, 4, 4); } else { pwm_set(0); }