~aleteoryx/muditaos

941b54bc652cacff194c1f42093f2df8cdb088ce — Wojtek Rzepecki 4 years ago aa6203c
[BH-1133] Fix UI lags due to lowered frequency

Added CPU frequency hold on timer while user is
interacting with device
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