diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index b5977064..e97da88d 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -113,15 +113,20 @@ class HomeScreen : public UIScreen { void renderBatteryIndicator(DisplayDriver& display, uint16_t batteryMilliVolts, int* outIconX = nullptr) { // Use the BQ27220 fuel gauge SOC register for accurate percentage. - // Falls back to voltage estimation if the fuel gauge returns 0. + // Falls back to voltage estimation if the fuel gauge is uncalibrated. uint8_t batteryPercentage = board.getBatteryPercent(); - if (batteryPercentage == 0 && batteryMilliVolts > 0) { - const int minMilliVolts = 3000; - const int maxMilliVolts = 4200; - int pct = ((batteryMilliVolts - minMilliVolts) * 100) / (maxMilliVolts - minMilliVolts); - if (pct < 0) pct = 0; - if (pct > 100) pct = 100; - batteryPercentage = (uint8_t)pct; + + // Sanity check: if voltage says full but gauge disagrees significantly, + // the gauge hasn't calibrated yet — fall back to voltage estimate + int voltagePct = 0; + if (batteryMilliVolts > 0) { + voltagePct = ((batteryMilliVolts - 3000) * 100) / (4200 - 3000); + if (voltagePct < 0) voltagePct = 0; + if (voltagePct > 100) voltagePct = 100; + } + + if (batteryPercentage == 0 || abs((int)batteryPercentage - voltagePct) > 30) { + batteryPercentage = (uint8_t)voltagePct; } display.setColor(DisplayDriver::GREEN);