From 5a70754a4e60ad11258fceaa3c2892ae6ee8b510 Mon Sep 17 00:00:00 2001 From: Maciej Gibowicz Date: Wed, 15 May 2024 11:40:30 +0200 Subject: [PATCH] [BH-1971] Changing the refresh rate of the progress bar screen The longer the time countdown on the progress bar, the less frequently the screen is refreshed, which results in less power consumption when running the Meditation, Relaxation, Power Nap and Focus Timer applications. --- harmony_changelog.md | 1 + .../widgets/MeditationTimer.cpp | 6 ++-- .../widgets/AbstractProgressTime.hpp | 2 +- .../apps-common/widgets/ProgressTimer.cpp | 10 +++++- .../apps-common/widgets/ProgressTimer.hpp | 3 +- .../ProgressTimerWithBarGraphAndCounter.cpp | 1 + .../widgets/TimeMinuteSecondWidget.cpp | 36 +++++++++++++++++++ .../widgets/TimeMinuteSecondWidget.hpp | 2 ++ .../windows/FocusTimerWindow.cpp | 4 +-- .../windows/MeditationCountdownWindow.cpp | 4 +-- .../windows/MeditationRunningWindow.cpp | 4 +-- .../windows/PowerNapProgressWindow.cpp | 4 +-- .../RelaxationRunningProgressWindow.cpp | 4 +-- .../windows/RelaxationVolumeWindow.cpp | 1 - .../common/widgets/list_items/details.hpp | 1 - 15 files changed, 65 insertions(+), 18 deletions(-) diff --git a/harmony_changelog.md b/harmony_changelog.md index 19ac7e01458d9cdf1721fdc0dae1f573a4988ed3..0347b87f515c8d1f0b76f2cf5a5cad7923ff3a5c 100644 --- a/harmony_changelog.md +++ b/harmony_changelog.md @@ -17,6 +17,7 @@ * Updated the countdown timer in Meditation app according to the new design * Updated the countdown timer in Power nap app according to the new design * Updated the countdown timer in Relaxation app according to the new design +* Changed the refresh rate of the progress bar screen ## [2.6.1 2024-04-02] diff --git a/module-apps/application-meditation/widgets/MeditationTimer.cpp b/module-apps/application-meditation/widgets/MeditationTimer.cpp index 2b44fed0f24cad276307916b5d8f341bcc0d54bb..48c8f7eab5c529e9abe2ea1774bda139d9180720 100644 --- a/module-apps/application-meditation/widgets/MeditationTimer.cpp +++ b/module-apps/application-meditation/widgets/MeditationTimer.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "MeditationTimer.hpp" @@ -14,7 +14,7 @@ namespace { inline constexpr auto meditationTimerName = "MeditationTimer"; - inline constexpr std::chrono::seconds timerTick{1}; + inline constexpr std::chrono::seconds initialInterval{1}; } // namespace namespace gui { @@ -56,7 +56,7 @@ namespace gui text->setEditMode(EditMode::Browse); timer = std::make_unique( - application, *this, meditationTimerName, timerTick); + application, *this, meditationTimerName, initialInterval); timer->attach(progressBar); timer->attach(text); timer->registerOnIntervalCallback(std::bind(&MeditationTimer::playSound, this)); diff --git a/module-apps/apps-common/widgets/AbstractProgressTime.hpp b/module-apps/apps-common/widgets/AbstractProgressTime.hpp index 4823c001730df7cab6acec46ee5076758c72e875..e7c3dc414dd1b77edb5636b3c373846e31841dbc 100644 --- a/module-apps/apps-common/widgets/AbstractProgressTime.hpp +++ b/module-apps/apps-common/widgets/AbstractProgressTime.hpp @@ -8,11 +8,11 @@ namespace gui { - class AbstractProgressTime { public: virtual ~AbstractProgressTime() = default; virtual void updateTime(std::uint32_t seconds) = 0; + virtual std::chrono::seconds getRefreshTime() = 0; }; } // namespace gui diff --git a/module-apps/apps-common/widgets/ProgressTimer.cpp b/module-apps/apps-common/widgets/ProgressTimer.cpp index 3ce4f6f1e995935b87a11c74cc1f70e01d8b796c..0bea6bb7b6c3998c65a65c4adb4bdd96509f6d77 100644 --- a/module-apps/apps-common/widgets/ProgressTimer.cpp +++ b/module-apps/apps-common/widgets/ProgressTimer.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ProgressTimer.hpp" @@ -53,6 +53,14 @@ namespace app timerTask.start(); } + void ProgressTimer::updateInterval(std::chrono::milliseconds newInterval) + { + if (baseTickInterval != newInterval) { + baseTickInterval = newInterval; + timerTask.restart(newInterval); + } + } + auto ProgressTimer::onTimerTimeout(sys::Timer &task) -> bool { if (isStopped()) { diff --git a/module-apps/apps-common/widgets/ProgressTimer.hpp b/module-apps/apps-common/widgets/ProgressTimer.hpp index 99779cd07db201179446f80e2b30331ca946b402..2403c0961a75bebed33cb8dc91b07f6cfa2aacb9 100644 --- a/module-apps/apps-common/widgets/ProgressTimer.hpp +++ b/module-apps/apps-common/widgets/ProgressTimer.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -54,6 +54,7 @@ namespace app utils::time::Duration::DisplayedFormat displayFormat; void startTimer(); + void updateInterval(std::chrono::milliseconds newInterval); [[nodiscard]] auto onTimerTimeout(sys::Timer &timerTask) -> bool; [[nodiscard]] auto isFinished() const noexcept -> bool; diff --git a/module-apps/apps-common/widgets/ProgressTimerWithBarGraphAndCounter.cpp b/module-apps/apps-common/widgets/ProgressTimerWithBarGraphAndCounter.cpp index 3aca07cff96527db1f751959c61ac5f39be4daef..dbeb2c167b57def78ab222cb3608f3095227faff 100644 --- a/module-apps/apps-common/widgets/ProgressTimerWithBarGraphAndCounter.cpp +++ b/module-apps/apps-common/widgets/ProgressTimerWithBarGraphAndCounter.cpp @@ -21,6 +21,7 @@ namespace app updateProgress(); updateTimeWidget(); ProgressTimer::update(); + updateInterval(timeWidget->getRefreshTime()); } void ProgressTimerWithBarGraphAndCounter::updateText() diff --git a/module-apps/apps-common/widgets/TimeMinuteSecondWidget.cpp b/module-apps/apps-common/widgets/TimeMinuteSecondWidget.cpp index b64cb05daeb2eb69048edd0fe5dc884179af367e..8efa0f2bc10261843d656e560d08756561af160f 100644 --- a/module-apps/apps-common/widgets/TimeMinuteSecondWidget.cpp +++ b/module-apps/apps-common/widgets/TimeMinuteSecondWidget.cpp @@ -48,6 +48,31 @@ namespace constexpr auto topMargin = -2; constexpr auto font = style::window::font::big; } // namespace description + + namespace refreshTime + { + constexpr auto defaultValue{std::chrono::seconds{1}}; + constexpr auto arraySize{3}; + constexpr std::array, arraySize> values = {{ + {10 * utils::time::secondsInMinute, std::chrono::seconds{5}}, + {5 * utils::time::secondsInMinute, std::chrono::seconds{3}}, + {3 * utils::time::secondsInMinute, std::chrono::seconds{2}}, + }}; + constexpr auto maxValue = std::max_element(values.begin(), values.end(), [](const auto &l, const auto &r) { + return l.second < r.second; + }) -> second; + + std::chrono::seconds get(std::uint32_t totalSeconds) + { + const auto res = std::find_if( + values.begin(), values.end(), [totalSeconds](const auto &e) { return e.first <= totalSeconds; }); + if (res != values.end()) { + return res->second; + } + return defaultValue; + } + + } // namespace refreshTime } // namespace namespace gui @@ -118,6 +143,7 @@ namespace gui if (!totalSeconds.has_value()) { totalSeconds = seconds; } + secondsLeft = seconds; if (displayType != DisplayType::OnlySeconds && (seconds >= utils::time::secondsInMinute || displayType == DisplayType::OnlyMinutes)) { const auto minutes = getRoundedMinutes(seconds, totalSeconds.value()); @@ -130,6 +156,16 @@ namespace gui } } + std::chrono::seconds TimeMinuteSecondWidget::getRefreshTime() + { + if (!totalSeconds.has_value() || + (displayType != DisplayType::OnlyMinutes && + secondsLeft < (utils::time::secondsInMinute + refreshTime::maxValue.count()))) { + return refreshTime::defaultValue; + } + return refreshTime::get(totalSeconds.value()); + } + void TimeMinuteSecondWidget::setText(std::uint32_t value) { const auto &digits = valueToDigits(value); diff --git a/module-apps/apps-common/widgets/TimeMinuteSecondWidget.hpp b/module-apps/apps-common/widgets/TimeMinuteSecondWidget.hpp index 2595cb537933f7177f6c81a5aa3afa4637947976..61ac1d8f9baa765db95edec9036f9ed0fdb79ab5 100644 --- a/module-apps/apps-common/widgets/TimeMinuteSecondWidget.hpp +++ b/module-apps/apps-common/widgets/TimeMinuteSecondWidget.hpp @@ -27,12 +27,14 @@ namespace gui DisplayType type = DisplayType::OnlyMinutes); void updateTime(std::uint32_t sec) override; + std::chrono::seconds getRefreshTime() override; void buildInterface(std::uint32_t w, std::uint32_t h); void setText(std::uint32_t value); private: DisplayType displayType; std::optional totalSeconds; + std::uint32_t secondsLeft{0}; static constexpr auto maxDigits{3U}; VBox *mainBox{nullptr}; diff --git a/products/BellHybrid/apps/application-bell-focus-timer/windows/FocusTimerWindow.cpp b/products/BellHybrid/apps/application-bell-focus-timer/windows/FocusTimerWindow.cpp index c9ac9bfb44acc4b6d6d241852583197ffe722c93..44dbcd2a29583c05e20cc3ae097d5cf2429e5232 100644 --- a/products/BellHybrid/apps/application-bell-focus-timer/windows/FocusTimerWindow.cpp +++ b/products/BellHybrid/apps/application-bell-focus-timer/windows/FocusTimerWindow.cpp @@ -13,7 +13,7 @@ namespace { constexpr auto progressTimerName{"FocusProgressTimer"}; - constexpr auto progressTimerPeriod{std::chrono::seconds{1}}; + constexpr auto initialInterval{std::chrono::seconds{1}}; constexpr auto progressMode{app::ProgressCountdownMode::Increasing}; } // namespace @@ -227,7 +227,7 @@ namespace app::focus void FocusTimerWindow::configureTimer() { auto progressTimer = std::make_unique( - application, *this, progressTimerName, progressTimerPeriod, progressMode); + application, *this, progressTimerName, initialInterval, progressMode); progressTimer->attach(progress); progressTimer->attach(timer); presenter->setTimer(std::move(progressTimer)); diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationCountdownWindow.cpp b/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationCountdownWindow.cpp index a9fa5e8ef1a7d70bbc8e8aaead67c577e2f72ea8..b08953775b01be9c9156c5d26e5a4eae09c79e91 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationCountdownWindow.cpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationCountdownWindow.cpp @@ -14,7 +14,7 @@ namespace { constexpr auto meditationCountdownTimerName{"MeditationCountdownTimer"}; - constexpr std::chrono::seconds meditationCountdownTimerPeriod{1}; + constexpr std::chrono::seconds initialInterval{1}; constexpr auto meditationCountdownMode{app::ProgressCountdownMode::Increasing}; constexpr auto leftBoxSize{1}; } // namespace @@ -110,7 +110,7 @@ namespace gui void MeditationCountdownWindow::configureTimer() { auto progressTimer = std::make_unique( - application, *this, meditationCountdownTimerName, meditationCountdownTimerPeriod, meditationCountdownMode); + application, *this, meditationCountdownTimerName, initialInterval, meditationCountdownMode); progressTimer->attach(timer); presenter->setTimer(std::move(progressTimer)); } diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp b/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp index 531ed0ab0102c7ca32849e3d079cac675c022754..9ba22a6c32e4061b019a3f1d08959738552a2033 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp @@ -15,7 +15,7 @@ namespace { constexpr auto meditationProgressTimerName{"MeditationProgressTimer"}; - constexpr std::chrono::seconds meditationProgressTimerPeriod{1}; + constexpr std::chrono::seconds initialInterval{1}; constexpr auto meditationProgressMode{app::ProgressCountdownMode::Increasing}; } // namespace @@ -152,7 +152,7 @@ namespace gui void MeditationRunningWindow::configureTimer() { auto progressTimer = std::make_unique( - application, *this, meditationProgressTimerName, meditationProgressTimerPeriod, meditationProgressMode); + application, *this, meditationProgressTimerName, initialInterval, meditationProgressMode); progressTimer->attach(progress); progressTimer->attach(timer); presenter->setTimer(std::move(progressTimer)); diff --git a/products/BellHybrid/apps/application-bell-powernap/windows/PowerNapProgressWindow.cpp b/products/BellHybrid/apps/application-bell-powernap/windows/PowerNapProgressWindow.cpp index 9c8bff7dad9f3fab805d3ab5759da64bbd2dc2f1..6e555d428efcfd74042301bac97a22c52628787c 100644 --- a/products/BellHybrid/apps/application-bell-powernap/windows/PowerNapProgressWindow.cpp +++ b/products/BellHybrid/apps/application-bell-powernap/windows/PowerNapProgressWindow.cpp @@ -11,7 +11,7 @@ namespace { constexpr auto powerNapTimerName{"PowerNapTimer"}; - constexpr auto powerNapTimerPeriod{std::chrono::seconds{1}}; + constexpr auto initialInterval{std::chrono::seconds{1}}; } // namespace namespace gui @@ -97,7 +97,7 @@ namespace gui void PowerNapProgressWindow::configureTimer() { auto progressTimer = std::make_unique( - application, *this, powerNapTimerName, powerNapTimerPeriod, app::ProgressCountdownMode::Increasing); + application, *this, powerNapTimerName, initialInterval, app::ProgressCountdownMode::Increasing); progressTimer->attach(progress); progressTimer->attach(timer); presenter->setTimer(std::move(progressTimer)); diff --git a/products/BellHybrid/apps/application-bell-relaxation/windows/RelaxationRunningProgressWindow.cpp b/products/BellHybrid/apps/application-bell-relaxation/windows/RelaxationRunningProgressWindow.cpp index f1d151d2ed5371187bab85c4e7a90d1a5702e194..a08577c405609cc6b2de35e9f0edfb1fcb07a9b7 100644 --- a/products/BellHybrid/apps/application-bell-relaxation/windows/RelaxationRunningProgressWindow.cpp +++ b/products/BellHybrid/apps/application-bell-relaxation/windows/RelaxationRunningProgressWindow.cpp @@ -13,7 +13,7 @@ namespace { constexpr auto relaxationProgressTimerName{"RelaxationProgressTimer"}; - constexpr std::chrono::seconds relaxationProgressTimerPeriod{1}; + constexpr std::chrono::seconds initialInterval{1}; constexpr auto relaxationProgressMode{app::ProgressCountdownMode::Increasing}; } // namespace @@ -154,7 +154,7 @@ namespace gui void RelaxationRunningProgressWindow::configureTimer() { auto progressTimer = std::make_unique( - application, *this, relaxationProgressTimerName, relaxationProgressTimerPeriod, relaxationProgressMode); + application, *this, relaxationProgressTimerName, initialInterval, relaxationProgressMode); progressTimer->attach(progress); progressTimer->attach(timer); presenter->setTimer(std::move(progressTimer)); diff --git a/products/BellHybrid/apps/application-bell-relaxation/windows/RelaxationVolumeWindow.cpp b/products/BellHybrid/apps/application-bell-relaxation/windows/RelaxationVolumeWindow.cpp index b7c26e03efb7caa073548035c314bc6e89943b4c..ab411c7054b9ea484776cbec4ddab8d38245ee90 100644 --- a/products/BellHybrid/apps/application-bell-relaxation/windows/RelaxationVolumeWindow.cpp +++ b/products/BellHybrid/apps/application-bell-relaxation/windows/RelaxationVolumeWindow.cpp @@ -7,7 +7,6 @@ #include #include -#include namespace gui { diff --git a/products/BellHybrid/apps/common/include/common/widgets/list_items/details.hpp b/products/BellHybrid/apps/common/include/common/widgets/list_items/details.hpp index 8f0a826351a5e64c2b9969d7ae3ad440ef0f7cee..f8ef4bc4ad62ed72634b7df0de62656d845adb3d 100644 --- a/products/BellHybrid/apps/common/include/common/widgets/list_items/details.hpp +++ b/products/BellHybrid/apps/common/include/common/widgets/list_items/details.hpp @@ -8,7 +8,6 @@ #include #include -#include #include #include "common/data/ListItemBarStyle.hpp"