M module-bsp/board/linux/battery-charger/battery_charger.cpp => module-bsp/board/linux/battery-charger/battery_charger.cpp +15 -0
@@ 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
M module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp => module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp +14 -0
@@ 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;
M module-bsp/bsp/battery-charger/battery_charger.hpp => module-bsp/bsp/battery-charger/battery_charger.hpp +6 -0
@@ 8,6 8,8 @@
#ifndef MODULE_BSP_BSP_BATTERY_CHARGER_BATTERY_CHARGER_HPP_
#define MODULE_BSP_BSP_BATTERY_CHARGER_BATTERY_CHARGER_HPP_
+#include <cstdint>
+
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();
M module-services/service-evtmgr/EventManager.cpp => module-services/service-evtmgr/EventManager.cpp +7 -0
@@ 20,6 20,7 @@
#include <bsp/magnetometer/magnetometer.hpp>
#include <bsp/rtc/rtc.hpp>
#include <bsp/torch/torch.hpp>
+#include <bsp/battery-charger/battery_charger.hpp>
#include <common_data/RawKey.hpp>
#include <log/log.hpp>
#include <module-utils/time/time_conversion.hpp>
@@ 285,6 286,12 @@ sys::ReturnCodes EventManager::InitHandler()
return std::make_shared<sys::ResponseMessage>();
});
+ connect(sevm::BatterySetCriticalLevel(0), [&](sys::Message *msgl) {
+ auto request = static_cast<sevm::BatterySetCriticalLevel *>(msgl);
+ bsp::battery_setCriticalLevel(request->criticalLevel);
+ return std::make_shared<sys::ResponseMessage>();
+ });
+
// initialize keyboard worker
EventWorker = std::make_unique<WorkerEvent>(this);
M module-services/service-evtmgr/WorkerEvent.cpp => module-services/service-evtmgr/WorkerEvent.cpp +5 -0
@@ 28,6 28,7 @@
#include <service-audio/AudioMessage.hpp>
#include <service-desktop/Constants.hpp>
#include <service-desktop/DesktopMessages.hpp>
+#include <SystemManager/SystemManager.hpp>
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<sevm::BatteryLevelCriticalMessage>();
+ sys::Bus::SendUnicast(levelCriticalMessage, service::name::system_manager, this->service);
+ }
}
if (notification & static_cast<uint8_t>(bsp::batteryIRQSource::INOKB)) {
bool status;
M module-services/service-evtmgr/service-evtmgr/BatteryMessages.hpp => module-services/service-evtmgr/service-evtmgr/BatteryMessages.hpp +15 -0
@@ 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
M module-sys/SystemManager/SystemManager.cpp => module-sys/SystemManager/SystemManager.cpp +5 -0
@@ 312,6 312,11 @@ namespace sys
return MessageNone{};
});
+ connect(sevm::BatteryLevelCriticalMessage(), [&](Message *) {
+ LOG_INFO("Battery Critical Level");
+ return MessageNone{};
+ });
+
return ReturnCodes::Success;
}
M source/MessageType.hpp => source/MessageType.hpp +2 -0
@@ 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.