diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index 3a7a00fae5..ee7b1cefb1 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -7,6 +7,7 @@ #include "displayapp/screens/Symbols.h" #include "displayapp/screens/NotificationIcon.h" #include "components/settings/Settings.h" +#include "components/alarm/AlarmController.h" #include "displayapp/InfiniTimeTheme.h" using namespace Pinetime::Applications::Screens; @@ -48,14 +49,16 @@ WatchFaceAnalog::WatchFaceAnalog(Controllers::DateTime& dateTimeController, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController) + Controllers::Settings& settingsController, + Controllers::AlarmController& alarmController) : currentDateTime {{}}, batteryIcon(true), dateTimeController {dateTimeController}, batteryController {batteryController}, bleController {bleController}, notificationManager {notificationManager}, - settingsController {settingsController} { + settingsController {settingsController}, + alarmController {alarmController} { sHour = 99; sMinute = 99; @@ -157,6 +160,11 @@ WatchFaceAnalog::WatchFaceAnalog(Controllers::DateTime& dateTimeController, lv_style_set_line_rounded(&hour_line_style_trace, LV_STATE_DEFAULT, false); lv_obj_add_style(hour_body_trace, LV_LINE_PART_MAIN, &hour_line_style_trace); + alarmIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(alarmIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FFE7)); + lv_label_set_text_static(alarmIcon, Symbols::bell); + lv_obj_align(alarmIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0); + taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); Refresh(); @@ -264,4 +272,13 @@ void WatchFaceAnalog::Refresh() { lv_label_set_text_fmt(label_date_day, "%s\n%02i", dateTimeController.DayOfWeekShortToString(), dateTimeController.Day()); } } + + alarmSet = alarmController.IsEnabled(); + if (alarmSet.Get()) { + lv_obj_set_style_local_text_color(alarmIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x6AA84F)); + lv_obj_realign(alarmIcon); + } else { + lv_obj_set_style_local_text_color(alarmIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x1B1B1B)); + lv_obj_realign(alarmIcon); + } } diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index 2c3946bff1..d9c442af07 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -18,6 +18,7 @@ namespace Pinetime { class Battery; class Ble; class NotificationManager; + class AlarmController; } namespace Applications { @@ -29,7 +30,8 @@ namespace Pinetime { const Controllers::Battery& batteryController, const Controllers::Ble& bleController, Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController); + Controllers::Settings& settingsController, + Controllers::AlarmController& alarmController); ~WatchFaceAnalog() override; @@ -44,6 +46,7 @@ namespace Pinetime { Utility::DirtyValue> currentDateTime; Utility::DirtyValue notificationState {false}; Utility::DirtyValue> currentDate; + Utility::DirtyValue alarmSet {}; lv_obj_t* minor_scales; lv_obj_t* major_scales; @@ -72,6 +75,7 @@ namespace Pinetime { lv_obj_t* plugIcon; lv_obj_t* notificationIcon; lv_obj_t* bleIcon; + lv_obj_t* alarmIcon; BatteryIcon batteryIcon; @@ -80,6 +84,7 @@ namespace Pinetime { const Controllers::Ble& bleController; Controllers::NotificationManager& notificationManager; Controllers::Settings& settingsController; + Controllers::AlarmController& alarmController; void UpdateClock(); void SetBatteryIcon(); @@ -98,7 +103,8 @@ namespace Pinetime { controllers.batteryController, controllers.bleController, controllers.notificationManager, - controllers.settingsController); + controllers.settingsController, + controllers.alarmController); }; static bool IsAvailable(Pinetime::Controllers::FS& /*filesystem*/) { diff --git a/src/displayapp/screens/WatchFacePineTimeStyle.cpp b/src/displayapp/screens/WatchFacePineTimeStyle.cpp index ce8f8f7ed9..92b5dfe21f 100644 --- a/src/displayapp/screens/WatchFacePineTimeStyle.cpp +++ b/src/displayapp/screens/WatchFacePineTimeStyle.cpp @@ -35,6 +35,7 @@ #include "components/settings/Settings.h" #include "displayapp/DisplayApp.h" #include "components/ble/SimpleWeatherService.h" +#include "components/alarm/AlarmController.h" using namespace Pinetime::Applications::Screens; @@ -51,7 +52,8 @@ WatchFacePineTimeStyle::WatchFacePineTimeStyle(Controllers::DateTime& dateTimeCo Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::MotionController& motionController, - Controllers::SimpleWeatherService& weatherService) + Controllers::SimpleWeatherService& weatherService, + Controllers::AlarmController& alarmController) : currentDateTime {{}}, batteryIcon(false), dateTimeController {dateTimeController}, @@ -60,7 +62,8 @@ WatchFacePineTimeStyle::WatchFacePineTimeStyle(Controllers::DateTime& dateTimeCo notificationManager {notificationManager}, settingsController {settingsController}, motionController {motionController}, - weatherService {weatherService} { + weatherService {weatherService}, + alarmController {alarmController} { // Create a 200px wide background rectangle timebar = lv_obj_create(lv_scr_act(), nullptr); @@ -135,6 +138,11 @@ WatchFacePineTimeStyle::WatchFacePineTimeStyle(Controllers::DateTime& dateTimeCo lv_obj_set_hidden(temperature, true); } + alarmIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(alarmIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_label_set_text_static(alarmIcon, Symbols::bell); + lv_obj_align(alarmIcon, nullptr, LV_ALIGN_IN_TOP_MID, 92, 1); + // Calendar icon calendarOuter = lv_obj_create(lv_scr_act(), nullptr); lv_obj_set_style_local_bg_color(calendarOuter, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); @@ -564,6 +572,16 @@ void WatchFacePineTimeStyle::Refresh() { savedTick = 0; } } + + alarmSet = alarmController.IsEnabled(); + if (alarmSet.Get()) { + lv_obj_set_hidden(alarmIcon, false); + lv_obj_set_style_local_text_color(alarmIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_obj_realign(alarmIcon); + } else { + lv_obj_set_hidden(alarmIcon, true); + lv_obj_realign(alarmIcon); + } } void WatchFacePineTimeStyle::UpdateSelected(lv_obj_t* object, lv_event_t event) { diff --git a/src/displayapp/screens/WatchFacePineTimeStyle.h b/src/displayapp/screens/WatchFacePineTimeStyle.h index e44a612891..10e2a40294 100644 --- a/src/displayapp/screens/WatchFacePineTimeStyle.h +++ b/src/displayapp/screens/WatchFacePineTimeStyle.h @@ -21,6 +21,7 @@ namespace Pinetime { class NotificationManager; class HeartRateController; class MotionController; + class AlarmController; } namespace Applications { @@ -33,7 +34,8 @@ namespace Pinetime { Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::MotionController& motionController, - Controllers::SimpleWeatherService& weather); + Controllers::SimpleWeatherService& weather, + Controllers::AlarmController& alarmController); ~WatchFacePineTimeStyle() override; bool OnTouchEvent(TouchEvents event) override; @@ -62,6 +64,7 @@ namespace Pinetime { Utility::DirtyValue stepCount {}; Utility::DirtyValue notificationState {}; Utility::DirtyValue> currentWeather {}; + Utility::DirtyValue alarmSet {}; static Pinetime::Controllers::Settings::Colors GetNext(Controllers::Settings::Colors color); static Pinetime::Controllers::Settings::Colors GetPrevious(Controllers::Settings::Colors color); @@ -102,6 +105,7 @@ namespace Pinetime { lv_obj_t* btnSetOpts; lv_obj_t* stepIcon; lv_obj_t* stepValue; + lv_obj_t* alarmIcon; lv_color_t needle_colors[1]; BatteryIcon batteryIcon; @@ -113,6 +117,7 @@ namespace Pinetime { Controllers::Settings& settingsController; Controllers::MotionController& motionController; Controllers::SimpleWeatherService& weatherService; + Controllers::AlarmController& alarmController; void SetBatteryIcon(); void CloseMenu(); @@ -133,7 +138,8 @@ namespace Pinetime { controllers.notificationManager, controllers.settingsController, controllers.motionController, - *controllers.weatherController); + *controllers.weatherController, + controllers.alarmController); }; static bool IsAvailable(Pinetime::Controllers::FS& /*filesystem*/) { diff --git a/src/displayapp/screens/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp index 96d77741fd..6abc262a85 100644 --- a/src/displayapp/screens/WatchFaceTerminal.cpp +++ b/src/displayapp/screens/WatchFaceTerminal.cpp @@ -8,6 +8,7 @@ #include "components/ble/NotificationManager.h" #include "components/heartrate/HeartRateController.h" #include "components/motion/MotionController.h" +#include "components/alarm/AlarmController.h" #include "components/settings/Settings.h" using namespace Pinetime::Applications::Screens; @@ -18,7 +19,8 @@ WatchFaceTerminal::WatchFaceTerminal(Controllers::DateTime& dateTimeController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController) + Controllers::MotionController& motionController, + Controllers::AlarmController& alarmController) : currentDateTime {{}}, dateTimeController {dateTimeController}, batteryController {batteryController}, @@ -26,7 +28,8 @@ WatchFaceTerminal::WatchFaceTerminal(Controllers::DateTime& dateTimeController, notificationManager {notificationManager}, settingsController {settingsController}, heartRateController {heartRateController}, - motionController {motionController} { + motionController {motionController}, + alarmController {alarmController} { batteryValue = lv_label_create(lv_scr_act(), nullptr); lv_label_set_recolor(batteryValue, true); lv_obj_align(batteryValue, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -20); @@ -47,7 +50,7 @@ WatchFaceTerminal::WatchFaceTerminal(Controllers::DateTime& dateTimeController, lv_label_set_text_static(label_prompt_1, "user@watch:~ $ now"); label_prompt_2 = lv_label_create(lv_scr_act(), nullptr); - lv_obj_align(label_prompt_2, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 60); + lv_obj_align(label_prompt_2, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 80); lv_label_set_text_static(label_prompt_2, "user@watch:~ $"); label_time = lv_label_create(lv_scr_act(), nullptr); @@ -62,6 +65,10 @@ WatchFaceTerminal::WatchFaceTerminal(Controllers::DateTime& dateTimeController, lv_label_set_recolor(stepValue, true); lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 0); + alarmTime = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_recolor(alarmTime, true); + lv_obj_align(alarmTime, nullptr, LV_ALIGN_IN_LEFT_MID, 0, 60); + taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); Refresh(); } @@ -148,4 +155,26 @@ void WatchFaceTerminal::Refresh() { if (stepCount.IsUpdated()) { lv_label_set_text_fmt(stepValue, "[STEP]#ee3377 %lu steps#", stepCount.Get()); } + + alarmSet = alarmController.IsEnabled(); + if (alarmSet.Get()) { + uint8_t hour = alarmController.Hours(); + uint8_t minute = alarmController.Minutes(); + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { + char ampmChar[3] = "AM"; + if (hour == 0) { + hour = 12; + } else if (hour == 12) { + ampmChar[0] = 'P'; + } else if (hour > 12) { + hour = hour - 12; + ampmChar[0] = 'P'; + } + lv_label_set_text_fmt(alarmTime, "[RING]#11cc55 At %02d:%02d %s#", hour, minute, ampmChar); + } else { + lv_label_set_text_fmt(alarmTime, "[RING]#11cc55 At %02d:%02d#", hour, minute); + } + } else { + lv_label_set_text_fmt(alarmTime, "[RING]#11cc55 Not Set#"); + } } diff --git a/src/displayapp/screens/WatchFaceTerminal.h b/src/displayapp/screens/WatchFaceTerminal.h index bf4608660f..81a202fb16 100644 --- a/src/displayapp/screens/WatchFaceTerminal.h +++ b/src/displayapp/screens/WatchFaceTerminal.h @@ -17,6 +17,7 @@ namespace Pinetime { class NotificationManager; class HeartRateController; class MotionController; + class AlarmController; } namespace Applications { @@ -30,7 +31,8 @@ namespace Pinetime { Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController); + Controllers::MotionController& motionController, + Controllers::AlarmController& alarmController); ~WatchFaceTerminal() override; void Refresh() override; @@ -46,6 +48,7 @@ namespace Pinetime { Utility::DirtyValue heartbeatRunning {}; Utility::DirtyValue notificationState {}; Utility::DirtyValue> currentDate; + Utility::DirtyValue alarmSet {}; lv_obj_t* label_time; lv_obj_t* label_date; @@ -56,6 +59,7 @@ namespace Pinetime { lv_obj_t* stepValue; lv_obj_t* notificationIcon; lv_obj_t* connectState; + lv_obj_t* alarmTime; Controllers::DateTime& dateTimeController; const Controllers::Battery& batteryController; @@ -64,6 +68,7 @@ namespace Pinetime { Controllers::Settings& settingsController; Controllers::HeartRateController& heartRateController; Controllers::MotionController& motionController; + Controllers::AlarmController& alarmController; lv_task_t* taskRefresh; }; @@ -81,7 +86,8 @@ namespace Pinetime { controllers.notificationManager, controllers.settingsController, controllers.heartRateController, - controllers.motionController); + controllers.motionController, + controllers.alarmController); }; static bool IsAvailable(Pinetime::Controllers::FS& /*filesystem*/) {