From 217e5fcf3c2077a587a82a27947db9b9b30dc6b3 Mon Sep 17 00:00:00 2001 From: JustScott Date: Sun, 14 Jan 2024 15:34:48 -0600 Subject: [PATCH] Add Timer's Time Remaining to the StatusIcons bar When a timer is active the time remaining will be displayed in the StatusIcons bar along with an hour glass symbol, and will be set to hidden when the timer's off. --- src/components/timer/Timer.cpp | 4 +-- src/components/timer/Timer.h | 4 +-- src/displayapp/DisplayApp.cpp | 4 ++- src/displayapp/screens/ApplicationList.cpp | 5 +++- src/displayapp/screens/ApplicationList.h | 2 ++ src/displayapp/screens/Tile.cpp | 10 +++++-- src/displayapp/screens/Tile.h | 3 +- src/displayapp/screens/WatchFaceDigital.cpp | 3 +- src/displayapp/screens/WatchFaceDigital.h | 3 ++ .../screens/settings/QuickSettings.cpp | 7 +++-- .../screens/settings/QuickSettings.h | 3 +- src/displayapp/widgets/StatusIcons.cpp | 30 +++++++++++++++++-- src/displayapp/widgets/StatusIcons.h | 5 +++- 13 files changed, 65 insertions(+), 18 deletions(-) diff --git a/src/components/timer/Timer.cpp b/src/components/timer/Timer.cpp index 279178cd33..935d41e288 100644 --- a/src/components/timer/Timer.cpp +++ b/src/components/timer/Timer.cpp @@ -11,7 +11,7 @@ void Timer::StartTimer(std::chrono::milliseconds duration) { xTimerStart(timer, 0); } -std::chrono::milliseconds Timer::GetTimeRemaining() { +std::chrono::milliseconds Timer::GetTimeRemaining() const { if (IsRunning()) { TickType_t remainingTime = xTimerGetExpiryTime(timer) - xTaskGetTickCount(); return std::chrono::milliseconds(remainingTime * 1000 / configTICK_RATE_HZ); @@ -23,6 +23,6 @@ void Timer::StopTimer() { xTimerStop(timer, 0); } -bool Timer::IsRunning() { +bool Timer::IsRunning() const { return (xTimerIsTimerActive(timer) == pdTRUE); } diff --git a/src/components/timer/Timer.h b/src/components/timer/Timer.h index 2469666f4f..406ae03327 100644 --- a/src/components/timer/Timer.h +++ b/src/components/timer/Timer.h @@ -15,9 +15,9 @@ namespace Pinetime { void StopTimer(); - std::chrono::milliseconds GetTimeRemaining(); + std::chrono::milliseconds GetTimeRemaining() const; - bool IsRunning(); + bool IsRunning() const; private: TimerHandle_t timer; diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index b1594f197c..594ddcf488 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -527,6 +527,7 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio batteryController, bleController, dateTimeController, + timer, filesystem, std::move(apps)); } break; @@ -580,7 +581,8 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio brightnessController, motorController, settingsController, - bleController); + bleController, + timer); break; case Apps::Settings: currentScreen = std::make_unique(this, settingsController); diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp index 41735349da..74f1849859 100644 --- a/src/displayapp/screens/ApplicationList.cpp +++ b/src/displayapp/screens/ApplicationList.cpp @@ -22,6 +22,7 @@ ApplicationList::ApplicationList(DisplayApp* app, const Pinetime::Controllers::Battery& batteryController, const Pinetime::Controllers::Ble& bleController, Controllers::DateTime& dateTimeController, + Controllers::Timer& timer, Pinetime::Controllers::FS& filesystem, std::array&& apps) : app {app}, @@ -29,6 +30,7 @@ ApplicationList::ApplicationList(DisplayApp* app, batteryController {batteryController}, bleController {bleController}, dateTimeController {dateTimeController}, + timer {timer}, filesystem {filesystem}, apps {std::move(apps)}, screens {app, settingsController.GetAppMenu(), CreateScreenList(), Screens::ScreenListModes::UpDown} { @@ -60,5 +62,6 @@ std::unique_ptr ApplicationList::CreateScreen(unsigned int screenNum) co batteryController, bleController, dateTimeController, - pageApps); + pageApps, + timer); } diff --git a/src/displayapp/screens/ApplicationList.h b/src/displayapp/screens/ApplicationList.h index 41a413af1a..c963548526 100644 --- a/src/displayapp/screens/ApplicationList.h +++ b/src/displayapp/screens/ApplicationList.h @@ -19,6 +19,7 @@ namespace Pinetime { const Pinetime::Controllers::Battery& batteryController, const Pinetime::Controllers::Ble& bleController, Controllers::DateTime& dateTimeController, + Pinetime::Controllers::Timer& timer, Pinetime::Controllers::FS& filesystem, std::array&& apps); ~ApplicationList() override; @@ -33,6 +34,7 @@ namespace Pinetime { const Pinetime::Controllers::Battery& batteryController; const Pinetime::Controllers::Ble& bleController; Controllers::DateTime& dateTimeController; + Pinetime::Controllers::Timer& timer; Pinetime::Controllers::FS& filesystem; std::array apps; diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp index 7c392c59e5..d2f5b80b54 100644 --- a/src/displayapp/screens/Tile.cpp +++ b/src/displayapp/screens/Tile.cpp @@ -30,8 +30,12 @@ Tile::Tile(uint8_t screenID, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, Controllers::DateTime& dateTimeController, - std::array& applications) - : app {app}, dateTimeController {dateTimeController}, pageIndicator(screenID, numScreens), statusIcons(batteryController, bleController) { + std::array& applications, + Controllers::Timer& timer) + : app {app}, + dateTimeController {dateTimeController}, + pageIndicator(screenID, numScreens), + statusIcons(batteryController, bleController, timer) { settingsController.SetAppMenu(screenID); @@ -83,7 +87,7 @@ Tile::Tile(uint8_t screenID, btnm1->user_data = this; lv_obj_set_event_cb(btnm1, event_handler); - taskUpdate = lv_task_create(lv_update_task, 5000, LV_TASK_PRIO_MID, this); + taskUpdate = lv_task_create(lv_update_task, 500, LV_TASK_PRIO_MID, this); UpdateScreen(); } diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h index f1b86246ce..0bea237cc4 100644 --- a/src/displayapp/screens/Tile.h +++ b/src/displayapp/screens/Tile.h @@ -29,7 +29,8 @@ namespace Pinetime { const Controllers::Battery& batteryController, const Controllers::Ble& bleController, Controllers::DateTime& dateTimeController, - std::array& applications); + std::array& applications, + Controllers::Timer& timer); ~Tile() override; diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index d944117dd7..d8abc8ec41 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -19,6 +19,7 @@ using namespace Pinetime::Applications::Screens; WatchFaceDigital::WatchFaceDigital(Controllers::DateTime& dateTimeController, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, + const Controllers::Timer& timer, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, @@ -31,7 +32,7 @@ WatchFaceDigital::WatchFaceDigital(Controllers::DateTime& dateTimeController, heartRateController {heartRateController}, motionController {motionController}, weatherService {weatherService}, - statusIcons(batteryController, bleController) { + statusIcons(batteryController, bleController, timer) { statusIcons.Create(); diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 7bb713cbb8..ac67d04476 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -20,6 +20,7 @@ namespace Pinetime { class NotificationManager; class HeartRateController; class MotionController; + class Timer; } namespace Applications { @@ -30,6 +31,7 @@ namespace Pinetime { WatchFaceDigital(Controllers::DateTime& dateTimeController, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, + const Controllers::Timer& timer, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, @@ -84,6 +86,7 @@ namespace Pinetime { return new Screens::WatchFaceDigital(controllers.dateTimeController, controllers.batteryController, controllers.bleController, + controllers.timer, controllers.notificationManager, controllers.settingsController, controllers.heartRateController, diff --git a/src/displayapp/screens/settings/QuickSettings.cpp b/src/displayapp/screens/settings/QuickSettings.cpp index 0548488855..3f1615df25 100644 --- a/src/displayapp/screens/settings/QuickSettings.cpp +++ b/src/displayapp/screens/settings/QuickSettings.cpp @@ -33,13 +33,14 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, Controllers::BrightnessController& brightness, Controllers::MotorController& motorController, Pinetime::Controllers::Settings& settingsController, - const Controllers::Ble& bleController) + const Controllers::Ble& bleController, + const Controllers::Timer& timer) : app {app}, dateTimeController {dateTimeController}, brightness {brightness}, motorController {motorController}, settingsController {settingsController}, - statusIcons(batteryController, bleController) { + statusIcons(batteryController, bleController, timer) { statusIcons.Create(); @@ -118,7 +119,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, lv_obj_set_style_local_text_font(lbl_btn, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48); lv_label_set_text_static(lbl_btn, Symbols::settings); - taskUpdate = lv_task_create(lv_update_task, 5000, LV_TASK_PRIO_MID, this); + taskUpdate = lv_task_create(lv_update_task, 500, LV_TASK_PRIO_MID, this); UpdateScreen(); } diff --git a/src/displayapp/screens/settings/QuickSettings.h b/src/displayapp/screens/settings/QuickSettings.h index 55da617629..297c41e84c 100644 --- a/src/displayapp/screens/settings/QuickSettings.h +++ b/src/displayapp/screens/settings/QuickSettings.h @@ -23,7 +23,8 @@ namespace Pinetime { Controllers::BrightnessController& brightness, Controllers::MotorController& motorController, Pinetime::Controllers::Settings& settingsController, - const Controllers::Ble& bleController); + const Controllers::Ble& bleController, + const Controllers::Timer& timer); ~QuickSettings() override; diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp index 423b53d97a..1f1f4c7bb8 100644 --- a/src/displayapp/widgets/StatusIcons.cpp +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -3,11 +3,23 @@ using namespace Pinetime::Applications::Widgets; -StatusIcons::StatusIcons(const Controllers::Battery& batteryController, const Controllers::Ble& bleController) - : batteryIcon(true), batteryController {batteryController}, bleController {bleController} { +StatusIcons::StatusIcons(const Controllers::Battery& batteryController, + const Controllers::Ble& bleController, + const Controllers::Timer& timer) + : batteryIcon(true), batteryController {batteryController}, bleController {bleController}, timer {timer} { } void StatusIcons::Create() { + timerIcon = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(timerIcon, Screens::Symbols::hourGlass); + lv_obj_set_style_local_text_color(timerIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); + lv_obj_align(timerIcon, lv_scr_act(), LV_ALIGN_IN_TOP_MID, -32, 0); + + timeRemaining = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(timeRemaining, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); + lv_label_set_text(timeRemaining, "00:00"); + lv_obj_align(timeRemaining, nullptr, LV_ALIGN_IN_TOP_MID, 10, 0); + container = lv_cont_create(lv_scr_act(), nullptr); lv_cont_set_layout(container, LV_LAYOUT_ROW_TOP); lv_cont_set_fit(container, LV_FIT_TIGHT); @@ -26,6 +38,20 @@ void StatusIcons::Create() { } void StatusIcons::Update() { + if (timer.IsRunning()) { + auto secondsRemaining = std::chrono::duration_cast(timer.GetTimeRemaining()); + + uint8_t minutes = secondsRemaining.count() / 60; + uint8_t seconds = secondsRemaining.count() % 60; + lv_label_set_text_fmt(timeRemaining, "%02d:%02d", minutes, seconds); + + lv_obj_set_hidden(timeRemaining, false); + lv_obj_set_hidden(timerIcon, false); + } else { + lv_obj_set_hidden(timeRemaining, true); + lv_obj_set_hidden(timerIcon, true); + } + powerPresent = batteryController.IsPowerPresent(); if (powerPresent.IsUpdated()) { lv_obj_set_hidden(batteryPlug, !powerPresent.Get()); diff --git a/src/displayapp/widgets/StatusIcons.h b/src/displayapp/widgets/StatusIcons.h index 9e21d3add0..39189a07e5 100644 --- a/src/displayapp/widgets/StatusIcons.h +++ b/src/displayapp/widgets/StatusIcons.h @@ -13,7 +13,7 @@ namespace Pinetime { namespace Widgets { class StatusIcons { public: - StatusIcons(const Controllers::Battery& batteryController, const Controllers::Ble& bleController); + StatusIcons(const Controllers::Battery& batteryController, const Controllers::Ble& bleController, const Controllers::Timer& timer); void Align(); void Create(); @@ -27,12 +27,15 @@ namespace Pinetime { Screens::BatteryIcon batteryIcon; const Pinetime::Controllers::Battery& batteryController; const Controllers::Ble& bleController; + const Controllers::Timer& timer; Utility::DirtyValue batteryPercentRemaining {}; Utility::DirtyValue powerPresent {}; Utility::DirtyValue bleState {}; Utility::DirtyValue bleRadioEnabled {}; + lv_obj_t* timerIcon; + lv_obj_t* timeRemaining; lv_obj_t* bleIcon; lv_obj_t* batteryPlug; lv_obj_t* container;