M products/BellHybrid/services/evtmgr/CMakeLists.txt => products/BellHybrid/services/evtmgr/CMakeLists.txt +2 -0
@@ 12,6 12,7 @@ target_sources(evtmgr
internal/StaticData.hpp
screen-light-control/ScreenLightControl.cpp
backlight-handler/BacklightHandler.cpp
+ user-activity-handler/UserActivityHandler.cpp
internal/key_sequences/AbstractKeySequence.hpp
internal/key_sequences/KeySequenceMgr.hpp
@@ 26,6 27,7 @@ target_sources(evtmgr
include/evtmgr/EventManager.hpp
include/evtmgr/api/TemperatureApi.hpp
include/evtmgr/backlight-handler/BacklightHandler.hpp
+ include/evtmgr/user-activity-handler/UserActivityHandler.hpp
)
target_include_directories(evtmgr
M products/BellHybrid/services/evtmgr/EventManager.cpp => products/BellHybrid/services/evtmgr/EventManager.cpp +2 -1
@@ 38,7 38,7 @@ namespace
EventManager::EventManager(const std::string &name)
: EventManagerCommon(name), temperatureSource{hal::temperature::AbstractTemperatureSource::Factory::create()},
- backlightHandler(settings, this)
+ backlightHandler(settings, this), userActivityHandler(std::make_shared<sys::CpuSentinel>(name, this), this)
{
buildKeySequences();
updateTemperature(*temperatureSource);
@@ 56,6 56,7 @@ void EventManager::handleKeyEvent(sys::Message *msg)
}
if (kbdMessage->key.state == RawKey::State::Pressed || kbdMessage->key.state == RawKey::State::Moved) {
+ userActivityHandler.handleUserInput();
backlightHandler.handleKeyPressed(static_cast<int>(mapKey(static_cast<gui::KeyCode>(kbdMessage->key.keyCode))));
}
M products/BellHybrid/services/evtmgr/include/evtmgr/EventManager.hpp => products/BellHybrid/services/evtmgr/include/evtmgr/EventManager.hpp +2 -0
@@ 6,6 6,7 @@
#include <service-evtmgr/EventManagerCommon.hpp>
#include "backlight-handler/BacklightHandler.hpp"
+#include "user-activity-handler/UserActivityHandler.hpp"
class KeySequenceMgr;
@@ 27,6 28,7 @@ class EventManager : public EventManagerCommon
void buildKeySequences();
std::shared_ptr<hal::temperature::AbstractTemperatureSource> temperatureSource;
backlight::Handler backlightHandler;
+ evm::UserActivityHandler userActivityHandler;
std::shared_ptr<KeySequenceMgr> keySequenceMgr;
};
A products/BellHybrid/services/evtmgr/include/evtmgr/user-activity-handler/UserActivityHandler.hpp => products/BellHybrid/services/evtmgr/include/evtmgr/user-activity-handler/UserActivityHandler.hpp +25 -0
@@ 0,0 1,25 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#pragma once
+
+#include <Timers/TimerHandle.hpp>
+#include <SystemManager/CpuSentinel.hpp>
+#include <Service/Service.hpp>
+
+namespace evm
+{
+ class UserActivityHandler
+ {
+ public:
+ UserActivityHandler(std::shared_ptr<sys::CpuSentinel> cpuSentinel, sys::Service *parent);
+
+ void handleUserInput();
+
+ private:
+ void onUserActivityTimeout();
+
+ std::shared_ptr<sys::CpuSentinel> cpuSentinel;
+ sys::TimerHandle activityTimer;
+ };
+} // namespace evm
A products/BellHybrid/services/evtmgr/user-activity-handler/UserActivityHandler.cpp => products/BellHybrid/services/evtmgr/user-activity-handler/UserActivityHandler.cpp +36 -0
@@ 0,0 1,36 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#include <evtmgr/user-activity-handler/UserActivityHandler.hpp>
+#include <Timers/TimerFactory.hpp>
+
+namespace evm
+{
+ namespace
+ {
+ constexpr auto userActivityTimerTime = std::chrono::seconds(10);
+ constexpr auto userActivityCPULevel = bsp::CpuFrequencyHz::Level_5;
+ } // namespace
+
+ UserActivityHandler::UserActivityHandler(std::shared_ptr<sys::CpuSentinel> cpuSentinel, sys::Service *parent)
+ : cpuSentinel{std::move(cpuSentinel)},
+ activityTimer{sys::TimerFactory::createSingleShotTimer(
+ parent, "UserActivityTimer", userActivityTimerTime, [this]([[maybe_unused]] sys::Timer &timer) {
+ onUserActivityTimeout();
+ })}
+ {}
+
+ void UserActivityHandler::handleUserInput()
+ {
+ if (!activityTimer.isActive()) {
+ cpuSentinel->HoldMinimumFrequency(userActivityCPULevel);
+ }
+ activityTimer.restart(userActivityTimerTime);
+ }
+
+ void UserActivityHandler::onUserActivityTimeout()
+ {
+ cpuSentinel->ReleaseMinimumFrequency();
+ }
+
+} // namespace evm