From 2c57111fecef417304e799922dc1acb6020f7794 Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Sat, 19 Jun 2021 20:59:17 -0400 Subject: [PATCH 01/17] Refactored common functions out of DateTime controller --- src/CMakeLists.txt | 1 + src/components/ble/CurrentTimeClient.cpp | 2 +- src/components/ble/CurrentTimeClient.h | 8 +- src/components/ble/CurrentTimeService.cpp | 2 +- src/components/ble/CurrentTimeService.h | 4 +- src/components/ble/DfuService.h | 2 +- src/components/ble/NimbleController.cpp | 2 +- src/components/ble/NimbleController.h | 6 +- src/components/datetime/DateTime.cpp | 136 ++++++++++++++++++ src/components/datetime/DateTime.h | 42 ++++++ .../datetime/DateTimeController.cpp | 53 +------ src/components/datetime/DateTimeController.h | 46 +----- src/displayapp/DisplayApp.cpp | 2 +- src/displayapp/DisplayApp.h | 6 +- src/displayapp/DisplayAppRecovery.cpp | 2 +- src/displayapp/DisplayAppRecovery.h | 2 +- src/displayapp/screens/ApplicationList.cpp | 2 +- src/displayapp/screens/ApplicationList.h | 6 +- src/displayapp/screens/Clock.cpp | 4 +- src/displayapp/screens/Clock.h | 4 +- src/displayapp/screens/SystemInfo.cpp | 2 +- src/displayapp/screens/SystemInfo.h | 6 +- src/displayapp/screens/Tile.cpp | 2 +- src/displayapp/screens/Tile.h | 4 +- src/displayapp/screens/WatchFaceAnalog.cpp | 7 +- src/displayapp/screens/WatchFaceAnalog.h | 12 +- src/displayapp/screens/WatchFaceDigital.cpp | 11 +- src/displayapp/screens/WatchFaceDigital.h | 9 +- .../screens/settings/QuickSettings.cpp | 2 +- .../screens/settings/QuickSettings.h | 4 +- src/main.cpp | 2 +- src/systemtask/SystemTask.cpp | 2 +- src/systemtask/SystemTask.h | 4 +- 33 files changed, 253 insertions(+), 146 deletions(-) create mode 100644 src/components/datetime/DateTime.cpp create mode 100644 src/components/datetime/DateTime.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 40e1f2a554..c7bdc5b6eb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -451,6 +451,7 @@ list(APPEND SOURCE_FILES components/battery/BatteryController.cpp components/ble/BleController.cpp components/ble/NotificationManager.cpp + components/datetime/DateTime.cpp components/datetime/DateTimeController.cpp components/brightness/BrightnessController.cpp components/motion/MotionController.cpp diff --git a/src/components/ble/CurrentTimeClient.cpp b/src/components/ble/CurrentTimeClient.cpp index c6e6831294..5ca1adf6b7 100644 --- a/src/components/ble/CurrentTimeClient.cpp +++ b/src/components/ble/CurrentTimeClient.cpp @@ -28,7 +28,7 @@ namespace { } } -CurrentTimeClient::CurrentTimeClient(DateTime& dateTimeController) : dateTimeController {dateTimeController} { +CurrentTimeClient::CurrentTimeClient(DateTimeController& dateTimeController) : dateTimeController {dateTimeController} { } void CurrentTimeClient::Init() { diff --git a/src/components/ble/CurrentTimeClient.h b/src/components/ble/CurrentTimeClient.h index 6424c035b9..ae51a71a8a 100644 --- a/src/components/ble/CurrentTimeClient.h +++ b/src/components/ble/CurrentTimeClient.h @@ -9,11 +9,11 @@ namespace Pinetime { namespace Controllers { - class DateTime; + class DateTimeController; class CurrentTimeClient : public BleClient { public: - explicit CurrentTimeClient(DateTime& dateTimeController); + explicit CurrentTimeClient(DateTimeController& dateTimeController); void Init(); void Reset(); bool OnDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_svc* service); @@ -45,7 +45,7 @@ namespace Pinetime { static constexpr ble_uuid16_t ctsServiceUuid {.u {.type = BLE_UUID_TYPE_16}, .value = ctsServiceId}; static constexpr ble_uuid16_t currentTimeCharacteristicUuid {.u {.type = BLE_UUID_TYPE_16}, .value = currentTimeCharacteristicId}; - DateTime& dateTimeController; + DateTimeController& dateTimeController; bool isDiscovered = false; uint16_t ctsStartHandle; uint16_t ctsEndHandle; @@ -55,4 +55,4 @@ namespace Pinetime { std::function onServiceDiscovered; }; } -} \ No newline at end of file +} diff --git a/src/components/ble/CurrentTimeService.cpp b/src/components/ble/CurrentTimeService.cpp index b49be39ca5..20522c84e3 100644 --- a/src/components/ble/CurrentTimeService.cpp +++ b/src/components/ble/CurrentTimeService.cpp @@ -52,7 +52,7 @@ int CurrentTimeService::OnTimeAccessed(uint16_t conn_handle, uint16_t attr_handl return 0; } -CurrentTimeService::CurrentTimeService(DateTime& dateTimeController) +CurrentTimeService::CurrentTimeService(DateTimeController& dateTimeController) : characteristicDefinition {{.uuid = (ble_uuid_t*) &ctChrUuid, .access_cb = CTSCallback, diff --git a/src/components/ble/CurrentTimeService.h b/src/components/ble/CurrentTimeService.h index ca87d97088..72f1b272c7 100644 --- a/src/components/ble/CurrentTimeService.h +++ b/src/components/ble/CurrentTimeService.h @@ -13,7 +13,7 @@ namespace Pinetime { namespace Controllers { class CurrentTimeService { public: - CurrentTimeService(DateTime& dateTimeController); + CurrentTimeService(DateTimeController& dateTimeController); void Init(); int OnTimeAccessed(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt); @@ -40,7 +40,7 @@ namespace Pinetime { uint8_t reason; } CtsData; - DateTime& m_dateTimeController; + DateTimeController& m_dateTimeController; }; } } diff --git a/src/components/ble/DfuService.h b/src/components/ble/DfuService.h index 4708a4a607..7e8e24ff92 100644 --- a/src/components/ble/DfuService.h +++ b/src/components/ble/DfuService.h @@ -155,4 +155,4 @@ namespace Pinetime { TimerHandle_t timeoutTimer; }; } -} \ No newline at end of file +} diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp index 5eb227bf00..b54e6b316a 100644 --- a/src/components/ble/NimbleController.cpp +++ b/src/components/ble/NimbleController.cpp @@ -19,7 +19,7 @@ using namespace Pinetime::Controllers; NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::Ble& bleController, - DateTime& dateTimeController, + DateTimeController& dateTimeController, Pinetime::Controllers::NotificationManager& notificationManager, Controllers::Battery& batteryController, Pinetime::Drivers::SpiNorFlash& spiNorFlash, diff --git a/src/components/ble/NimbleController.h b/src/components/ble/NimbleController.h index 0cfe983c6b..0cd1211cf6 100644 --- a/src/components/ble/NimbleController.h +++ b/src/components/ble/NimbleController.h @@ -31,7 +31,7 @@ namespace Pinetime { namespace Controllers { class Ble; - class DateTime; + class DateTimeController; class NotificationManager; class NimbleController { @@ -39,7 +39,7 @@ namespace Pinetime { public: NimbleController(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::Ble& bleController, - DateTime& dateTimeController, + DateTimeController& dateTimeController, Pinetime::Controllers::NotificationManager& notificationManager, Controllers::Battery& batteryController, Pinetime::Drivers::SpiNorFlash& spiNorFlash, @@ -76,7 +76,7 @@ namespace Pinetime { static constexpr const char* deviceName = "InfiniTime"; Pinetime::System::SystemTask& systemTask; Pinetime::Controllers::Ble& bleController; - DateTime& dateTimeController; + DateTimeController& dateTimeController; Pinetime::Controllers::NotificationManager& notificationManager; Pinetime::Drivers::SpiNorFlash& spiNorFlash; Pinetime::Controllers::DfuService dfuService; diff --git a/src/components/datetime/DateTime.cpp b/src/components/datetime/DateTime.cpp new file mode 100644 index 0000000000..a9e1fb9e56 --- /dev/null +++ b/src/components/datetime/DateTime.cpp @@ -0,0 +1,136 @@ +#include "DateTime.h" + +#include + +namespace Pinetime { + namespace DateTime { + namespace { + + constexpr std::array DaysStringLow = { + "--", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" + }; + + constexpr std::array DaysStringShortLow = { + "--", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + }; + + constexpr std::array DaysStringShort = { + "--", + "MON", + "TUE", + "WED", + "THU", + "FRI", + "SAT", + "SUN" + }; + + constexpr std::array DaysString = { + "--", + "MONDAY", + "TUESDAY", + "WEDNESDAY", + "THURSDAY", + "FRIDAY", + "SATURDAY", + "SUNDAY" + }; + + constexpr std::array MonthsString = { + "--", + "JAN", + "FEB", + "MAR", + "APR", + "MAY", + "JUN", + "JUL", + "AUG", + "SEP", + "OCT", + "NOV", + "DEC" + }; + + constexpr std::array MonthsStringLow = { + "--", + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + }; + + constexpr std::array MonthsLow = { + "--", + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + }; + + template + constexpr typename std::underlying_type::type to_underlying(E e) { + return static_cast::type>(e); + } + } + + char const* MonthShortToString(Months month) { + return MonthsString[to_underlying(month)]; + } + + char const* MonthShortToStringLow(Months month) { + return MonthsStringLow[to_underlying(month)]; + } + + char const* MonthsToStringLow(Months month) { + return MonthsLow[to_underlying(month)]; + } + + char const* DayOfWeekToString(Days day) { + return DaysString[to_underlying(day)]; + } + + char const* DayOfWeekShortToString(Days day) { + return DaysStringShort[to_underlying(day)]; + } + + char const* DayOfWeekToStringLow(Days day) { + return DaysStringLow[to_underlying(day)]; + } + + char const* DayOfWeekShortToStringLow(Days day) { + return DaysStringShortLow[to_underlying(day)]; + } + + } +} diff --git a/src/components/datetime/DateTime.h b/src/components/datetime/DateTime.h new file mode 100644 index 0000000000..9e7f854cd1 --- /dev/null +++ b/src/components/datetime/DateTime.h @@ -0,0 +1,42 @@ +#pragma once + +#include + +namespace Pinetime { + namespace DateTime { + enum class Days : uint8_t { + Unknown, + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday + }; + + enum class Months : uint8_t { + Unknown, + January, + February, + March, + April, + May, + June, + July, + August, + September, + October, + November, + December + }; + + char const* MonthShortToString(Months month); + char const* MonthShortToStringLow(Months month); + char const* MonthsToStringLow(Months month); + char const* DayOfWeekToString(Days day); + char const* DayOfWeekShortToString(Days day); + char const* DayOfWeekToStringLow(Days day); + char const* DayOfWeekShortToStringLow(Days day); + } +} diff --git a/src/components/datetime/DateTimeController.cpp b/src/components/datetime/DateTimeController.cpp index 28a70abc9b..8c6f842f7b 100644 --- a/src/components/datetime/DateTimeController.cpp +++ b/src/components/datetime/DateTimeController.cpp @@ -5,7 +5,7 @@ using namespace Pinetime::Controllers; -void DateTime::SetTime( +void DateTimeController::SetTime( uint16_t year, uint8_t month, uint8_t day, uint8_t dayOfWeek, uint8_t hour, uint8_t minute, uint8_t second, uint32_t systickCounter) { std::tm tm = { /* .tm_sec = */ second, @@ -27,7 +27,7 @@ void DateTime::SetTime( NRF_LOG_INFO("* %d %d %d ", this->day, this->month, this->year); } -void DateTime::UpdateTime(uint32_t systickCounter) { +void DateTimeController::UpdateTime(uint32_t systickCounter) { // Handle systick counter overflow uint32_t systickDelta = 0; if (systickCounter < previousSystickCounter) { @@ -56,9 +56,9 @@ void DateTime::UpdateTime(uint32_t systickCounter) { auto yearMonthDay = date::year_month_day(dp); year = (int) yearMonthDay.year(); - month = static_cast((unsigned) yearMonthDay.month()); + month = static_cast(static_cast(yearMonthDay.month())); day = (unsigned) yearMonthDay.day(); - dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); + dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); hour = time.hours().count(); minute = time.minutes().count(); @@ -74,49 +74,6 @@ void DateTime::UpdateTime(uint32_t systickCounter) { } } -const char* DateTime::MonthShortToString() { - return DateTime::MonthsString[(uint8_t) month]; -} - -const char* DateTime::MonthShortToStringLow() { - return DateTime::MonthsStringLow[(uint8_t) month]; -} - -const char* DateTime::MonthsToStringLow() { - return DateTime::MonthsLow[(uint8_t) month]; -} - -const char* DateTime::DayOfWeekToString() { - return DateTime::DaysString[(uint8_t) dayOfWeek]; -} - -const char* DateTime::DayOfWeekShortToString() { - return DateTime::DaysStringShort[(uint8_t) dayOfWeek]; -} - -const char* DateTime::DayOfWeekToStringLow() { - return DateTime::DaysStringLow[(uint8_t) dayOfWeek]; -} - -const char* DateTime::DayOfWeekShortToStringLow() { - return DateTime::DaysStringShortLow[(uint8_t) dayOfWeek]; -} - -void DateTime::Register(Pinetime::System::SystemTask* systemTask) { +void DateTimeController::Register(Pinetime::System::SystemTask* systemTask) { this->systemTask = systemTask; } - -char const* DateTime::DaysStringLow[] = {"--", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; - -char const* DateTime::DaysStringShortLow[] = {"--", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; - -char const* DateTime::DaysStringShort[] = {"--", "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; - -char const* DateTime::DaysString[] = {"--", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"}; - -char const* DateTime::MonthsString[] = {"--", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"}; - -char const* DateTime::MonthsStringLow[] = {"--", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - -char const* DateTime::MonthsLow[] = { - "--", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; \ No newline at end of file diff --git a/src/components/datetime/DateTimeController.h b/src/components/datetime/DateTimeController.h index 265d6e9def..4cd0a74cda 100644 --- a/src/components/datetime/DateTimeController.h +++ b/src/components/datetime/DateTimeController.h @@ -1,5 +1,6 @@ #pragma once +#include "DateTime.h" #include #include @@ -8,25 +9,8 @@ namespace Pinetime { class SystemTask; } namespace Controllers { - class DateTime { + class DateTimeController { public: - enum class Days : uint8_t { Unknown, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; - enum class Months : uint8_t { - Unknown, - January, - February, - March, - April, - May, - June, - July, - August, - September, - October, - November, - December - }; - void SetTime(uint16_t year, uint8_t month, uint8_t day, @@ -39,13 +23,13 @@ namespace Pinetime { uint16_t Year() const { return year; } - Months Month() const { + DateTime::Months Month() const { return month; } uint8_t Day() const { return day; } - Days DayOfWeek() const { + DateTime::Days DayOfWeek() const { return dayOfWeek; } uint8_t Hours() const { @@ -58,14 +42,6 @@ namespace Pinetime { return second; } - const char* MonthShortToString(); - const char* MonthShortToStringLow(); - const char* MonthsToStringLow(); - const char* DayOfWeekToString(); - const char* DayOfWeekShortToString(); - const char* DayOfWeekToStringLow(); - const char* DayOfWeekShortToStringLow(); - std::chrono::time_point CurrentDateTime() const { return currentDateTime; } @@ -77,9 +53,9 @@ namespace Pinetime { private: uint16_t year = 0; - Months month = Months::Unknown; + DateTime::Months month = DateTime::Months::Unknown; uint8_t day = 0; - Days dayOfWeek = Days::Unknown; + DateTime::Days dayOfWeek = DateTime::Days::Unknown; uint8_t hour = 0; uint8_t minute = 0; uint8_t second = 0; @@ -90,14 +66,6 @@ namespace Pinetime { bool isMidnightAlreadyNotified = false; System::SystemTask* systemTask = nullptr; - - static char const* DaysString[]; - static char const* DaysStringShort[]; - static char const* DaysStringLow[]; - static char const* DaysStringShortLow[]; - static char const* MonthsString[]; - static char const* MonthsStringLow[]; - static char const* MonthsLow[]; }; } -} \ No newline at end of file +} diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index d4a73f5ee7..c357921c5e 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -84,7 +84,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, Drivers::Cst816S& touchPanel, Controllers::Battery& batteryController, Controllers::Ble& bleController, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Drivers::WatchdogView& watchdog, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::HeartRateController& heartRateController, diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index 574be63fcd..22d12e9459 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -27,7 +27,7 @@ namespace Pinetime { class Settings; class Battery; class Ble; - class DateTime; + class DControllerateTime; class NotificationManager; class HeartRateController; class MotionController; @@ -48,7 +48,7 @@ namespace Pinetime { Drivers::Cst816S&, Controllers::Battery& batteryController, Controllers::Ble& bleController, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Drivers::WatchdogView& watchdog, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::HeartRateController& heartRateController, @@ -72,7 +72,7 @@ namespace Pinetime { Pinetime::Drivers::Cst816S& touchPanel; Pinetime::Controllers::Battery& batteryController; Pinetime::Controllers::Ble& bleController; - Pinetime::Controllers::DateTime& dateTimeController; + Pinetime::Controllers::DateTimeController& dateTimeController; Pinetime::Drivers::WatchdogView& watchdog; Pinetime::System::SystemTask* systemTask = nullptr; Pinetime::Controllers::NotificationManager& notificationManager; diff --git a/src/displayapp/DisplayAppRecovery.cpp b/src/displayapp/DisplayAppRecovery.cpp index fd517b11a0..cffdcf7a8b 100644 --- a/src/displayapp/DisplayAppRecovery.cpp +++ b/src/displayapp/DisplayAppRecovery.cpp @@ -12,7 +12,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, Drivers::Cst816S& touchPanel, Controllers::Battery& batteryController, Controllers::Ble& bleController, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Drivers::WatchdogView& watchdog, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::HeartRateController& heartRateController, diff --git a/src/displayapp/DisplayAppRecovery.h b/src/displayapp/DisplayAppRecovery.h index 638c0071da..a1f5a93ffe 100644 --- a/src/displayapp/DisplayAppRecovery.h +++ b/src/displayapp/DisplayAppRecovery.h @@ -37,7 +37,7 @@ namespace Pinetime { Drivers::Cst816S&, Controllers::Battery& batteryController, Controllers::Ble& bleController, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Drivers::WatchdogView& watchdog, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::HeartRateController& heartRateController, diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp index d6c3970b08..06fc0f2ebe 100644 --- a/src/displayapp/screens/ApplicationList.cpp +++ b/src/displayapp/screens/ApplicationList.cpp @@ -11,7 +11,7 @@ using namespace Pinetime::Applications::Screens; ApplicationList::ApplicationList(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController, Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController) + Controllers::DateTimeController& dateTimeController) : Screen(app), settingsController {settingsController}, batteryController {batteryController}, diff --git a/src/displayapp/screens/ApplicationList.h b/src/displayapp/screens/ApplicationList.h index 88534ec47e..be0c3a5805 100644 --- a/src/displayapp/screens/ApplicationList.h +++ b/src/displayapp/screens/ApplicationList.h @@ -16,7 +16,7 @@ namespace Pinetime { explicit ApplicationList(DisplayApp* app, Pinetime::Controllers::Settings& settingsController, Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController); + Controllers::DateTimeController& dateTimeController); ~ApplicationList() override; bool Refresh() override; bool OnTouchEvent(TouchEvents event) override; @@ -24,7 +24,7 @@ namespace Pinetime { private: Controllers::Settings& settingsController; Pinetime::Controllers::Battery& batteryController; - Controllers::DateTime& dateTimeController; + Controllers::DateTimeController& dateTimeController; ScreenList<2> screens; std::unique_ptr CreateScreen1(); @@ -33,4 +33,4 @@ namespace Pinetime { }; } } -} \ No newline at end of file +} diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index e0684976f3..380e830561 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -19,7 +19,7 @@ using namespace Pinetime::Applications::Screens; Clock::Clock(DisplayApp* app, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, @@ -101,4 +101,4 @@ std::unique_ptr Clock::WatchFaceCustomScreen() { return std::make_unique(app, dateTimeController, batteryController, bleController, notificatioManager, settingsController); } -*/ \ No newline at end of file +*/ diff --git a/src/displayapp/screens/Clock.h b/src/displayapp/screens/Clock.h index a48feea1b9..15188f5321 100644 --- a/src/displayapp/screens/Clock.h +++ b/src/displayapp/screens/Clock.h @@ -25,7 +25,7 @@ namespace Pinetime { class Clock : public Screen { public: Clock(DisplayApp* app, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, @@ -39,7 +39,7 @@ namespace Pinetime { bool OnTouchEvent(TouchEvents event) override; private: - Controllers::DateTime& dateTimeController; + Controllers::DateTimeController& dateTimeController; Controllers::Battery& batteryController; Controllers::Ble& bleController; Controllers::NotificationManager& notificatioManager; diff --git a/src/displayapp/screens/SystemInfo.cpp b/src/displayapp/screens/SystemInfo.cpp index e7c5b65aea..1869f7153b 100644 --- a/src/displayapp/screens/SystemInfo.cpp +++ b/src/displayapp/screens/SystemInfo.cpp @@ -28,7 +28,7 @@ namespace { } SystemInfo::SystemInfo(Pinetime::Applications::DisplayApp* app, - Pinetime::Controllers::DateTime& dateTimeController, + Pinetime::Controllers::DateTimeController& dateTimeController, Pinetime::Controllers::Battery& batteryController, Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Controllers::Ble& bleController, diff --git a/src/displayapp/screens/SystemInfo.h b/src/displayapp/screens/SystemInfo.h index a9ad652d41..a1f8910e53 100644 --- a/src/displayapp/screens/SystemInfo.h +++ b/src/displayapp/screens/SystemInfo.h @@ -6,7 +6,7 @@ namespace Pinetime { namespace Controllers { - class DateTime; + class DateTimeController; class Battery; class BrightnessController; class Ble; @@ -23,7 +23,7 @@ namespace Pinetime { class SystemInfo : public Screen { public: explicit SystemInfo(DisplayApp* app, - Pinetime::Controllers::DateTime& dateTimeController, + Pinetime::Controllers::DateTimeController& dateTimeController, Pinetime::Controllers::Battery& batteryController, Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Controllers::Ble& bleController, @@ -34,7 +34,7 @@ namespace Pinetime { bool OnTouchEvent(TouchEvents event) override; private: - Pinetime::Controllers::DateTime& dateTimeController; + Pinetime::Controllers::DateTimeController& dateTimeController; Pinetime::Controllers::Battery& batteryController; Pinetime::Controllers::BrightnessController& brightnessController; Pinetime::Controllers::Ble& bleController; diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp index 3eb127cc43..e33230b2d4 100644 --- a/src/displayapp/screens/Tile.cpp +++ b/src/displayapp/screens/Tile.cpp @@ -23,7 +23,7 @@ Tile::Tile(uint8_t screenID, DisplayApp* app, Controllers::Settings& settingsController, Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, std::array& applications) : Screen(app), batteryController {batteryController}, dateTimeController {dateTimeController} { diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h index 4ebd81cd9b..9cefa5c75d 100644 --- a/src/displayapp/screens/Tile.h +++ b/src/displayapp/screens/Tile.h @@ -25,7 +25,7 @@ namespace Pinetime { DisplayApp* app, Controllers::Settings& settingsController, Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, std::array& applications); ~Tile() override; @@ -36,7 +36,7 @@ namespace Pinetime { private: Pinetime::Controllers::Battery& batteryController; - Controllers::DateTime& dateTimeController; + Controllers::DateTimeController& dateTimeController; lv_task_t* taskUpdate; diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index f1889379a4..c735cb3e81 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -8,6 +8,7 @@ LV_IMG_DECLARE(bg_clock); using namespace Pinetime::Applications::Screens; +using namespace Pinetime::DateTime; namespace { @@ -44,7 +45,7 @@ lv_point_t coordinate_relocate(int16_t radius, int16_t angle) { } // namespace WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificationManager, @@ -79,7 +80,7 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, label_date_day = lv_label_create(lv_scr_act(), NULL); lv_obj_set_style_local_text_color(label_date_day, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xf0a500)); - lv_label_set_text_fmt(label_date_day, "%s\n%02i", dateTimeController.DayOfWeekShortToString(), dateTimeController.Day()); + lv_label_set_text_fmt(label_date_day, "%s\n%02i", DayOfWeekShortToString(currentDayOfWeek), dateTimeController.Day()); lv_label_set_align(label_date_day, LV_LABEL_ALIGN_CENTER); lv_obj_align(label_date_day, NULL, LV_ALIGN_CENTER, 50, 0); @@ -204,7 +205,7 @@ bool WatchFaceAnalog::Refresh() { if ((month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { - lv_label_set_text_fmt(label_date_day, "%s\n%02i", dateTimeController.DayOfWeekShortToString(), day); + lv_label_set_text_fmt(label_date_day, "%s\n%02i", DayOfWeekShortToString(dayOfWeek), day); currentMonth = month; currentDayOfWeek = dayOfWeek; diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index ac7f0ac51f..cd01a0978c 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -24,7 +24,7 @@ namespace Pinetime { class WatchFaceAnalog : public Screen { public: WatchFaceAnalog(DisplayApp* app, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificationManager, @@ -40,12 +40,12 @@ namespace Pinetime { uint8_t minute; uint8_t second; - Pinetime::Controllers::DateTime::Months month; + Pinetime::DateTime::Months month; uint8_t day; - Pinetime::Controllers::DateTime::Days dayOfWeek; + Pinetime::DateTime::Days dayOfWeek; - Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; - Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + Pinetime::DateTime::Months currentMonth = Pinetime::DateTime::Months::Unknown; + Pinetime::DateTime::Days currentDayOfWeek = Pinetime::DateTime::Days::Unknown; uint8_t currentDay = 0; DirtyValue batteryPercentRemaining {0}; @@ -76,7 +76,7 @@ namespace Pinetime { lv_obj_t* batteryIcon; lv_obj_t* notificationIcon; - Controllers::DateTime& dateTimeController; + Controllers::DateTimeController& dateTimeController; Controllers::Battery& batteryController; Controllers::Ble& bleController; Controllers::NotificationManager& notificationManager; diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index f1285eaf35..1403e0d4b0 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -16,9 +16,10 @@ #include "../DisplayApp.h" using namespace Pinetime::Applications::Screens; +using namespace Pinetime::DateTime; WatchFaceDigital::WatchFaceDigital(DisplayApp* app, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, @@ -145,9 +146,9 @@ bool WatchFaceDigital::Refresh() { auto yearMonthDay = date::year_month_day(dp); auto year = (int) yearMonthDay.year(); - auto month = static_cast((unsigned) yearMonthDay.month()); + auto month = static_cast((unsigned) yearMonthDay.month()); auto day = (unsigned) yearMonthDay.day(); - auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); + auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); int hour = time.hours().count(); auto minute = time.minutes().count(); @@ -204,9 +205,9 @@ bool WatchFaceDigital::Refresh() { if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { char dateStr[22]; if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { - sprintf(dateStr, "%s %d %s %d", dateTimeController.DayOfWeekShortToString(), day, dateTimeController.MonthShortToString(), year); + sprintf(dateStr, "%s %d %s %d", DayOfWeekShortToString(dayOfWeek), day, MonthShortToString(month), year); } else { - sprintf(dateStr, "%s %s %d %d", dateTimeController.DayOfWeekShortToString(), dateTimeController.MonthShortToString(), day, year); + sprintf(dateStr, "%s %s %d %d", DayOfWeekShortToString(dayOfWeek), MonthShortToString(month), day, year); } lv_label_set_text(label_date, dateStr); lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 76c8d3dcce..6fdabbd36b 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -6,6 +6,7 @@ #include #include "Screen.h" #include "ScreenList.h" +#include "components/datetime/DateTime.h" #include "components/datetime/DateTimeController.h" namespace Pinetime { @@ -24,7 +25,7 @@ namespace Pinetime { class WatchFaceDigital : public Screen { public: WatchFaceDigital(DisplayApp* app, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, @@ -41,8 +42,8 @@ namespace Pinetime { char displayedChar[5]; uint16_t currentYear = 1970; - Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; - Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + Pinetime::DateTime::Months currentMonth = Pinetime::DateTime::Months::Unknown; + Pinetime::DateTime::Days currentDayOfWeek = Pinetime::DateTime::Days::Unknown; uint8_t currentDay = 0; DirtyValue batteryPercentRemaining {}; @@ -68,7 +69,7 @@ namespace Pinetime { lv_obj_t* stepValue; lv_obj_t* notificationIcon; - Controllers::DateTime& dateTimeController; + Controllers::DateTimeController& dateTimeController; Controllers::Battery& batteryController; Controllers::Ble& bleController; Controllers::NotificationManager& notificatioManager; diff --git a/src/displayapp/screens/settings/QuickSettings.cpp b/src/displayapp/screens/settings/QuickSettings.cpp index 2cd24876f3..f0e2c43cdd 100644 --- a/src/displayapp/screens/settings/QuickSettings.cpp +++ b/src/displayapp/screens/settings/QuickSettings.cpp @@ -19,7 +19,7 @@ namespace { QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::BrightnessController& brightness, Controllers::MotorController& motorController, Pinetime::Controllers::Settings& settingsController) diff --git a/src/displayapp/screens/settings/QuickSettings.h b/src/displayapp/screens/settings/QuickSettings.h index e0fc0a87b3..0b9067c4af 100644 --- a/src/displayapp/screens/settings/QuickSettings.h +++ b/src/displayapp/screens/settings/QuickSettings.h @@ -20,7 +20,7 @@ namespace Pinetime { public: QuickSettings(DisplayApp* app, Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::BrightnessController& brightness, Controllers::MotorController& motorController, Pinetime::Controllers::Settings& settingsController); @@ -35,7 +35,7 @@ namespace Pinetime { private: Pinetime::Controllers::Battery& batteryController; - Controllers::DateTime& dateTimeController; + Controllers::DateTimeController& dateTimeController; Controllers::BrightnessController& brightness; Controllers::MotorController& motorController; Controllers::Settings& settingsController; diff --git a/src/main.cpp b/src/main.cpp index ffbba5e765..1524badaf2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -112,7 +112,7 @@ static constexpr uint8_t pinPowerPresentIrq = 19; Pinetime::Controllers::HeartRateController heartRateController; Pinetime::Applications::HeartRateTask heartRateApp(heartRateSensor, heartRateController); -Pinetime::Controllers::DateTime dateTimeController; +Pinetime::Controllers::DateTimeController dateTimeController; Pinetime::Drivers::Watchdog watchdog; Pinetime::Drivers::WatchdogView watchdogView(watchdog); Pinetime::Controllers::NotificationManager notificationManager; diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 8915ce7448..0a0087d4eb 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -55,7 +55,7 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi, Components::LittleVgl& lvgl, Controllers::Battery& batteryController, Controllers::Ble& bleController, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::TimerController& timerController, Drivers::Watchdog& watchdog, Pinetime::Controllers::NotificationManager& notificationManager, diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index ba4342987b..48c5307995 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -50,7 +50,7 @@ namespace Pinetime { Components::LittleVgl& lvgl, Controllers::Battery& batteryController, Controllers::Ble& bleController, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::TimerController& timerController, Drivers::Watchdog& watchdog, Pinetime::Controllers::NotificationManager& notificationManager, @@ -94,7 +94,7 @@ namespace Pinetime { Pinetime::Controllers::Ble& bleController; - Pinetime::Controllers::DateTime& dateTimeController; + Pinetime::Controllers::DateTimeController& dateTimeController; Pinetime::Controllers::TimerController& timerController; QueueHandle_t systemTasksMsgQueue; std::atomic isSleeping {false}; From c951659dab6b71b73e34080503feb523f311b22b Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Sat, 19 Jun 2021 21:07:14 -0400 Subject: [PATCH 02/17] Add empty base watch face class All existing and future watch faces will derive common functionality from this base class in the future. Currently it does nothing except exist in the class heirarchy. --- src/CMakeLists.txt | 1 + src/displayapp/screens/WatchFaceAnalog.cpp | 2 +- src/displayapp/screens/WatchFaceAnalog.h | 5 ++--- src/displayapp/screens/WatchFaceBase.cpp | 7 +++++++ src/displayapp/screens/WatchFaceBase.h | 21 +++++++++++++++++++++ src/displayapp/screens/WatchFaceDigital.cpp | 2 +- src/displayapp/screens/WatchFaceDigital.h | 5 ++--- 7 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 src/displayapp/screens/WatchFaceBase.cpp create mode 100644 src/displayapp/screens/WatchFaceBase.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c7bdc5b6eb..9fd2b67808 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -430,6 +430,7 @@ list(APPEND SOURCE_FILES ## Watch faces displayapp/icons/bg_clock.c + displayapp/screens/WatchFaceBase.cpp displayapp/screens/WatchFaceAnalog.cpp displayapp/screens/WatchFaceDigital.cpp displayapp/screens/PineTimeStyle.cpp diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index c735cb3e81..d36a928978 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -50,7 +50,7 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, Controllers::Ble& bleController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController) - : Screen(app), + : WatchFaceBase(app), currentDateTime {{}}, dateTimeController {dateTimeController}, batteryController {batteryController}, diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index cd01a0978c..494e03c083 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -4,8 +4,7 @@ #include #include #include -#include "Screen.h" -#include "ScreenList.h" +#include "WatchFaceBase.h" #include "components/datetime/DateTimeController.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" @@ -21,7 +20,7 @@ namespace Pinetime { namespace Applications { namespace Screens { - class WatchFaceAnalog : public Screen { + class WatchFaceAnalog : public WatchFaceBase { public: WatchFaceAnalog(DisplayApp* app, Controllers::DateTimeController& dateTimeController, diff --git a/src/displayapp/screens/WatchFaceBase.cpp b/src/displayapp/screens/WatchFaceBase.cpp new file mode 100644 index 0000000000..96615da07d --- /dev/null +++ b/src/displayapp/screens/WatchFaceBase.cpp @@ -0,0 +1,7 @@ +#include "WatchFaceBase.h" + +using namespace Pinetime::Applications::Screens; + +WatchFaceBase::WatchFaceBase(DisplayApp* app) + : Screen(app) { +} diff --git a/src/displayapp/screens/WatchFaceBase.h b/src/displayapp/screens/WatchFaceBase.h new file mode 100644 index 0000000000..de552a1fd3 --- /dev/null +++ b/src/displayapp/screens/WatchFaceBase.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Screen.h" +#include "../DisplayApp.h" + +namespace Pinetime { + namespace Applications { + namespace Screens { + + class WatchFaceBase : public Screen { + public: + explicit WatchFaceBase(DisplayApp* app); + + virtual ~WatchFaceBase() = default; + + private: + }; + } + } +} + diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 1403e0d4b0..e30cf2523b 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -26,7 +26,7 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController) - : Screen(app), + : WatchFaceBase(app), currentDateTime {{}}, dateTimeController {dateTimeController}, batteryController {batteryController}, diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 6fdabbd36b..357494d5b7 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -4,8 +4,7 @@ #include #include #include -#include "Screen.h" -#include "ScreenList.h" +#include "WatchFaceBase.h" #include "components/datetime/DateTime.h" #include "components/datetime/DateTimeController.h" @@ -22,7 +21,7 @@ namespace Pinetime { namespace Applications { namespace Screens { - class WatchFaceDigital : public Screen { + class WatchFaceDigital : public WatchFaceBase { public: WatchFaceDigital(DisplayApp* app, Controllers::DateTimeController& dateTimeController, From 70f08fe4fcbd237e2ee57f457165f6ec5081a5d4 Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Sun, 20 Jun 2021 14:51:27 -0400 Subject: [PATCH 03/17] Move DateTimeController functionality to WatchFaseBase Also improved some repeated calculations in the analog watch face. --- src/displayapp/screens/Screen.h | 22 ++--- src/displayapp/screens/WatchFaceAnalog.cpp | 59 +++++-------- src/displayapp/screens/WatchFaceAnalog.h | 21 ++--- src/displayapp/screens/WatchFaceBase.cpp | 24 ++++- src/displayapp/screens/WatchFaceBase.h | 51 ++++++++++- src/displayapp/screens/WatchFaceDigital.cpp | 97 ++++++++------------- src/displayapp/screens/WatchFaceDigital.h | 12 +-- 7 files changed, 146 insertions(+), 140 deletions(-) diff --git a/src/displayapp/screens/Screen.h b/src/displayapp/screens/Screen.h index 6c9110c6b8..53bdbc8ce7 100644 --- a/src/displayapp/screens/Screen.h +++ b/src/displayapp/screens/Screen.h @@ -13,28 +13,24 @@ namespace Pinetime { DirtyValue() = default; // Use NSDMI explicit DirtyValue(T const& v) : value {v} { } // Use MIL and const-lvalue-ref - bool IsUpdated() { - if (this->isUpdated) { - this->isUpdated = false; - return true; - } - return false; + bool IsUpdated() const { + return std::exchange(isUpdated, false); } - T const& Get() { - this->isUpdated = false; + T const& Get() const { + isUpdated = false; return value; } // never expose a non-const lvalue-ref DirtyValue& operator=(const T& other) { - if (this->value != other) { - this->value = other; - this->isUpdated = true; + if (value != other) { + value = other; + isUpdated = true; } return *this; } private: - T value {}; // NSDMI - default initialise type - bool isUpdated {true}; // NSDMI - use brace initilisation + T value {}; // NSDMI - default initialise type + mutable bool isUpdated {true}; // NSDMI - use brace initilisation }; class Screen { diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index d36a928978..e8a7bcda33 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -45,24 +45,18 @@ lv_point_t coordinate_relocate(int16_t radius, int16_t angle) { } // namespace WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, - Controllers::DateTimeController& dateTimeController, + Controllers::DateTimeController const& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController) - : WatchFaceBase(app), - currentDateTime {{}}, - dateTimeController {dateTimeController}, + : WatchFaceBase{app, dateTimeController}, batteryController {batteryController}, bleController {bleController}, notificationManager {notificationManager}, settingsController {settingsController} { settingsController.SetClockFace(1); - sHour = 99; - sMinute = 99; - sSecond = 99; - lv_obj_t* bg_clock_img = lv_img_create(lv_scr_act(), NULL); lv_img_set_src(bg_clock_img, &bg_clock); lv_obj_align(bg_clock_img, NULL, LV_ALIGN_CENTER, 0, 0); @@ -77,10 +71,10 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, lv_obj_align(notificationIcon, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 8, -4); // Date - Day / Week day - + auto const& date = GetUpdatedDate().Get(); label_date_day = lv_label_create(lv_scr_act(), NULL); lv_obj_set_style_local_text_color(label_date_day, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xf0a500)); - lv_label_set_text_fmt(label_date_day, "%s\n%02i", DayOfWeekShortToString(currentDayOfWeek), dateTimeController.Day()); + lv_label_set_text_fmt(label_date_day, "%s\n%02i", DayOfWeekShortToString(date.dayOfWeek), date.day); lv_label_set_align(label_date_day, LV_LABEL_ALIGN_CENTER); lv_obj_align(label_date_day, NULL, LV_ALIGN_CENTER, 50, 0); @@ -136,12 +130,9 @@ WatchFaceAnalog::~WatchFaceAnalog() { void WatchFaceAnalog::UpdateClock() { - hour = dateTimeController.Hours(); - minute = dateTimeController.Minutes(); - second = dateTimeController.Seconds(); - - if (sMinute != minute) { - auto const angle = minute * 6; + bool const minute_changed = minute.IsUpdated(); + if (minute_changed) { + auto const angle = minute.Get() * 6; minute_point[0] = coordinate_relocate(30, angle); minute_point[1] = coordinate_relocate(MINUTE_LENGTH, angle); @@ -152,10 +143,8 @@ void WatchFaceAnalog::UpdateClock() { lv_line_set_points(minute_body_trace, minute_point_trace, 2); } - if (sHour != hour || sMinute != minute) { - sHour = hour; - sMinute = minute; - auto const angle = (hour * 30 + minute / 2); + if (hour.IsUpdated() || minute_changed) { + auto const angle = (hour.Get() * 30 + minute.Get() / 2); hour_point[0] = coordinate_relocate(30, angle); hour_point[1] = coordinate_relocate(HOUR_LENGTH, angle); @@ -167,12 +156,12 @@ void WatchFaceAnalog::UpdateClock() { lv_line_set_points(hour_body_trace, hour_point_trace, 2); } - if (sSecond != second) { - sSecond = second; + if (second.IsUpdated()) { auto const angle = second * 6; second_point[0] = coordinate_relocate(-20, angle); second_point[1] = coordinate_relocate(SECOND_LENGTH, angle); + lv_line_set_points(second_body, second_point, 2); } } @@ -193,24 +182,20 @@ bool WatchFaceAnalog::Refresh() { lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); } - currentDateTime = dateTimeController.CurrentDateTime(); - - if (currentDateTime.IsUpdated()) { - - month = dateTimeController.Month(); - day = dateTimeController.Day(); - dayOfWeek = dateTimeController.DayOfWeek(); + auto const& time = GetUpdatedTime(); + if (time.IsUpdated()) { + auto const& t = time.Get(); + hour = t.hour; + minute = t.minute; + second = t.second; UpdateClock(); + } - if ((month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { - - lv_label_set_text_fmt(label_date_day, "%s\n%02i", DayOfWeekShortToString(dayOfWeek), day); - - currentMonth = month; - currentDayOfWeek = dayOfWeek; - currentDay = day; - } + auto const& date = GetUpdatedDate(); + if (date.IsUpdated()) { + auto const& d = date.Get(); + lv_label_set_text_fmt(label_date_day, "%s\n%02i", DayOfWeekShortToString(d.dayOfWeek), d.day); } return true; diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index 494e03c083..bdb20224b9 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -5,7 +5,6 @@ #include #include #include "WatchFaceBase.h" -#include "components/datetime/DateTimeController.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" @@ -16,6 +15,7 @@ namespace Pinetime { class Battery; class Ble; class NotificationManager; + class DateTimeController; } namespace Applications { namespace Screens { @@ -23,7 +23,7 @@ namespace Pinetime { class WatchFaceAnalog : public WatchFaceBase { public: WatchFaceAnalog(DisplayApp* app, - Controllers::DateTimeController& dateTimeController, + Controllers::DateTimeController const& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificationManager, @@ -34,21 +34,11 @@ namespace Pinetime { bool Refresh() override; private: - uint8_t sHour, sMinute, sSecond; - uint8_t hour; - uint8_t minute; - uint8_t second; - - Pinetime::DateTime::Months month; - uint8_t day; - Pinetime::DateTime::Days dayOfWeek; - - Pinetime::DateTime::Months currentMonth = Pinetime::DateTime::Months::Unknown; - Pinetime::DateTime::Days currentDayOfWeek = Pinetime::DateTime::Days::Unknown; - uint8_t currentDay = 0; + DirtyValue hour{99}; + DirtyValue minute{99}; + DirtyValue second{99}; DirtyValue batteryPercentRemaining {0}; - DirtyValue> currentDateTime; DirtyValue notificationState {false}; lv_obj_t* hour_body; @@ -75,7 +65,6 @@ namespace Pinetime { lv_obj_t* batteryIcon; lv_obj_t* notificationIcon; - Controllers::DateTimeController& dateTimeController; Controllers::Battery& batteryController; Controllers::Ble& bleController; Controllers::NotificationManager& notificationManager; diff --git a/src/displayapp/screens/WatchFaceBase.cpp b/src/displayapp/screens/WatchFaceBase.cpp index 96615da07d..6988dcf7cb 100644 --- a/src/displayapp/screens/WatchFaceBase.cpp +++ b/src/displayapp/screens/WatchFaceBase.cpp @@ -1,7 +1,27 @@ #include "WatchFaceBase.h" +#include "components/datetime/DateTimeController.h" using namespace Pinetime::Applications::Screens; -WatchFaceBase::WatchFaceBase(DisplayApp* app) - : Screen(app) { +WatchFaceBase::WatchFaceBase(DisplayApp* app, + Controllers::DateTimeController const& dateTimeController) + : Screen(app), + dateTimeController(dateTimeController) { +} + +void WatchFaceBase::UpdateDate() { + date = DateState{ + .year = dateTimeController.Year(), + .month = dateTimeController.Month(), + .day = dateTimeController.Day(), + .dayOfWeek = dateTimeController.DayOfWeek() + }; +} + +void WatchFaceBase::UpdateTime() { + time = TimeState{ + .hour = dateTimeController.Hours(), + .minute = dateTimeController.Minutes(), + .second = dateTimeController.Seconds() + }; } diff --git a/src/displayapp/screens/WatchFaceBase.h b/src/displayapp/screens/WatchFaceBase.h index de552a1fd3..71bd29f763 100644 --- a/src/displayapp/screens/WatchFaceBase.h +++ b/src/displayapp/screens/WatchFaceBase.h @@ -2,18 +2,65 @@ #include "Screen.h" #include "../DisplayApp.h" +#include "components/datetime/DateTime.h" +#include namespace Pinetime { + namespace Controllers { + class DateTimeController; + } namespace Applications { namespace Screens { - class WatchFaceBase : public Screen { public: - explicit WatchFaceBase(DisplayApp* app); + struct DateState { + uint16_t year; + DateTime::Months month; + uint8_t day; + DateTime::Days dayOfWeek; + + bool operator!=(DateState const& rhs) { + return year != rhs.year || month != rhs.month || day != rhs.day || dayOfWeek != rhs.dayOfWeek; + } + }; + + struct TimeState { + uint8_t hour; + uint8_t minute; + uint8_t second; + + bool operator!=(TimeState const& rhs) { + return hour != rhs.hour || minute != rhs.minute || second != rhs.second; + } + }; + + WatchFaceBase(DisplayApp* app, + Controllers::DateTimeController const& dateTimeController); virtual ~WatchFaceBase() = default; + void UpdateDate(); + void UpdateTime(); + DirtyValue const& GetDate() const { + return date; + } + DirtyValue const& GetTime() const { + return time; + } + DirtyValue const& GetUpdatedDate() { + UpdateDate(); + return date; + } + DirtyValue const& GetUpdatedTime() { + UpdateTime(); + return time; + } + private: + DirtyValue date; + DirtyValue time; + + Controllers::DateTimeController const& dateTimeController; }; } } diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index e30cf2523b..e5d82f1a0f 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -19,16 +19,14 @@ using namespace Pinetime::Applications::Screens; using namespace Pinetime::DateTime; WatchFaceDigital::WatchFaceDigital(DisplayApp* app, - Controllers::DateTimeController& dateTimeController, + Controllers::DateTimeController const& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController) - : WatchFaceBase(app), - currentDateTime {{}}, - dateTimeController {dateTimeController}, + : WatchFaceBase{app, dateTimeController}, batteryController {batteryController}, bleController {bleController}, notificatioManager {notificatioManager}, @@ -37,12 +35,6 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, motionController {motionController} { settingsController.SetClockFace(0); - displayedChar[0] = 0; - displayedChar[1] = 0; - displayedChar[2] = 0; - displayedChar[3] = 0; - displayedChar[4] = 0; - batteryIcon = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text(batteryIcon, Symbols::batteryFull); lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -5, 2); @@ -136,56 +128,41 @@ bool WatchFaceDigital::Refresh() { lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); } - currentDateTime = dateTimeController.CurrentDateTime(); - - if (currentDateTime.IsUpdated()) { - auto newDateTime = currentDateTime.Get(); - - auto dp = date::floor(newDateTime); - auto time = date::make_time(newDateTime - dp); - auto yearMonthDay = date::year_month_day(dp); - - auto year = (int) yearMonthDay.year(); - auto month = static_cast((unsigned) yearMonthDay.month()); - auto day = (unsigned) yearMonthDay.day(); - auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); - - int hour = time.hours().count(); - auto minute = time.minutes().count(); + auto const clock_type = settingsController.GetClockType(); + auto const& time = GetUpdatedTime(); + if (time.IsUpdated()) { + auto const& t = time.Get(); char minutesChar[3]; - sprintf(minutesChar, "%02d", static_cast(minute)); + sprintf(minutesChar, "%02u", t.minute); char hoursChar[3]; char ampmChar[3]; - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { - sprintf(hoursChar, "%02d", hour); - } else { - if (hour == 0 && hour != 12) { - hour = 12; + auto hour = t.hour; + if (clock_type == Controllers::Settings::ClockType::H12) { + if (hour > 0 && hour < 12) { sprintf(ampmChar, "AM"); - } else if (hour == 12 && hour != 0) { - hour = 12; - sprintf(ampmChar, "PM"); - } else if (hour < 12 && hour != 0) { - sprintf(ampmChar, "AM"); - } else if (hour > 12 && hour != 0) { - hour = hour - 12; + } else { sprintf(ampmChar, "PM"); } - sprintf(hoursChar, "%02d", hour); + if (hour == 0) { + hour = 12; + } else if (hour > 12) { + hour -= 12; + } } + sprintf(hoursChar, "%02u", hour); - if (hoursChar[0] != displayedChar[0] || hoursChar[1] != displayedChar[1] || minutesChar[0] != displayedChar[2] || - minutesChar[1] != displayedChar[3]) { - displayedChar[0] = hoursChar[0]; - displayedChar[1] = hoursChar[1]; - displayedChar[2] = minutesChar[0]; - displayedChar[3] = minutesChar[1]; + if (hoursChar[0] != displayedTime[0] || hoursChar[1] != displayedTime[1] || minutesChar[0] != displayedTime[2] || + minutesChar[1] != displayedTime[3]) { + displayedTime[0] = hoursChar[0]; + displayedTime[1] = hoursChar[1]; + displayedTime[2] = minutesChar[0]; + displayedTime[3] = minutesChar[1]; char timeStr[6]; - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { + if (clock_type == Controllers::Settings::ClockType::H12) { lv_label_set_text(label_time_ampm, ampmChar); if (hoursChar[0] == '0') { hoursChar[0] = ' '; @@ -195,28 +172,26 @@ bool WatchFaceDigital::Refresh() { sprintf(timeStr, "%c%c:%c%c", hoursChar[0], hoursChar[1], minutesChar[0], minutesChar[1]); lv_label_set_text(label_time, timeStr); - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { + if (clock_type == Controllers::Settings::ClockType::H12) { lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0); } else { lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); } } + } - if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { - char dateStr[22]; - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { - sprintf(dateStr, "%s %d %s %d", DayOfWeekShortToString(dayOfWeek), day, MonthShortToString(month), year); - } else { - sprintf(dateStr, "%s %s %d %d", DayOfWeekShortToString(dayOfWeek), MonthShortToString(month), day, year); - } - lv_label_set_text(label_date, dateStr); - lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); + auto const& date = GetUpdatedDate(); + if (date.IsUpdated()) { + auto const& d = date.Get(); + char dateStr[22]; - currentYear = year; - currentMonth = month; - currentDayOfWeek = dayOfWeek; - currentDay = day; + if (clock_type == Controllers::Settings::ClockType::H24) { + sprintf(dateStr, "%s %d %s %d", DayOfWeekShortToString(d.dayOfWeek), d.day, MonthShortToString(d.month), d.year); + } else { + sprintf(dateStr, "%s %s %d %d", DayOfWeekShortToString(d.dayOfWeek), MonthShortToString(d.month), d.day, d.year); } + lv_label_set_text(label_date, dateStr); + lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); } heartbeat = heartRateController.HeartRate(); diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 357494d5b7..2556ce0d4b 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -6,7 +6,6 @@ #include #include "WatchFaceBase.h" #include "components/datetime/DateTime.h" -#include "components/datetime/DateTimeController.h" namespace Pinetime { namespace Controllers { @@ -16,6 +15,7 @@ namespace Pinetime { class NotificationManager; class HeartRateController; class MotionController; + class DateTimeController; } namespace Applications { @@ -24,7 +24,7 @@ namespace Pinetime { class WatchFaceDigital : public WatchFaceBase { public: WatchFaceDigital(DisplayApp* app, - Controllers::DateTimeController& dateTimeController, + Controllers::DateTimeController const& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, @@ -38,12 +38,7 @@ namespace Pinetime { void OnObjectEvent(lv_obj_t* pObj, lv_event_t i); private: - char displayedChar[5]; - - uint16_t currentYear = 1970; - Pinetime::DateTime::Months currentMonth = Pinetime::DateTime::Months::Unknown; - Pinetime::DateTime::Days currentDayOfWeek = Pinetime::DateTime::Days::Unknown; - uint8_t currentDay = 0; + char displayedTime[5] = {}; DirtyValue batteryPercentRemaining {}; DirtyValue bleState {}; @@ -68,7 +63,6 @@ namespace Pinetime { lv_obj_t* stepValue; lv_obj_t* notificationIcon; - Controllers::DateTimeController& dateTimeController; Controllers::Battery& batteryController; Controllers::Ble& bleController; Controllers::NotificationManager& notificatioManager; From 468df4e5f9458d715a6ee91b6b4249dad8dfd9f7 Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Sun, 20 Jun 2021 16:05:35 -0400 Subject: [PATCH 04/17] Move BatteryController functionality to WatchFaceBase --- src/displayapp/screens/BatteryIcon.cpp | 48 ++++++++++++--------- src/displayapp/screens/BatteryIcon.h | 13 +++--- src/displayapp/screens/WatchFaceAnalog.cpp | 14 +++--- src/displayapp/screens/WatchFaceAnalog.h | 7 ++- src/displayapp/screens/WatchFaceBase.cpp | 17 ++++++-- src/displayapp/screens/WatchFaceBase.h | 28 +++++++++++- src/displayapp/screens/WatchFaceDigital.cpp | 17 +++----- src/displayapp/screens/WatchFaceDigital.h | 6 +-- 8 files changed, 94 insertions(+), 56 deletions(-) diff --git a/src/displayapp/screens/BatteryIcon.cpp b/src/displayapp/screens/BatteryIcon.cpp index bb6626a525..f1fd3e9b10 100644 --- a/src/displayapp/screens/BatteryIcon.cpp +++ b/src/displayapp/screens/BatteryIcon.cpp @@ -2,27 +2,35 @@ #include "BatteryIcon.h" #include "Symbols.h" -using namespace Pinetime::Applications::Screens; +namespace Pinetime { + namespace Applications { + namespace Screens { + namespace BatteryIcon { -const char* BatteryIcon::GetBatteryIcon(uint8_t batteryPercent) { - if (batteryPercent > 90) - return Symbols::batteryFull; - if (batteryPercent > 75) - return Symbols::batteryThreeQuarter; - if (batteryPercent > 50) - return Symbols::batteryHalf; - if (batteryPercent > 25) - return Symbols::batteryOneQuarter; - return Symbols::batteryEmpty; -} + const char* GetBatteryIcon(uint8_t batteryPercent) { + if (batteryPercent > 90) + return Symbols::batteryFull; + if (batteryPercent > 75) + return Symbols::batteryThreeQuarter; + if (batteryPercent > 50) + return Symbols::batteryHalf; + if (batteryPercent > 25) + return Symbols::batteryOneQuarter; + return Symbols::batteryEmpty; + } -const char* BatteryIcon::GetUnknownIcon() { - return Symbols::batteryEmpty; -} + const char* GetUnknownIcon() { + return Symbols::batteryEmpty; + } + + const char* GetPlugIcon(bool isCharging) { + if (isCharging) + return Symbols::plug; + else + return ""; + } -const char* BatteryIcon::GetPlugIcon(bool isCharging) { - if (isCharging) - return Symbols::plug; - else - return ""; + } + } + } } diff --git a/src/displayapp/screens/BatteryIcon.h b/src/displayapp/screens/BatteryIcon.h index b370b331d2..224a504a1a 100644 --- a/src/displayapp/screens/BatteryIcon.h +++ b/src/displayapp/screens/BatteryIcon.h @@ -3,12 +3,11 @@ namespace Pinetime { namespace Applications { namespace Screens { - class BatteryIcon { - public: - static const char* GetUnknownIcon(); - static const char* GetBatteryIcon(uint8_t batteryPercent); - static const char* GetPlugIcon(bool isCharging); - }; + namespace BatteryIcon { + const char* GetUnknownIcon(); + const char* GetBatteryIcon(uint8_t batteryPercent); + const char* GetPlugIcon(bool isCharging); + } } } -} \ No newline at end of file +} diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index e8a7bcda33..16b61ae9ce 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -4,6 +4,7 @@ #include "BleIcon.h" #include "Symbols.h" #include "NotificationIcon.h" +#include "components/settings/Settings.h" LV_IMG_DECLARE(bg_clock); @@ -46,12 +47,11 @@ lv_point_t coordinate_relocate(int16_t radius, int16_t angle) { WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, Controllers::DateTimeController const& dateTimeController, - Controllers::Battery& batteryController, + Controllers::Battery const& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController) - : WatchFaceBase{app, dateTimeController}, - batteryController {batteryController}, + : WatchFaceBase{app, dateTimeController, batteryController}, bleController {bleController}, notificationManager {notificationManager}, settingsController {settingsController} { @@ -167,10 +167,10 @@ void WatchFaceAnalog::UpdateClock() { } bool WatchFaceAnalog::Refresh() { - batteryPercentRemaining = batteryController.PercentRemaining(); - if (batteryPercentRemaining.IsUpdated()) { - auto batteryPercent = batteryPercentRemaining.Get(); - lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); + auto const& battery = GetUpdatedBattery(); + if (battery.IsUpdated()) { + auto const icon = BatteryIcon::GetBatteryIcon(battery.Get().percentRemaining); + lv_label_set_text_static(batteryIcon, icon); } notificationState = notificationManager.AreNewNotificationsAvailable(); diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index bdb20224b9..c493e4fae2 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -5,7 +5,6 @@ #include #include #include "WatchFaceBase.h" -#include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" @@ -18,13 +17,15 @@ namespace Pinetime { class DateTimeController; } namespace Applications { + class DisplayApp; + namespace Screens { class WatchFaceAnalog : public WatchFaceBase { public: WatchFaceAnalog(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, - Controllers::Battery& batteryController, + Controllers::Battery const& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController); @@ -38,7 +39,6 @@ namespace Pinetime { DirtyValue minute{99}; DirtyValue second{99}; - DirtyValue batteryPercentRemaining {0}; DirtyValue notificationState {false}; lv_obj_t* hour_body; @@ -65,7 +65,6 @@ namespace Pinetime { lv_obj_t* batteryIcon; lv_obj_t* notificationIcon; - Controllers::Battery& batteryController; Controllers::Ble& bleController; Controllers::NotificationManager& notificationManager; Controllers::Settings& settingsController; diff --git a/src/displayapp/screens/WatchFaceBase.cpp b/src/displayapp/screens/WatchFaceBase.cpp index 6988dcf7cb..386be2308b 100644 --- a/src/displayapp/screens/WatchFaceBase.cpp +++ b/src/displayapp/screens/WatchFaceBase.cpp @@ -1,12 +1,15 @@ #include "WatchFaceBase.h" #include "components/datetime/DateTimeController.h" +#include "components/battery/BatteryController.h" using namespace Pinetime::Applications::Screens; WatchFaceBase::WatchFaceBase(DisplayApp* app, - Controllers::DateTimeController const& dateTimeController) - : Screen(app), - dateTimeController(dateTimeController) { + Controllers::DateTimeController const& dateTimeController, + Controllers::Battery const& batteryController) + : Screen{app}, + dateTimeController{dateTimeController}, + batteryController{batteryController} { } void WatchFaceBase::UpdateDate() { @@ -25,3 +28,11 @@ void WatchFaceBase::UpdateTime() { .second = dateTimeController.Seconds() }; } + +void WatchFaceBase::UpdateBattery() { + battery = BatteryState{ + .percentRemaining = batteryController.PercentRemaining(), + .charging = batteryController.IsCharging(), + .powerPresent = batteryController.IsPowerPresent() + }; +} diff --git a/src/displayapp/screens/WatchFaceBase.h b/src/displayapp/screens/WatchFaceBase.h index 71bd29f763..60289c4e2c 100644 --- a/src/displayapp/screens/WatchFaceBase.h +++ b/src/displayapp/screens/WatchFaceBase.h @@ -1,15 +1,17 @@ #pragma once #include "Screen.h" -#include "../DisplayApp.h" #include "components/datetime/DateTime.h" #include namespace Pinetime { namespace Controllers { class DateTimeController; + class Battery; } namespace Applications { + class DisplayApp; + namespace Screens { class WatchFaceBase : public Screen { public: @@ -34,8 +36,19 @@ namespace Pinetime { } }; + struct BatteryState { + uint8_t percentRemaining; + bool charging; + bool powerPresent; + + bool operator!=(BatteryState const& rhs) { + return percentRemaining != rhs.percentRemaining || charging != rhs.charging || powerPresent != rhs.powerPresent; + } + }; + WatchFaceBase(DisplayApp* app, - Controllers::DateTimeController const& dateTimeController); + Controllers::DateTimeController const& dateTimeController, + Controllers::Battery const& batteryController); virtual ~WatchFaceBase() = default; @@ -56,11 +69,22 @@ namespace Pinetime { return time; } + void UpdateBattery(); + DirtyValue const& GetBattery() const { + return battery; + } + DirtyValue const& GetUpdatedBattery() { + UpdateBattery(); + return battery; + } + private: DirtyValue date; DirtyValue time; + DirtyValue battery; Controllers::DateTimeController const& dateTimeController; + Controllers::Battery const& batteryController; }; } } diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index e5d82f1a0f..0ca22bfb17 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -7,27 +7,24 @@ #include "BleIcon.h" #include "NotificationIcon.h" #include "Symbols.h" -#include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" #include "components/heartrate/HeartRateController.h" #include "components/motion/MotionController.h" #include "components/settings/Settings.h" -#include "../DisplayApp.h" using namespace Pinetime::Applications::Screens; using namespace Pinetime::DateTime; WatchFaceDigital::WatchFaceDigital(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, - Controllers::Battery& batteryController, + Controllers::Battery const& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController) - : WatchFaceBase{app, dateTimeController}, - batteryController {batteryController}, + : WatchFaceBase{app, dateTimeController, batteryController }, bleController {bleController}, notificatioManager {notificatioManager}, settingsController {settingsController}, @@ -100,11 +97,11 @@ WatchFaceDigital::~WatchFaceDigital() { } bool WatchFaceDigital::Refresh() { - batteryPercentRemaining = batteryController.PercentRemaining(); - if (batteryPercentRemaining.IsUpdated()) { - auto batteryPercent = batteryPercentRemaining.Get(); - lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); - auto isCharging = batteryController.IsCharging() || batteryController.IsPowerPresent(); + auto const& battery = GetUpdatedBattery(); + if (battery.IsUpdated()) { + auto const& b = battery.Get(); + lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(b.percentRemaining)); + auto const isCharging = b.charging || b.powerPresent; lv_label_set_text(batteryPlug, BatteryIcon::GetPlugIcon(isCharging)); } diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 2556ce0d4b..413abe9221 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -19,13 +19,15 @@ namespace Pinetime { } namespace Applications { + class DisplayApp; + namespace Screens { class WatchFaceDigital : public WatchFaceBase { public: WatchFaceDigital(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, - Controllers::Battery& batteryController, + Controllers::Battery const& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, @@ -40,7 +42,6 @@ namespace Pinetime { private: char displayedTime[5] = {}; - DirtyValue batteryPercentRemaining {}; DirtyValue bleState {}; DirtyValue> currentDateTime {}; DirtyValue motionSensorOk {}; @@ -63,7 +64,6 @@ namespace Pinetime { lv_obj_t* stepValue; lv_obj_t* notificationIcon; - Controllers::Battery& batteryController; Controllers::Ble& bleController; Controllers::NotificationManager& notificatioManager; Controllers::Settings& settingsController; From a62a16f095ef8cfd393e4d3bc499a50a70b6ddda Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Sun, 20 Jun 2021 16:14:06 -0400 Subject: [PATCH 05/17] Move BleController functionality to WatchFaceBase --- src/displayapp/screens/WatchFaceAnalog.cpp | 8 +++---- src/displayapp/screens/WatchFaceAnalog.h | 4 +--- src/displayapp/screens/WatchFaceBase.cpp | 13 ++++++++++-- src/displayapp/screens/WatchFaceBase.h | 23 ++++++++++++++++++++- src/displayapp/screens/WatchFaceDigital.cpp | 16 +++++--------- src/displayapp/screens/WatchFaceDigital.h | 4 +--- 6 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index 16b61ae9ce..c01ac3cad7 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -1,7 +1,6 @@ #include #include "WatchFaceAnalog.h" #include "BatteryIcon.h" -#include "BleIcon.h" #include "Symbols.h" #include "NotificationIcon.h" #include "components/settings/Settings.h" @@ -48,12 +47,11 @@ lv_point_t coordinate_relocate(int16_t radius, int16_t angle) { WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, - Controllers::Ble& bleController, + Controllers::Ble const& bleController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController) - : WatchFaceBase{app, dateTimeController, batteryController}, - bleController {bleController}, - notificationManager {notificationManager}, + : WatchFaceBase{app, dateTimeController, batteryController, bleController}, + notificatioManager {notificatioManager}, settingsController {settingsController} { settingsController.SetClockFace(1); diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index c493e4fae2..f8e9502bc6 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -5,7 +5,6 @@ #include #include #include "WatchFaceBase.h" -#include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" namespace Pinetime { @@ -26,7 +25,7 @@ namespace Pinetime { WatchFaceAnalog(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, - Controllers::Ble& bleController, + Controllers::Ble const& bleController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController); @@ -65,7 +64,6 @@ namespace Pinetime { lv_obj_t* batteryIcon; lv_obj_t* notificationIcon; - Controllers::Ble& bleController; Controllers::NotificationManager& notificationManager; Controllers::Settings& settingsController; diff --git a/src/displayapp/screens/WatchFaceBase.cpp b/src/displayapp/screens/WatchFaceBase.cpp index 386be2308b..e2821a99b3 100644 --- a/src/displayapp/screens/WatchFaceBase.cpp +++ b/src/displayapp/screens/WatchFaceBase.cpp @@ -1,15 +1,18 @@ #include "WatchFaceBase.h" #include "components/datetime/DateTimeController.h" #include "components/battery/BatteryController.h" +#include "components/ble/BleController.h" using namespace Pinetime::Applications::Screens; WatchFaceBase::WatchFaceBase(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, - Controllers::Battery const& batteryController) + Controllers::Battery const& batteryController, + Controllers::Ble const& bleController) : Screen{app}, dateTimeController{dateTimeController}, - batteryController{batteryController} { + batteryController{batteryController}, + bleController{bleController} { } void WatchFaceBase::UpdateDate() { @@ -36,3 +39,9 @@ void WatchFaceBase::UpdateBattery() { .powerPresent = batteryController.IsPowerPresent() }; } + +void WatchFaceBase::UpdateBle() { + ble = BleState{ + .connected = bleController.IsConnected() + }; +} diff --git a/src/displayapp/screens/WatchFaceBase.h b/src/displayapp/screens/WatchFaceBase.h index 60289c4e2c..73741d390b 100644 --- a/src/displayapp/screens/WatchFaceBase.h +++ b/src/displayapp/screens/WatchFaceBase.h @@ -8,6 +8,7 @@ namespace Pinetime { namespace Controllers { class DateTimeController; class Battery; + class Ble; } namespace Applications { class DisplayApp; @@ -46,9 +47,18 @@ namespace Pinetime { } }; + struct BleState { + bool connected; + + bool operator!=(BleState const& rhs) { + return connected != rhs.connected; + } + }; + WatchFaceBase(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, - Controllers::Battery const& batteryController); + Controllers::Battery const& batteryController, + Controllers::Ble const& bleController); virtual ~WatchFaceBase() = default; @@ -78,13 +88,24 @@ namespace Pinetime { return battery; } + void UpdateBle(); + DirtyValue const& GetBle() const { + return ble; + } + DirtyValue const& GetUpdatedBle() { + UpdateBle(); + return ble; + } + private: DirtyValue date; DirtyValue time; DirtyValue battery; + DirtyValue ble; Controllers::DateTimeController const& dateTimeController; Controllers::Battery const& batteryController; + Controllers::Ble const& bleController; }; } } diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 0ca22bfb17..69e6100803 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -7,7 +7,6 @@ #include "BleIcon.h" #include "NotificationIcon.h" #include "Symbols.h" -#include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" #include "components/heartrate/HeartRateController.h" #include "components/motion/MotionController.h" @@ -19,13 +18,12 @@ using namespace Pinetime::DateTime; WatchFaceDigital::WatchFaceDigital(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, - Controllers::Ble& bleController, + Controllers::Ble const& bleController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController) - : WatchFaceBase{app, dateTimeController, batteryController }, - bleController {bleController}, + : WatchFaceBase{app, dateTimeController, batteryController, bleController}, notificatioManager {notificatioManager}, settingsController {settingsController}, heartRateController {heartRateController}, @@ -105,13 +103,9 @@ bool WatchFaceDigital::Refresh() { lv_label_set_text(batteryPlug, BatteryIcon::GetPlugIcon(isCharging)); } - bleState = bleController.IsConnected(); - if (bleState.IsUpdated()) { - if (bleState.Get() == true) { - lv_label_set_text(bleIcon, BleIcon::GetIcon(true)); - } else { - lv_label_set_text(bleIcon, BleIcon::GetIcon(false)); - } + auto const& ble = GetUpdatedBle(); + if (ble.IsUpdated()) { + lv_label_set_text(bleIcon, BleIcon::GetIcon(ble.Get().connected)); } lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -5, 5); lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0); diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 413abe9221..85d7a14751 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -28,7 +28,7 @@ namespace Pinetime { WatchFaceDigital(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, - Controllers::Ble& bleController, + Controllers::Ble const& bleController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, @@ -42,7 +42,6 @@ namespace Pinetime { private: char displayedTime[5] = {}; - DirtyValue bleState {}; DirtyValue> currentDateTime {}; DirtyValue motionSensorOk {}; DirtyValue stepCount {}; @@ -64,7 +63,6 @@ namespace Pinetime { lv_obj_t* stepValue; lv_obj_t* notificationIcon; - Controllers::Ble& bleController; Controllers::NotificationManager& notificatioManager; Controllers::Settings& settingsController; Controllers::HeartRateController& heartRateController; From 980035e4191b950121fa4c4ef38ee11638a05a2d Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Sun, 20 Jun 2021 16:45:00 -0400 Subject: [PATCH 06/17] Move NotificationManager functionality to WatchFaceBase --- src/components/ble/NotificationManager.cpp | 4 ++-- src/components/ble/NotificationManager.h | 6 +++--- src/displayapp/screens/WatchFaceAnalog.cpp | 16 ++++++-------- src/displayapp/screens/WatchFaceAnalog.h | 6 +----- src/displayapp/screens/WatchFaceBase.cpp | 13 ++++++++++-- src/displayapp/screens/WatchFaceBase.h | 23 ++++++++++++++++++++- src/displayapp/screens/WatchFaceDigital.cpp | 16 ++++++-------- src/displayapp/screens/WatchFaceDigital.h | 4 +--- 8 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/components/ble/NotificationManager.cpp b/src/components/ble/NotificationManager.cpp index b1b0e6b262..2f3662719c 100644 --- a/src/components/ble/NotificationManager.cpp +++ b/src/components/ble/NotificationManager.cpp @@ -75,11 +75,11 @@ NotificationManager::Notification NotificationManager::GetPrevious(NotificationM return result; } -bool NotificationManager::AreNewNotificationsAvailable() { +bool NotificationManager::AreNewNotificationsAvailable() const { return newNotification; } -bool NotificationManager::IsVibrationEnabled() { +bool NotificationManager::IsVibrationEnabled() const { return vibrationEnabled; } diff --git a/src/components/ble/NotificationManager.h b/src/components/ble/NotificationManager.h index d4072cc2ed..2decb6bce1 100644 --- a/src/components/ble/NotificationManager.h +++ b/src/components/ble/NotificationManager.h @@ -43,8 +43,8 @@ namespace Pinetime { Notification GetNext(Notification::Id id); Notification GetPrevious(Notification::Id id); bool ClearNewNotificationFlag(); - bool AreNewNotificationsAvailable(); - bool IsVibrationEnabled(); + bool AreNewNotificationsAvailable() const; + bool IsVibrationEnabled() const; void ToggleVibrations(); static constexpr size_t MaximumMessageSize() { @@ -63,4 +63,4 @@ namespace Pinetime { bool vibrationEnabled = true; }; } -} \ No newline at end of file +} diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index c01ac3cad7..9a59354684 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -48,10 +48,9 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, Controllers::Ble const& bleController, - Controllers::NotificationManager& notificationManager, + Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController) - : WatchFaceBase{app, dateTimeController, batteryController, bleController}, - notificatioManager {notificatioManager}, + : WatchFaceBase{app, dateTimeController, batteryController, bleController, notificationManager}, settingsController {settingsController} { settingsController.SetClockFace(1); @@ -171,13 +170,10 @@ bool WatchFaceAnalog::Refresh() { lv_label_set_text_static(batteryIcon, icon); } - notificationState = notificationManager.AreNewNotificationsAvailable(); - - if (notificationState.IsUpdated()) { - if (notificationState.Get() == true) - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(true)); - else - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); + auto const& notifications = GetUpdatedNotifications(); + if (notifications.IsUpdated()) { + auto const icon = NotificationIcon::GetIcon(notifications.Get().newNotificationsAvailable); + lv_label_set_text(notificationIcon, icon); } auto const& time = GetUpdatedTime(); diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index f8e9502bc6..8b3ed87654 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -5,7 +5,6 @@ #include #include #include "WatchFaceBase.h" -#include "components/ble/NotificationManager.h" namespace Pinetime { namespace Controllers { @@ -26,7 +25,7 @@ namespace Pinetime { Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, Controllers::Ble const& bleController, - Controllers::NotificationManager& notificationManager, + Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController); ~WatchFaceAnalog() override; @@ -38,8 +37,6 @@ namespace Pinetime { DirtyValue minute{99}; DirtyValue second{99}; - DirtyValue notificationState {false}; - lv_obj_t* hour_body; lv_obj_t* hour_body_trace; lv_obj_t* minute_body; @@ -64,7 +61,6 @@ namespace Pinetime { lv_obj_t* batteryIcon; lv_obj_t* notificationIcon; - Controllers::NotificationManager& notificationManager; Controllers::Settings& settingsController; void UpdateClock(); diff --git a/src/displayapp/screens/WatchFaceBase.cpp b/src/displayapp/screens/WatchFaceBase.cpp index e2821a99b3..b943a1d492 100644 --- a/src/displayapp/screens/WatchFaceBase.cpp +++ b/src/displayapp/screens/WatchFaceBase.cpp @@ -2,17 +2,20 @@ #include "components/datetime/DateTimeController.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" +#include "components/ble/NotificationManager.h" using namespace Pinetime::Applications::Screens; WatchFaceBase::WatchFaceBase(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, - Controllers::Ble const& bleController) + Controllers::Ble const& bleController, + Controllers::NotificationManager const& notificationManager) : Screen{app}, dateTimeController{dateTimeController}, batteryController{batteryController}, - bleController{bleController} { + bleController{bleController}, + notificationManager{notificationManager} { } void WatchFaceBase::UpdateDate() { @@ -45,3 +48,9 @@ void WatchFaceBase::UpdateBle() { .connected = bleController.IsConnected() }; } + +void WatchFaceBase::UpdateNotifications() { + notifications = NotificationState{ + .newNotificationsAvailable = notificationManager.AreNewNotificationsAvailable() + }; +} diff --git a/src/displayapp/screens/WatchFaceBase.h b/src/displayapp/screens/WatchFaceBase.h index 73741d390b..add312a5c1 100644 --- a/src/displayapp/screens/WatchFaceBase.h +++ b/src/displayapp/screens/WatchFaceBase.h @@ -9,6 +9,7 @@ namespace Pinetime { class DateTimeController; class Battery; class Ble; + class NotificationManager; } namespace Applications { class DisplayApp; @@ -55,10 +56,19 @@ namespace Pinetime { } }; + struct NotificationState { + bool newNotificationsAvailable; + + bool operator!=(NotificationState const& rhs) { + return newNotificationsAvailable != rhs.newNotificationsAvailable; + } + }; + WatchFaceBase(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, - Controllers::Ble const& bleController); + Controllers::Ble const& bleController, + Controllers::NotificationManager const& notificationManager); virtual ~WatchFaceBase() = default; @@ -97,15 +107,26 @@ namespace Pinetime { return ble; } + void UpdateNotifications(); + DirtyValue const& GetNotifications() const { + return notifications; + } + DirtyValue const& GetUpdatedNotifications() { + UpdateNotifications(); + return notifications; + } + private: DirtyValue date; DirtyValue time; DirtyValue battery; DirtyValue ble; + DirtyValue notifications; Controllers::DateTimeController const& dateTimeController; Controllers::Battery const& batteryController; Controllers::Ble const& bleController; + Controllers::NotificationManager const& notificationManager; }; } } diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 69e6100803..751c679136 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -7,7 +7,6 @@ #include "BleIcon.h" #include "NotificationIcon.h" #include "Symbols.h" -#include "components/ble/NotificationManager.h" #include "components/heartrate/HeartRateController.h" #include "components/motion/MotionController.h" #include "components/settings/Settings.h" @@ -19,12 +18,11 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, Controllers::Ble const& bleController, - Controllers::NotificationManager& notificatioManager, + Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController) - : WatchFaceBase{app, dateTimeController, batteryController, bleController}, - notificatioManager {notificatioManager}, + : WatchFaceBase{app, dateTimeController, batteryController, bleController, notificationManager}, settingsController {settingsController}, heartRateController {heartRateController}, motionController {motionController} { @@ -111,12 +109,10 @@ bool WatchFaceDigital::Refresh() { lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0); lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0); - notificationState = notificatioManager.AreNewNotificationsAvailable(); - if (notificationState.IsUpdated()) { - if (notificationState.Get() == true) - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(true)); - else - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); + auto const& notifications = GetUpdatedNotifications(); + if (notifications.IsUpdated()) { + auto const icon = NotificationIcon::GetIcon(notifications.Get().newNotificationsAvailable); + lv_label_set_text(notificationIcon, icon); } auto const clock_type = settingsController.GetClockType(); diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 85d7a14751..e2294d4a55 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -29,7 +29,7 @@ namespace Pinetime { Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, Controllers::Ble const& bleController, - Controllers::NotificationManager& notificatioManager, + Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController); @@ -47,7 +47,6 @@ namespace Pinetime { DirtyValue stepCount {}; DirtyValue heartbeat {}; DirtyValue heartbeatRunning {}; - DirtyValue notificationState {}; lv_obj_t* label_time; lv_obj_t* label_time_ampm; @@ -63,7 +62,6 @@ namespace Pinetime { lv_obj_t* stepValue; lv_obj_t* notificationIcon; - Controllers::NotificationManager& notificatioManager; Controllers::Settings& settingsController; Controllers::HeartRateController& heartRateController; Controllers::MotionController& motionController; From 5dda4dd5c669fe44a1325a4eb1197c858298ca35 Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Sun, 20 Jun 2021 17:20:38 -0400 Subject: [PATCH 07/17] Move Settings functionality to WatchFaceBase --- src/components/settings/Settings.h | 7 ++++--- src/displayapp/screens/Clock.cpp | 7 ++++--- src/displayapp/screens/PineTimeStyle.cpp | 4 ++-- src/displayapp/screens/WatchFaceAnalog.cpp | 10 +++++++--- src/displayapp/screens/WatchFaceAnalog.h | 2 -- src/displayapp/screens/WatchFaceBase.cpp | 10 +++++++++- src/displayapp/screens/WatchFaceBase.h | 8 +++++++- src/displayapp/screens/WatchFaceDigital.cpp | 12 ++++++++---- src/displayapp/screens/WatchFaceDigital.h | 1 - src/displayapp/screens/settings/SettingWatchFace.cpp | 6 +++--- 10 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 93d6d21760..221b817057 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -10,6 +10,7 @@ namespace Pinetime { namespace Controllers { class Settings { public: + enum class ClockFace { Digital, Analog, PineTimeStyle }; enum class ClockType : uint8_t { H24, H12 }; enum class Vibration : uint8_t { ON, OFF }; enum class WakeUpMode : uint8_t { @@ -23,13 +24,13 @@ namespace Pinetime { void Init(); void SaveSettings(); - void SetClockFace(uint8_t face) { + void SetClockFace(ClockFace face) { if (face != settings.clockFace) { settingsChanged = true; } settings.clockFace = face; }; - uint8_t GetClockFace() const { + ClockFace GetClockFace() const { return settings.clockFace; }; @@ -137,7 +138,7 @@ namespace Pinetime { ClockType clockType = ClockType::H24; Vibration vibrationStatus = Vibration::ON; - uint8_t clockFace = 0; + ClockFace clockFace = ClockFace::Digital; std::bitset<3> wakeUpMode {0}; diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index 380e830561..b2c0225f12 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -7,6 +7,7 @@ #include "BleIcon.h" #include "NotificationIcon.h" #include "Symbols.h" +#include "components/settings/Settings.h" #include "components/battery/BatteryController.h" #include "components/motion/MotionController.h" #include "components/ble/BleController.h" @@ -36,13 +37,13 @@ Clock::Clock(DisplayApp* app, motionController {motionController}, screen {[this, &settingsController]() { switch (settingsController.GetClockFace()) { - case 0: + case Controllers::Settings::ClockFace::Digital: return WatchFaceDigitalScreen(); break; - case 1: + case Controllers::Settings::ClockFace::Analog: return WatchFaceAnalogScreen(); break; - case 2: + case Controllers::Settings::ClockFace::PineTimeStyle: return PineTimeStyleScreen(); break; } diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp index 0efb4dc300..f63eae89b3 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/PineTimeStyle.cpp @@ -53,7 +53,7 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app, motionController {motionController} { /* This sets the watchface number to return to after leaving the menu */ - settingsController.SetClockFace(2); + settingsController.SetClockFace(Pinetime::Controllers::Settings::ClockFace::PineTimeStyle); displayedChar[0] = 0; displayedChar[1] = 0; @@ -337,4 +337,4 @@ bool PineTimeStyle::Refresh() { } return running; -} \ No newline at end of file +} diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index 9a59354684..2925813968 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -50,9 +50,13 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, Controllers::Ble const& bleController, Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController) - : WatchFaceBase{app, dateTimeController, batteryController, bleController, notificationManager}, - settingsController {settingsController} { - settingsController.SetClockFace(1); + : WatchFaceBase{Pinetime::Controllers::Settings::ClockFace::Analog, + app, + settingsController, + dateTimeController, + batteryController, + bleController, + notificationManager} { lv_obj_t* bg_clock_img = lv_img_create(lv_scr_act(), NULL); lv_img_set_src(bg_clock_img, &bg_clock); diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index 8b3ed87654..fd2095c76e 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -61,8 +61,6 @@ namespace Pinetime { lv_obj_t* batteryIcon; lv_obj_t* notificationIcon; - Controllers::Settings& settingsController; - void UpdateClock(); }; } diff --git a/src/displayapp/screens/WatchFaceBase.cpp b/src/displayapp/screens/WatchFaceBase.cpp index b943a1d492..c22cc45209 100644 --- a/src/displayapp/screens/WatchFaceBase.cpp +++ b/src/displayapp/screens/WatchFaceBase.cpp @@ -6,16 +6,24 @@ using namespace Pinetime::Applications::Screens; -WatchFaceBase::WatchFaceBase(DisplayApp* app, +WatchFaceBase::WatchFaceBase(Controllers::Settings::ClockFace face, + DisplayApp* app, + Controllers::Settings& settingsController, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, Controllers::Ble const& bleController, Controllers::NotificationManager const& notificationManager) : Screen{app}, + settingsController{settingsController}, dateTimeController{dateTimeController}, batteryController{batteryController}, bleController{bleController}, notificationManager{notificationManager} { + settingsController.SetClockFace(face); +} + +Pinetime::Controllers::Settings::ClockType WatchFaceBase::GetClockType() const { + return settingsController.GetClockType(); } void WatchFaceBase::UpdateDate() { diff --git a/src/displayapp/screens/WatchFaceBase.h b/src/displayapp/screens/WatchFaceBase.h index add312a5c1..9a2d2623fc 100644 --- a/src/displayapp/screens/WatchFaceBase.h +++ b/src/displayapp/screens/WatchFaceBase.h @@ -1,6 +1,7 @@ #pragma once #include "Screen.h" +#include "components/settings/Settings.h" #include "components/datetime/DateTime.h" #include @@ -64,7 +65,9 @@ namespace Pinetime { } }; - WatchFaceBase(DisplayApp* app, + WatchFaceBase(Controllers::Settings::ClockFace face, + DisplayApp* app, + Controllers::Settings& settingsController, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, Controllers::Ble const& bleController, @@ -72,6 +75,8 @@ namespace Pinetime { virtual ~WatchFaceBase() = default; + Controllers::Settings::ClockType GetClockType() const; + void UpdateDate(); void UpdateTime(); DirtyValue const& GetDate() const { @@ -123,6 +128,7 @@ namespace Pinetime { DirtyValue ble; DirtyValue notifications; + Controllers::Settings& settingsController; Controllers::DateTimeController const& dateTimeController; Controllers::Battery const& batteryController; Controllers::Ble const& bleController; diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 751c679136..df5b0dc820 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -22,11 +22,15 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController) - : WatchFaceBase{app, dateTimeController, batteryController, bleController, notificationManager}, - settingsController {settingsController}, + : WatchFaceBase{Pinetime::Controllers::Settings::ClockFace::Digital, + app, + settingsController, + dateTimeController, + batteryController, + bleController, + notificationManager}, heartRateController {heartRateController}, motionController {motionController} { - settingsController.SetClockFace(0); batteryIcon = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text(batteryIcon, Symbols::batteryFull); @@ -115,7 +119,7 @@ bool WatchFaceDigital::Refresh() { lv_label_set_text(notificationIcon, icon); } - auto const clock_type = settingsController.GetClockType(); + auto const clock_type = GetClockType(); auto const& time = GetUpdatedTime(); if (time.IsUpdated()) { auto const& t = time.Get(); diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index e2294d4a55..e37e6a5117 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -62,7 +62,6 @@ namespace Pinetime { lv_obj_t* stepValue; lv_obj_t* notificationIcon; - Controllers::Settings& settingsController; Controllers::HeartRateController& heartRateController; Controllers::MotionController& motionController; }; diff --git a/src/displayapp/screens/settings/SettingWatchFace.cpp b/src/displayapp/screens/settings/SettingWatchFace.cpp index 02b9081608..fc9c7106f0 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.cpp +++ b/src/displayapp/screens/settings/SettingWatchFace.cpp @@ -45,7 +45,7 @@ SettingWatchFace::SettingWatchFace(Pinetime::Applications::DisplayApp* app, Pine lv_checkbox_set_text_static(cbOption[optionsTotal], " Digital face"); cbOption[optionsTotal]->user_data = this; lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetClockFace() == 0) { + if (settingsController.GetClockFace() == Pinetime::Controllers::Settings::ClockFace::Digital) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } @@ -54,7 +54,7 @@ SettingWatchFace::SettingWatchFace(Pinetime::Applications::DisplayApp* app, Pine lv_checkbox_set_text_static(cbOption[optionsTotal], " Analog face"); cbOption[optionsTotal]->user_data = this; lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetClockFace() == 1) { + if (settingsController.GetClockFace() == Pinetime::Controllers::Settings::ClockFace::Analog) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } @@ -84,7 +84,7 @@ void SettingWatchFace::UpdateSelected(lv_obj_t* object, lv_event_t event) { for (uint8_t i = 0; i < optionsTotal; i++) { if (object == cbOption[i]) { lv_checkbox_set_checked(cbOption[i], true); - settingsController.SetClockFace(i); + settingsController.SetClockFace(static_cast(i)); } else { lv_checkbox_set_checked(cbOption[i], false); } From 9449ae5db3a9fa6270cccf3a16d6d366f0a9e568 Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Mon, 21 Jun 2021 22:49:27 -0400 Subject: [PATCH 08/17] Move HeartRateController functionality to WatchFaceBase --- src/displayapp/screens/Clock.cpp | 27 ++++++++++++++++----- src/displayapp/screens/WatchFaceAnalog.cpp | 6 +++-- src/displayapp/screens/WatchFaceAnalog.h | 4 ++- src/displayapp/screens/WatchFaceBase.cpp | 14 +++++++++-- src/displayapp/screens/WatchFaceBase.h | 24 +++++++++++++++++- src/displayapp/screens/WatchFaceDigital.cpp | 18 +++++++------- src/displayapp/screens/WatchFaceDigital.h | 3 +-- 7 files changed, 73 insertions(+), 23 deletions(-) diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index b2c0225f12..e5f1f7d9bb 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -77,8 +77,13 @@ std::unique_ptr Clock::WatchFaceDigitalScreen() { } std::unique_ptr Clock::WatchFaceAnalogScreen() { - return std::make_unique( - app, dateTimeController, batteryController, bleController, notificatioManager, settingsController); + return std::make_unique(app, + dateTimeController, + batteryController, + bleController, + notificatioManager, + settingsController, + heartRateController); } std::unique_ptr Clock::PineTimeStyleScreen() { @@ -94,12 +99,22 @@ std::unique_ptr Clock::PineTimeStyleScreen() { /* // Examples for more watch faces std::unique_ptr Clock::WatchFaceMinimalScreen() { - return std::make_unique(app, dateTimeController, batteryController, bleController, notificatioManager, -settingsController); + return std::make_unique(app, + dateTimeController, + batteryController, + bleController, + notificatioManager, + settingsController, + heartRateController); } std::unique_ptr Clock::WatchFaceCustomScreen() { - return std::make_unique(app, dateTimeController, batteryController, bleController, notificatioManager, -settingsController); + return std::make_unique(app, + dateTimeController, + batteryController, + bleController, + notificatioManager, + settingsController, + heartRateController); } */ diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index 2925813968..0262e5bbd3 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -49,14 +49,16 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, Controllers::Battery const& batteryController, Controllers::Ble const& bleController, Controllers::NotificationManager const& notificationManager, - Controllers::Settings& settingsController) + Controllers::Settings& settingsController, + Controllers::HeartRateController const& heartRateController) : WatchFaceBase{Pinetime::Controllers::Settings::ClockFace::Analog, app, settingsController, dateTimeController, batteryController, bleController, - notificationManager} { + notificationManager, + heartRateController} { lv_obj_t* bg_clock_img = lv_img_create(lv_scr_act(), NULL); lv_img_set_src(bg_clock_img, &bg_clock); diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index fd2095c76e..ce36a7ea8d 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -12,6 +12,7 @@ namespace Pinetime { class Battery; class Ble; class NotificationManager; + class HeartRateController; class DateTimeController; } namespace Applications { @@ -26,7 +27,8 @@ namespace Pinetime { Controllers::Battery const& batteryController, Controllers::Ble const& bleController, Controllers::NotificationManager const& notificationManager, - Controllers::Settings& settingsController); + Controllers::Settings& settingsController, + Controllers::HeartRateController const& heartRateController); ~WatchFaceAnalog() override; diff --git a/src/displayapp/screens/WatchFaceBase.cpp b/src/displayapp/screens/WatchFaceBase.cpp index c22cc45209..27a437a5f3 100644 --- a/src/displayapp/screens/WatchFaceBase.cpp +++ b/src/displayapp/screens/WatchFaceBase.cpp @@ -3,6 +3,7 @@ #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" +#include "components/heartrate/HeartRateController.h" using namespace Pinetime::Applications::Screens; @@ -12,13 +13,15 @@ WatchFaceBase::WatchFaceBase(Controllers::Settings::ClockFace face, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, Controllers::Ble const& bleController, - Controllers::NotificationManager const& notificationManager) + Controllers::NotificationManager const& notificationManager, + Controllers::HeartRateController const& heartRateController) : Screen{app}, settingsController{settingsController}, dateTimeController{dateTimeController}, batteryController{batteryController}, bleController{bleController}, - notificationManager{notificationManager} { + notificationManager{notificationManager}, + heartRateController{heartRateController} { settingsController.SetClockFace(face); } @@ -62,3 +65,10 @@ void WatchFaceBase::UpdateNotifications() { .newNotificationsAvailable = notificationManager.AreNewNotificationsAvailable() }; } + +void WatchFaceBase::UpdateHeartRate() { + heartRate = HeartRateState{ + .running = heartRateController.State() == Controllers::HeartRateController::States::Running, + .rate = heartRateController.HeartRate() + }; +} diff --git a/src/displayapp/screens/WatchFaceBase.h b/src/displayapp/screens/WatchFaceBase.h index 9a2d2623fc..9d981fb31c 100644 --- a/src/displayapp/screens/WatchFaceBase.h +++ b/src/displayapp/screens/WatchFaceBase.h @@ -11,6 +11,7 @@ namespace Pinetime { class Battery; class Ble; class NotificationManager; + class HeartRateController; } namespace Applications { class DisplayApp; @@ -65,13 +66,23 @@ namespace Pinetime { } }; + struct HeartRateState { + bool running; + uint8_t rate; + + bool operator!=(HeartRateState const& rhs) { + return running != rhs.running || rate != rhs.rate; + } + }; + WatchFaceBase(Controllers::Settings::ClockFace face, DisplayApp* app, Controllers::Settings& settingsController, Controllers::DateTimeController const& dateTimeController, Controllers::Battery const& batteryController, Controllers::Ble const& bleController, - Controllers::NotificationManager const& notificationManager); + Controllers::NotificationManager const& notificationManager, + Controllers::HeartRateController const& heartRateController); virtual ~WatchFaceBase() = default; @@ -121,18 +132,29 @@ namespace Pinetime { return notifications; } + void UpdateHeartRate(); + DirtyValue const& GetHeartRate() const { + return heartRate; + } + DirtyValue const& GetUpdatedHeartRate() { + UpdateHeartRate(); + return heartRate; + } + private: DirtyValue date; DirtyValue time; DirtyValue battery; DirtyValue ble; DirtyValue notifications; + DirtyValue heartRate; Controllers::Settings& settingsController; Controllers::DateTimeController const& dateTimeController; Controllers::Battery const& batteryController; Controllers::Ble const& bleController; Controllers::NotificationManager const& notificationManager; + Controllers::HeartRateController const& heartRateController; }; } } diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index df5b0dc820..9b49ebf7d2 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -7,7 +7,6 @@ #include "BleIcon.h" #include "NotificationIcon.h" #include "Symbols.h" -#include "components/heartrate/HeartRateController.h" #include "components/motion/MotionController.h" #include "components/settings/Settings.h" @@ -20,7 +19,7 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, Controllers::Ble const& bleController, Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController, - Controllers::HeartRateController& heartRateController, + Controllers::HeartRateController const& heartRateController, Controllers::MotionController& motionController) : WatchFaceBase{Pinetime::Controllers::Settings::ClockFace::Digital, app, @@ -28,8 +27,8 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, dateTimeController, batteryController, bleController, - notificationManager}, - heartRateController {heartRateController}, + notificationManager, + heartRateController}, motionController {motionController} { batteryIcon = lv_label_create(lv_scr_act(), nullptr); @@ -185,12 +184,13 @@ bool WatchFaceDigital::Refresh() { lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); } - heartbeat = heartRateController.HeartRate(); - heartbeatRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped; - if (heartbeat.IsUpdated() || heartbeatRunning.IsUpdated()) { - if (heartbeatRunning.Get()) { + auto const& heartRate = GetUpdatedHeartRate(); + if (heartRate.IsUpdated()) { + auto const& hr = heartRate.Get(); + + if (hr.running) { lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B)); - lv_label_set_text_fmt(heartbeatValue, "%d", heartbeat.Get()); + lv_label_set_text_fmt(heartbeatValue, "%d", hr.rate); } else { lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x1B1B1B)); lv_label_set_text_static(heartbeatValue, ""); diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index e37e6a5117..840454496b 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -31,7 +31,7 @@ namespace Pinetime { Controllers::Ble const& bleController, Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController, - Controllers::HeartRateController& heartRateController, + Controllers::HeartRateController const& heartRateController, Controllers::MotionController& motionController); ~WatchFaceDigital() override; @@ -62,7 +62,6 @@ namespace Pinetime { lv_obj_t* stepValue; lv_obj_t* notificationIcon; - Controllers::HeartRateController& heartRateController; Controllers::MotionController& motionController; }; } From 9efe5a95ff421ff0c149e3fa6f6e8434ac54682a Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Tue, 22 Jun 2021 22:06:44 -0400 Subject: [PATCH 09/17] Move MotionController functionality to WatchFaceBase --- src/displayapp/screens/Clock.cpp | 9 +++++--- src/displayapp/screens/WatchFaceAnalog.cpp | 6 ++++-- src/displayapp/screens/WatchFaceAnalog.h | 4 +++- src/displayapp/screens/WatchFaceBase.cpp | 14 ++++++++++-- src/displayapp/screens/WatchFaceBase.h | 24 ++++++++++++++++++++- src/displayapp/screens/WatchFaceDigital.cpp | 14 ++++++------ src/displayapp/screens/WatchFaceDigital.h | 4 +--- 7 files changed, 55 insertions(+), 20 deletions(-) diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index e5f1f7d9bb..4ffc0bacfa 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -83,7 +83,8 @@ std::unique_ptr Clock::WatchFaceAnalogScreen() { bleController, notificatioManager, settingsController, - heartRateController); + heartRateController, + motionController); } std::unique_ptr Clock::PineTimeStyleScreen() { @@ -105,7 +106,8 @@ std::unique_ptr Clock::WatchFaceMinimalScreen() { bleController, notificatioManager, settingsController, - heartRateController); + heartRateController, + motionController); } std::unique_ptr Clock::WatchFaceCustomScreen() { @@ -115,6 +117,7 @@ std::unique_ptr Clock::WatchFaceCustomScreen() { bleController, notificatioManager, settingsController, - heartRateController); + heartRateController, + motionController); } */ diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index 0262e5bbd3..62a5d7646d 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -50,7 +50,8 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, Controllers::Ble const& bleController, Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController, - Controllers::HeartRateController const& heartRateController) + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController) : WatchFaceBase{Pinetime::Controllers::Settings::ClockFace::Analog, app, settingsController, @@ -58,7 +59,8 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, batteryController, bleController, notificationManager, - heartRateController} { + heartRateController, + motionController} { lv_obj_t* bg_clock_img = lv_img_create(lv_scr_act(), NULL); lv_img_set_src(bg_clock_img, &bg_clock); diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index ce36a7ea8d..f027ed0af9 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -13,6 +13,7 @@ namespace Pinetime { class Ble; class NotificationManager; class HeartRateController; + class MotionController; class DateTimeController; } namespace Applications { @@ -28,7 +29,8 @@ namespace Pinetime { Controllers::Ble const& bleController, Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController, - Controllers::HeartRateController const& heartRateController); + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController); ~WatchFaceAnalog() override; diff --git a/src/displayapp/screens/WatchFaceBase.cpp b/src/displayapp/screens/WatchFaceBase.cpp index 27a437a5f3..e3401e2a7c 100644 --- a/src/displayapp/screens/WatchFaceBase.cpp +++ b/src/displayapp/screens/WatchFaceBase.cpp @@ -4,6 +4,7 @@ #include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" #include "components/heartrate/HeartRateController.h" +#include "components/motion/MotionController.h" using namespace Pinetime::Applications::Screens; @@ -14,14 +15,16 @@ WatchFaceBase::WatchFaceBase(Controllers::Settings::ClockFace face, Controllers::Battery const& batteryController, Controllers::Ble const& bleController, Controllers::NotificationManager const& notificationManager, - Controllers::HeartRateController const& heartRateController) + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController) : Screen{app}, settingsController{settingsController}, dateTimeController{dateTimeController}, batteryController{batteryController}, bleController{bleController}, notificationManager{notificationManager}, - heartRateController{heartRateController} { + heartRateController{heartRateController}, + motionController{motionController} { settingsController.SetClockFace(face); } @@ -72,3 +75,10 @@ void WatchFaceBase::UpdateHeartRate() { .rate = heartRateController.HeartRate() }; } + +void WatchFaceBase::UpdateMotion() { + motion = MotionState{ + .stepCount = motionController.NbSteps(), + .sensorOk = motionController.IsSensorOk() + }; +} diff --git a/src/displayapp/screens/WatchFaceBase.h b/src/displayapp/screens/WatchFaceBase.h index 9d981fb31c..885f2f2149 100644 --- a/src/displayapp/screens/WatchFaceBase.h +++ b/src/displayapp/screens/WatchFaceBase.h @@ -12,6 +12,7 @@ namespace Pinetime { class Ble; class NotificationManager; class HeartRateController; + class MotionController; } namespace Applications { class DisplayApp; @@ -75,6 +76,15 @@ namespace Pinetime { } }; + struct MotionState { + uint32_t stepCount; + bool sensorOk; + + bool operator!=(MotionState const& rhs) { + return stepCount != rhs.stepCount || sensorOk != rhs.sensorOk; + } + }; + WatchFaceBase(Controllers::Settings::ClockFace face, DisplayApp* app, Controllers::Settings& settingsController, @@ -82,7 +92,8 @@ namespace Pinetime { Controllers::Battery const& batteryController, Controllers::Ble const& bleController, Controllers::NotificationManager const& notificationManager, - Controllers::HeartRateController const& heartRateController); + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController); virtual ~WatchFaceBase() = default; @@ -141,6 +152,15 @@ namespace Pinetime { return heartRate; } + void UpdateMotion(); + DirtyValue const& GetMotion() const { + return motion; + } + DirtyValue const& GetUpdatedMotion() { + UpdateMotion(); + return motion; + } + private: DirtyValue date; DirtyValue time; @@ -148,6 +168,7 @@ namespace Pinetime { DirtyValue ble; DirtyValue notifications; DirtyValue heartRate; + DirtyValue motion; Controllers::Settings& settingsController; Controllers::DateTimeController const& dateTimeController; @@ -155,6 +176,7 @@ namespace Pinetime { Controllers::Ble const& bleController; Controllers::NotificationManager const& notificationManager; Controllers::HeartRateController const& heartRateController; + Controllers::MotionController const& motionController; }; } } diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 9b49ebf7d2..818d391de3 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -7,7 +7,6 @@ #include "BleIcon.h" #include "NotificationIcon.h" #include "Symbols.h" -#include "components/motion/MotionController.h" #include "components/settings/Settings.h" using namespace Pinetime::Applications::Screens; @@ -20,7 +19,7 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController, Controllers::HeartRateController const& heartRateController, - Controllers::MotionController& motionController) + Controllers::MotionController const& motionController) : WatchFaceBase{Pinetime::Controllers::Settings::ClockFace::Digital, app, settingsController, @@ -28,8 +27,8 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, batteryController, bleController, notificationManager, - heartRateController}, - motionController {motionController} { + heartRateController, + motionController} { batteryIcon = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text(batteryIcon, Symbols::batteryFull); @@ -200,10 +199,9 @@ bool WatchFaceDigital::Refresh() { lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0); } - stepCount = motionController.NbSteps(); - motionSensorOk = motionController.IsSensorOk(); - if (stepCount.IsUpdated() || motionSensorOk.IsUpdated()) { - lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get()); + auto const& motion = GetUpdatedMotion(); + if (motion.IsUpdated()) { + lv_label_set_text_fmt(stepValue, "%lu", motion.Get().stepCount); lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -5, -2); lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0); } diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 840454496b..5085779aec 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -32,7 +32,7 @@ namespace Pinetime { Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController, Controllers::HeartRateController const& heartRateController, - Controllers::MotionController& motionController); + Controllers::MotionController const& motionController); ~WatchFaceDigital() override; bool Refresh() override; @@ -61,8 +61,6 @@ namespace Pinetime { lv_obj_t* stepIcon; lv_obj_t* stepValue; lv_obj_t* notificationIcon; - - Controllers::MotionController& motionController; }; } } From 48aad93dc1eac6350fa19c19b8c0679d2cab3aba Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Fri, 16 Jul 2021 12:39:01 -0400 Subject: [PATCH 10/17] Remove unused variables and headers --- src/displayapp/screens/WatchFaceAnalog.h | 2 -- src/displayapp/screens/WatchFaceDigital.h | 8 -------- 2 files changed, 10 deletions(-) diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index f027ed0af9..d2fd759166 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -1,9 +1,7 @@ #pragma once #include -#include #include -#include #include "WatchFaceBase.h" namespace Pinetime { diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 5085779aec..b4fe4a6139 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -1,9 +1,7 @@ #pragma once #include -#include #include -#include #include "WatchFaceBase.h" #include "components/datetime/DateTime.h" @@ -42,12 +40,6 @@ namespace Pinetime { private: char displayedTime[5] = {}; - DirtyValue> currentDateTime {}; - DirtyValue motionSensorOk {}; - DirtyValue stepCount {}; - DirtyValue heartbeat {}; - DirtyValue heartbeatRunning {}; - lv_obj_t* label_time; lv_obj_t* label_time_ampm; lv_obj_t* label_date; From 9ec12577819ee1188974da2f4c4c931990311b1a Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Fri, 16 Jul 2021 12:47:52 -0400 Subject: [PATCH 11/17] Fix post-rebase build errors --- src/displayapp/screens/PineTimeStyle.cpp | 11 ++++++----- src/displayapp/screens/PineTimeStyle.h | 14 +++++++------- src/displayapp/screens/WatchFaceAnalog.cpp | 2 +- .../screens/settings/SettingWatchFace.cpp | 2 +- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp index f63eae89b3..1bd02438e0 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/PineTimeStyle.cpp @@ -27,6 +27,7 @@ #include "BleIcon.h" #include "NotificationIcon.h" #include "Symbols.h" +#include "components/datetime/DateTimeController.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" @@ -37,7 +38,7 @@ using namespace Pinetime::Applications::Screens; PineTimeStyle::PineTimeStyle(DisplayApp* app, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, @@ -251,9 +252,9 @@ bool PineTimeStyle::Refresh() { auto yearMonthDay = date::year_month_day(dp); auto year = (int) yearMonthDay.year(); - auto month = static_cast((unsigned) yearMonthDay.month()); + auto month = static_cast((unsigned) yearMonthDay.month()); auto day = (unsigned) yearMonthDay.day(); - auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); + auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); int hour = time.hours().count(); auto minute = time.minutes().count(); @@ -309,9 +310,9 @@ bool PineTimeStyle::Refresh() { char dayStr[3]; char monthStr[4]; - sprintf(dayOfWeekStr, "%s", dateTimeController.DayOfWeekShortToString()); + sprintf(dayOfWeekStr, "%s", DayOfWeekShortToString(dayOfWeek)); sprintf(dayStr, "%d", day); - sprintf(monthStr, "%s", dateTimeController.MonthShortToString()); + sprintf(monthStr, "%s", MonthShortToString(month)); lv_label_set_text(dateDayOfWeek, dayOfWeekStr); lv_label_set_text(dateDay, dayStr); diff --git a/src/displayapp/screens/PineTimeStyle.h b/src/displayapp/screens/PineTimeStyle.h index 3b4ded1e14..259a0873a0 100644 --- a/src/displayapp/screens/PineTimeStyle.h +++ b/src/displayapp/screens/PineTimeStyle.h @@ -3,18 +3,18 @@ #include #include #include -#include #include "Screen.h" -#include "ScreenList.h" -#include "components/datetime/DateTimeController.h" +#include "components/datetime/DateTime.h" namespace Pinetime { namespace Controllers { + class DateTimeController; class Settings; class Battery; class Ble; class NotificationManager; class HeartRateController; + class MotionController; } namespace Applications { @@ -22,7 +22,7 @@ namespace Pinetime { class PineTimeStyle : public Screen { public: PineTimeStyle(DisplayApp* app, - Controllers::DateTime& dateTimeController, + Controllers::DateTimeController& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, @@ -38,8 +38,8 @@ namespace Pinetime { char displayedChar[5]; uint16_t currentYear = 1970; - Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; - Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + DateTime::Months currentMonth = DateTime::Months::Unknown; + DateTime::Days currentDayOfWeek = DateTime::Days::Unknown; uint8_t currentDay = 0; DirtyValue batteryPercentRemaining {}; @@ -74,7 +74,7 @@ namespace Pinetime { lv_obj_t* stepGauge; lv_color_t needle_colors[1]; - Controllers::DateTime& dateTimeController; + Controllers::DateTimeController& dateTimeController; Controllers::Battery& batteryController; Controllers::Ble& bleController; Controllers::NotificationManager& notificatioManager; diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index 62a5d7646d..622184e667 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -162,7 +162,7 @@ void WatchFaceAnalog::UpdateClock() { } if (second.IsUpdated()) { - auto const angle = second * 6; + auto const angle = second.Get() * 6; second_point[0] = coordinate_relocate(-20, angle); second_point[1] = coordinate_relocate(SECOND_LENGTH, angle); diff --git a/src/displayapp/screens/settings/SettingWatchFace.cpp b/src/displayapp/screens/settings/SettingWatchFace.cpp index fc9c7106f0..a790ca1e92 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.cpp +++ b/src/displayapp/screens/settings/SettingWatchFace.cpp @@ -63,7 +63,7 @@ SettingWatchFace::SettingWatchFace(Pinetime::Applications::DisplayApp* app, Pine lv_checkbox_set_text_static(cbOption[optionsTotal], " PineTimeStyle"); cbOption[optionsTotal]->user_data = this; lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetClockFace() == 2) { + if (settingsController.GetClockFace() == Pinetime::Controllers::Settings::ClockFace::PineTimeStyle) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } From 813eb661dfd7590b722321e79251d00a05558ca2 Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Fri, 16 Jul 2021 13:06:30 -0400 Subject: [PATCH 12/17] Refactor PineTimeStyle to use base watch face --- src/displayapp/screens/Clock.cpp | 13 +- src/displayapp/screens/PineTimeStyle.cpp | 184 ++++++++------------ src/displayapp/screens/PineTimeStyle.h | 37 +--- src/displayapp/screens/WatchFaceBase.cpp | 4 + src/displayapp/screens/WatchFaceBase.h | 1 + src/displayapp/screens/WatchFaceDigital.cpp | 10 +- 6 files changed, 100 insertions(+), 149 deletions(-) diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index 4ffc0bacfa..6b269ec9b2 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -89,12 +89,13 @@ std::unique_ptr Clock::WatchFaceAnalogScreen() { std::unique_ptr Clock::PineTimeStyleScreen() { return std::make_unique(app, - dateTimeController, - batteryController, - bleController, - notificatioManager, - settingsController, - motionController); + dateTimeController, + batteryController, + bleController, + notificatioManager, + settingsController, + heartRateController, + motionController); } /* diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp index 1bd02438e0..d8bf1c3002 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/PineTimeStyle.cpp @@ -27,40 +27,28 @@ #include "BleIcon.h" #include "NotificationIcon.h" #include "Symbols.h" -#include "components/datetime/DateTimeController.h" -#include "components/battery/BatteryController.h" -#include "components/ble/BleController.h" -#include "components/ble/NotificationManager.h" -#include "components/motion/MotionController.h" #include "components/settings/Settings.h" #include "../DisplayApp.h" using namespace Pinetime::Applications::Screens; PineTimeStyle::PineTimeStyle(DisplayApp* app, - Controllers::DateTimeController& dateTimeController, - Controllers::Battery& batteryController, - Controllers::Ble& bleController, - Controllers::NotificationManager& notificatioManager, + Controllers::DateTimeController const& dateTimeController, + Controllers::Battery const& batteryController, + Controllers::Ble const& bleController, + Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController, - Controllers::MotionController& motionController) - : Screen(app), - currentDateTime {{}}, - dateTimeController {dateTimeController}, - batteryController {batteryController}, - bleController {bleController}, - notificatioManager {notificatioManager}, - settingsController {settingsController}, - motionController {motionController} { - - /* This sets the watchface number to return to after leaving the menu */ - settingsController.SetClockFace(Pinetime::Controllers::Settings::ClockFace::PineTimeStyle); - - displayedChar[0] = 0; - displayedChar[1] = 0; - displayedChar[2] = 0; - displayedChar[3] = 0; - displayedChar[4] = 0; + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController) + : WatchFaceBase{Pinetime::Controllers::Settings::ClockFace::PineTimeStyle, + app, + settingsController, + dateTimeController, + batteryController, + bleController, + notificationManager, + heartRateController, + motionController} { /* Create a 200px wide background rectangle */ @@ -208,92 +196,68 @@ PineTimeStyle::~PineTimeStyle() { } bool PineTimeStyle::Refresh() { - batteryPercentRemaining = batteryController.PercentRemaining(); - if (batteryPercentRemaining.IsUpdated()) { - auto batteryPercent = batteryPercentRemaining.Get(); - if (batteryController.IsCharging()) { - auto isCharging = batteryController.IsCharging() || batteryController.IsPowerPresent(); - lv_label_set_text(batteryPlug, BatteryIcon::GetPlugIcon(isCharging)); + auto const& battery = GetUpdatedBattery(); + if (battery.IsUpdated()) { + auto const& b = battery.Get(); + if (b.charging) { + lv_label_set_text_static(batteryPlug, BatteryIcon::GetPlugIcon(b.powerPresent)); lv_obj_realign(batteryPlug); - lv_label_set_text(batteryIcon, ""); + lv_label_set_text_static(batteryIcon, ""); } else { - lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); - lv_label_set_text(batteryPlug, ""); + lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(b.percentRemaining)); + lv_label_set_text_static(batteryPlug, ""); } } - bleState = bleController.IsConnected(); - if (bleState.IsUpdated()) { - if (bleState.Get() == true) { - lv_label_set_text(bleIcon, BleIcon::GetIcon(true)); - lv_obj_realign(bleIcon); - } else { - lv_label_set_text(bleIcon, BleIcon::GetIcon(false)); - } + auto const& ble = GetUpdatedBle(); + if (ble.IsUpdated()) { + lv_label_set_text(bleIcon, BleIcon::GetIcon(ble.Get().connected)); + lv_obj_realign(bleIcon); } - notificationState = notificatioManager.AreNewNotificationsAvailable(); - if (notificationState.IsUpdated()) { - if (notificationState.Get() == true) { - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(true)); - lv_obj_realign(notificationIcon); - } else { - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); - } + auto const& notifications = GetUpdatedNotifications(); + if (notifications.IsUpdated()) { + auto const icon = NotificationIcon::GetIcon(notifications.Get().newNotificationsAvailable); + lv_label_set_text(notificationIcon, icon); } - currentDateTime = dateTimeController.CurrentDateTime(); - - if (currentDateTime.IsUpdated()) { - auto newDateTime = currentDateTime.Get(); - - auto dp = date::floor(newDateTime); - auto time = date::make_time(newDateTime - dp); - auto yearMonthDay = date::year_month_day(dp); - - auto year = (int) yearMonthDay.year(); - auto month = static_cast((unsigned) yearMonthDay.month()); - auto day = (unsigned) yearMonthDay.day(); - auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); - - int hour = time.hours().count(); - auto minute = time.minutes().count(); + auto const clockType = GetClockType(); + auto const& time = GetUpdatedTime(); + if (time.IsUpdated()) { + auto const& t = time.Get(); char minutesChar[3]; - sprintf(minutesChar, "%02d", static_cast(minute)); + sprintf(minutesChar, "%02u", t.minute); char hoursChar[3]; char ampmChar[5]; - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { - sprintf(hoursChar, "%02d", hour); - } else { - if (hour == 0 && hour != 12) { - hour = 12; + auto hour = t.hour; + if (clockType == Controllers::Settings::ClockType::H12) { + if (hour > 0 && hour < 12) { sprintf(ampmChar, "A\nM"); - } else if (hour == 12 && hour != 0) { - hour = 12; - sprintf(ampmChar, "P\nM"); - } else if (hour < 12 && hour != 0) { - sprintf(ampmChar, "A\nM"); - } else if (hour > 12 && hour != 0) { - hour = hour - 12; + } else { sprintf(ampmChar, "P\nM"); } - sprintf(hoursChar, "%02d", hour); + if (hour == 0) { + hour = 12; + } else if (hour > 12) { + hour -= 12; + } } + sprintf(hoursChar, "%02u", hour); - if (hoursChar[0] != displayedChar[0] || hoursChar[1] != displayedChar[1] || minutesChar[0] != displayedChar[2] || - minutesChar[1] != displayedChar[3]) { - displayedChar[0] = hoursChar[0]; - displayedChar[1] = hoursChar[1]; - displayedChar[2] = minutesChar[0]; - displayedChar[3] = minutesChar[1]; + if (hoursChar[0] != displayedTime[0] || hoursChar[1] != displayedTime[1] || minutesChar[0] != displayedTime[2] || + minutesChar[1] != displayedTime[3]) { + displayedTime[0] = hoursChar[0]; + displayedTime[1] = hoursChar[1]; + displayedTime[2] = minutesChar[0]; + displayedTime[3] = minutesChar[1]; char hourStr[3]; char minStr[3]; - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { + if (clockType == Controllers::Settings::ClockType::H12) { lv_label_set_text(timeAMPM, ampmChar); } @@ -304,34 +268,34 @@ bool PineTimeStyle::Refresh() { sprintf(minStr, "%c%c", minutesChar[0], minutesChar[1]); lv_label_set_text(timeDD2, minStr); } + } - if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { - char dayOfWeekStr[4]; - char dayStr[3]; - char monthStr[4]; + auto const& date = GetUpdatedDate(); + if (date.IsUpdated()) { + auto const& d = date.Get(); - sprintf(dayOfWeekStr, "%s", DayOfWeekShortToString(dayOfWeek)); - sprintf(dayStr, "%d", day); - sprintf(monthStr, "%s", MonthShortToString(month)); + char dayOfWeekStr[4]; + char dayStr[3]; + char monthStr[4]; - lv_label_set_text(dateDayOfWeek, dayOfWeekStr); - lv_label_set_text(dateDay, dayStr); - lv_obj_realign(dateDay); - lv_label_set_text(dateMonth, monthStr); + sprintf(dayOfWeekStr, "%s", DayOfWeekShortToString(d.dayOfWeek)); + sprintf(dayStr, "%d", d.day); + sprintf(monthStr, "%s", MonthShortToString(d.month)); - currentYear = year; - currentMonth = month; - currentDayOfWeek = dayOfWeek; - currentDay = day; - } + lv_label_set_text(dateDayOfWeek, dayOfWeekStr); + lv_label_set_text(dateDay, dayStr); + lv_obj_realign(dateDay); + lv_label_set_text(dateMonth, monthStr); } - stepCount = motionController.NbSteps(); - motionSensorOk = motionController.IsSensorOk(); - if (stepCount.IsUpdated() || motionSensorOk.IsUpdated()) { - lv_gauge_set_value(stepGauge, 0, (stepCount.Get() / (settingsController.GetStepsGoal() / 100))); + auto const& motion = GetUpdatedMotion(); + if (motion.IsUpdated()) { + auto const& m = motion.Get(); + auto const goal = GetStepsGoal(); + + lv_gauge_set_value(stepGauge, 0, (m.stepCount / (goal / 100))); lv_obj_realign(stepGauge); - if (stepCount.Get() > settingsController.GetStepsGoal()) { + if (m.stepCount > goal) { lv_obj_set_style_local_line_color(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); lv_obj_set_style_local_scale_grad_color(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); } diff --git a/src/displayapp/screens/PineTimeStyle.h b/src/displayapp/screens/PineTimeStyle.h index 259a0873a0..54cb4d4a61 100644 --- a/src/displayapp/screens/PineTimeStyle.h +++ b/src/displayapp/screens/PineTimeStyle.h @@ -1,9 +1,8 @@ #pragma once #include -#include #include -#include "Screen.h" +#include "WatchFaceBase.h" #include "components/datetime/DateTime.h" namespace Pinetime { @@ -19,15 +18,16 @@ namespace Pinetime { namespace Applications { namespace Screens { - class PineTimeStyle : public Screen { + class PineTimeStyle : public WatchFaceBase { public: PineTimeStyle(DisplayApp* app, - Controllers::DateTimeController& dateTimeController, - Controllers::Battery& batteryController, - Controllers::Ble& bleController, - Controllers::NotificationManager& notificatioManager, + Controllers::DateTimeController const& dateTimeController, + Controllers::Battery const& batteryController, + Controllers::Ble const& bleController, + Controllers::NotificationManager const& notificationManager, Controllers::Settings& settingsController, - Controllers::MotionController& motionController); + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController); ~PineTimeStyle() override; bool Refresh() override; @@ -35,19 +35,7 @@ namespace Pinetime { void OnObjectEvent(lv_obj_t* pObj, lv_event_t i); private: - char displayedChar[5]; - - uint16_t currentYear = 1970; - DateTime::Months currentMonth = DateTime::Months::Unknown; - DateTime::Days currentDayOfWeek = DateTime::Days::Unknown; - uint8_t currentDay = 0; - - DirtyValue batteryPercentRemaining {}; - DirtyValue bleState {}; - DirtyValue> currentDateTime {}; - DirtyValue motionSensorOk {}; - DirtyValue stepCount {}; - DirtyValue notificationState {}; + char displayedTime[5] = {}; lv_obj_t* timebar; lv_obj_t* sidebar; @@ -73,13 +61,6 @@ namespace Pinetime { lv_obj_t* notificationIcon; lv_obj_t* stepGauge; lv_color_t needle_colors[1]; - - Controllers::DateTimeController& dateTimeController; - Controllers::Battery& batteryController; - Controllers::Ble& bleController; - Controllers::NotificationManager& notificatioManager; - Controllers::Settings& settingsController; - Controllers::MotionController& motionController; }; } } diff --git a/src/displayapp/screens/WatchFaceBase.cpp b/src/displayapp/screens/WatchFaceBase.cpp index e3401e2a7c..35b32285b3 100644 --- a/src/displayapp/screens/WatchFaceBase.cpp +++ b/src/displayapp/screens/WatchFaceBase.cpp @@ -32,6 +32,10 @@ Pinetime::Controllers::Settings::ClockType WatchFaceBase::GetClockType() const { return settingsController.GetClockType(); } +uint32_t WatchFaceBase::GetStepsGoal() const { + return settingsController.GetStepsGoal(); +} + void WatchFaceBase::UpdateDate() { date = DateState{ .year = dateTimeController.Year(), diff --git a/src/displayapp/screens/WatchFaceBase.h b/src/displayapp/screens/WatchFaceBase.h index 885f2f2149..3f615f7873 100644 --- a/src/displayapp/screens/WatchFaceBase.h +++ b/src/displayapp/screens/WatchFaceBase.h @@ -98,6 +98,7 @@ namespace Pinetime { virtual ~WatchFaceBase() = default; Controllers::Settings::ClockType GetClockType() const; + uint32_t GetStepsGoal() const; void UpdateDate(); void UpdateTime(); diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 818d391de3..6745791b21 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -117,7 +117,7 @@ bool WatchFaceDigital::Refresh() { lv_label_set_text(notificationIcon, icon); } - auto const clock_type = GetClockType(); + auto const clockType = GetClockType(); auto const& time = GetUpdatedTime(); if (time.IsUpdated()) { auto const& t = time.Get(); @@ -128,7 +128,7 @@ bool WatchFaceDigital::Refresh() { char hoursChar[3]; char ampmChar[3]; auto hour = t.hour; - if (clock_type == Controllers::Settings::ClockType::H12) { + if (clockType == Controllers::Settings::ClockType::H12) { if (hour > 0 && hour < 12) { sprintf(ampmChar, "AM"); } else { @@ -151,7 +151,7 @@ bool WatchFaceDigital::Refresh() { char timeStr[6]; - if (clock_type == Controllers::Settings::ClockType::H12) { + if (clockType == Controllers::Settings::ClockType::H12) { lv_label_set_text(label_time_ampm, ampmChar); if (hoursChar[0] == '0') { hoursChar[0] = ' '; @@ -161,7 +161,7 @@ bool WatchFaceDigital::Refresh() { sprintf(timeStr, "%c%c:%c%c", hoursChar[0], hoursChar[1], minutesChar[0], minutesChar[1]); lv_label_set_text(label_time, timeStr); - if (clock_type == Controllers::Settings::ClockType::H12) { + if (clockType == Controllers::Settings::ClockType::H12) { lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0); } else { lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); @@ -174,7 +174,7 @@ bool WatchFaceDigital::Refresh() { auto const& d = date.Get(); char dateStr[22]; - if (clock_type == Controllers::Settings::ClockType::H24) { + if (clockType == Controllers::Settings::ClockType::H24) { sprintf(dateStr, "%s %d %s %d", DayOfWeekShortToString(d.dayOfWeek), d.day, MonthShortToString(d.month), d.year); } else { sprintf(dateStr, "%s %s %d %d", DayOfWeekShortToString(d.dayOfWeek), MonthShortToString(d.month), d.day, d.year); From adce5c1a535e0bd89c2904a6de591077dcbb2793 Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Fri, 16 Jul 2021 18:16:02 -0400 Subject: [PATCH 13/17] Fix error with midnight showing as PM instead oF AM --- src/displayapp/screens/PineTimeStyle.cpp | 3 ++- src/displayapp/screens/WatchFaceDigital.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp index d8bf1c3002..c9cd388716 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/PineTimeStyle.cpp @@ -234,11 +234,12 @@ bool PineTimeStyle::Refresh() { auto hour = t.hour; if (clockType == Controllers::Settings::ClockType::H12) { - if (hour > 0 && hour < 12) { + if (hour < 12) { sprintf(ampmChar, "A\nM"); } else { sprintf(ampmChar, "P\nM"); } + if (hour == 0) { hour = 12; } else if (hour > 12) { diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 6745791b21..4bade6fa45 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -129,11 +129,12 @@ bool WatchFaceDigital::Refresh() { char ampmChar[3]; auto hour = t.hour; if (clockType == Controllers::Settings::ClockType::H12) { - if (hour > 0 && hour < 12) { + if (hour < 12) { sprintf(ampmChar, "AM"); } else { sprintf(ampmChar, "PM"); } + if (hour == 0) { hour = 12; } else if (hour > 12) { From 75987deed602cfe750e640073ea17599a95a2013 Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Fri, 16 Jul 2021 18:42:10 -0400 Subject: [PATCH 14/17] Simplified date and time display logic Simplified the logic for determining whether to draw an updated time and exactly what to draw. Also replaced the sprintf and lv_label_set_text patterns with lv_label_set_text_fmt. --- src/displayapp/screens/PineTimeStyle.cpp | 66 ++++++--------------- src/displayapp/screens/PineTimeStyle.h | 3 +- src/displayapp/screens/WatchFaceDigital.cpp | 60 +++++-------------- src/displayapp/screens/WatchFaceDigital.h | 3 +- 4 files changed, 36 insertions(+), 96 deletions(-) diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp index c9cd388716..a2368ac6e2 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/PineTimeStyle.cpp @@ -22,6 +22,7 @@ #include "PineTimeStyle.h" #include #include +#include #include #include "BatteryIcon.h" #include "BleIcon.h" @@ -221,53 +222,28 @@ bool PineTimeStyle::Refresh() { lv_label_set_text(notificationIcon, icon); } - auto const clockType = GetClockType(); auto const& time = GetUpdatedTime(); if (time.IsUpdated()) { auto const& t = time.Get(); + hour = t.hour; + minute = t.minute; - char minutesChar[3]; - sprintf(minutesChar, "%02u", t.minute); + if (hour.IsUpdated() || minute.IsUpdated()) { + auto hourTemp = hour.Get(); - char hoursChar[3]; - char ampmChar[5]; + if (GetClockType() == Controllers::Settings::ClockType::H12) { + lv_label_set_text_static(timeAMPM, hourTemp < 12 ? "A\nM" : "P\nM"); - auto hour = t.hour; - if (clockType == Controllers::Settings::ClockType::H12) { - if (hour < 12) { - sprintf(ampmChar, "A\nM"); - } else { - sprintf(ampmChar, "P\nM"); - } - - if (hour == 0) { - hour = 12; - } else if (hour > 12) { - hour -= 12; - } - } - sprintf(hoursChar, "%02u", hour); - - if (hoursChar[0] != displayedTime[0] || hoursChar[1] != displayedTime[1] || minutesChar[0] != displayedTime[2] || - minutesChar[1] != displayedTime[3]) { - displayedTime[0] = hoursChar[0]; - displayedTime[1] = hoursChar[1]; - displayedTime[2] = minutesChar[0]; - displayedTime[3] = minutesChar[1]; - - char hourStr[3]; - char minStr[3]; - - if (clockType == Controllers::Settings::ClockType::H12) { - lv_label_set_text(timeAMPM, ampmChar); + if (hourTemp == 0) { + hourTemp = 12; + } else if (hourTemp > 12) { + hourTemp -= 12; + } } /* Display the time as 2 pairs of digits */ - sprintf(hourStr, "%c%c", hoursChar[0], hoursChar[1]); - lv_label_set_text(timeDD1, hourStr); - - sprintf(minStr, "%c%c", minutesChar[0], minutesChar[1]); - lv_label_set_text(timeDD2, minStr); + lv_label_set_text_fmt(timeDD1, "%02" PRIu8, hourTemp); + lv_label_set_text_fmt(timeDD2, "%02" PRIu8, minute.Get()); } } @@ -275,18 +251,10 @@ bool PineTimeStyle::Refresh() { if (date.IsUpdated()) { auto const& d = date.Get(); - char dayOfWeekStr[4]; - char dayStr[3]; - char monthStr[4]; - - sprintf(dayOfWeekStr, "%s", DayOfWeekShortToString(d.dayOfWeek)); - sprintf(dayStr, "%d", d.day); - sprintf(monthStr, "%s", MonthShortToString(d.month)); - - lv_label_set_text(dateDayOfWeek, dayOfWeekStr); - lv_label_set_text(dateDay, dayStr); + lv_label_set_text_fmt(dateDayOfWeek, "%s", DayOfWeekShortToString(d.dayOfWeek)); + lv_label_set_text_fmt(dateDay, "%d", d.day); lv_obj_realign(dateDay); - lv_label_set_text(dateMonth, monthStr); + lv_label_set_text_fmt(dateMonth, "%s", MonthShortToString(d.month)); } auto const& motion = GetUpdatedMotion(); diff --git a/src/displayapp/screens/PineTimeStyle.h b/src/displayapp/screens/PineTimeStyle.h index 54cb4d4a61..7a163ce2cf 100644 --- a/src/displayapp/screens/PineTimeStyle.h +++ b/src/displayapp/screens/PineTimeStyle.h @@ -35,7 +35,8 @@ namespace Pinetime { void OnObjectEvent(lv_obj_t* pObj, lv_event_t i); private: - char displayedTime[5] = {}; + DirtyValue hour{}; + DirtyValue minute{}; lv_obj_t* timebar; lv_obj_t* sidebar; diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 4bade6fa45..5956838784 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -121,50 +121,25 @@ bool WatchFaceDigital::Refresh() { auto const& time = GetUpdatedTime(); if (time.IsUpdated()) { auto const& t = time.Get(); + hour = t.hour; + minute = t.minute; - char minutesChar[3]; - sprintf(minutesChar, "%02u", t.minute); - - char hoursChar[3]; - char ampmChar[3]; - auto hour = t.hour; - if (clockType == Controllers::Settings::ClockType::H12) { - if (hour < 12) { - sprintf(ampmChar, "AM"); - } else { - sprintf(ampmChar, "PM"); - } - - if (hour == 0) { - hour = 12; - } else if (hour > 12) { - hour -= 12; - } - } - sprintf(hoursChar, "%02u", hour); - - if (hoursChar[0] != displayedTime[0] || hoursChar[1] != displayedTime[1] || minutesChar[0] != displayedTime[2] || - minutesChar[1] != displayedTime[3]) { - displayedTime[0] = hoursChar[0]; - displayedTime[1] = hoursChar[1]; - displayedTime[2] = minutesChar[0]; - displayedTime[3] = minutesChar[1]; - - char timeStr[6]; + if (hour.IsUpdated() || minute.IsUpdated()) { + auto hourTemp = hour.Get(); if (clockType == Controllers::Settings::ClockType::H12) { - lv_label_set_text(label_time_ampm, ampmChar); - if (hoursChar[0] == '0') { - hoursChar[0] = ' '; - } - } + lv_label_set_text(label_time_ampm, hourTemp < 12 ? "AM" : "PM"); - sprintf(timeStr, "%c%c:%c%c", hoursChar[0], hoursChar[1], minutesChar[0], minutesChar[1]); - lv_label_set_text(label_time, timeStr); + if (hourTemp == 0) { + hourTemp = 12; + } else if (hourTemp > 12) { + hourTemp -= 12; + } - if (clockType == Controllers::Settings::ClockType::H12) { + lv_label_set_text_fmt(label_time, "%2" PRIu8 ":%02" PRIu8, hourTemp, minute.Get()); lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0); - } else { + } else if (clockType == Controllers::Settings::ClockType::H24) { + lv_label_set_text_fmt(label_time, "%02" PRIu8 ":%02" PRIu8, hourTemp, minute.Get()); lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); } } @@ -173,14 +148,9 @@ bool WatchFaceDigital::Refresh() { auto const& date = GetUpdatedDate(); if (date.IsUpdated()) { auto const& d = date.Get(); - char dateStr[22]; - if (clockType == Controllers::Settings::ClockType::H24) { - sprintf(dateStr, "%s %d %s %d", DayOfWeekShortToString(d.dayOfWeek), d.day, MonthShortToString(d.month), d.year); - } else { - sprintf(dateStr, "%s %s %d %d", DayOfWeekShortToString(d.dayOfWeek), MonthShortToString(d.month), d.day, d.year); - } - lv_label_set_text(label_date, dateStr); + lv_label_set_text_fmt(label_date, "%s %" PRIu8 " %s %" PRIu16, DayOfWeekShortToString(d.dayOfWeek), + d.day, MonthShortToString(d.month), d.year); lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); } diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index b4fe4a6139..10c34f1163 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -38,7 +38,8 @@ namespace Pinetime { void OnObjectEvent(lv_obj_t* pObj, lv_event_t i); private: - char displayedTime[5] = {}; + DirtyValue hour{}; + DirtyValue minute{}; lv_obj_t* label_time; lv_obj_t* label_time_ampm; From daeef9950bb3b738ddb931439586b20d4a4104de Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Fri, 16 Jul 2021 18:44:30 -0400 Subject: [PATCH 15/17] Replace lv_label_set_text with set_text_static where possible --- src/displayapp/screens/PineTimeStyle.cpp | 20 +++++++-------- src/displayapp/screens/WatchFaceAnalog.cpp | 6 ++--- src/displayapp/screens/WatchFaceDigital.cpp | 28 ++++++++++----------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp index a2368ac6e2..ced275d7e1 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/PineTimeStyle.cpp @@ -64,19 +64,19 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app, timeDD1 = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &open_sans_light); lv_obj_set_style_local_text_color(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x008080)); - lv_label_set_text(timeDD1, "12"); + lv_label_set_text_static(timeDD1, "12"); lv_obj_align(timeDD1, timebar, LV_ALIGN_IN_TOP_MID, 5, 5); timeDD2 = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &open_sans_light); lv_obj_set_style_local_text_color(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x008080)); - lv_label_set_text(timeDD2, "34"); + lv_label_set_text_static(timeDD2, "34"); lv_obj_align(timeDD2, timebar, LV_ALIGN_IN_BOTTOM_MID, 5, -5); timeAMPM = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x008080)); lv_obj_set_style_local_text_line_space(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, -3); - lv_label_set_text(timeAMPM, ""); + lv_label_set_text_static(timeAMPM, ""); lv_obj_align(timeAMPM, timebar, LV_ALIGN_IN_BOTTOM_LEFT, 2, -20); /* Create a 40px wide bar down the right side of the screen */ @@ -91,7 +91,7 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app, batteryIcon = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000)); - lv_label_set_text(batteryIcon, Symbols::batteryFull); + lv_label_set_text_static(batteryIcon, Symbols::batteryFull); lv_obj_align(batteryIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 2); batteryPlug = lv_label_create(lv_scr_act(), nullptr); @@ -148,17 +148,17 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app, dateDayOfWeek = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(dateDayOfWeek, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000)); - lv_label_set_text(dateDayOfWeek, "THU"); + lv_label_set_text_static(dateDayOfWeek, "THU"); lv_obj_align(dateDayOfWeek, sidebar, LV_ALIGN_CENTER, 0, -34); dateDay = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(dateDay, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000)); - lv_label_set_text(dateDay, "25"); + lv_label_set_text_static(dateDay, "25"); lv_obj_align(dateDay, sidebar, LV_ALIGN_CENTER, 0, 3); dateMonth = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(dateMonth, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000)); - lv_label_set_text(dateMonth, "MAR"); + lv_label_set_text_static(dateMonth, "MAR"); lv_obj_align(dateMonth, sidebar, LV_ALIGN_CENTER, 0, 32); // Step count gauge @@ -189,7 +189,7 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app, lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); - lv_label_set_text(backgroundLabel, ""); + lv_label_set_text_static(backgroundLabel, ""); } PineTimeStyle::~PineTimeStyle() { @@ -212,14 +212,14 @@ bool PineTimeStyle::Refresh() { auto const& ble = GetUpdatedBle(); if (ble.IsUpdated()) { - lv_label_set_text(bleIcon, BleIcon::GetIcon(ble.Get().connected)); + lv_label_set_text_static(bleIcon, BleIcon::GetIcon(ble.Get().connected)); lv_obj_realign(bleIcon); } auto const& notifications = GetUpdatedNotifications(); if (notifications.IsUpdated()) { auto const icon = NotificationIcon::GetIcon(notifications.Get().newNotificationsAvailable); - lv_label_set_text(notificationIcon, icon); + lv_label_set_text_static(notificationIcon, icon); } auto const& time = GetUpdatedTime(); diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index 622184e667..13bd23c6a6 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -67,12 +67,12 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, lv_obj_align(bg_clock_img, NULL, LV_ALIGN_CENTER, 0, 0); batteryIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(batteryIcon, Symbols::batteryHalf); + lv_label_set_text_static(batteryIcon, Symbols::batteryHalf); lv_obj_align(batteryIcon, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, -8, -4); notificationIcon = lv_label_create(lv_scr_act(), NULL); lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FF00)); - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); + lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(false)); lv_obj_align(notificationIcon, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 8, -4); // Date - Day / Week day @@ -181,7 +181,7 @@ bool WatchFaceAnalog::Refresh() { auto const& notifications = GetUpdatedNotifications(); if (notifications.IsUpdated()) { auto const icon = NotificationIcon::GetIcon(notifications.Get().newNotificationsAvailable); - lv_label_set_text(notificationIcon, icon); + lv_label_set_text_static(notificationIcon, icon); } auto const& time = GetUpdatedTime(); diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 5956838784..8457aedc76 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -31,22 +31,22 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, motionController} { batteryIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(batteryIcon, Symbols::batteryFull); + lv_label_set_text_static(batteryIcon, Symbols::batteryFull); lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -5, 2); 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(batteryPlug, Symbols::plug); + lv_label_set_text_static(batteryPlug, Symbols::plug); lv_obj_align(batteryPlug, batteryIcon, 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(0x0000FF)); - lv_label_set_text(bleIcon, Symbols::bluetooth); + lv_label_set_text_static(bleIcon, Symbols::bluetooth); lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0); notificationIcon = lv_label_create(lv_scr_act(), NULL); lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FF00)); - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); + lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(false)); lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 10, 0); label_date = lv_label_create(lv_scr_act(), nullptr); @@ -67,26 +67,26 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); - lv_label_set_text(backgroundLabel, ""); + lv_label_set_text_static(backgroundLabel, ""); heartbeatIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(heartbeatIcon, Symbols::heartBeat); + lv_label_set_text_static(heartbeatIcon, Symbols::heartBeat); lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B)); lv_obj_align(heartbeatIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 5, -2); heartbeatValue = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(heartbeatValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B)); - lv_label_set_text(heartbeatValue, ""); + lv_label_set_text_static(heartbeatValue, ""); lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0); stepValue = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FFE7)); - lv_label_set_text(stepValue, "0"); + lv_label_set_text_static(stepValue, "0"); lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -5, -2); stepIcon = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(stepIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FFE7)); - lv_label_set_text(stepIcon, Symbols::shoe); + lv_label_set_text_static(stepIcon, Symbols::shoe); lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0); } @@ -98,14 +98,14 @@ bool WatchFaceDigital::Refresh() { auto const& battery = GetUpdatedBattery(); if (battery.IsUpdated()) { auto const& b = battery.Get(); - lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(b.percentRemaining)); + lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(b.percentRemaining)); auto const isCharging = b.charging || b.powerPresent; - lv_label_set_text(batteryPlug, BatteryIcon::GetPlugIcon(isCharging)); + lv_label_set_text_static(batteryPlug, BatteryIcon::GetPlugIcon(isCharging)); } auto const& ble = GetUpdatedBle(); if (ble.IsUpdated()) { - lv_label_set_text(bleIcon, BleIcon::GetIcon(ble.Get().connected)); + lv_label_set_text_static(bleIcon, BleIcon::GetIcon(ble.Get().connected)); } lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -5, 5); lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0); @@ -114,7 +114,7 @@ bool WatchFaceDigital::Refresh() { auto const& notifications = GetUpdatedNotifications(); if (notifications.IsUpdated()) { auto const icon = NotificationIcon::GetIcon(notifications.Get().newNotificationsAvailable); - lv_label_set_text(notificationIcon, icon); + lv_label_set_text_static(notificationIcon, icon); } auto const clockType = GetClockType(); @@ -128,7 +128,7 @@ bool WatchFaceDigital::Refresh() { auto hourTemp = hour.Get(); if (clockType == Controllers::Settings::ClockType::H12) { - lv_label_set_text(label_time_ampm, hourTemp < 12 ? "AM" : "PM"); + lv_label_set_text_static(label_time_ampm, hourTemp < 12 ? "AM" : "PM"); if (hourTemp == 0) { hourTemp = 12; From 732bacd11028c1202820d4c17c0cc85ff26019d6 Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Sat, 17 Jul 2021 11:26:07 -0400 Subject: [PATCH 16/17] Fix typo --- src/displayapp/DisplayApp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index 22d12e9459..a44a4e9f09 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -27,7 +27,7 @@ namespace Pinetime { class Settings; class Battery; class Ble; - class DControllerateTime; + class DateTimeController; class NotificationManager; class HeartRateController; class MotionController; From 88e4bc72ffb662a67dfeef67defdabe116cbe776 Mon Sep 17 00:00:00 2001 From: Jonathan Vander Mey Date: Sat, 21 Aug 2021 18:45:32 -0400 Subject: [PATCH 17/17] Fix things missed in merge conflict resolution --- src/displayapp/screens/Clock.cpp | 13 ------------- src/displayapp/screens/Screen.h | 1 + 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index 1a2e573fb8..e23ce9323d 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -97,16 +97,3 @@ std::unique_ptr Clock::PineTimeStyleScreen() { heartRateController, motionController); } - -/* -// Examples for more watch faces -std::unique_ptr Clock::WatchFaceMinimalScreen() { - return std::make_unique(app, - dateTimeController, - batteryController, - bleController, - notificatioManager, - settingsController, - heartRateController, - motionController); -} diff --git a/src/displayapp/screens/Screen.h b/src/displayapp/screens/Screen.h index 53bdbc8ce7..418ee72271 100644 --- a/src/displayapp/screens/Screen.h +++ b/src/displayapp/screens/Screen.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "../TouchEvents.h" namespace Pinetime {