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]