Compare commits

...

2 Commits

Author SHA1 Message Date
e45617d6b2 new graphics 2026-05-12 23:40:22 +02:00
944133bd45 avoid string parsing 2026-05-12 23:40:02 +02:00
3 changed files with 114 additions and 8 deletions

View File

@ -254,3 +254,98 @@ static char str_buf[32];
uint8_t str_len; uint8_t str_len;
int buf_putc(char c) { str_buf[str_len++] = c; return 0; } 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; } 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');
}

View File

@ -12,6 +12,7 @@ const char* i16toa(int16_t value);
const char* u16toa(uint16_t value); const char* u16toa(uint16_t value);
int buf_putc(char c); int buf_putc(char c);
const char* buf_get(void); const char* buf_get(void);
void draw_temp(u8g2_t *u8g2, uint8_t x, uint8_t y, int16_t temp);
#endif // _DISPLAY_H #endif // _DISPLAY_H

View File

@ -385,9 +385,9 @@ uint16_t pid(int16_t delta, int16_t max_duty)
prev_t = t; prev_t = t;
// PID coefficients // PID coefficients
const s32 kp = FR_numstr("1.1700", R); const s32 kp = FR_NUM(1, 170, 3, R);
const s32 ki = FR_numstr("0.05000", R); const s32 ki = FR_NUM(0, 050, 3, R);
const s32 kd = FR_numstr("0.07000", R); const s32 kd = FR_NUM(0, 070, 3, R);
s32 e = 0; s32 e = 0;
e = FR_FixAddSat(e, FR_FixMulSat(err_p, kp)); e = FR_FixAddSat(e, FR_FixMulSat(err_p, kp));
e = FR_FixAddSat(e, FR_FixMulSat(err_i, ki)); e = FR_FixAddSat(e, FR_FixMulSat(err_i, ki));
@ -524,7 +524,7 @@ __attribute__((noreturn)) int main(void)
if (has_pd) { if (has_pd) {
static uint16_t vbus_mv, current_ma; static uint16_t vbus_mv, current_ma;
static volatile int16_t temp_c, tip_temp_c; static int16_t temp_c, tip_temp_c;
static uint16_t power; static uint16_t power;
static uint16_t duty; static uint16_t duty;
vbus_mv = U16_FP_EMA_K4(vbus_mv, ((u32)adc_buffer[0]*VCC_MV*11)/4096); vbus_mv = U16_FP_EMA_K4(vbus_mv, ((u32)adc_buffer[0]*VCC_MV*11)/4096);
@ -538,8 +538,8 @@ __attribute__((noreturn)) int main(void)
adc_injection_conversion(); adc_injection_conversion();
u32 tip_mv = ((u32)injection_results[0]*VCC_MV)/4096; u32 tip_mv = ((u32)injection_results[0]*VCC_MV)/4096;
// Tip calibration factors // Tip calibration factors
const s32 tip_k = FR_numstr("0.144728", R); const s32 tip_k = FR_NUM(0, 14473, 5, R);
const s32 tip_off = FR_numstr("0", R); const s32 tip_off = FR_NUM(0, 0, 0, R);
int16_t tt_now = FR2I(FR_FixAddSat(FR_FixMulSat(I2FR(tip_mv, R), tip_k), tip_off), R); int16_t tt_now = FR2I(FR_FixAddSat(FR_FixMulSat(I2FR(tip_mv, R), tip_k), tip_off), R);
tip_temp_c = I16_FP_EMA_K4(tip_temp_c, tt_now + temp_c); tip_temp_c = I16_FP_EMA_K4(tip_temp_c, tt_now + temp_c);
if (enabled) { if (enabled) {
@ -569,6 +569,7 @@ __attribute__((noreturn)) int main(void)
} }
break; break;
case STATE_HEATING: case STATE_HEATING:
#if 0
// Display tip temperature // Display tip temperature
u8g2_DrawStr(u8g2, x_off+0, y_off+7, "TIP:"); u8g2_DrawStr(u8g2, x_off+0, y_off+7, "TIP:");
u8g2_DrawStr(u8g2, x_off+20, y_off+7, i16toa(tip_temp_c)); 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+55, y_off+15, u16toa(current_ma));
u8g2_DrawStr(u8g2, x_off+45, y_off+15, "W:"); u8g2_DrawStr(u8g2, x_off+45, y_off+15, "W:");
u8g2_DrawStr(u8g2, x_off+55, y_off+15, u16toa(power)); 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) { if (enabled) {
funDigitalWrite(PIN_12V, 1); funDigitalWrite(PIN_12V, 1);
@ -613,7 +623,7 @@ __attribute__((noreturn)) int main(void)
if (pwm) { if (pwm) {
const uint16_t tim_max = FUNCONF_SYSTEM_CORE_CLOCK / PWM_FREQ_HZ - 1; const uint16_t tim_max = FUNCONF_SYSTEM_CORE_CLOCK / PWM_FREQ_HZ - 1;
pwm_set(((u32)duty*tim_max)/100); 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 { } else {
pwm_set(0); pwm_set(0);
} }