M module-bsp/board/linux/battery-charger/battery_charger.cpp => module-bsp/board/linux/battery-charger/battery_charger.cpp +5 -1
@@ 48,6 48,9 @@ namespace bsp
return 1;
}
Store::Battery::modify().level = battLevel;
+
+ uint8_t notification = static_cast<uint8_t>(bsp::batteryIRQSource::checkCriticalLevel);
+ xQueueSend(qHandleIrq, ¬ification, 100);
return 0;
}
@@ 109,7 112,6 @@ namespace bsp
if (battLevel >= 1)
battLevel--;
break;
- }
xQueueSend(qHandleIrq, ¬ification, 100);
}
vTaskDelay(50);
@@ 119,6 121,8 @@ namespace bsp
void battery_setCriticalLevel(std::uint8_t level)
{
batteryCriticalLevel = level;
+ uint8_t notification = static_cast<uint8_t>(bsp::batteryIRQSource::checkCriticalLevel);
+ xQueueSend(qHandleIrq, ¬ification, 100);
}
bool battery_isLevelCritical(std::uint8_t level)
M module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp => module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp +9 -0
@@ 179,6 179,11 @@ namespace bsp
s_BSP_BatteryChargerIrqPinsInit();
+ if (qHandleIrq != NULL) {
+ uint8_t val = static_cast<uint8_t>(bsp::batteryIRQSource::checkCriticalLevel);
+ xQueueSendFromISR(qHandleIrq, &val, &xHigherPriorityTaskWoken);
+ }
+
return 0;
}
@@ 199,6 204,10 @@ namespace bsp
void battery_setCriticalLevel(std::uint8_t level)
{
batteryLevelCritical = level;
+ if (qHandleIrq != NULL) {
+ uint8_t val = static_cast<uint8_t>(bsp::batteryIRQSource::checkCriticalLevel);
+ xQueueSendFromISR(qHandleIrq, &val, &xHigherPriorityTaskWoken);
+ }
}
bool battery_isLevelCritical(std::uint8_t level)
M module-bsp/bsp/battery-charger/battery_charger.hpp => module-bsp/bsp/battery-charger/battery_charger.hpp +2 -1
@@ 99,7 99,8 @@ namespace bsp{
enum class batteryIRQSource{
INTB = 0x01,
- INOKB = 0x02
+ INOKB = 0x02,
+ checkCriticalLevel
};
int battery_Init(xQueueHandle qHandle);
M module-services/service-evtmgr/WorkerEvent.cpp => module-services/service-evtmgr/WorkerEvent.cpp +10 -2
@@ 90,7 90,7 @@ bool WorkerEvent::handleMessage(uint32_t queueID)
if (!queue->Dequeue(¬ification, 0)) {
return false;
}
- if (notification & static_cast<uint8_t>(bsp::batteryIRQSource::INTB)) {
+ if (notification == static_cast<uint8_t>(bsp::batteryIRQSource::INTB)) {
uint8_t battLevel = 0;
bsp::battery_getBatteryLevel(battLevel);
bsp::battery_ClearAllIRQs();
@@ 103,7 103,7 @@ bool WorkerEvent::handleMessage(uint32_t queueID)
sys::Bus::SendUnicast(levelCriticalMessage, service::name::system_manager, this->service);
}
}
- if (notification & static_cast<uint8_t>(bsp::batteryIRQSource::INOKB)) {
+ if (notification == static_cast<uint8_t>(bsp::batteryIRQSource::INOKB)) {
bool status;
bsp::battery_getChargeStatus(status);
bsp::battery_ClearAllIRQs();
@@ 111,6 111,14 @@ bool WorkerEvent::handleMessage(uint32_t queueID)
message->plugged = status;
sys::Bus::SendUnicast(message, service::name::evt_manager, this->service);
}
+ if (notification == static_cast<uint8_t>(bsp::batteryIRQSource::checkCriticalLevel)) {
+ if (Store::Battery::get().state == Store::Battery::State::Discharging) {
+ if (bsp::battery_isLevelCritical(Store::Battery::get().level)) {
+ auto levelCriticalMessage = std::make_shared<sevm::BatteryLevelCriticalMessage>();
+ sys::Bus::SendUnicast(levelCriticalMessage, service::name::system_manager, this->service);
+ }
+ }
+ }
}
if (queueID == static_cast<uint32_t>(WorkerEventQueues::queueRTC)) {