From c9b16c3064aacec99d7d2259a2c60bda959225f0 Mon Sep 17 00:00:00 2001 From: Maciej Gibowicz Date: Wed, 27 Jul 2022 11:31:33 +0200 Subject: [PATCH] [MOS-598] Improved keyboard responsiveness Add sentinel that increases and hold the CPU frequency after a button press event --- module-sys/SystemManager/CpuGovernor.cpp | 6 ++++ .../PurePhone/services/evtmgr/CMakeLists.txt | 1 + .../services/evtmgr/EventManager.cpp | 1 + .../evtmgr/include/evtmgr/EventManager.hpp | 6 ++-- .../include/evtmgr/UserActivityHandler.hpp | 25 +++++++++++++ .../UserActivityHandler.cpp | 36 +++++++++++++++++++ 6 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 products/PurePhone/services/evtmgr/include/evtmgr/UserActivityHandler.hpp create mode 100644 products/PurePhone/services/evtmgr/user-activity-handler/UserActivityHandler.cpp diff --git a/module-sys/SystemManager/CpuGovernor.cpp b/module-sys/SystemManager/CpuGovernor.cpp index a56a092836caa7bf55462e8bafcd3b20be7348a9..8e731e569f4b9321b924321a883885342b91a753 100644 --- a/module-sys/SystemManager/CpuGovernor.cpp +++ b/module-sys/SystemManager/CpuGovernor.cpp @@ -81,15 +81,21 @@ namespace sys void CpuGovernor::SetCpuFrequencyRequest(const std::string &sentinelName, bsp::CpuFrequencyMHz request) { + auto isSentinelRecognized = false; for (auto &sentinel : sentinels) { auto sentinelWeakPointer = sentinel->GetSentinel(); if (!sentinelWeakPointer.expired()) { std::shared_ptr sharedResource = sentinelWeakPointer.lock(); if (sharedResource->GetName() == sentinelName) { sentinel->SetRequestedFrequency(request); + isSentinelRecognized = true; + break; } } } + if (!isSentinelRecognized) { + LOG_WARN("Sentinel %s is not recognized!", sentinelName.c_str()); + } } void CpuGovernor::ResetCpuFrequencyRequest(const std::string &sentinelName) diff --git a/products/PurePhone/services/evtmgr/CMakeLists.txt b/products/PurePhone/services/evtmgr/CMakeLists.txt index ff8f481945474736de86851d97e8cf1944b609d4..a8b6a583b3c89a5248a3e56e8f5dd4fe58fcece7 100644 --- a/products/PurePhone/services/evtmgr/CMakeLists.txt +++ b/products/PurePhone/services/evtmgr/CMakeLists.txt @@ -7,6 +7,7 @@ target_sources(evtmgr WorkerEvent.hpp screen-light-control/ScreenLightControl.cpp backlight-handler/BacklightHandler.cpp + user-activity-handler/UserActivityHandler.cpp PUBLIC include/evtmgr/EVMessages.hpp include/evtmgr/EventManager.hpp diff --git a/products/PurePhone/services/evtmgr/EventManager.cpp b/products/PurePhone/services/evtmgr/EventManager.cpp index 4d9cbb603a8bc5b42f433c068ce7de4f979eb723..6a89a410e6f3e46e967aaff8b084444fa403b20e 100644 --- a/products/PurePhone/services/evtmgr/EventManager.cpp +++ b/products/PurePhone/services/evtmgr/EventManager.cpp @@ -177,6 +177,7 @@ void EventManager::handleKeyEvent(sys::Message *msg) } if (kbdMessage->key.state == RawKey::State::Pressed) { + userActivityHandler.handleUserInput(); backlightHandler.handleKeyPressed(kbdMessage->key.keyCode); } else if (kbdMessage->key.state == RawKey::State::Moved) { diff --git a/products/PurePhone/services/evtmgr/include/evtmgr/EventManager.hpp b/products/PurePhone/services/evtmgr/include/evtmgr/EventManager.hpp index 6791f32e7ec1fc7280a9aaa1c2784387244a8825..803d7df8058e0d4e82b4d477cd5979af3b117389 100644 --- a/products/PurePhone/services/evtmgr/include/evtmgr/EventManager.hpp +++ b/products/PurePhone/services/evtmgr/include/evtmgr/EventManager.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -6,6 +6,7 @@ #include #include "BacklightHandler.hpp" +#include "UserActivityHandler.hpp" #include #include @@ -15,7 +16,7 @@ class EventManager : public EventManagerCommon explicit EventManager(LogDumpFunction logDumpFunction = nullptr, const std::string &name = service::name::evt_manager) : EventManagerCommon(logDumpFunction, name), vibrator(std::make_unique(this)), - backlightHandler(settings, this) + backlightHandler(settings, this), userActivityHandler(std::make_shared(name, this), this) {} private: @@ -36,6 +37,7 @@ class EventManager : public EventManagerCommon std::unique_ptr vibrator; backlight::Handler backlightHandler; + evm::UserActivityHandler userActivityHandler; }; namespace sys diff --git a/products/PurePhone/services/evtmgr/include/evtmgr/UserActivityHandler.hpp b/products/PurePhone/services/evtmgr/include/evtmgr/UserActivityHandler.hpp new file mode 100644 index 0000000000000000000000000000000000000000..07abf1472b72cdc523fd164220506f2fea887de9 --- /dev/null +++ b/products/PurePhone/services/evtmgr/include/evtmgr/UserActivityHandler.hpp @@ -0,0 +1,25 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include +#include +#include + +namespace evm +{ + class UserActivityHandler + { + public: + UserActivityHandler(std::shared_ptr cpuSentinel, sys::Service *parent); + + void handleUserInput(); + + private: + void onUserActivityTimeout(); + + std::shared_ptr cpuSentinel; + sys::TimerHandle activityTimer; + }; +} // namespace evm diff --git a/products/PurePhone/services/evtmgr/user-activity-handler/UserActivityHandler.cpp b/products/PurePhone/services/evtmgr/user-activity-handler/UserActivityHandler.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fc22d02b8eb8cd73b0bf0c3157b9106121475fb4 --- /dev/null +++ b/products/PurePhone/services/evtmgr/user-activity-handler/UserActivityHandler.cpp @@ -0,0 +1,36 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include +#include + +namespace evm +{ + namespace + { + constexpr auto userActivityTimerTime = std::chrono::seconds(2); + constexpr auto userActivityCPULevel = bsp::CpuFrequencyMHz::Level_4; + } // namespace + + UserActivityHandler::UserActivityHandler(std::shared_ptr 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