diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f72f50c9a4..21e7ee219d 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 @@ -451,6 +452,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/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/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 d6aa83c844..05b6355992 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 = static_cast(yearMonthDay.year()); - month = static_cast(static_cast(yearMonthDay.month())); + month = static_cast(static_cast(yearMonthDay.month())); day = static_cast(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(); @@ -67,56 +67,13 @@ void DateTime::UpdateTime(uint32_t systickCounter) { // Notify new day to SystemTask if (hour == 0 and not isMidnightAlreadyNotified) { isMidnightAlreadyNotified = true; - if(systemTask != nullptr) + if (systemTask != nullptr) systemTask->PushMessage(System::Messages::OnNewDay); } else if (hour != 0) { isMidnightAlreadyNotified = false; } } -const char* DateTime::MonthShortToString() { - return DateTime::MonthsString[static_cast(month)]; -} - -const char* DateTime::MonthShortToStringLow() { - return DateTime::MonthsStringLow[static_cast(month)]; -} - -const char* DateTime::MonthsToStringLow() { - return DateTime::MonthsLow[static_cast(month)]; -} - -const char* DateTime::DayOfWeekToString() { - return DateTime::DaysString[static_cast(dayOfWeek)]; -} - -const char* DateTime::DayOfWeekShortToString() { - return DateTime::DaysStringShort[static_cast(dayOfWeek)]; -} - -const char* DateTime::DayOfWeekToStringLow() { - return DateTime::DaysStringLow[static_cast(dayOfWeek)]; -} - -const char* DateTime::DayOfWeekShortToStringLow() { - return DateTime::DaysStringShortLow[static_cast(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/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/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 5150162a93..bcb7844899 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..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 DateTime; + class DateTimeController; 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/BatteryIcon.cpp b/src/displayapp/screens/BatteryIcon.cpp index c67bcb2317..7f85f4d461 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 > 87) - return Symbols::batteryFull; - if (batteryPercent > 62) - return Symbols::batteryThreeQuarter; - if (batteryPercent > 37) - return Symbols::batteryHalf; - if (batteryPercent > 12) - return Symbols::batteryOneQuarter; - return Symbols::batteryEmpty; -} + const char* GetBatteryIcon(uint8_t batteryPercent) { + if (batteryPercent > 87) + return Symbols::batteryFull; + if (batteryPercent > 62) + return Symbols::batteryThreeQuarter; + if (batteryPercent > 37) + return Symbols::batteryHalf; + if (batteryPercent > 12) + 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/Clock.cpp b/src/displayapp/screens/Clock.cpp index 86afee0c42..e23ce9323d 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -2,6 +2,12 @@ #include #include +#include +#include "BatteryIcon.h" +#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" @@ -14,7 +20,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, @@ -31,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; } @@ -71,16 +77,23 @@ 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, + motionController); } std::unique_ptr Clock::PineTimeStyleScreen() { return std::make_unique(app, - dateTimeController, - batteryController, - bleController, - notificatioManager, - settingsController, - motionController); -} \ No newline at end of file + dateTimeController, + batteryController, + bleController, + notificatioManager, + settingsController, + heartRateController, + motionController); +} diff --git a/src/displayapp/screens/Clock.h b/src/displayapp/screens/Clock.h index 7968ccedb0..956861888b 100644 --- a/src/displayapp/screens/Clock.h +++ b/src/displayapp/screens/Clock.h @@ -22,7 +22,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, @@ -36,7 +36,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/Metronome.h b/src/displayapp/screens/Metronome.h index a4baa09699..ec45eadf80 100644 --- a/src/displayapp/screens/Metronome.h +++ b/src/displayapp/screens/Metronome.h @@ -27,7 +27,7 @@ namespace Pinetime { lv_obj_t *bpmArc, *bpmTap, *bpmValue; lv_obj_t *bpbDropdown, *currentBpbText; - lv_obj_t *playPause; + lv_obj_t* playPause; }; } } diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp index 98fd976cd4..ddabc5b246 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/PineTimeStyle.cpp @@ -22,43 +22,34 @@ #include "PineTimeStyle.h" #include #include +#include #include #include "BatteryIcon.h" #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/motion/MotionController.h" #include "components/settings/Settings.h" #include "../DisplayApp.h" using namespace Pinetime::Applications::Screens; PineTimeStyle::PineTimeStyle(DisplayApp* app, - Controllers::DateTime& 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(2); - - 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 */ timebar = lv_obj_create(lv_scr_act(), nullptr); @@ -71,19 +62,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 */ @@ -96,7 +87,7 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app, /* Display icons */ 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); @@ -151,17 +142,17 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app, /* Display date */ 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 @@ -192,7 +183,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() { @@ -200,109 +191,78 @@ 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()) { - lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get())); + auto const& ble = GetUpdatedBle(); + if (ble.IsUpdated()) { + lv_label_set_text_static(bleIcon, BleIcon::GetIcon(ble.Get().connected)); lv_obj_realign(bleIcon); } - notificationState = notificatioManager.AreNewNotificationsAvailable(); - if (notificationState.IsUpdated()) { - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(notificationState.Get())); - lv_obj_realign(notificationIcon); + auto const& notifications = GetUpdatedNotifications(); + if (notifications.IsUpdated()) { + auto const icon = NotificationIcon::GetIcon(notifications.Get().newNotificationsAvailable); + lv_label_set_text_static(notificationIcon, icon); } - currentDateTime = dateTimeController.CurrentDateTime(); - if (currentDateTime.IsUpdated()) { - auto newDateTime = currentDateTime.Get(); + auto const& time = GetUpdatedTime(); + if (time.IsUpdated()) { + auto const& t = time.Get(); + hour = t.hour; + minute = t.minute; - auto dp = date::floor(newDateTime); - auto time = date::make_time(newDateTime - dp); - auto yearMonthDay = date::year_month_day(dp); + if (hour.IsUpdated() || minute.IsUpdated()) { + auto hourTemp = hour.Get(); - auto year = static_cast(yearMonthDay.year()); - auto month = static_cast(static_cast(yearMonthDay.month())); - auto day = static_cast(yearMonthDay.day()); - auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); + if (GetClockType() == Controllers::Settings::ClockType::H12) { + lv_label_set_text_static(timeAMPM, hourTemp < 12 ? "A\nM" : "P\nM"); - int hour = time.hours().count(); - auto minute = time.minutes().count(); - - char minutesChar[3]; - sprintf(minutesChar, "%02d", static_cast(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; - 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; - sprintf(ampmChar, "P\nM"); + if (hourTemp == 0) { + hourTemp = 12; + } else if (hourTemp > 12) { + hourTemp -= 12; + } } - sprintf(hoursChar, "%02d", hour); - } - - if (hoursChar[0] != displayedChar[0] or hoursChar[1] != displayedChar[1] or minutesChar[0] != displayedChar[2] or - minutesChar[1] != displayedChar[3]) { - displayedChar[0] = hoursChar[0]; - displayedChar[1] = hoursChar[1]; - displayedChar[2] = minutesChar[0]; - displayedChar[3] = minutesChar[1]; - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { - lv_label_set_text(timeAMPM, ampmChar); - } - - lv_label_set_text_fmt(timeDD1, "%s", hoursChar); - lv_label_set_text_fmt(timeDD2, "%s", minutesChar); + /* Display the time as 2 pairs of digits */ + lv_label_set_text_fmt(timeDD1, "%02" PRIu8, hourTemp); + lv_label_set_text_fmt(timeDD2, "%02" PRIu8, minute.Get()); } + } - if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { - lv_label_set_text_fmt(dateDayOfWeek, "%s", dateTimeController.DayOfWeekShortToString()); - lv_label_set_text_fmt(dateDay, "%d", day); - lv_obj_realign(dateDay); - lv_label_set_text_fmt(dateMonth, "%s", dateTimeController.MonthShortToString()); + auto const& date = GetUpdatedDate(); + if (date.IsUpdated()) { + auto const& d = date.Get(); - currentYear = year; - currentMonth = month; - currentDayOfWeek = dayOfWeek; - currentDay = day; - } + 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_fmt(dateMonth, "%s", MonthShortToString(d.month)); } - 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); } } return running; -} \ No newline at end of file +} diff --git a/src/displayapp/screens/PineTimeStyle.h b/src/displayapp/screens/PineTimeStyle.h index f4cd28e49a..285f1110cd 100644 --- a/src/displayapp/screens/PineTimeStyle.h +++ b/src/displayapp/screens/PineTimeStyle.h @@ -1,51 +1,40 @@ #pragma once #include -#include #include -#include -#include "Screen.h" -#include "ScreenList.h" -#include "components/datetime/DateTimeController.h" +#include "WatchFaceBase.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 { namespace Screens { - class PineTimeStyle : public Screen { + class PineTimeStyle : public WatchFaceBase { public: PineTimeStyle(DisplayApp* app, - Controllers::DateTime& 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; private: - 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; - uint8_t currentDay = 0; - - DirtyValue batteryPercentRemaining {}; - DirtyValue bleState {}; - DirtyValue> currentDateTime {}; - DirtyValue motionSensorOk {}; - DirtyValue stepCount {}; - DirtyValue notificationState {}; + DirtyValue hour {}; + DirtyValue minute {}; lv_obj_t* timebar; lv_obj_t* sidebar; @@ -68,13 +57,6 @@ namespace Pinetime { lv_obj_t* notificationIcon; lv_obj_t* stepGauge; lv_color_t needle_colors[1]; - - Controllers::DateTime& dateTimeController; - Controllers::Battery& batteryController; - Controllers::Ble& bleController; - Controllers::NotificationManager& notificatioManager; - Controllers::Settings& settingsController; - Controllers::MotionController& motionController; }; } } diff --git a/src/displayapp/screens/Screen.h b/src/displayapp/screens/Screen.h index 6c9110c6b8..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 { @@ -13,28 +14,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/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 777b5bb7f8..f22fa25b61 100644 --- a/src/displayapp/screens/Tile.cpp +++ b/src/displayapp/screens/Tile.cpp @@ -11,7 +11,8 @@ namespace { } static void event_handler(lv_obj_t* obj, lv_event_t event) { - if (event != LV_EVENT_VALUE_CHANGED) return; + if (event != LV_EVENT_VALUE_CHANGED) + return; Tile* screen = static_cast(obj->user_data); auto* eventDataPtr = (uint32_t*) lv_event_get_data(); @@ -25,7 +26,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} { @@ -127,7 +128,8 @@ bool Tile::Refresh() { } void Tile::OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId) { - if(obj != btnm1) return; + if (obj != btnm1) + return; app->StartApp(apps[buttonId], DisplayApp::FullRefreshDirections::Up); running = false; diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h index 765a8def61..6550ec4f5c 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 1410fc2893..a82ee3660d 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -1,84 +1,82 @@ #include #include "WatchFaceAnalog.h" #include "BatteryIcon.h" -#include "BleIcon.h" #include "Symbols.h" #include "NotificationIcon.h" +#include "components/settings/Settings.h" LV_IMG_DECLARE(bg_clock); using namespace Pinetime::Applications::Screens; +using namespace Pinetime::DateTime; namespace { -constexpr int16_t HourLength = 70; -constexpr int16_t MinuteLength = 90; -constexpr int16_t SecondLength = 110; + constexpr int16_t HourLength = 70; + constexpr int16_t MinuteLength = 90; + constexpr int16_t SecondLength = 110; -// sin(90) = 1 so the value of _lv_trigo_sin(90) is the scaling factor -const auto LV_TRIG_SCALE = _lv_trigo_sin(90); + // sin(90) = 1 so the value of _lv_trigo_sin(90) is the scaling factor + const auto LV_TRIG_SCALE = _lv_trigo_sin(90); -int16_t Cosine(int16_t angle) { - return _lv_trigo_sin(angle + 90); -} + int16_t Cosine(int16_t angle) { + return _lv_trigo_sin(angle + 90); + } -int16_t Sine(int16_t angle) { - return _lv_trigo_sin(angle); -} + int16_t Sine(int16_t angle) { + return _lv_trigo_sin(angle); + } -int16_t CoordinateXRelocate(int16_t x) { - return (x + LV_HOR_RES / 2); -} + int16_t CoordinateXRelocate(int16_t x) { + return (x + LV_HOR_RES / 2); + } -int16_t CoordinateYRelocate(int16_t y) { - return std::abs(y - LV_HOR_RES / 2); -} + int16_t CoordinateYRelocate(int16_t y) { + return std::abs(y - LV_HOR_RES / 2); + } -lv_point_t CoordinateRelocate(int16_t radius, int16_t angle) { - return lv_point_t{ - .x = CoordinateXRelocate(radius * static_cast(Sine(angle)) / LV_TRIG_SCALE), - .y = CoordinateYRelocate(radius * static_cast(Cosine(angle)) / LV_TRIG_SCALE) - }; -} + lv_point_t CoordinateRelocate(int16_t radius, int16_t angle) { + return lv_point_t {.x = CoordinateXRelocate(radius * static_cast(Sine(angle)) / LV_TRIG_SCALE), + .y = CoordinateYRelocate(radius * static_cast(Cosine(angle)) / LV_TRIG_SCALE)}; + } } WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, - Controllers::DateTime& dateTimeController, - Controllers::Battery& batteryController, - Controllers::Ble& bleController, - Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController) - : Screen(app), - currentDateTime {{}}, - dateTimeController {dateTimeController}, - batteryController {batteryController}, - bleController {bleController}, - notificationManager {notificationManager}, - settingsController {settingsController} { - settingsController.SetClockFace(1); - - sHour = 99; - sMinute = 99; - sSecond = 99; + Controllers::DateTimeController const& dateTimeController, + Controllers::Battery const& batteryController, + Controllers::Ble const& bleController, + Controllers::NotificationManager const& notificationManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController) + : WatchFaceBase {Pinetime::Controllers::Settings::ClockFace::Analog, + app, + settingsController, + dateTimeController, + batteryController, + bleController, + notificationManager, + heartRateController, + motionController} { 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); 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_TOP_RIGHT, 0, 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, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); // 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", dateTimeController.DayOfWeekShortToString(), 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); @@ -132,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] = CoordinateRelocate(30, angle); minute_point[1] = CoordinateRelocate(MinuteLength, angle); @@ -148,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] = CoordinateRelocate(30, angle); hour_point[1] = CoordinateRelocate(HourLength, angle); @@ -163,45 +156,43 @@ void WatchFaceAnalog::UpdateClock() { lv_line_set_points(hour_body_trace, hour_point_trace, 2); } - if (sSecond != second) { - sSecond = second; - auto const angle = second * 6; + if (second.IsUpdated()) { + auto const angle = second.Get() * 6; second_point[0] = CoordinateRelocate(-20, angle); second_point[1] = CoordinateRelocate(SecondLength, angle); + lv_line_set_points(second_body, second_point, 2); } } 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(); - - if (notificationState.IsUpdated()) { - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(notificationState.Get())); + auto const& notifications = GetUpdatedNotifications(); + if (notifications.IsUpdated()) { + auto const icon = NotificationIcon::GetIcon(notifications.Get().newNotificationsAvailable); + lv_label_set_text_static(notificationIcon, icon); } - 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", dateTimeController.DayOfWeekShortToString(), 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 5d8c6a248b..90f19d9a9b 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -1,15 +1,8 @@ #pragma once #include -#include #include -#include -#include "Screen.h" -#include "ScreenList.h" -#include "components/datetime/DateTimeController.h" -#include "components/battery/BatteryController.h" -#include "components/ble/BleController.h" -#include "components/ble/NotificationManager.h" +#include "WatchFaceBase.h" namespace Pinetime { namespace Controllers { @@ -17,40 +10,34 @@ namespace Pinetime { class Battery; class Ble; class NotificationManager; + class HeartRateController; + class MotionController; + class DateTimeController; } namespace Applications { + class DisplayApp; + namespace Screens { - class WatchFaceAnalog : public Screen { + class WatchFaceAnalog : public WatchFaceBase { public: WatchFaceAnalog(DisplayApp* app, - Controllers::DateTime& dateTimeController, - Controllers::Battery& batteryController, - Controllers::Ble& bleController, - Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController); + Controllers::DateTimeController const& dateTimeController, + Controllers::Battery const& batteryController, + Controllers::Ble const& bleController, + Controllers::NotificationManager const& notificationManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController); ~WatchFaceAnalog() override; bool Refresh() override; private: - uint8_t sHour, sMinute, sSecond; - uint8_t hour; - uint8_t minute; - uint8_t second; - - Pinetime::Controllers::DateTime::Months month; - uint8_t day; - Pinetime::Controllers::DateTime::Days dayOfWeek; - - Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; - Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; - uint8_t currentDay = 0; - - DirtyValue batteryPercentRemaining {0}; - DirtyValue> currentDateTime; - DirtyValue notificationState {false}; + DirtyValue hour {99}; + DirtyValue minute {99}; + DirtyValue second {99}; lv_obj_t* hour_body; lv_obj_t* hour_body_trace; @@ -74,12 +61,6 @@ namespace Pinetime { lv_obj_t* batteryIcon; lv_obj_t* notificationIcon; - Controllers::DateTime& dateTimeController; - Controllers::Battery& batteryController; - Controllers::Ble& bleController; - Controllers::NotificationManager& notificationManager; - Controllers::Settings& settingsController; - void UpdateClock(); }; } diff --git a/src/displayapp/screens/WatchFaceBase.cpp b/src/displayapp/screens/WatchFaceBase.cpp new file mode 100644 index 0000000000..35b32285b3 --- /dev/null +++ b/src/displayapp/screens/WatchFaceBase.cpp @@ -0,0 +1,88 @@ +#include "WatchFaceBase.h" +#include "components/datetime/DateTimeController.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" + +using namespace Pinetime::Applications::Screens; + +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, + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController) + : Screen{app}, + settingsController{settingsController}, + dateTimeController{dateTimeController}, + batteryController{batteryController}, + bleController{bleController}, + notificationManager{notificationManager}, + heartRateController{heartRateController}, + motionController{motionController} { + settingsController.SetClockFace(face); +} + +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(), + .month = dateTimeController.Month(), + .day = dateTimeController.Day(), + .dayOfWeek = dateTimeController.DayOfWeek() + }; +} + +void WatchFaceBase::UpdateTime() { + time = TimeState{ + .hour = dateTimeController.Hours(), + .minute = dateTimeController.Minutes(), + .second = dateTimeController.Seconds() + }; +} + +void WatchFaceBase::UpdateBattery() { + battery = BatteryState{ + .percentRemaining = batteryController.PercentRemaining(), + .charging = batteryController.IsCharging(), + .powerPresent = batteryController.IsPowerPresent() + }; +} + +void WatchFaceBase::UpdateBle() { + ble = BleState{ + .connected = bleController.IsConnected() + }; +} + +void WatchFaceBase::UpdateNotifications() { + notifications = NotificationState{ + .newNotificationsAvailable = notificationManager.AreNewNotificationsAvailable() + }; +} + +void WatchFaceBase::UpdateHeartRate() { + heartRate = HeartRateState{ + .running = heartRateController.State() == Controllers::HeartRateController::States::Running, + .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 new file mode 100644 index 0000000000..3f615f7873 --- /dev/null +++ b/src/displayapp/screens/WatchFaceBase.h @@ -0,0 +1,185 @@ +#pragma once + +#include "Screen.h" +#include "components/settings/Settings.h" +#include "components/datetime/DateTime.h" +#include + +namespace Pinetime { + namespace Controllers { + class DateTimeController; + class Battery; + class Ble; + class NotificationManager; + class HeartRateController; + class MotionController; + } + namespace Applications { + class DisplayApp; + + namespace Screens { + class WatchFaceBase : public Screen { + public: + 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; + } + }; + + struct BatteryState { + uint8_t percentRemaining; + bool charging; + bool powerPresent; + + bool operator!=(BatteryState const& rhs) { + return percentRemaining != rhs.percentRemaining || charging != rhs.charging || powerPresent != rhs.powerPresent; + } + }; + + struct BleState { + bool connected; + + bool operator!=(BleState const& rhs) { + return connected != rhs.connected; + } + }; + + struct NotificationState { + bool newNotificationsAvailable; + + bool operator!=(NotificationState const& rhs) { + return newNotificationsAvailable != rhs.newNotificationsAvailable; + } + }; + + struct HeartRateState { + bool running; + uint8_t rate; + + bool operator!=(HeartRateState const& rhs) { + return running != rhs.running || rate != rhs.rate; + } + }; + + 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, + Controllers::DateTimeController const& dateTimeController, + Controllers::Battery const& batteryController, + Controllers::Ble const& bleController, + Controllers::NotificationManager const& notificationManager, + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController); + + virtual ~WatchFaceBase() = default; + + Controllers::Settings::ClockType GetClockType() const; + uint32_t GetStepsGoal() const; + + 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; + } + + void UpdateBattery(); + DirtyValue const& GetBattery() const { + return battery; + } + DirtyValue const& GetUpdatedBattery() { + UpdateBattery(); + return battery; + } + + void UpdateBle(); + DirtyValue const& GetBle() const { + return ble; + } + DirtyValue const& GetUpdatedBle() { + UpdateBle(); + return ble; + } + + void UpdateNotifications(); + DirtyValue const& GetNotifications() const { + return notifications; + } + DirtyValue const& GetUpdatedNotifications() { + UpdateNotifications(); + return notifications; + } + + void UpdateHeartRate(); + DirtyValue const& GetHeartRate() const { + return heartRate; + } + DirtyValue const& GetUpdatedHeartRate() { + UpdateHeartRate(); + return heartRate; + } + + void UpdateMotion(); + DirtyValue const& GetMotion() const { + return motion; + } + DirtyValue const& GetUpdatedMotion() { + UpdateMotion(); + return motion; + } + + private: + DirtyValue date; + DirtyValue time; + DirtyValue battery; + DirtyValue ble; + DirtyValue notifications; + DirtyValue heartRate; + DirtyValue motion; + + Controllers::Settings& settingsController; + Controllers::DateTimeController const& dateTimeController; + Controllers::Battery const& batteryController; + 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 2b902b3b6f..077f539540 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -7,49 +7,46 @@ #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" + using namespace Pinetime::Applications::Screens; +using namespace Pinetime::DateTime; WatchFaceDigital::WatchFaceDigital(DisplayApp* app, - Controllers::DateTime& 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::HeartRateController& heartRateController, - Controllers::MotionController& motionController) - : Screen(app), - currentDateTime {{}}, - dateTimeController {dateTimeController}, - batteryController {batteryController}, - bleController {bleController}, - notificatioManager {notificatioManager}, - settingsController {settingsController}, - heartRateController {heartRateController}, - motionController {motionController} { - settingsController.SetClockFace(0); + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController) + : WatchFaceBase {Pinetime::Controllers::Settings::ClockFace::Digital, + app, + settingsController, + dateTimeController, + batteryController, + bleController, + notificationManager, + heartRateController, + 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, 0, 0); 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(), nullptr); 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, 0, 0); label_date = lv_label_create(lv_scr_act(), nullptr); @@ -70,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, 0, 0); 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, 0, 0); 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,111 +95,72 @@ 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() or batteryController.IsPowerPresent(); - lv_label_set_text(batteryPlug, BatteryIcon::GetPlugIcon(isCharging)); + auto const& battery = GetUpdatedBattery(); + if (battery.IsUpdated()) { + auto const& b = battery.Get(); + lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(b.percentRemaining)); + auto const isCharging = b.charging || b.powerPresent; + lv_label_set_text_static(batteryPlug, BatteryIcon::GetPlugIcon(isCharging)); } - bleState = bleController.IsConnected(); - if (bleState.IsUpdated()) { - lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get())); + auto const& ble = GetUpdatedBle(); + if (ble.IsUpdated()) { + lv_label_set_text_static(bleIcon, BleIcon::GetIcon(ble.Get().connected)); } lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0); 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()) { - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(notificationState.Get())); + auto const& notifications = GetUpdatedNotifications(); + if (notifications.IsUpdated()) { + auto const icon = NotificationIcon::GetIcon(notifications.Get().newNotificationsAvailable); + lv_label_set_text_static(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 = static_cast(yearMonthDay.year()); - auto month = static_cast(static_cast(yearMonthDay.month())); - auto day = static_cast(yearMonthDay.day()); - auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); + auto const clockType = GetClockType(); + auto const& time = GetUpdatedTime(); + if (time.IsUpdated()) { + auto const& t = time.Get(); + hour = t.hour; + minute = t.minute; - int hour = time.hours().count(); - auto minute = time.minutes().count(); + if (hour.IsUpdated() || minute.IsUpdated()) { + auto hourTemp = hour.Get(); - char minutesChar[3]; - sprintf(minutesChar, "%02d", static_cast(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; - 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; - sprintf(ampmChar, "PM"); - } - sprintf(hoursChar, "%02d", hour); - } + if (clockType == Controllers::Settings::ClockType::H12) { + lv_label_set_text_static(label_time_ampm, hourTemp < 12 ? "AM" : "PM"); - if ((hoursChar[0] != displayedChar[0]) or (hoursChar[1] != displayedChar[1]) or (minutesChar[0] != displayedChar[2]) or - (minutesChar[1] != displayedChar[3])) { - displayedChar[0] = hoursChar[0]; - displayedChar[1] = hoursChar[1]; - displayedChar[2] = minutesChar[0]; - displayedChar[3] = minutesChar[1]; - - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { - lv_label_set_text(label_time_ampm, ampmChar); - if (hoursChar[0] == '0') { - hoursChar[0] = ' '; + if (hourTemp == 0) { + hourTemp = 12; + } else if (hourTemp > 12) { + hourTemp -= 12; } - } - lv_label_set_text_fmt(label_time, "%s:%s", hoursChar, minutesChar); - - if (settingsController.GetClockType() == 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); } } + } - if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { - lv_label_set_text_fmt(label_date, "%s %d %s %d", dateTimeController.DayOfWeekShortToString(), day, dateTimeController.MonthShortToString(), year); - } else { - lv_label_set_text_fmt(label_date, "%s %s %d %d", dateTimeController.DayOfWeekShortToString(), dateTimeController.MonthShortToString(), day, year); - } - 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(); - currentYear = year; - currentMonth = month; - currentDayOfWeek = dayOfWeek; - currentDay = day; - } + 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); } - 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, ""); @@ -212,10 +170,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, 0, 0); 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 6a6e1ac6c8..5cbdfb1023 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -1,12 +1,9 @@ #pragma once #include -#include #include -#include -#include "Screen.h" -#include "ScreenList.h" -#include "components/datetime/DateTimeController.h" +#include "WatchFaceBase.h" +#include "components/datetime/DateTime.h" namespace Pinetime { namespace Controllers { @@ -16,41 +13,31 @@ namespace Pinetime { class NotificationManager; class HeartRateController; class MotionController; + class DateTimeController; } namespace Applications { + class DisplayApp; + namespace Screens { - class WatchFaceDigital : public Screen { + class WatchFaceDigital : public WatchFaceBase { public: WatchFaceDigital(DisplayApp* app, - Controllers::DateTime& 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::HeartRateController& heartRateController, - Controllers::MotionController& motionController); + Controllers::HeartRateController const& heartRateController, + Controllers::MotionController const& motionController); ~WatchFaceDigital() override; bool Refresh() override; private: - 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; - uint8_t currentDay = 0; - - DirtyValue batteryPercentRemaining {}; - DirtyValue bleState {}; - DirtyValue> currentDateTime {}; - DirtyValue motionSensorOk {}; - DirtyValue stepCount {}; - DirtyValue heartbeat {}; - DirtyValue heartbeatRunning {}; - DirtyValue notificationState {}; + DirtyValue hour {}; + DirtyValue minute {}; lv_obj_t* label_time; lv_obj_t* label_time_ampm; @@ -64,14 +51,6 @@ namespace Pinetime { lv_obj_t* stepIcon; lv_obj_t* stepValue; lv_obj_t* notificationIcon; - - Controllers::DateTime& dateTimeController; - Controllers::Battery& batteryController; - Controllers::Ble& bleController; - Controllers::NotificationManager& notificatioManager; - Controllers::Settings& settingsController; - Controllers::HeartRateController& heartRateController; - Controllers::MotionController& motionController; }; } } diff --git a/src/displayapp/screens/settings/QuickSettings.cpp b/src/displayapp/screens/settings/QuickSettings.cpp index 54e2f3e22e..a970576992 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) @@ -46,7 +46,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, static constexpr uint8_t barHeight = 20 + innerDistance; static constexpr uint8_t buttonHeight = (LV_VER_RES_MAX - barHeight - innerDistance) / 2; static constexpr uint8_t buttonWidth = (LV_HOR_RES_MAX - innerDistance) / 2; // wide buttons - //static constexpr uint8_t buttonWidth = buttonHeight; // square buttons + // static constexpr uint8_t buttonWidth = buttonHeight; // square buttons static constexpr uint8_t buttonXOffset = (LV_HOR_RES_MAX - buttonWidth * 2 - innerDistance) / 2; lv_style_init(&btn_style); @@ -69,7 +69,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, lv_obj_set_event_cb(btn2, ButtonEventHandler); lv_obj_add_style(btn2, LV_BTN_PART_MAIN, &btn_style); lv_obj_set_size(btn2, buttonWidth, buttonHeight); - lv_obj_align(btn2, nullptr, LV_ALIGN_IN_TOP_RIGHT, - buttonXOffset, barHeight); + lv_obj_align(btn2, nullptr, LV_ALIGN_IN_TOP_RIGHT, -buttonXOffset, barHeight); lv_obj_t* lbl_btn; lbl_btn = lv_label_create(btn2, nullptr); @@ -100,7 +100,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, lv_obj_set_event_cb(btn4, ButtonEventHandler); lv_obj_add_style(btn4, LV_BTN_PART_MAIN, &btn_style); lv_obj_set_size(btn4, buttonWidth, buttonHeight); - lv_obj_align(btn4, nullptr, LV_ALIGN_IN_BOTTOM_RIGHT, - buttonXOffset, 0); + lv_obj_align(btn4, nullptr, LV_ALIGN_IN_BOTTOM_RIGHT, -buttonXOffset, 0); lbl_btn = lv_label_create(btn4, nullptr); lv_obj_set_style_local_text_font(lbl_btn, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48); diff --git a/src/displayapp/screens/settings/QuickSettings.h b/src/displayapp/screens/settings/QuickSettings.h index 2eefe1a728..05ab1ad2ea 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/displayapp/screens/settings/SettingWatchFace.cpp b/src/displayapp/screens/settings/SettingWatchFace.cpp index 02b9081608..a790ca1e92 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); } @@ -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); } @@ -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); } diff --git a/src/main.cpp b/src/main.cpp index d301be6711..f01ba5ace7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -113,7 +113,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; @@ -124,7 +124,6 @@ Pinetime::Controllers::FS fs {spiNorFlash}; Pinetime::Controllers::Settings settingsController {fs}; Pinetime::Controllers::MotorController motorController {settingsController}; - Pinetime::Applications::DisplayApp displayApp(lcd, lvgl, touchPanel, @@ -302,12 +301,8 @@ int main(void) { nrf_drv_clock_init(); // Unblock i2c? - nrf_gpio_cfg(pinTwiScl, - NRF_GPIO_PIN_DIR_OUTPUT, - NRF_GPIO_PIN_INPUT_DISCONNECT, - NRF_GPIO_PIN_NOPULL, - NRF_GPIO_PIN_S0D1, - NRF_GPIO_PIN_NOSENSE); + nrf_gpio_cfg( + pinTwiScl, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_DISCONNECT, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_S0D1, NRF_GPIO_PIN_NOSENSE); nrf_gpio_pin_set(pinTwiScl); for (uint8_t i = 0; i < 16; i++) { nrf_gpio_pin_toggle(pinTwiScl); diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 3553f449fd..74881c3fee 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, @@ -79,18 +79,17 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi, dateTimeController {dateTimeController}, timerController {timerController}, watchdog {watchdog}, - notificationManager{notificationManager}, + notificationManager {notificationManager}, motorController {motorController}, heartRateSensor {heartRateSensor}, motionSensor {motionSensor}, settingsController {settingsController}, - heartRateController{heartRateController}, - motionController{motionController}, - displayApp{displayApp}, + heartRateController {heartRateController}, + motionController {motionController}, + displayApp {displayApp}, heartRateApp(heartRateApp), - fs{fs}, + fs {fs}, nimbleController(*this, bleController, dateTimeController, notificationManager, batteryController, spiNorFlash, heartRateController) { - } void SystemTask::Start() { @@ -116,7 +115,7 @@ void SystemTask::Work() { spi.Init(); spiNorFlash.Init(); spiNorFlash.Wakeup(); - + fs.Init(); nimbleController.Init(); @@ -326,7 +325,7 @@ void SystemTask::Work() { break; case Messages::OnChargingEvent: motorController.RunForDuration(15); - // Battery level is updated on every message - there's no need to do anything + // Battery level is updated on every message - there's no need to do anything break; default: @@ -424,14 +423,13 @@ void SystemTask::PushMessage(System::Messages msg) { isGoingToSleep = true; } - if(in_isr()) { + if (in_isr()) { BaseType_t xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; xQueueSendFromISR(systemTasksMsgQueue, &msg, &xHigherPriorityTaskWoken); if (xHigherPriorityTaskWoken) { /* Actual macro used here is port specific. */ portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } } else { xQueueSend(systemTasksMsgQueue, &msg, portMAX_DELAY); 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};