diff --git a/core/embed/sys/power_manager/fuel_gauge/fuel_gauge.c b/core/embed/sys/power_manager/fuel_gauge/fuel_gauge.c index 39360f7be6..4e3df855fb 100644 --- a/core/embed/sys/power_manager/fuel_gauge/fuel_gauge.c +++ b/core/embed/sys/power_manager/fuel_gauge/fuel_gauge.c @@ -41,6 +41,8 @@ void fuel_gauge_reset(fuel_gauge_state_t* state) { } void fuel_gauge_set_soc(fuel_gauge_state_t* state, float soc, float P) { + soc = fmaxf(0.0f, fminf(soc, 1.0f)); // Clamp SOC to [0, 1] + // Set SOC directly state->soc = soc; state->soc_latched = soc; @@ -55,8 +57,9 @@ void fuel_gauge_initial_guess(fuel_gauge_state_t* state, float voltage_V, // Calculate OCV from terminal voltage and current float ocv = battery_meas_to_ocv(voltage_V, current_mA, temperature); - // Get SOC from OCV using lookup + // Extract SoC from battery model state->soc = battery_soc(ocv, temperature, discharging_mode); + state->soc = fmaxf(0.0f, fminf(state->soc, 1.0f)); // Clamp SOC to [0, 1] state->soc_latched = state->soc; } diff --git a/core/embed/sys/power_manager/stm32u5/power_monitoring.c b/core/embed/sys/power_manager/stm32u5/power_monitoring.c index df9887a2ea..c8f0965bc0 100644 --- a/core/embed/sys/power_manager/stm32u5/power_monitoring.c +++ b/core/embed/sys/power_manager/stm32u5/power_monitoring.c @@ -99,10 +99,7 @@ void pm_monitor_power_sources(void) { } // Ceil the float soc to user-friendly integer - uint8_t soc_ceiled_temp = (int)(drv->fuel_gauge.soc_latched * 100 + 0.999f); - if (soc_ceiled_temp != drv->soc_ceiled) { - drv->soc_ceiled = soc_ceiled_temp; - } + drv->soc_ceiled = (uint8_t)(drv->fuel_gauge.soc_latched * 100 + 0.999f); // Check battery voltage for low threshold if (drv->soc_ceiled <= PM_BATTERY_LOW_THRESHOLD_SOC && !drv->battery_low) {