From 243deec8d5ecc1c978b67c9b6651457259e636d2 Mon Sep 17 00:00:00 2001 From: Wojtek Rzepecki Date: Wed, 16 Dec 2020 09:26:53 +0100 Subject: [PATCH] [EGD-4952] Added critical level check + messages --- .../linux/battery-charger/battery_charger.cpp | 15 +++++++++++++++ .../bsp/battery-charger/battery_charger.cpp | 14 ++++++++++++++ .../bsp/battery-charger/battery_charger.hpp | 6 ++++++ module-services/service-evtmgr/EventManager.cpp | 7 +++++++ module-services/service-evtmgr/WorkerEvent.cpp | 5 +++++ .../service-evtmgr/BatteryMessages.hpp | 15 +++++++++++++++ module-sys/SystemManager/SystemManager.cpp | 5 +++++ source/MessageType.hpp | 2 ++ 8 files changed, 69 insertions(+) diff --git a/module-bsp/board/linux/battery-charger/battery_charger.cpp b/module-bsp/board/linux/battery-charger/battery_charger.cpp index 3e492dba81f15457edee098a9ed22a06bd39cc62..29732016cdbcbcc04996c976b6e56e7e80d3e96f 100644 --- a/module-bsp/board/linux/battery-charger/battery_charger.cpp +++ b/module-bsp/board/linux/battery-charger/battery_charger.cpp @@ -34,6 +34,10 @@ static uint8_t battLevel = 100; static bool plugged = false; namespace bsp { + namespace + { + std::uint8_t batteryCriticalLevel = 10; + } // namespace static void battery_worker(void *pvp); @@ -111,4 +115,15 @@ namespace bsp vTaskDelay(50); } } + + void battery_setCriticalLevel(std::uint8_t level) + { + batteryCriticalLevel = level; + } + + bool battery_isLevelCritical(std::uint8_t level) + { + return level <= batteryCriticalLevel; + } + } // namespace bsp 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 0c56c5c7dcefe1a156c11af65b179804941f2681..d99bc43c6bb8ef5a0c81d9088068ef469522e799 100644 --- a/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp +++ b/module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp @@ -100,6 +100,10 @@ static xQueueHandle qHandleIrq = NULL; namespace bsp { + namespace + { + std::uint8_t batteryLevelCritical = 10; + } // namespace // STATUS register bits enum B_STATUS @@ -192,6 +196,16 @@ namespace bsp gpio.reset(); } + void battery_setCriticalLevel(std::uint8_t level) + { + batteryLevelCritical = level; + } + + bool battery_isLevelCritical(std::uint8_t level) + { + return level <= batteryLevelCritical; + } + void battery_getBatteryLevel(uint8_t &levelPercent) { uint16_t val = 0; diff --git a/module-bsp/bsp/battery-charger/battery_charger.hpp b/module-bsp/bsp/battery-charger/battery_charger.hpp index 1e6c4b3b368b20f0ad47c712b0800ef9f6b1ea15..f753d4ddde502b86d9fc2cde34ba26c03bfaf7b4 100644 --- a/module-bsp/bsp/battery-charger/battery_charger.hpp +++ b/module-bsp/bsp/battery-charger/battery_charger.hpp @@ -8,6 +8,8 @@ #ifndef MODULE_BSP_BSP_BATTERY_CHARGER_BATTERY_CHARGER_HPP_ #define MODULE_BSP_BSP_BATTERY_CHARGER_BATTERY_CHARGER_HPP_ +#include + namespace bsp{ enum class batteryChargerRegisters{ @@ -111,6 +113,10 @@ namespace bsp{ void battery_ClearAllIRQs(void); void battery_clearFuelGuageIRQ(void); + + void battery_setCriticalLevel(std::uint8_t level); + + bool battery_isLevelCritical(std::uint8_t level); } BaseType_t BSP_BatteryChargerINOKB_IRQHandler(); diff --git a/module-services/service-evtmgr/EventManager.cpp b/module-services/service-evtmgr/EventManager.cpp index a0ae50276dbb6a9d5d20f94ab72c6e8b8fa1a88b..cfb86596608d5c435d7199d9409f814339b08237 100644 --- a/module-services/service-evtmgr/EventManager.cpp +++ b/module-services/service-evtmgr/EventManager.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -285,6 +286,12 @@ sys::ReturnCodes EventManager::InitHandler() return std::make_shared(); }); + connect(sevm::BatterySetCriticalLevel(0), [&](sys::Message *msgl) { + auto request = static_cast(msgl); + bsp::battery_setCriticalLevel(request->criticalLevel); + return std::make_shared(); + }); + // initialize keyboard worker EventWorker = std::make_unique(this); diff --git a/module-services/service-evtmgr/WorkerEvent.cpp b/module-services/service-evtmgr/WorkerEvent.cpp index 3af518c0c84c4bc35abb191f7d8ff7a6060598f3..2bf4d107156cd0e90ea75c8fdbb7c257157cb85a 100644 --- a/module-services/service-evtmgr/WorkerEvent.cpp +++ b/module-services/service-evtmgr/WorkerEvent.cpp @@ -28,6 +28,7 @@ #include #include #include +#include extern "C" { @@ -97,6 +98,10 @@ bool WorkerEvent::handleMessage(uint32_t queueID) message->levelPercents = battLevel; message->fullyCharged = false; sys::Bus::SendUnicast(message, service::name::evt_manager, this->service); + if (bsp::battery_isLevelCritical(battLevel)) { + auto levelCriticalMessage = std::make_shared(); + sys::Bus::SendUnicast(levelCriticalMessage, service::name::system_manager, this->service); + } } if (notification & static_cast(bsp::batteryIRQSource::INOKB)) { bool status; diff --git a/module-services/service-evtmgr/service-evtmgr/BatteryMessages.hpp b/module-services/service-evtmgr/service-evtmgr/BatteryMessages.hpp index a7c34904bac60c06afa60fad8db6b7258608654d..df54172bdf43d5cc91a54b2eb7aa062bc06a6bc2 100644 --- a/module-services/service-evtmgr/service-evtmgr/BatteryMessages.hpp +++ b/module-services/service-evtmgr/service-evtmgr/BatteryMessages.hpp @@ -29,4 +29,19 @@ namespace sevm } bool plugged = false; }; + class BatterySetCriticalLevel : public Message + { + public: + BatterySetCriticalLevel(std::uint8_t level) + : Message(MessageType::EVMBatterySetCriticalLevel), criticalLevel(level) + {} + std::uint8_t criticalLevel = 0; + }; + + class BatteryLevelCriticalMessage : public Message + { + public: + BatteryLevelCriticalMessage() : Message(MessageType::EVMBatteryLevelCritical) + {} + }; } // namespace sevm diff --git a/module-sys/SystemManager/SystemManager.cpp b/module-sys/SystemManager/SystemManager.cpp index a7a1c14f8f57554dbaacc3d2d799982d5cc7f9ae..21797454a8063c771f3543f291d5546993024196 100644 --- a/module-sys/SystemManager/SystemManager.cpp +++ b/module-sys/SystemManager/SystemManager.cpp @@ -312,6 +312,11 @@ namespace sys return MessageNone{}; }); + connect(sevm::BatteryLevelCriticalMessage(), [&](Message *) { + LOG_INFO("Battery Critical Level"); + return MessageNone{}; + }); + return ReturnCodes::Success; } diff --git a/source/MessageType.hpp b/source/MessageType.hpp index d9196b2acf6991acf0fcef82ce618fa1268ccfc6..7934fb42b708c3626553d2af206e6c3658edd6f1 100644 --- a/source/MessageType.hpp +++ b/source/MessageType.hpp @@ -166,6 +166,8 @@ enum class MessageType // battery charger messages EVMBatteryLevel, EVMChargerPlugged, + EVMBatterySetCriticalLevel, + EVMBatteryLevelCritical, // rtc messages EVMMinuteUpdated, ///< This message is send to current focused application on every minute time change. EVMTimeUpdated, ///< This message is send on every time update.