// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "BatteryLevelCheck.hpp" #include "service-evtmgr/BatteryMessages.hpp" #include "SystemManager/Constants.hpp" #include #include namespace battery_level_check { namespace { enum class CheckState { InitialCheck, LevelCritical, LevelNormal }; CheckState state = CheckState::InitialCheck; constexpr inline auto DEFAULT_LEVEL = 10; unsigned int batteryLevelCritical = DEFAULT_LEVEL; sys::Service *parentService = nullptr; bool isBatteryLevelCritical(unsigned int level) { return level < batteryLevelCritical; } void sendCriticalLevelMessage() { auto levelCriticalMessage = std::make_shared(); sys::Bus::SendUnicast(levelCriticalMessage, service::name::system_manager, parentService); } void sendNormalLevelMessage() { auto levelNormalMessage = std::make_shared(); sys::Bus::SendUnicast(levelNormalMessage, service::name::system_manager, parentService); } } // namespace void init(sys::Service *service) { parentService = service; } void checkBatteryLevelCritical() { switch (state) { case CheckState::InitialCheck: if (isBatteryLevelCritical(Store::Battery::get().level)) { sendCriticalLevelMessage(); state = CheckState::LevelCritical; } else { sendNormalLevelMessage(); state = CheckState::LevelNormal; } break; case CheckState::LevelCritical: if (!isBatteryLevelCritical(Store::Battery::get().level)) { sendNormalLevelMessage(); state = CheckState::LevelNormal; } break; case CheckState::LevelNormal: if (isBatteryLevelCritical(Store::Battery::get().level)) { sendCriticalLevelMessage(); state = CheckState::LevelCritical; } break; } } void setBatteryCriticalLevel(unsigned int level) { batteryLevelCritical = level; checkBatteryLevelCritical(); } } // namespace battery_level_check