diff --git a/APP/app_adc.c b/APP/app_adc.c index 96d4059..cc583a6 100644 --- a/APP/app_adc.c +++ b/APP/app_adc.c @@ -358,6 +358,7 @@ static void app_adc_volume_process(void) static uint16_t s_vbat_raw = 0; static uint8_t s_vbat_valid = 0; static uint8_t s_charge_ui_allowed = 0; +static uint8_t s_pct_shown_valid = 0; /* 高于 6.8V 才允许点亮关机充电页;未采样视为不允许 */ uint8_t app_adc_charge_ui_allowed(void) @@ -396,6 +397,7 @@ void app_adc_init(void) s_vbat_raw = 0; s_vbat_valid = 0; s_charge_ui_allowed = 0; + s_pct_shown_valid = 0; } /* 采样:读 ADC + 滑动平均 */ @@ -409,6 +411,25 @@ static void app_adc_battery_do_sample(void) bat_index = (bat_index + 1) % BAT_SAMPLE_COUNT; } +/* 显示电量:四舍五入到 5%,之后每次最多升/降 5,避免一下掉一截。关机仍看原始电压。 */ +static uint8_t bat_display_percent(uint8_t raw_pct) +{ + uint8_t q = (uint8_t)((((uint16_t)raw_pct + 2u) / 5u) * 5u); + + if (q > 100u) + q = 100u; + if (!s_pct_shown_valid) + { + s_pct_shown_valid = 1u; + return q; + } + if ((uint16_t)q + 5u < percentage) + return (uint8_t)(percentage - 5u); + if (q > (uint8_t)(percentage + 5u)) + return (uint8_t)(percentage + 5u); + return q; +} + /* 上报:映射成百分比,变化才发消息;低于等于 6.8V 触发低电量关机(插着 Type-C 也执行) */ static void app_adc_battery_report(void) { @@ -437,6 +458,7 @@ static void app_adc_battery_report(void) MainTask_Sendmsg(MSG_ID_LOW_BAT_TIP, pct, filtered, 0); } + pct = bat_display_percent(pct); pct_changed = (pct != percentage) ? 1u : 0u; allow_changed = (allow != s_charge_ui_allowed) ? 1u : 0u; s_charge_ui_allowed = allow; @@ -445,7 +467,7 @@ static void app_adc_battery_report(void) if (usb_charging_state && !powon) { - /* 跨过 6.8V 也要通知,否则百分比不变时充电页不会亮或熄 */ + /* 跨过 6.8V 时通知界面:高于则一直亮,否则 10s 后关屏 */ if (pct_changed || allow_changed) MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, usb_charging_state, 0); }