From 95ff285991d399498d9bd7f60a503ef7665822ce Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Sat, 18 Jun 2022 12:54:41 +0300 Subject: Remove backup brightness feature (#1180) This feature is not needed and is probably more likely to cause issues. It's better to just use brightnessController.Set(settingsController.GetBrightness()); --- src/displayapp/DisplayApp.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'src/displayapp/DisplayApp.cpp') diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 411497e6..3174a658 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -129,6 +129,11 @@ void DisplayApp::InitHw() { } void DisplayApp::Refresh() { + auto LoadPreviousScreen = [this]() { + brightnessController.Set(settingsController.GetBrightness()); + LoadApp(returnToApp, returnDirection); + }; + TickType_t queueTimeout; switch (state) { case States::Idle: @@ -136,7 +141,7 @@ void DisplayApp::Refresh() { break; case States::Running: if (!currentScreen->IsRunning()) { - LoadApp(returnToApp, returnDirection); + LoadPreviousScreen(); } queueTimeout = lv_task_handler(); break; @@ -149,12 +154,10 @@ void DisplayApp::Refresh() { if (xQueueReceive(msgQueue, &msg, queueTimeout)) { switch (msg) { case Messages::DimScreen: - // Backup brightness is the brightness to return to after dimming or sleeping - brightnessController.Backup(); brightnessController.Set(Controllers::BrightnessController::Levels::Low); break; case Messages::RestoreBrightness: - brightnessController.Restore(); + brightnessController.Set(settingsController.GetBrightness()); break; case Messages::GoToSleep: while (brightnessController.Level() != Controllers::BrightnessController::Levels::Off) { @@ -165,7 +168,7 @@ void DisplayApp::Refresh() { state = States::Idle; break; case Messages::GoToRunning: - brightnessController.Restore(); + brightnessController.Set(settingsController.GetBrightness()); state = States::Running; break; case Messages::UpdateTimeOut: @@ -224,9 +227,7 @@ void DisplayApp::Refresh() { break; } } else if (returnTouchEvent == gesture) { - LoadApp(returnToApp, returnDirection); - brightnessController.Set(settingsController.GetBrightness()); - brightnessController.Backup(); + LoadPreviousScreen(); } } else { touchHandler.CancelTap(); @@ -237,9 +238,7 @@ void DisplayApp::Refresh() { if (currentApp == Apps::Clock) { PushMessageToSystemTask(System::Messages::GoToSleep); } else { - LoadApp(returnToApp, returnDirection); - brightnessController.Set(settingsController.GetBrightness()); - brightnessController.Backup(); + LoadPreviousScreen(); } } break; -- cgit v1.2.3-70-g09d2 From cea81fea9c2892bd9d83ff0ba9ba681db17f718f Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Thu, 21 Jul 2022 22:16:55 +0300 Subject: Always restore brightness on app switch (#1213) --- src/displayapp/DisplayApp.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/displayapp/DisplayApp.cpp') diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 3174a658..731d9c01 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -130,7 +130,6 @@ void DisplayApp::InitHw() { void DisplayApp::Refresh() { auto LoadPreviousScreen = [this]() { - brightnessController.Set(settingsController.GetBrightness()); LoadApp(returnToApp, returnDirection); }; @@ -302,6 +301,8 @@ void DisplayApp::ReturnApp(Apps app, DisplayApp::FullRefreshDirections direction void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) { touchHandler.CancelTap(); + brightnessController.Set(settingsController.GetBrightness()); + currentScreen.reset(nullptr); SetFullRefresh(direction); -- cgit v1.2.3-70-g09d2 From 9ee1160578e22e8dfa3da89dfd6405439d374da7 Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Thu, 21 Jul 2022 22:53:36 +0300 Subject: Reset timer by long pressing on the button (#1214) * Reset timer by long pressing on the button * Consider press_lost as released Otherwise the bar would keep increasing if the finger slid off the button --- src/displayapp/DisplayApp.cpp | 2 +- src/displayapp/screens/Timer.cpp | 100 +++++++++++++++++++++++++++++++-------- src/displayapp/screens/Timer.h | 21 ++++++-- src/libs/lv_conf.h | 2 +- 4 files changed, 99 insertions(+), 26 deletions(-) (limited to 'src/displayapp/DisplayApp.cpp') diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 731d9c01..93d7277d 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -183,7 +183,7 @@ void DisplayApp::Refresh() { case Messages::TimerDone: if (currentApp == Apps::Timer) { auto* timer = static_cast(currentScreen.get()); - timer->SetDone(); + timer->Reset(); } else { LoadApp(Apps::Timer, DisplayApp::FullRefreshDirections::Down); } diff --git a/src/displayapp/screens/Timer.cpp b/src/displayapp/screens/Timer.cpp index a1df662a..a25be1c4 100644 --- a/src/displayapp/screens/Timer.cpp +++ b/src/displayapp/screens/Timer.cpp @@ -7,7 +7,13 @@ using namespace Pinetime::Applications::Screens; static void btnEventHandler(lv_obj_t* obj, lv_event_t event) { auto* screen = static_cast(obj->user_data); - screen->OnButtonEvent(obj, event); + if (event == LV_EVENT_PRESSED) { + screen->ButtonPressed(); + } else if (event == LV_EVENT_RELEASED || event == LV_EVENT_PRESS_LOST) { + screen->MaskReset(); + } else if (event == LV_EVENT_SHORT_CLICKED) { + screen->ToggleRunning(); + } } Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController) : Screen(app), timerController {timerController} { @@ -23,14 +29,37 @@ Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController) : S lv_obj_align(minuteCounter.GetObject(), nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0); lv_obj_align(secondCounter.GetObject(), nullptr, LV_ALIGN_IN_TOP_RIGHT, 0, 0); - btnPlayPause = lv_btn_create(lv_scr_act(), nullptr); + highlightObjectMask = lv_objmask_create(lv_scr_act(), nullptr); + lv_obj_set_size(highlightObjectMask, 240, 50); + lv_obj_align(highlightObjectMask, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0); + + lv_draw_mask_line_param_t tmpMaskLine; + + lv_draw_mask_line_points_init(&tmpMaskLine, 0, 0, 0, 240, LV_DRAW_MASK_LINE_SIDE_LEFT); + highlightMask = lv_objmask_add_mask(highlightObjectMask, &tmpMaskLine); + + lv_obj_t* btnHighlight = lv_obj_create(highlightObjectMask, nullptr); + lv_obj_set_style_local_radius(btnHighlight, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_obj_set_style_local_bg_color(btnHighlight, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); + lv_obj_set_size(btnHighlight, LV_HOR_RES, 50); + lv_obj_align(btnHighlight, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0); + + btnObjectMask = lv_objmask_create(lv_scr_act(), nullptr); + lv_obj_set_size(btnObjectMask, 240, 50); + lv_obj_align(btnObjectMask, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0); + + lv_draw_mask_line_points_init(&tmpMaskLine, 0, 0, 0, 240, LV_DRAW_MASK_LINE_SIDE_RIGHT); + btnMask = lv_objmask_add_mask(btnObjectMask, &tmpMaskLine); + + btnPlayPause = lv_btn_create(btnObjectMask, nullptr); btnPlayPause->user_data = this; lv_obj_set_style_local_radius(btnPlayPause, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); lv_obj_set_style_local_bg_color(btnPlayPause, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x38, 0x38, 0x38)); lv_obj_set_event_cb(btnPlayPause, btnEventHandler); lv_obj_set_size(btnPlayPause, LV_HOR_RES, 50); - lv_obj_align(btnPlayPause, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0); - txtPlayPause = lv_label_create(btnPlayPause, nullptr); + + txtPlayPause = lv_label_create(lv_scr_act(), nullptr); + lv_obj_align(txtPlayPause, btnPlayPause, LV_ALIGN_CENTER, 0, 0); if (timerController.IsRunning()) { SetTimerRunning(); @@ -46,11 +75,46 @@ Timer::~Timer() { lv_obj_clean(lv_scr_act()); } +void Timer::ButtonPressed() { + pressTime = xTaskGetTickCount(); + buttonPressing = true; +} + +void Timer::MaskReset() { + buttonPressing = false; + // A click event is processed before a release event, + // so the release event would override the "Pause" text without this check + if (!timerController.IsRunning()) { + lv_label_set_text_static(txtPlayPause, "Start"); + } + maskPosition = 0; + UpdateMask(); +} + +void Timer::UpdateMask() { + lv_draw_mask_line_param_t maskLine; + + lv_draw_mask_line_points_init(&maskLine, maskPosition, 0, maskPosition, 240, LV_DRAW_MASK_LINE_SIDE_LEFT); + lv_objmask_update_mask(highlightObjectMask, highlightMask, &maskLine); + + lv_draw_mask_line_points_init(&maskLine, maskPosition, 0, maskPosition, 240, LV_DRAW_MASK_LINE_SIDE_RIGHT); + lv_objmask_update_mask(btnObjectMask, btnMask, &maskLine); +} + void Timer::Refresh() { if (timerController.IsRunning()) { uint32_t seconds = timerController.GetTimeRemaining() / 1000; minuteCounter.SetValue(seconds / 60); secondCounter.SetValue(seconds % 60); + } else if (buttonPressing && xTaskGetTickCount() > pressTime + pdMS_TO_TICKS(150)) { + lv_label_set_text_static(txtPlayPause, "Reset"); + maskPosition += 15; + if (maskPosition > 240) { + MaskReset(); + Reset(); + } else { + UpdateMask(); + } } } @@ -66,25 +130,21 @@ void Timer::SetTimerStopped() { lv_label_set_text_static(txtPlayPause, "Start"); } -void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) { - if (event == LV_EVENT_CLICKED) { - if (obj == btnPlayPause) { - if (timerController.IsRunning()) { - uint32_t seconds = timerController.GetTimeRemaining() / 1000; - minuteCounter.SetValue(seconds / 60); - secondCounter.SetValue(seconds % 60); - timerController.StopTimer(); - SetTimerStopped(); - } else if (secondCounter.GetValue() + minuteCounter.GetValue() > 0) { - timerController.StartTimer((secondCounter.GetValue() + minuteCounter.GetValue() * 60) * 1000); - Refresh(); - SetTimerRunning(); - } - } +void Timer::ToggleRunning() { + if (timerController.IsRunning()) { + uint32_t seconds = timerController.GetTimeRemaining() / 1000; + minuteCounter.SetValue(seconds / 60); + secondCounter.SetValue(seconds % 60); + timerController.StopTimer(); + SetTimerStopped(); + } else if (secondCounter.GetValue() + minuteCounter.GetValue() > 0) { + timerController.StartTimer((secondCounter.GetValue() + minuteCounter.GetValue() * 60) * 1000); + Refresh(); + SetTimerRunning(); } } -void Timer::SetDone() { +void Timer::Reset() { minuteCounter.SetValue(0); secondCounter.SetValue(0); SetTimerStopped(); diff --git a/src/displayapp/screens/Timer.h b/src/displayapp/screens/Timer.h index 29b5e813..a6b60a17 100644 --- a/src/displayapp/screens/Timer.h +++ b/src/displayapp/screens/Timer.h @@ -5,29 +5,42 @@ #include "systemtask/SystemTask.h" #include "displayapp/LittleVgl.h" #include "displayapp/widgets/Counter.h" +#include #include "components/timer/TimerController.h" namespace Pinetime::Applications::Screens { class Timer : public Screen { public: - enum class Modes { Normal, Done }; - Timer(DisplayApp* app, Controllers::TimerController& timerController); ~Timer() override; void Refresh() override; - void SetDone(); - void OnButtonEvent(lv_obj_t* obj, lv_event_t event); + void Reset(); + void ToggleRunning(); + void ButtonPressed(); + void MaskReset(); private: void SetTimerRunning(); void SetTimerStopped(); + void UpdateMask(); Controllers::TimerController& timerController; + lv_obj_t* msecTime; lv_obj_t* btnPlayPause; lv_obj_t* txtPlayPause; + + lv_obj_t* btnObjectMask; + lv_obj_t* highlightObjectMask; + lv_objmask_mask_t* btnMask; + lv_objmask_mask_t* highlightMask; + lv_task_t* taskRefresh; Widgets::Counter minuteCounter = Widgets::Counter(0, 59, jetbrains_mono_76); Widgets::Counter secondCounter = Widgets::Counter(0, 59, jetbrains_mono_76); + + bool buttonPressing = false; + int maskPosition = 0; + TickType_t pressTime; }; } diff --git a/src/libs/lv_conf.h b/src/libs/lv_conf.h index 73109c5a..b3ff8f57 100644 --- a/src/libs/lv_conf.h +++ b/src/libs/lv_conf.h @@ -678,7 +678,7 @@ typedef void* lv_obj_user_data_t; #endif /*Mask (dependencies: -)*/ -#define LV_USE_OBJMASK 0 +#define LV_USE_OBJMASK 1 /*Message box (dependencies: lv_rect, lv_btnm, lv_label)*/ #define LV_USE_MSGBOX 0 -- cgit v1.2.3-70-g09d2 From edba1d9ccfb2b16c26b12428acb71425f4f41cd5 Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Thu, 21 Jul 2022 19:27:52 +0300 Subject: Add status icons widget --- src/CMakeLists.txt | 2 + src/displayapp/DisplayApp.cpp | 6 ++- src/displayapp/screens/ApplicationList.cpp | 11 ++++- src/displayapp/screens/ApplicationList.h | 2 + src/displayapp/screens/Tile.cpp | 19 +++++--- src/displayapp/screens/Tile.h | 10 ++--- src/displayapp/screens/WatchFaceDigital.cpp | 40 +++-------------- src/displayapp/screens/WatchFaceDigital.h | 9 +--- src/displayapp/screens/settings/QuickSettings.cpp | 15 ++++--- src/displayapp/screens/settings/QuickSettings.h | 13 ++++-- src/displayapp/widgets/StatusIcons.cpp | 55 +++++++++++++++++++++++ src/displayapp/widgets/StatusIcons.h | 38 ++++++++++++++++ 12 files changed, 151 insertions(+), 69 deletions(-) create mode 100644 src/displayapp/widgets/StatusIcons.cpp create mode 100644 src/displayapp/widgets/StatusIcons.h (limited to 'src/displayapp/DisplayApp.cpp') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6069aca6..e6971a56 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -406,6 +406,7 @@ list(APPEND SOURCE_FILES displayapp/Colors.cpp displayapp/widgets/Counter.cpp displayapp/widgets/PageIndicator.cpp + displayapp/widgets/StatusIcons.cpp ## Settings displayapp/screens/settings/QuickSettings.cpp @@ -611,6 +612,7 @@ set(INCLUDE_FILES displayapp/Colors.h displayapp/widgets/Counter.h displayapp/widgets/PageIndicator.h + displayapp/widgets/StatusIcons.h drivers/St7789.h drivers/SpiNorFlash.h drivers/SpiMaster.h diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 93d7277d..d5cc9810 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -311,7 +311,8 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) switch (app) { case Apps::Launcher: - currentScreen = std::make_unique(this, settingsController, batteryController, dateTimeController); + currentScreen = + std::make_unique(this, settingsController, batteryController, bleController, dateTimeController); ReturnApp(Apps::Clock, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; case Apps::None: @@ -377,7 +378,8 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) dateTimeController, brightnessController, motorController, - settingsController); + settingsController, + bleController); ReturnApp(Apps::Clock, FullRefreshDirections::LeftAnim, TouchEvents::SwipeLeft); break; case Apps::Settings: diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp index 9fd408e1..9f3e9568 100644 --- a/src/displayapp/screens/ApplicationList.cpp +++ b/src/displayapp/screens/ApplicationList.cpp @@ -21,10 +21,12 @@ auto ApplicationList::CreateScreenList() const { ApplicationList::ApplicationList(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController, Pinetime::Controllers::Battery& batteryController, + Pinetime::Controllers::Ble& bleController, Controllers::DateTime& dateTimeController) : Screen(app), settingsController {settingsController}, batteryController {batteryController}, + bleController {bleController}, dateTimeController {dateTimeController}, screens {app, settingsController.GetAppMenu(), CreateScreenList(), Screens::ScreenListModes::UpDown} { } @@ -43,5 +45,12 @@ std::unique_ptr ApplicationList::CreateScreen(unsigned int screenNum) co apps[i] = applications[screenNum * appsPerScreen + i]; } - return std::make_unique(screenNum, nScreens, app, settingsController, batteryController, dateTimeController, apps); + return std::make_unique(screenNum, + nScreens, + app, + settingsController, + batteryController, + bleController, + dateTimeController, + apps); } diff --git a/src/displayapp/screens/ApplicationList.h b/src/displayapp/screens/ApplicationList.h index 14d7623c..e7c094bf 100644 --- a/src/displayapp/screens/ApplicationList.h +++ b/src/displayapp/screens/ApplicationList.h @@ -19,6 +19,7 @@ namespace Pinetime { explicit ApplicationList(DisplayApp* app, Pinetime::Controllers::Settings& settingsController, Pinetime::Controllers::Battery& batteryController, + Pinetime::Controllers::Ble& bleController, Controllers::DateTime& dateTimeController); ~ApplicationList() override; bool OnTouchEvent(TouchEvents event) override; @@ -29,6 +30,7 @@ namespace Pinetime { Controllers::Settings& settingsController; Pinetime::Controllers::Battery& batteryController; + Pinetime::Controllers::Ble& bleController; Controllers::DateTime& dateTimeController; static constexpr int appsPerScreen = 6; diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp index c633e17b..2af04ab0 100644 --- a/src/displayapp/screens/Tile.cpp +++ b/src/displayapp/screens/Tile.cpp @@ -1,6 +1,7 @@ #include "displayapp/screens/Tile.h" #include "displayapp/DisplayApp.h" #include "displayapp/screens/BatteryIcon.h" +#include "components/ble/BleController.h" using namespace Pinetime::Applications::Screens; @@ -26,22 +27,26 @@ Tile::Tile(uint8_t screenID, uint8_t numScreens, DisplayApp* app, Controllers::Settings& settingsController, - Pinetime::Controllers::Battery& batteryController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, Controllers::DateTime& dateTimeController, std::array& applications) - : Screen(app), batteryController {batteryController}, dateTimeController {dateTimeController}, pageIndicator(screenID, numScreens) { + : Screen(app), + dateTimeController {dateTimeController}, + pageIndicator(screenID, numScreens), + statusIcons(batteryController, bleController) { settingsController.SetAppMenu(screenID); + statusIcons.Create(); + lv_obj_align(statusIcons.GetObject(), lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -8, 0); + statusIcons.Align(); + // Time label_time = lv_label_create(lv_scr_act(), nullptr); lv_label_set_align(label_time, LV_LABEL_ALIGN_CENTER); lv_obj_align(label_time, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0); - // Battery - batteryIcon.Create(lv_scr_act()); - lv_obj_align(batteryIcon.GetObject(), nullptr, LV_ALIGN_IN_TOP_RIGHT, -8, 0); - pageIndicator.Create(); uint8_t btIndex = 0; @@ -93,7 +98,7 @@ Tile::~Tile() { void Tile::UpdateScreen() { lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str()); - batteryIcon.SetBatteryPercentage(batteryController.PercentRemaining()); + statusIcons.Update(); } void Tile::OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId) { diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h index ff121376..d8a68128 100644 --- a/src/displayapp/screens/Tile.h +++ b/src/displayapp/screens/Tile.h @@ -7,10 +7,9 @@ #include "displayapp/Apps.h" #include "components/datetime/DateTimeController.h" #include "components/settings/Settings.h" -#include "components/datetime/DateTimeController.h" #include "components/battery/BatteryController.h" -#include "displayapp/screens/BatteryIcon.h" #include "displayapp/widgets/PageIndicator.h" +#include "displayapp/widgets/StatusIcons.h" namespace Pinetime { namespace Applications { @@ -26,7 +25,8 @@ namespace Pinetime { uint8_t numScreens, DisplayApp* app, Controllers::Settings& settingsController, - Pinetime::Controllers::Battery& batteryController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, Controllers::DateTime& dateTimeController, std::array& applications); @@ -36,7 +36,6 @@ namespace Pinetime { void OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId); private: - Pinetime::Controllers::Battery& batteryController; Controllers::DateTime& dateTimeController; lv_task_t* taskUpdate; @@ -45,8 +44,7 @@ namespace Pinetime { lv_obj_t* btnm1; Widgets::PageIndicator pageIndicator; - - BatteryIcon batteryIcon; + Widgets::StatusIcons statusIcons; const char* btnmMap[8]; Pinetime::Applications::Apps apps[6]; diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index d10f8532..7e876d8f 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -3,8 +3,6 @@ #include #include #include -#include "displayapp/screens/BatteryIcon.h" -#include "displayapp/screens/BleIcon.h" #include "displayapp/screens/NotificationIcon.h" #include "displayapp/screens/Symbols.h" #include "components/battery/BatteryController.h" @@ -13,6 +11,7 @@ #include "components/heartrate/HeartRateController.h" #include "components/motion/MotionController.h" #include "components/settings/Settings.h" + using namespace Pinetime::Applications::Screens; WatchFaceDigital::WatchFaceDigital(DisplayApp* app, @@ -26,25 +25,13 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, : Screen(app), currentDateTime {{}}, dateTimeController {dateTimeController}, - batteryController {batteryController}, - bleController {bleController}, notificatioManager {notificatioManager}, settingsController {settingsController}, heartRateController {heartRateController}, - motionController {motionController} { - - batteryIcon.Create(lv_scr_act()); - lv_obj_align(batteryIcon.GetObject(), lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0); + motionController {motionController}, + statusIcons(batteryController, bleController) { - batteryPlug = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(batteryPlug, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xFF0000)); - lv_label_set_text_static(batteryPlug, Symbols::plug); - lv_obj_align(batteryPlug, batteryIcon.GetObject(), LV_ALIGN_OUT_LEFT_MID, -5, 0); - - bleIcon = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(bleIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x0082FC)); - lv_label_set_text_static(bleIcon, Symbols::bluetooth); - lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0); + statusIcons.Create(); notificationIcon = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FF00)); @@ -94,24 +81,7 @@ WatchFaceDigital::~WatchFaceDigital() { } void WatchFaceDigital::Refresh() { - powerPresent = batteryController.IsPowerPresent(); - if (powerPresent.IsUpdated()) { - lv_label_set_text_static(batteryPlug, BatteryIcon::GetPlugIcon(powerPresent.Get())); - } - - batteryPercentRemaining = batteryController.PercentRemaining(); - if (batteryPercentRemaining.IsUpdated()) { - auto batteryPercent = batteryPercentRemaining.Get(); - batteryIcon.SetBatteryPercentage(batteryPercent); - } - - bleState = bleController.IsConnected(); - bleRadioEnabled = bleController.IsRadioEnabled(); - if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { - lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); - } - lv_obj_realign(batteryPlug); - lv_obj_realign(bleIcon); + statusIcons.Update(); notificationState = notificatioManager.AreNewNotificationsAvailable(); if (notificationState.IsUpdated()) { diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index bd27806f..49935792 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -8,6 +7,7 @@ #include "displayapp/screens/Screen.h" #include "components/datetime/DateTimeController.h" #include "components/ble/BleController.h" +#include "displayapp/widgets/StatusIcons.h" namespace Pinetime { namespace Controllers { @@ -59,25 +59,20 @@ namespace Pinetime { lv_obj_t* label_time; lv_obj_t* label_time_ampm; lv_obj_t* label_date; - lv_obj_t* bleIcon; - lv_obj_t* batteryPlug; lv_obj_t* heartbeatIcon; lv_obj_t* heartbeatValue; lv_obj_t* stepIcon; lv_obj_t* stepValue; lv_obj_t* notificationIcon; - BatteryIcon batteryIcon; - Controllers::DateTime& dateTimeController; - Controllers::Battery& batteryController; - Controllers::Ble& bleController; Controllers::NotificationManager& notificatioManager; Controllers::Settings& settingsController; Controllers::HeartRateController& heartRateController; Controllers::MotionController& motionController; lv_task_t* taskRefresh; + Widgets::StatusIcons statusIcons; }; } } diff --git a/src/displayapp/screens/settings/QuickSettings.cpp b/src/displayapp/screens/settings/QuickSettings.cpp index ab5a437b..f7560066 100644 --- a/src/displayapp/screens/settings/QuickSettings.cpp +++ b/src/displayapp/screens/settings/QuickSettings.cpp @@ -2,6 +2,7 @@ #include "displayapp/DisplayApp.h" #include "displayapp/screens/Symbols.h" #include "displayapp/screens/BatteryIcon.h" +#include using namespace Pinetime::Applications::Screens; @@ -22,13 +23,16 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, Controllers::DateTime& dateTimeController, Controllers::BrightnessController& brightness, Controllers::MotorController& motorController, - Pinetime::Controllers::Settings& settingsController) + Pinetime::Controllers::Settings& settingsController, + Controllers::Ble& bleController) : Screen(app), - batteryController {batteryController}, dateTimeController {dateTimeController}, brightness {brightness}, motorController {motorController}, - settingsController {settingsController} { + settingsController {settingsController}, + statusIcons(batteryController, bleController) { + + statusIcons.Create(); // This is the distance (padding) between all objects on this screen. static constexpr uint8_t innerDistance = 10; @@ -38,9 +42,6 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, lv_label_set_align(label_time, LV_LABEL_ALIGN_CENTER); lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 0, 0); - batteryIcon.Create(lv_scr_act()); - lv_obj_align(batteryIcon.GetObject(), nullptr, LV_ALIGN_IN_TOP_RIGHT, 0, 0); - static constexpr uint8_t barHeight = 20 + innerDistance; static constexpr uint8_t buttonHeight = (LV_VER_RES_MAX - barHeight - innerDistance) / 2; static constexpr uint8_t buttonWidth = (LV_HOR_RES_MAX - innerDistance) / 2; // wide buttons @@ -117,7 +118,7 @@ QuickSettings::~QuickSettings() { void QuickSettings::UpdateScreen() { lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str()); - batteryIcon.SetBatteryPercentage(batteryController.PercentRemaining()); + statusIcons.Update(); } void QuickSettings::OnButtonEvent(lv_obj_t* object, lv_event_t event) { diff --git a/src/displayapp/screens/settings/QuickSettings.h b/src/displayapp/screens/settings/QuickSettings.h index 40a2a2ef..fd1b5ea4 100644 --- a/src/displayapp/screens/settings/QuickSettings.h +++ b/src/displayapp/screens/settings/QuickSettings.h @@ -8,7 +8,7 @@ #include "components/motor/MotorController.h" #include "components/settings/Settings.h" #include "components/battery/BatteryController.h" -#include +#include "displayapp/widgets/StatusIcons.h" namespace Pinetime { @@ -22,7 +22,8 @@ namespace Pinetime { Controllers::DateTime& dateTimeController, Controllers::BrightnessController& brightness, Controllers::MotorController& motorController, - Pinetime::Controllers::Settings& settingsController); + Pinetime::Controllers::Settings& settingsController, + Controllers::Ble& bleController); ~QuickSettings() override; @@ -31,7 +32,6 @@ namespace Pinetime { void UpdateScreen(); private: - Pinetime::Controllers::Battery& batteryController; Controllers::DateTime& dateTimeController; Controllers::BrightnessController& brightness; Controllers::MotorController& motorController; @@ -40,6 +40,11 @@ namespace Pinetime { lv_task_t* taskUpdate; lv_obj_t* label_time; + DirtyValue batteryPercentRemaining {}; + DirtyValue powerPresent {}; + DirtyValue bleState {}; + DirtyValue bleRadioEnabled {}; + lv_style_t btn_style; lv_obj_t* btn1; @@ -49,7 +54,7 @@ namespace Pinetime { lv_obj_t* btn3_lvl; lv_obj_t* btn4; - BatteryIcon batteryIcon; + Widgets::StatusIcons statusIcons; }; } } diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp new file mode 100644 index 00000000..d8f294b5 --- /dev/null +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -0,0 +1,55 @@ +#include "displayapp/widgets/StatusIcons.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Widgets; + +StatusIcons::StatusIcons(Controllers::Battery& batteryController, Controllers::Ble& bleController) + : batteryController {batteryController}, bleController {bleController} { +} + +void StatusIcons::Align() { + lv_obj_t* lastIcon = batteryIcon.GetObject(); + + for (auto& icon : icons) { + if (!lv_obj_get_hidden(icon)) { + lv_obj_align(icon, lastIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0); + lastIcon = icon; + } + } +} + +void StatusIcons::Create() { + batteryIcon.Create(lv_scr_act()); + lv_obj_align(batteryIcon.GetObject(), lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0); + + icons[Icons::BatteryPlug] = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(icons[Icons::BatteryPlug], LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xFF0000)); + lv_label_set_text_static(icons[Icons::BatteryPlug], Screens::Symbols::plug); + + icons[Icons::BleIcon] = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(icons[Icons::BleIcon], LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x0082FC)); + lv_label_set_text_static(icons[Icons::BleIcon], Screens::Symbols::bluetooth); + + Align(); +} + +void StatusIcons::Update() { + powerPresent = batteryController.IsPowerPresent(); + if (powerPresent.IsUpdated()) { + lv_obj_set_hidden(icons[Icons::BatteryPlug], !powerPresent.Get()); + } + + batteryPercentRemaining = batteryController.PercentRemaining(); + if (batteryPercentRemaining.IsUpdated()) { + auto batteryPercent = batteryPercentRemaining.Get(); + batteryIcon.SetBatteryPercentage(batteryPercent); + } + + bleState = bleController.IsConnected(); + bleRadioEnabled = bleController.IsRadioEnabled(); + if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { + lv_obj_set_hidden(icons[Icons::BleIcon], !bleState.Get()); + } + + Align(); +} diff --git a/src/displayapp/widgets/StatusIcons.h b/src/displayapp/widgets/StatusIcons.h new file mode 100644 index 00000000..b6e713e2 --- /dev/null +++ b/src/displayapp/widgets/StatusIcons.h @@ -0,0 +1,38 @@ +#pragma once + +#include + +#include "displayapp/screens/Screen.h" +#include "components/battery/BatteryController.h" +#include "components/ble/BleController.h" +#include "displayapp/screens/BatteryIcon.h" + +namespace Pinetime { + namespace Applications { + namespace Widgets { + class StatusIcons { + public: + StatusIcons(Controllers::Battery& batteryController, Controllers::Ble& bleController); + void Align(); + void Create(); + lv_obj_t* GetObject() { + return batteryIcon.GetObject(); + } + void Update(); + + private: + Screens::BatteryIcon batteryIcon; + Pinetime::Controllers::Battery& batteryController; + Controllers::Ble& bleController; + + Screens::DirtyValue batteryPercentRemaining {}; + Screens::DirtyValue powerPresent {}; + Screens::DirtyValue bleState {}; + Screens::DirtyValue bleRadioEnabled {}; + + enum Icons { BatteryPlug, BleIcon }; + lv_obj_t* icons[2]; + }; + } + } +} -- cgit v1.2.3-70-g09d2 From 97048121b05abb2c51c09a4340fe0aa223f46182 Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Fri, 22 Jul 2022 08:33:15 +0300 Subject: Use Counter widget in Alarm --- src/displayapp/DisplayApp.cpp | 2 +- src/displayapp/screens/Alarm.cpp | 162 +++++++++++++-------------------------- src/displayapp/screens/Alarm.h | 14 ++-- 3 files changed, 61 insertions(+), 117 deletions(-) (limited to 'src/displayapp/DisplayApp.cpp') diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index d5cc9810..29684466 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -368,7 +368,7 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) currentScreen = std::make_unique(this, timerController); break; case Apps::Alarm: - currentScreen = std::make_unique(this, alarmController, settingsController, *systemTask); + currentScreen = std::make_unique(this, alarmController, settingsController.GetClockType(), *systemTask); break; // Settings diff --git a/src/displayapp/screens/Alarm.cpp b/src/displayapp/screens/Alarm.cpp index c1ee6469..d508dd39 100644 --- a/src/displayapp/screens/Alarm.cpp +++ b/src/displayapp/screens/Alarm.cpp @@ -22,6 +22,13 @@ using namespace Pinetime::Applications::Screens; using Pinetime::Controllers::AlarmController; +namespace { + void ValueChangedHandler(void* userData) { + auto* screen = static_cast(userData); + screen->OnValueChanged(); + } +} + static void btnEventHandler(lv_obj_t* obj, lv_event_t event) { auto* screen = static_cast(obj->user_data); screen->OnButtonEvent(obj, event); @@ -34,59 +41,34 @@ static void StopAlarmTaskCallback(lv_task_t* task) { Alarm::Alarm(DisplayApp* app, Controllers::AlarmController& alarmController, - Pinetime::Controllers::Settings& settingsController, + Controllers::Settings::ClockType clockType, System::SystemTask& systemTask) - : Screen(app), alarmController {alarmController}, settingsController {settingsController}, systemTask {systemTask} { + : Screen(app), alarmController {alarmController}, clockType {clockType}, systemTask {systemTask} { - time = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); - lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0xb0, 0xb0, 0xb0)); + hourCounter.Create(); + lv_obj_align(hourCounter.GetObject(), nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0); + if (clockType == Controllers::Settings::ClockType::H12) { + hourCounter.EnableTwelveHourMode(); + } + hourCounter.SetValue(alarmController.Hours()); + hourCounter.SetValueChangedEventCallback(this, ValueChangedHandler); - alarmHours = alarmController.Hours(); - alarmMinutes = alarmController.Minutes(); - lv_label_set_text_fmt(time, "%02hhu:%02hhu", alarmHours, alarmMinutes); + minuteCounter.Create(); + lv_obj_align(minuteCounter.GetObject(), nullptr, LV_ALIGN_IN_TOP_RIGHT, 0, 0); + minuteCounter.SetValue(alarmController.Minutes()); + minuteCounter.SetValueChangedEventCallback(this, ValueChangedHandler); - lv_obj_align(time, lv_scr_act(), LV_ALIGN_CENTER, 0, -25); + lv_obj_t* colonLabel = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_font(colonLabel, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); + lv_label_set_text_static(colonLabel, ":"); + lv_obj_align(colonLabel, lv_scr_act(), LV_ALIGN_CENTER, 0, -29); lblampm = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(lblampm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); - lv_obj_set_style_local_text_color(lblampm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0xb0, 0xb0, 0xb0)); lv_label_set_text_static(lblampm, " "); lv_label_set_align(lblampm, LV_LABEL_ALIGN_CENTER); lv_obj_align(lblampm, lv_scr_act(), LV_ALIGN_CENTER, 0, 30); - btnHoursUp = lv_btn_create(lv_scr_act(), nullptr); - btnHoursUp->user_data = this; - lv_obj_set_event_cb(btnHoursUp, btnEventHandler); - lv_obj_set_size(btnHoursUp, 60, 40); - lv_obj_align(btnHoursUp, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 20, -85); - txtHrUp = lv_label_create(btnHoursUp, nullptr); - lv_label_set_text_static(txtHrUp, "+"); - - btnHoursDown = lv_btn_create(lv_scr_act(), nullptr); - btnHoursDown->user_data = this; - lv_obj_set_event_cb(btnHoursDown, btnEventHandler); - lv_obj_set_size(btnHoursDown, 60, 40); - lv_obj_align(btnHoursDown, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 20, 35); - txtHrDown = lv_label_create(btnHoursDown, nullptr); - lv_label_set_text_static(txtHrDown, "-"); - - btnMinutesUp = lv_btn_create(lv_scr_act(), nullptr); - btnMinutesUp->user_data = this; - lv_obj_set_event_cb(btnMinutesUp, btnEventHandler); - lv_obj_set_size(btnMinutesUp, 60, 40); - lv_obj_align(btnMinutesUp, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, -20, -85); - txtMinUp = lv_label_create(btnMinutesUp, nullptr); - lv_label_set_text_static(txtMinUp, "+"); - - btnMinutesDown = lv_btn_create(lv_scr_act(), nullptr); - btnMinutesDown->user_data = this; - lv_obj_set_event_cb(btnMinutesDown, btnEventHandler); - lv_obj_set_size(btnMinutesDown, 60, 40); - lv_obj_align(btnMinutesDown, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, -20, 35); - txtMinDown = lv_label_create(btnMinutesDown, nullptr); - lv_label_set_text_static(txtMinDown, "-"); - btnStop = lv_btn_create(lv_scr_act(), nullptr); btnStop->user_data = this; lv_obj_set_event_cb(btnStop, btnEventHandler); @@ -104,14 +86,15 @@ Alarm::Alarm(DisplayApp* app, lv_obj_align(btnRecur, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); txtRecur = lv_label_create(btnRecur, nullptr); SetRecurButtonState(); + lv_obj_set_style_local_bg_color(btnRecur, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x38, 0x38, 0x38)); + // Invisible button above the time btnInfo = lv_btn_create(lv_scr_act(), nullptr); btnInfo->user_data = this; lv_obj_set_event_cb(btnInfo, btnEventHandler); - lv_obj_set_size(btnInfo, 50, 40); - lv_obj_align(btnInfo, lv_scr_act(), LV_ALIGN_CENTER, 0, -85); - txtInfo = lv_label_create(btnInfo, nullptr); - lv_label_set_text_static(txtInfo, "i"); + lv_obj_set_size(btnInfo, LV_HOR_RES, 80); + lv_obj_align(btnInfo, lv_scr_act(), LV_ALIGN_CENTER, 0, -29); + lv_obj_set_style_local_bg_opa(btnInfo, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); enableSwitch = lv_switch_create(lv_scr_act(), nullptr); enableSwitch->user_data = this; @@ -119,6 +102,7 @@ Alarm::Alarm(DisplayApp* app, lv_obj_set_size(enableSwitch, 100, 50); // Align to the center of 115px from edge lv_obj_align(enableSwitch, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 7, 0); + lv_obj_set_style_local_bg_color(enableSwitch, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x38, 0x38, 0x38)); UpdateAlarmTime(); @@ -136,8 +120,14 @@ Alarm::~Alarm() { lv_obj_clean(lv_scr_act()); } +void Alarm::DisableAlarm() { + if (alarmController.State() == AlarmController::AlarmState::Set) { + alarmController.DisableAlarm(); + lv_switch_off(enableSwitch, LV_ANIM_ON); + } +} + void Alarm::OnButtonEvent(lv_obj_t* obj, lv_event_t event) { - using Pinetime::Controllers::AlarmController; if (event == LV_EVENT_CLICKED) { if (obj == btnStop) { StopAlerting(); @@ -159,49 +149,8 @@ void Alarm::OnButtonEvent(lv_obj_t* obj, lv_event_t event) { } return; } - // If any other button was pressed, disable the alarm - // this is to make it clear that the alarm won't be set until it is turned back on - if (alarmController.State() == AlarmController::AlarmState::Set) { - alarmController.DisableAlarm(); - lv_switch_off(enableSwitch, LV_ANIM_ON); - } - if (obj == btnMinutesUp) { - if (alarmMinutes >= 59) { - alarmMinutes = 0; - } else { - alarmMinutes++; - } - UpdateAlarmTime(); - return; - } - if (obj == btnMinutesDown) { - if (alarmMinutes == 0) { - alarmMinutes = 59; - } else { - alarmMinutes--; - } - UpdateAlarmTime(); - return; - } - if (obj == btnHoursUp) { - if (alarmHours >= 23) { - alarmHours = 0; - } else { - alarmHours++; - } - UpdateAlarmTime(); - return; - } - if (obj == btnHoursDown) { - if (alarmHours == 0) { - alarmHours = 23; - } else { - alarmHours--; - } - UpdateAlarmTime(); - return; - } if (obj == btnRecur) { + DisableAlarm(); ToggleRecurrence(); } } @@ -224,30 +173,20 @@ bool Alarm::OnTouchEvent(Pinetime::Applications::TouchEvents event) { return alarmController.State() == AlarmController::AlarmState::Alerting && event == TouchEvents::SwipeDown; } +void Alarm::OnValueChanged() { + DisableAlarm(); + UpdateAlarmTime(); +} + void Alarm::UpdateAlarmTime() { - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { - switch (alarmHours) { - case 0: - lv_label_set_text_static(lblampm, "AM"); - lv_label_set_text_fmt(time, "%02d:%02d", 12, alarmMinutes); - break; - case 1 ... 11: - lv_label_set_text_static(lblampm, "AM"); - lv_label_set_text_fmt(time, "%02d:%02d", alarmHours, alarmMinutes); - break; - case 12: - lv_label_set_text_static(lblampm, "PM"); - lv_label_set_text_fmt(time, "%02d:%02d", 12, alarmMinutes); - break; - case 13 ... 23: - lv_label_set_text_static(lblampm, "PM"); - lv_label_set_text_fmt(time, "%02d:%02d", alarmHours - 12, alarmMinutes); - break; + if (clockType == Controllers::Settings::ClockType::H12) { + if (hourCounter.GetValue() >= 12) { + lv_label_set_text_static(lblampm, "PM"); + } else { + lv_label_set_text_static(lblampm, "AM"); } - } else { - lv_label_set_text_fmt(time, "%02d:%02d", alarmHours, alarmMinutes); } - alarmController.SetAlarmTime(alarmHours, alarmMinutes); + alarmController.SetAlarmTime(hourCounter.GetValue(), minuteCounter.GetValue()); } void Alarm::SetAlerting() { @@ -283,6 +222,9 @@ void Alarm::SetSwitchState(lv_anim_enable_t anim) { } void Alarm::ShowInfo() { + if (btnMessage != nullptr) { + return; + } btnMessage = lv_btn_create(lv_scr_act(), nullptr); btnMessage->user_data = this; lv_obj_set_event_cb(btnMessage, btnEventHandler); diff --git a/src/displayapp/screens/Alarm.h b/src/displayapp/screens/Alarm.h index 80e446f1..a64bbe81 100644 --- a/src/displayapp/screens/Alarm.h +++ b/src/displayapp/screens/Alarm.h @@ -21,6 +21,7 @@ #include "systemtask/SystemTask.h" #include "displayapp/LittleVgl.h" #include "components/alarm/AlarmController.h" +#include "displayapp/widgets/Counter.h" namespace Pinetime { namespace Applications { @@ -29,29 +30,28 @@ namespace Pinetime { public: Alarm(DisplayApp* app, Controllers::AlarmController& alarmController, - Pinetime::Controllers::Settings& settingsController, + Controllers::Settings::ClockType clockType, System::SystemTask& systemTask); ~Alarm() override; void SetAlerting(); void OnButtonEvent(lv_obj_t* obj, lv_event_t event); bool OnButtonPushed() override; bool OnTouchEvent(TouchEvents event) override; + void OnValueChanged(); void StopAlerting(); private: - uint8_t alarmHours; - uint8_t alarmMinutes; Controllers::AlarmController& alarmController; - Controllers::Settings& settingsController; + const Controllers::Settings::ClockType clockType; System::SystemTask& systemTask; - lv_obj_t *time, *lblampm, *btnStop, *txtStop, *btnMinutesUp, *btnMinutesDown, *btnHoursUp, *btnHoursDown, *txtMinUp, *txtMinDown, - *txtHrUp, *txtHrDown, *btnRecur, *txtRecur, *btnInfo, *txtInfo, *enableSwitch; + lv_obj_t *lblampm, *btnStop, *txtStop, *btnRecur, *txtRecur, *btnInfo, *enableSwitch; lv_obj_t* txtMessage = nullptr; lv_obj_t* btnMessage = nullptr; lv_task_t* taskStopAlarm = nullptr; enum class EnableButtonState { On, Off, Alerting }; + void DisableAlarm(); void SetRecurButtonState(); void SetSwitchState(lv_anim_enable_t anim); void SetAlarm(); @@ -59,6 +59,8 @@ namespace Pinetime { void HideInfo(); void ToggleRecurrence(); void UpdateAlarmTime(); + Widgets::Counter hourCounter = Widgets::Counter(0, 23, jetbrains_mono_76); + Widgets::Counter minuteCounter = Widgets::Counter(0, 59, jetbrains_mono_76); }; }; }; -- cgit v1.2.3-70-g09d2