~aleteoryx/muditaos

544fab126043adda08957d9b3ff3517c90fcac41 — Mateusz Piesta 4 years ago cc3a3dd
[BH-1162] Battery SOC filtering

Added temporary fix for SOC calculation
during discharging.
M module-bsp/board/rt1051/bellpx/hal/battery_charger/BatteryCharger.cpp => module-bsp/board/rt1051/bellpx/hal/battery_charger/BatteryCharger.cpp +22 -4
@@ 19,13 19,14 @@ namespace hal::battery
        bsp::fuel_gauge::init(queueBatteryHandle);
        bsp::battery_charger::init(queueBatteryHandle);

        Store::Battery::modify().level = static_cast<unsigned int>(bsp::fuel_gauge::getBatteryLevel());
        Store::Battery::modify().state = Store::Battery::State::Discharging;
        lastSOC                        = bsp::fuel_gauge::getBatteryLevel();
        Store::Battery::modify().level = static_cast<unsigned int>(lastSOC);
    }

    int BatteryCharger::getBatteryVoltage()
    {
        constexpr auto dummyBatteryLevel = 100;
        return dummyBatteryLevel;
        return bsp::fuel_gauge::getVoltageFilteredMeasurement();
    }

    void BatteryCharger::BatteryCharger::deinit()


@@ 37,7 38,7 @@ namespace hal::battery


        if (notification == bsp::fuel_gauge::FuelGaugeUpdate) {
            Store::Battery::modify().level = bsp::fuel_gauge::getBatteryLevel();
            Store::Battery::modify().level = filterSOC();
        }
        eventsHandler.onStatusChanged();
    }


@@ 45,6 46,23 @@ namespace hal::battery
    void BatteryCharger::setChargingCurrentLimit(std::uint8_t)
    {}

    bsp::fuel_gauge::StateOfCharge BatteryCharger::filterSOC()
    {
        const auto currentSOC = bsp::fuel_gauge::getBatteryLevel();

        /** Due to unknown reasons, fuel gauge sometimes reports SOC raising even if charger is unplugged.
            In order to not confuse the user, SOC reported by fuel gage is filtered based on the last valid SOC
            value. This is not the ideal solution to the problem, but rather a quick&dirty solution which absolutely
           does not fixes the root cause.
        **/
        if (Store::Battery::get().state == Store::Battery::State::Discharging && currentSOC > lastSOC) {
            return lastSOC;
        }
        else {
            return currentSOC;
        }
    }

    BaseType_t IRQHandler(AbstractBatteryCharger::IRQSource source)
    {
        if (source == AbstractBatteryCharger::IRQSource::Charger) {

M module-bsp/board/rt1051/bellpx/hal/battery_charger/BatteryCharger.hpp => module-bsp/board/rt1051/bellpx/hal/battery_charger/BatteryCharger.hpp +4 -0
@@ 4,6 4,7 @@
#pragma once

#include <hal/battery_charger/AbstractBatteryCharger.hpp>
#include <bsp/fuel_gauge/fuel_gauge.hpp>

namespace hal::battery
{


@@ 18,6 19,9 @@ namespace hal::battery
        int getBatteryVoltage() final;

      private:
        bsp::fuel_gauge::StateOfCharge filterSOC();

        AbstractBatteryCharger::BatteryChargerEvents &eventsHandler;
        bsp::fuel_gauge::StateOfCharge lastSOC;
    };
} // namespace hal::battery