From 61f034b288f05d5d71ccb211205cd540aa759159 Mon Sep 17 00:00:00 2001 From: chenjintao Date: Tue, 25 Aug 2026 10:03:36 +0800 Subject: [PATCH] fix(battery): harden charge-complete inference --- .../runtime/control_plane_battery_service.c | 15 ++++++++----- main/Kconfig.projbuild | 22 +++++++++++++++++++ sdkconfig.defaults | 3 +++ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/components/control_plane/src/runtime/control_plane_battery_service.c b/components/control_plane/src/runtime/control_plane_battery_service.c index b2ffa6d..fe024de 100644 --- a/components/control_plane/src/runtime/control_plane_battery_service.c +++ b/components/control_plane/src/runtime/control_plane_battery_service.c @@ -22,9 +22,9 @@ #define BATTERY_STOP_POLL_MS 10 #define BATTERY_CHARGE_DEBOUNCE_MS 30 #define BATTERY_FULL_CONFIRM_RETRY_MS 1000 -#define BATTERY_FULL_CONFIRM_TIME_MS 5000 +#define BATTERY_FULL_CONFIRM_TIME_MS \ + ((uint32_t)CONFIG_TQ_BATTERY_FULL_CONFIRM_SEC * 1000U) #define BATTERY_FULL_CONFIRM_SAMPLES 3U -#define BATTERY_FULL_MIN_VOLTAGE_MV 4050 #define BATTERY_SHUTDOWN_CONFIRM_SAMPLES 3U #define BATTERY_EMERGENCY_CONFIRM_SAMPLES 2U #define BATTERY_SHUTDOWN_RETRY_MS 1000 @@ -339,8 +339,9 @@ static void control_plane_battery_full_hint_hook( } ESP_LOGI(TAG, - "Inferred charge-complete prompt start voltage=%dmV file=%s", + "Inferred charge-complete prompt start voltage=%dmV level=%u%% file=%s", status->voltage_mv, + (unsigned)status->percentage, BATTERY_FULL_PROMPT_FILE); esp_err_t prompt_err = domain_runtime_behavior_play_prompt_file( BATTERY_FULL_PROMPT_FILE); @@ -453,11 +454,13 @@ static void battery_worker(void *arg) if (full_hint_candidate && status.valid && !status.measurement_suppressed) { if (status.charge_state != DOMAIN_BATTERY_CHARGE_NOT_CHARGING || - status.voltage_mv < BATTERY_FULL_MIN_VOLTAGE_MV) { + status.voltage_mv < CONFIG_TQ_BATTERY_FULL_MIN_VOLTAGE_MV || + status.percentage < CONFIG_TQ_BATTERY_FULL_MIN_PERCENT) { ESP_LOGI(TAG, - "Charge-complete inference cancelled charge=%s voltage=%dmV", + "Charge-complete inference cancelled charge=%s voltage=%dmV level=%u%%", charge_state_name(status.charge_state), - status.voltage_mv); + status.voltage_mv, + (unsigned)status.percentage); full_hint_candidate = false; full_hint_confirmations = 0U; } else { diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index d88d17c..7b61020 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -979,6 +979,28 @@ menu "Example Configuration" range 0 1 depends on TQ_BATTERY_ENABLE + config TQ_BATTERY_FULL_MIN_VOLTAGE_MV + int "Minimum voltage for charge-complete prompt (mV)" + default 4150 + range 4000 4200 + depends on TQ_BATTERY_ENABLE + help + The TP4057 status pin cannot distinguish charge termination + from charger removal. Require at least this filtered battery + voltage before inferring that charging has completed. + + config TQ_BATTERY_FULL_MIN_PERCENT + int "Minimum level for charge-complete prompt (percent)" + default 95 + range 90 100 + depends on TQ_BATTERY_ENABLE + + config TQ_BATTERY_FULL_CONFIRM_SEC + int "Charge-complete stable confirmation time (seconds)" + default 30 + range 5 300 + depends on TQ_BATTERY_ENABLE + config TQ_BATTERY_DIVIDER_HIGH_OHM int "Battery divider resistance from VBAT to ADC (ohm)" default 100000 diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 99512ec..add5a87 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -332,6 +332,9 @@ CONFIG_TQ_BATTERY_ENABLE=y CONFIG_TQ_BATTERY_ADC_GPIO=9 CONFIG_TQ_BATTERY_CHARGE_GPIO=10 CONFIG_TQ_BATTERY_CHARGE_ACTIVE_LEVEL=0 +CONFIG_TQ_BATTERY_FULL_MIN_VOLTAGE_MV=4150 +CONFIG_TQ_BATTERY_FULL_MIN_PERCENT=95 +CONFIG_TQ_BATTERY_FULL_CONFIRM_SEC=30 CONFIG_TQ_BATTERY_DIVIDER_HIGH_OHM=100000 CONFIG_TQ_BATTERY_DIVIDER_LOW_OHM=100000 CONFIG_TQ_BATTERY_CALIBRATION_GAIN_PPM=1000000