~aleteoryx/muditaos

c9b16c3064aacec99d7d2259a2c60bda959225f0 — Maciej Gibowicz 3 years ago 8cc5960
[MOS-598] Improved keyboard responsiveness

Add sentinel that increases and hold the CPU frequency
after a button press event
M module-sys/SystemManager/CpuGovernor.cpp => module-sys/SystemManager/CpuGovernor.cpp +6 -0
@@ 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<CpuSentinel> 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)

M products/PurePhone/services/evtmgr/CMakeLists.txt => products/PurePhone/services/evtmgr/CMakeLists.txt +1 -0
@@ 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

M products/PurePhone/services/evtmgr/EventManager.cpp => products/PurePhone/services/evtmgr/EventManager.cpp +1 -0
@@ 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) {

M products/PurePhone/services/evtmgr/include/evtmgr/EventManager.hpp => products/PurePhone/services/evtmgr/include/evtmgr/EventManager.hpp +4 -2
@@ 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 <service-evtmgr/EventManagerCommon.hpp>

#include "BacklightHandler.hpp"
#include "UserActivityHandler.hpp"
#include <bsp/vibrator/vibrator.hpp>
#include <vibra/Vibra.hpp>



@@ 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<vibra_handle::Vibra>(this)),
          backlightHandler(settings, this)
          backlightHandler(settings, this), userActivityHandler(std::make_shared<sys::CpuSentinel>(name, this), this)
    {}

  private:


@@ 36,6 37,7 @@ class EventManager : public EventManagerCommon

    std::unique_ptr<vibra_handle::Vibra> vibrator;
    backlight::Handler backlightHandler;
    evm::UserActivityHandler userActivityHandler;
};

namespace sys

A products/PurePhone/services/evtmgr/include/evtmgr/UserActivityHandler.hpp => products/PurePhone/services/evtmgr/include/evtmgr/UserActivityHandler.hpp +25 -0
@@ 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 <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/PurePhone/services/evtmgr/user-activity-handler/UserActivityHandler.cpp => products/PurePhone/services/evtmgr/user-activity-handler/UserActivityHandler.cpp +36 -0
@@ 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 <evtmgr/UserActivityHandler.hpp>
#include <Timers/TimerFactory.hpp>

namespace evm
{
    namespace
    {
        constexpr auto userActivityTimerTime = std::chrono::seconds(2);
        constexpr auto userActivityCPULevel  = bsp::CpuFrequencyMHz::Level_4;
    } // 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