From 293c21125ff3b6d5e08a568db0f8c7ab3fd8538c Mon Sep 17 00:00:00 2001 From: David Lechner Date: Sat, 4 Jul 2026 15:40:21 -0500 Subject: [PATCH] pbio/sys/battery: Add hysteresis to battery full level check. Avoids the light blinking red then green a few times before staying solid on green --- lib/pbio/sys/battery.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/pbio/sys/battery.c b/lib/pbio/sys/battery.c index 8f4e7e17b..422a65829 100644 --- a/lib/pbio/sys/battery.c +++ b/lib/pbio/sys/battery.c @@ -27,6 +27,7 @@ // These values are for LEGO rechargeable battery packs #define LIION_FULL_MV 8190 // 4.095V per cell +#define LIION_FULL_HYSTERESIS_MV 100 // 50mV per cell hysteresis on full level check #define LIION_OK_MV 7200 // 3.6V per cell #define LIION_LOW_MV 6800 // 3.4V per cell #define LIION_CRITICAL_MV 6000 // 3.0V per cell @@ -127,7 +128,16 @@ void pbsys_battery_poll(void) { * This is only valid on hubs with a built-in battery charger. */ bool pbsys_battery_is_full(void) { - return pbio_battery_get_average_voltage() >= LIION_FULL_MV; + static bool was_full; + int32_t voltage = pbio_battery_get_average_voltage(); + + if (was_full) { + was_full = voltage >= LIION_FULL_MV - LIION_FULL_HYSTERESIS_MV; + } else { + was_full = voltage >= LIION_FULL_MV; + } + + return was_full; } #endif // PBSYS_CONFIG_BATTERY