From 4b27ef0763f6fb47815018e0fb3cb820bd362840 Mon Sep 17 00:00:00 2001 From: Wojtek Rzepecki Date: Wed, 16 Dec 2020 10:25:02 +0100 Subject: [PATCH] [EGD-4952] Added battery check at init and if crit level changed --- .../board/linux/battery-charger/battery_charger.cpp | 6 +++++- .../rt1051/bsp/battery-charger/battery_charger.cpp | 9 +++++++++ module-bsp/bsp/battery-charger/battery_charger.hpp | 3 ++- module-services/service-evtmgr/WorkerEvent.cpp | 12 ++++++++++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/module-bsp/board/linux/battery-charger/battery_charger.cpp b/module-bsp/board/linux/battery-charger/battery_charger.cpp index 29732016cdbcbcc04996c976b6e56e7e80d3e96f..90fefe25a99c3e9e63dea560eb931b1682189a2b 100644 --- a/module-bsp/board/linux/battery-charger/battery_charger.cpp +++ b/module-bsp/board/linux/battery-charger/battery_charger.cpp @@ -48,6 +48,9 @@ namespace bsp return 1; } Store::Battery::modify().level = battLevel; + + uint8_t notification = static_cast(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(bsp::batteryIRQSource::checkCriticalLevel); + xQueueSend(qHandleIrq, ¬ification, 100); } bool battery_isLevelCritical(std::uint8_t level) diff --git a/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp b/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp index d99bc43c6bb8ef5a0c81d9088068ef469522e799..ea106e969a244a4dbf40ec593818c0823316bec3 100644 --- a/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp +++ b/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp @@ -179,6 +179,11 @@ namespace bsp s_BSP_BatteryChargerIrqPinsInit(); + if (qHandleIrq != NULL) { + uint8_t val = static_cast(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(bsp::batteryIRQSource::checkCriticalLevel); + xQueueSendFromISR(qHandleIrq, &val, &xHigherPriorityTaskWoken); + } } bool battery_isLevelCritical(std::uint8_t level) diff --git a/module-bsp/bsp/battery-charger/battery_charger.hpp b/module-bsp/bsp/battery-charger/battery_charger.hpp index f753d4ddde502b86d9fc2cde34ba26c03bfaf7b4..e862aec60dbefd84bdbd92a5ec4814d58011c89d 100644 --- a/module-bsp/bsp/battery-charger/battery_charger.hpp +++ b/module-bsp/bsp/battery-charger/battery_charger.hpp @@ -99,7 +99,8 @@ namespace bsp{ enum class batteryIRQSource{ INTB = 0x01, - INOKB = 0x02 + INOKB = 0x02, + checkCriticalLevel }; int battery_Init(xQueueHandle qHandle); diff --git a/module-services/service-evtmgr/WorkerEvent.cpp b/module-services/service-evtmgr/WorkerEvent.cpp index 2bf4d107156cd0e90ea75c8fdbb7c257157cb85a..bce15f75dac051e1c97ea6b204f26986443e8278 100644 --- a/module-services/service-evtmgr/WorkerEvent.cpp +++ b/module-services/service-evtmgr/WorkerEvent.cpp @@ -90,7 +90,7 @@ bool WorkerEvent::handleMessage(uint32_t queueID) if (!queue->Dequeue(¬ification, 0)) { return false; } - if (notification & static_cast(bsp::batteryIRQSource::INTB)) { + if (notification == static_cast(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(bsp::batteryIRQSource::INOKB)) { + if (notification == static_cast(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(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(); + sys::Bus::SendUnicast(levelCriticalMessage, service::name::system_manager, this->service); + } + } + } } if (queueID == static_cast(WorkerEventQueues::queueRTC)) {