~aleteoryx/muditaos

90543e264fc1857ec7b13b3fd0be8095e472cb42 — Maciej Gibowicz 3 years ago 14f78ff
[MOS-648] Fix USB connection/disconnection detection

If there were errors while charging the battery,
e.g. too high temperature, the detection of USB
connection/disconnection failed.
M module-bsp/board/linux/hal/battery_charger/BatteryCharger.cpp => module-bsp/board/linux/hal/battery_charger/BatteryCharger.cpp +6 -0
@@ 39,6 39,7 @@ namespace hal::battery
        Voltage getBatteryVoltage() const final;
        std::optional<SOC> getSOC() const final;
        ChargingStatus getChargingStatus() const final;
        ChargerPresence getChargerPresence() const final;

      private:
        void worker();


@@ 94,6 95,11 @@ namespace hal::battery
            return ChargingStatus::Discharging;
        }
    }
    AbstractBatteryCharger::ChargerPresence BatteryCharger::getChargerPresence() const
    {
        return isPlugged ? AbstractBatteryCharger::ChargerPresence::PluggedIn
                         : AbstractBatteryCharger::ChargerPresence::Unplugged;
    }

    void BatteryCharger::worker()
    {

M module-bsp/board/rt1051/bellpx/hal/battery_charger/BatteryCharger.cpp => module-bsp/board/rt1051/bellpx/hal/battery_charger/BatteryCharger.cpp +8 -0
@@ 58,6 58,7 @@ namespace hal::battery
        Voltage getBatteryVoltage() const final;
        std::optional<SOC> getSOC() const final;
        ChargingStatus getChargingStatus() const final;
        ChargerPresence getChargerPresence() const final;

        static BatteryWorkerQueue &getWorkerQueueHandle();



@@ 179,6 180,13 @@ namespace hal::battery
            return ChargingStatus::PluggedNotCharging;
        }
    }

    AbstractBatteryCharger::ChargerPresence BellBatteryCharger::getChargerPresence() const
    {
        return getChargingStatus() == ChargingStatus::Discharging ? AbstractBatteryCharger::ChargerPresence::Unplugged
                                                                  : AbstractBatteryCharger::ChargerPresence::PluggedIn;
    }

    std::optional<AbstractBatteryCharger::SOC> BellBatteryCharger::fetchBatterySOC() const
    {
        if (const auto soc = fuel_gauge.get_battery_soc(); const auto scaled_soc = scale_soc(*soc)) {

M module-bsp/board/rt1051/puretx/bsp/battery_charger/battery_charger.cpp => module-bsp/board/rt1051/puretx/bsp/battery_charger/battery_charger.cpp +10 -0
@@ 941,4 941,14 @@ namespace bsp::battery_charger
        LOG_INFO("\tAvgCurrent: %dmA", getAvgCurrent());
        LOG_INFO("\tRawSoC: %d%%", getBatteryLevel().value());
    }

    bool isChargerPlugged()
    {
        const auto chargerStatus = chargerRead(Registers::CHG_INT_OK);
        if (chargerStatus.first != kStatus_Success) {
            LOG_ERROR("failed to read charger status");
            return false;
        }
        return chargerStatus.second & static_cast<std::uint8_t>(CHG_INT::CHGIN_I);
    }
} // namespace bsp::battery_charger

M module-bsp/board/rt1051/puretx/bsp/battery_charger/battery_charger.hpp => module-bsp/board/rt1051/puretx/bsp/battery_charger/battery_charger.hpp +2 -0
@@ 92,4 92,6 @@ namespace bsp::battery_charger

    bool checkConfigurationFile(std::ifstream &file);

    bool isChargerPlugged();

} // namespace bsp::battery_charger

M module-bsp/board/rt1051/puretx/hal/battery_charger/BatteryCharger.cpp => module-bsp/board/rt1051/puretx/hal/battery_charger/BatteryCharger.cpp +6 -0
@@ 85,6 85,7 @@ namespace hal::battery
        Voltage getBatteryVoltage() const final;
        std::optional<SOC> getSOC() const final;
        ChargingStatus getChargingStatus() const final;
        ChargerPresence getChargerPresence() const final;

        static BatteryWorkerQueue &getWorkerQueueHandle();



@@ 173,6 174,11 @@ namespace hal::battery
    {
        return transformChargingState(bsp::battery_charger::getChargeStatus());
    }
    AbstractBatteryCharger::ChargerPresence PureBatteryCharger::getChargerPresence() const
    {
        return bsp::battery_charger::isChargerPlugged() ? AbstractBatteryCharger::ChargerPresence::PluggedIn
                                                        : AbstractBatteryCharger::ChargerPresence::Unplugged;
    }
    PureBatteryCharger::BatteryWorkerQueue &PureBatteryCharger::getWorkerQueueHandle()
    {
        return *workerQueue;

M module-bsp/hal/include/hal/battery_charger/AbstractBatteryCharger.hpp => module-bsp/hal/include/hal/battery_charger/AbstractBatteryCharger.hpp +8 -0
@@ 33,6 33,13 @@ namespace hal::battery
            Brownout
        };

        enum class ChargerPresence
        {
            Undefined,
            PluggedIn,
            Unplugged
        };

        struct Factory
        {
            static std::unique_ptr<AbstractBatteryCharger> create(xQueueHandle);


@@ 43,6 50,7 @@ namespace hal::battery
        virtual Voltage getBatteryVoltage() const        = 0;
        virtual std::optional<SOC> getSOC() const        = 0;
        virtual ChargingStatus getChargingStatus() const = 0;
        virtual ChargerPresence getChargerPresence() const = 0;

        static_assert(sizeof(Events) == sizeof(std::uint8_t),
                      "All events processed by event manager ought to have size of std::uint8_t");

M module-services/service-evtmgr/battery/BatteryController.cpp => module-services/service-evtmgr/battery/BatteryController.cpp +8 -12
@@ 99,7 99,7 @@ void sevm::battery::BatteryController::handleNotification(Events evt)
    LOG_INFO("Incoming event: %s", std::string{magic_enum::enum_name(evt)}.c_str());
    switch (evt) {
    case Events::Charger:
        checkPlugState();
        checkChargerPresence();
        update();
        break;
    case Events::SOC:


@@ 153,18 153,14 @@ void sevm::battery::BatteryController::updateSoC()
    }
}

void sevm::battery::BatteryController::checkPlugState()
void sevm::battery::BatteryController::checkChargerPresence()
{
    const auto chargingState = Store::Battery::get().state;
    auto newState            = transformChargingState(charger->getChargingStatus());

    if (chargingState == Store::Battery::State::Discharging && newState != Store::Battery::State::Discharging) {
        service->bus.sendUnicast(std::make_shared<sevm::USBPlugEvent>(sevm::USBPlugEvent::Event::CablePlugged),
                                 service::name::service_desktop);
    }

    if (chargingState != Store::Battery::State::Discharging && newState == Store::Battery::State::Discharging) {
        service->bus.sendUnicast(std::make_shared<sevm::USBPlugEvent>(sevm::USBPlugEvent::Event::CableUnplugged),
    const auto newChargerPresence = charger->getChargerPresence();
    if (chargerPresence != newChargerPresence) {
        service->bus.sendUnicast(std::make_shared<sevm::USBPlugEvent>(newChargerPresence == ChargerPresence::PluggedIn
                                                                          ? sevm::USBPlugEvent::Event::CablePlugged
                                                                          : sevm::USBPlugEvent::Event::CableUnplugged),
                                 service::name::service_desktop);
        chargerPresence = newChargerPresence;
    }
}

M module-services/service-evtmgr/battery/BatteryController.hpp => module-services/service-evtmgr/battery/BatteryController.hpp +3 -1
@@ 19,6 19,7 @@ namespace sevm::battery
    {
      public:
        using Events = hal::battery::AbstractBatteryCharger::Events;
        using ChargerPresence = hal::battery::AbstractBatteryCharger::ChargerPresence;
        explicit BatteryController(sys::Service *service, xQueueHandle notificationChannel);

        void poll();


@@ 30,10 31,11 @@ namespace sevm::battery
        void update();
        void updateSoC();
        void printCurrentState();
        void checkPlugState();
        void checkChargerPresence();
        sys::Service *service{nullptr};
        std::unique_ptr<hal::battery::AbstractBatteryCharger> charger;
        BatteryBrownoutDetector brownoutDetector;
        BatteryState batteryState;
        ChargerPresence chargerPresence{ChargerPresence::Undefined};
    };
}; // namespace sevm::battery

M pure_changelog.md => pure_changelog.md +1 -0
@@ 4,6 4,7 @@

### Fixed
* Fixed PLAY label translation in German
* Fixed USB connection/disconnection detection

## [1.3.0 2022-08-04]