From d8c86882daf5454e3d0297ab395f81dafecd40ac Mon Sep 17 00:00:00 2001 From: Will Bradley Date: Thu, 5 Dec 2024 17:19:34 -0800 Subject: [PATCH] Fix merge issues, adjust font size and initial screen --- src/components/settings/Settings.h | 2 +- src/displayapp/apps/Apps.h.in | 16 +- src/displayapp/apps/CMakeLists.txt | 1 - src/displayapp/fonts/CMakeLists.txt | 2 +- src/displayapp/fonts/fonts.json | 2 +- src/displayapp/screens/WatchFaceAnalog.cpp | 8 +- src/displayapp/screens/WatchFaceAnalog.h | 3 +- .../screens/WatchFaceCasioStyleG7710.cpp | 334 ------------ .../screens/WatchFaceCasioStyleG7710.h | 126 ----- src/displayapp/screens/WatchFaceDigital.cpp | 193 ------- src/displayapp/screens/WatchFaceDigital.h | 99 ---- src/displayapp/screens/WatchFaceInfineat.cpp | 509 ------------------ src/displayapp/screens/WatchFaceInfineat.h | 123 ----- src/displayapp/screens/WatchFaceSundial.cpp | 259 --------- src/displayapp/screens/WatchFaceSundial.h | 111 ---- src/displayapp/screens/WatchFaceTerminal.cpp | 151 ------ src/displayapp/screens/WatchFaceTerminal.h | 92 ---- .../screens/settings/SettingTimeFormat.cpp | 2 +- src/libs/lv_conf.h | 1 + 19 files changed, 18 insertions(+), 2016 deletions(-) delete mode 100644 src/displayapp/screens/WatchFaceCasioStyleG7710.cpp delete mode 100644 src/displayapp/screens/WatchFaceCasioStyleG7710.h delete mode 100644 src/displayapp/screens/WatchFaceDigital.cpp delete mode 100644 src/displayapp/screens/WatchFaceDigital.h delete mode 100644 src/displayapp/screens/WatchFaceInfineat.cpp delete mode 100644 src/displayapp/screens/WatchFaceInfineat.h delete mode 100644 src/displayapp/screens/WatchFaceSundial.cpp delete mode 100644 src/displayapp/screens/WatchFaceSundial.h delete mode 100644 src/displayapp/screens/WatchFaceTerminal.cpp delete mode 100644 src/displayapp/screens/WatchFaceTerminal.h diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 50cad268..b42b0f46 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -314,7 +314,7 @@ namespace Pinetime { uint32_t stepsGoal = 10000; uint32_t screenTimeOut = 15000; - ClockType clockType = ClockType::H24; + ClockType clockType = ClockType::FUZZY; WeatherFormat weatherFormat = WeatherFormat::Metric; Notification notificationStatus = Notification::On; diff --git a/src/displayapp/apps/Apps.h.in b/src/displayapp/apps/Apps.h.in index 5e073efe..1491e58b 100644 --- a/src/displayapp/apps/Apps.h.in +++ b/src/displayapp/apps/Apps.h.in @@ -49,11 +49,12 @@ namespace Pinetime { enum class WatchFace : uint8_t { Analog, PineTimeStyle, - #Terminal, - #Fuzzy, - #Sundial, - #Infineat, - #CasioStyleG7710, + Digital, + Terminal, + Fuzzy, + //Sundial, + //Infineat, + //CasioStyleG7710, }; template @@ -74,12 +75,9 @@ namespace Pinetime { static constexpr size_t Count = sizeof...(Ws); }; -<<<<<<< HEAD using UserWatchFaceTypes = WatchFaceTypeList; -======= - using UserWatchFaceTypes = WatchFaceTypeList<@WATCHFACE_TYPES@>; ->>>>>>> main + //using UserWatchFaceTypes = WatchFaceTypeList<@WATCHFACE_TYPES@>; static_assert(UserWatchFaceTypes::Count >= 1); } diff --git a/src/displayapp/apps/CMakeLists.txt b/src/displayapp/apps/CMakeLists.txt index 4187d87e..1aa869b1 100644 --- a/src/displayapp/apps/CMakeLists.txt +++ b/src/displayapp/apps/CMakeLists.txt @@ -17,7 +17,6 @@ if(DEFINED ENABLE_WATCHFACES) else() set(DEFAULT_WATCHFACE_TYPES "WatchFace::Digital") set(DEFAULT_WATCHFACE_TYPES "${DEFAULT_WATCHFACE_TYPES}, WatchFace::Fuzzy") - set(DEFAULT_WATCHFACE_TYPES "${DEFAULT_WATCHFACE_TYPES}, WatchFace::Sundial") set(WATCHFACE_TYPES "${DEFAULT_WATCHFACE_TYPES}" CACHE STRING "List of watch faces to build into the firmware") endif() diff --git a/src/displayapp/fonts/CMakeLists.txt b/src/displayapp/fonts/CMakeLists.txt index 4b37f9b8..a85e5f35 100644 --- a/src/displayapp/fonts/CMakeLists.txt +++ b/src/displayapp/fonts/CMakeLists.txt @@ -1,4 +1,4 @@ -set(FONTS jetbrains_mono_42 noto_serif_cjk_20 noto_serif_cjk_15 jetbrains_mono_76 jetbrains_mono_bold_20 +set(FONTS jetbrains_mono_42 noto_serif_cjk_20 noto_serif_cjk_15 jetbrains_mono_76 jetbrains_mono_bold_20 jetbrains_mono_bold_24 jetbrains_mono_extrabold_compressed lv_font_sys_48 open_sans_light fontawesome_weathericons) find_program(LV_FONT_CONV "lv_font_conv" NO_CACHE REQUIRED diff --git a/src/displayapp/fonts/fonts.json b/src/displayapp/fonts/fonts.json index f8397a83..2f417897 100644 --- a/src/displayapp/fonts/fonts.json +++ b/src/displayapp/fonts/fonts.json @@ -11,7 +11,7 @@ } ], "bpp": 1, - "size": 20 + "size": 18 }, "jetbrains_mono_bold_24": { "sources": [ diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index dbca8c5e..cda0401a 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -101,7 +101,7 @@ WatchFaceAnalog::WatchFaceAnalog(Controllers::DateTime& dateTimeController, location = settingsController.GetLocation(); // begin Japanese watch face - if (settingsController.GetClockType() == Controllers::Settings::ClockType::Fuzzy) { + if (settingsController.GetClockType() == Controllers::Settings::ClockType::FUZZY) { lv_obj_t * nighttime = lv_obj_create(lv_scr_act(), nullptr); lv_obj_set_size(nighttime, LV_HOR_RES, LV_HOR_RES/2); lv_obj_set_pos(nighttime, 0, 0); @@ -317,7 +317,7 @@ void WatchFaceAnalog::drawWatchFaceWadokei(){ } void WatchFaceAnalog::UpdateClock() { - if (settingsController.GetClockType() == Controllers::Settings::ClockType::Fuzzy) { + if (settingsController.GetClockType() == Controllers::Settings::ClockType::FUZZY) { drawWatchFaceWadokei(); return; } @@ -407,9 +407,9 @@ void WatchFaceAnalog::Refresh() { if (currentDateTime.IsUpdated()) { UpdateClock(); - currentDate = std::chrono::time_point_cast(currentDateTime.Get()); + currentDate = std::chrono::time_point_cast(currentDateTime.Get()); if (currentDate.IsUpdated()) { - if (settingsController.GetClockType() == Controllers::Settings::ClockType::Fuzzy) { + if (settingsController.GetClockType() == Controllers::Settings::ClockType::FUZZY) { /*char const* MonthsString[] = {"--", "IANUARIUS","FEBRUARIUS","MARTIUS","APRILIS","MARTIUSIUNIUS","QUINTILIS","SEXTILIS","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; char const* DaysString[] = {"--", "LUNAE", "MARTIS", "MERCURII", "IOVIS", "VENERIS", "SATURNI", "SOLIS"}; char const* RomanNumeralsString[] = {"--", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"}; diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index 7c7b2e14..143eb4aa 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -44,7 +44,8 @@ namespace Pinetime { Utility::DirtyValue bleState {}; Utility::DirtyValue> currentDateTime; Utility::DirtyValue notificationState {false}; - Utility::DirtyValue> currentDate; + using days = std::chrono::duration>; // TODO: days is standard in c++20 + Utility::DirtyValue> currentDate; lv_obj_t* minor_scales; lv_obj_t* major_scales; diff --git a/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp b/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp deleted file mode 100644 index c695f852..00000000 --- a/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp +++ /dev/null @@ -1,334 +0,0 @@ -#include "displayapp/screens/WatchFaceCasioStyleG7710.h" - -#include -#include -#include "displayapp/screens/BatteryIcon.h" -#include "displayapp/screens/BleIcon.h" -#include "displayapp/screens/NotificationIcon.h" -#include "displayapp/screens/Symbols.h" -#include "components/battery/BatteryController.h" -#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; - -WatchFaceCasioStyleG7710::WatchFaceCasioStyleG7710(Controllers::DateTime& dateTimeController, - const Controllers::Battery& batteryController, - const Controllers::Ble& bleController, - Controllers::NotificationManager& notificatioManager, - Controllers::Settings& settingsController, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController, - Controllers::FS& filesystem) - : currentDateTime {{}}, - batteryIcon(false), - dateTimeController {dateTimeController}, - batteryController {batteryController}, - bleController {bleController}, - notificatioManager {notificatioManager}, - settingsController {settingsController}, - heartRateController {heartRateController}, - motionController {motionController} { - - lfs_file f = {}; - if (filesystem.FileOpen(&f, "/fonts/lv_font_dots_40.bin", LFS_O_RDONLY) >= 0) { - filesystem.FileClose(&f); - font_dot40 = lv_font_load("F:/fonts/lv_font_dots_40.bin"); - } - - if (filesystem.FileOpen(&f, "/fonts/7segments_40.bin", LFS_O_RDONLY) >= 0) { - filesystem.FileClose(&f); - font_segment40 = lv_font_load("F:/fonts/7segments_40.bin"); - } - - if (filesystem.FileOpen(&f, "/fonts/7segments_115.bin", LFS_O_RDONLY) >= 0) { - filesystem.FileClose(&f); - font_segment115 = lv_font_load("F:/fonts/7segments_115.bin"); - } - - label_battery_value = lv_label_create(lv_scr_act(), nullptr); - lv_obj_align(label_battery_value, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0); - lv_obj_set_style_local_text_color(label_battery_value, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - lv_label_set_text_static(label_battery_value, "00%"); - - batteryIcon.Create(lv_scr_act()); - batteryIcon.SetColor(color_text); - lv_obj_align(batteryIcon.GetObject(), label_battery_value, LV_ALIGN_OUT_LEFT_MID, -5, 0); - - batteryPlug = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(batteryPlug, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - lv_label_set_text_static(batteryPlug, Symbols::plug); - lv_obj_align(batteryPlug, batteryIcon.GetObject(), LV_ALIGN_OUT_LEFT_MID, -5, 0); - - bleIcon = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(bleIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - 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, color_text); - lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(false)); - lv_obj_align(notificationIcon, bleIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0); - - label_day_of_week = lv_label_create(lv_scr_act(), nullptr); - lv_obj_align(label_day_of_week, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 10, 64); - lv_obj_set_style_local_text_color(label_day_of_week, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - lv_obj_set_style_local_text_font(label_day_of_week, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_dot40); - lv_label_set_text_static(label_day_of_week, "SUN"); - - label_week_number = lv_label_create(lv_scr_act(), nullptr); - lv_obj_align(label_week_number, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 5, 22); - lv_obj_set_style_local_text_color(label_week_number, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - lv_obj_set_style_local_text_font(label_week_number, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_dot40); - lv_label_set_text_static(label_week_number, "WK26"); - - label_day_of_year = lv_label_create(lv_scr_act(), nullptr); - lv_obj_align(label_day_of_year, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 100, 30); - lv_obj_set_style_local_text_color(label_day_of_year, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - lv_obj_set_style_local_text_font(label_day_of_year, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_segment40); - lv_label_set_text_static(label_day_of_year, "181-184"); - - lv_style_init(&style_line); - lv_style_set_line_width(&style_line, LV_STATE_DEFAULT, 2); - lv_style_set_line_color(&style_line, LV_STATE_DEFAULT, color_text); - lv_style_set_line_rounded(&style_line, LV_STATE_DEFAULT, true); - - lv_style_init(&style_border); - lv_style_set_line_width(&style_border, LV_STATE_DEFAULT, 6); - lv_style_set_line_color(&style_border, LV_STATE_DEFAULT, color_text); - lv_style_set_line_rounded(&style_border, LV_STATE_DEFAULT, true); - - line_icons = lv_line_create(lv_scr_act(), nullptr); - lv_line_set_points(line_icons, line_icons_points, 3); - lv_obj_add_style(line_icons, LV_LINE_PART_MAIN, &style_line); - lv_obj_align(line_icons, nullptr, LV_ALIGN_IN_TOP_RIGHT, -10, 18); - - line_day_of_week_number = lv_line_create(lv_scr_act(), nullptr); - lv_line_set_points(line_day_of_week_number, line_day_of_week_number_points, 4); - lv_obj_add_style(line_day_of_week_number, LV_LINE_PART_MAIN, &style_border); - lv_obj_align(line_day_of_week_number, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 8); - - line_day_of_year = lv_line_create(lv_scr_act(), nullptr); - lv_line_set_points(line_day_of_year, line_day_of_year_points, 3); - lv_obj_add_style(line_day_of_year, LV_LINE_PART_MAIN, &style_line); - lv_obj_align(line_day_of_year, nullptr, LV_ALIGN_IN_TOP_RIGHT, 0, 60); - - label_date = lv_label_create(lv_scr_act(), nullptr); - lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 100, 70); - lv_obj_set_style_local_text_color(label_date, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - lv_obj_set_style_local_text_font(label_date, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_segment40); - lv_label_set_text_static(label_date, "6-30"); - - line_date = lv_line_create(lv_scr_act(), nullptr); - lv_line_set_points(line_date, line_date_points, 3); - lv_obj_add_style(line_date, LV_LINE_PART_MAIN, &style_line); - lv_obj_align(line_date, nullptr, LV_ALIGN_IN_TOP_RIGHT, 0, 100); - - label_time = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_segment115); - lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 40); - - line_time = lv_line_create(lv_scr_act(), nullptr); - lv_line_set_points(line_time, line_time_points, 3); - lv_obj_add_style(line_time, LV_LINE_PART_MAIN, &style_line); - lv_obj_align(line_time, nullptr, LV_ALIGN_IN_BOTTOM_RIGHT, 0, -25); - - label_time_ampm = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(label_time_ampm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - lv_label_set_text_static(label_time_ampm, ""); - lv_obj_align(label_time_ampm, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 5, -5); - - backgroundLabel = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_click(backgroundLabel, true); - 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_static(backgroundLabel, ""); - - heartbeatIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(heartbeatIcon, Symbols::heartBeat); - lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - 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, color_text); - 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, color_text); - 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, color_text); - lv_label_set_text_static(stepIcon, Symbols::shoe); - lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0); - - taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); - Refresh(); -} - -WatchFaceCasioStyleG7710::~WatchFaceCasioStyleG7710() { - lv_task_del(taskRefresh); - - lv_style_reset(&style_line); - lv_style_reset(&style_border); - - if (font_dot40 != nullptr) { - lv_font_free(font_dot40); - } - - if (font_segment40 != nullptr) { - lv_font_free(font_segment40); - } - - if (font_segment115 != nullptr) { - lv_font_free(font_segment115); - } - - lv_obj_clean(lv_scr_act()); -} - -void WatchFaceCasioStyleG7710::Refresh() { - powerPresent = batteryController.IsPowerPresent(); - if (powerPresent.IsUpdated()) { - lv_label_set_text_static(batteryPlug, BatteryIcon::GetPlugIcon(powerPresent.Get())); - } - - batteryPercentRemaining = batteryController.PercentRemaining(); - if (batteryPercentRemaining.IsUpdated()) { - auto batteryPercent = batteryPercentRemaining.Get(); - batteryIcon.SetBatteryPercentage(batteryPercent); - lv_label_set_text_fmt(label_battery_value, "%d%%", batteryPercent); - } - - bleState = bleController.IsConnected(); - bleRadioEnabled = bleController.IsRadioEnabled(); - if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { - lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); - } - lv_obj_realign(label_battery_value); - lv_obj_realign(batteryIcon.GetObject()); - lv_obj_realign(batteryPlug); - lv_obj_realign(bleIcon); - lv_obj_realign(notificationIcon); - - notificationState = notificatioManager.AreNewNotificationsAvailable(); - if (notificationState.IsUpdated()) { - lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(notificationState.Get())); - } - - currentDateTime = std::chrono::time_point_cast(dateTimeController.CurrentDateTime()); - if (currentDateTime.IsUpdated()) { - uint8_t hour = dateTimeController.Hours(); - uint8_t minute = dateTimeController.Minutes(); - - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { - char ampmChar[2] = "A"; - if (hour == 0) { - hour = 12; - } else if (hour == 12) { - ampmChar[0] = 'P'; - } else if (hour > 12) { - hour = hour - 12; - ampmChar[0] = 'P'; - } - lv_label_set_text(label_time_ampm, ampmChar); - lv_label_set_text_fmt(label_time, "%2d:%02d", hour, minute); - } else { - lv_label_set_text_fmt(label_time, "%02d:%02d", hour, minute); - } - lv_obj_realign(label_time); - - currentDate = std::chrono::time_point_cast(currentDateTime.Get()); - if (currentDate.IsUpdated()) { - const char* weekNumberFormat = "%V"; - - uint16_t year = dateTimeController.Year(); - Controllers::DateTime::Months month = dateTimeController.Month(); - uint8_t day = dateTimeController.Day(); - int dayOfYear = dateTimeController.DayOfYear(); - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { - // 24h mode: ddmmyyyy, first DOW=Monday; - lv_label_set_text_fmt(label_date, "%3d-%2d", day, month); - weekNumberFormat = "%V"; // Replaced by the week number of the year (Monday as the first day of the week) as a decimal number - // [01,53]. If the week containing 1 January has four or more days in the new year, then it is considered - // week 1. Otherwise, it is the last week of the previous year, and the next week is week 1. Both January - // 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday] - } else { - // 12h mode: mmddyyyy, first DOW=Sunday; - lv_label_set_text_fmt(label_date, "%3d-%2d", month, day); - weekNumberFormat = "%U"; // Replaced by the week number of the year as a decimal number [00,53]. The first Sunday of January is the - // first day of week 1; days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] - } - - time_t ttTime = - std::chrono::system_clock::to_time_t(std::chrono::time_point_cast(currentDateTime.Get())); - tm* tmTime = std::localtime(&ttTime); - - // TODO: When we start using C++20, use std::chrono::year::is_leap - int daysInCurrentYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? 366 : 365; - uint16_t daysTillEndOfYearNumber = daysInCurrentYear - dayOfYear; - - char buffer[8]; - strftime(buffer, 8, weekNumberFormat, tmTime); - uint8_t weekNumber = atoi(buffer); - - lv_label_set_text_fmt(label_day_of_week, "%s", dateTimeController.DayOfWeekShortToString()); - lv_label_set_text_fmt(label_day_of_year, "%3d-%3d", dayOfYear, daysTillEndOfYearNumber); - lv_label_set_text_fmt(label_week_number, "WK%02d", weekNumber); - - lv_obj_realign(label_day_of_week); - lv_obj_realign(label_day_of_year); - lv_obj_realign(label_week_number); - lv_obj_realign(label_date); - } - } - - heartbeat = heartRateController.HeartRate(); - heartbeatRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped; - if (heartbeat.IsUpdated() || heartbeatRunning.IsUpdated()) { - if (heartbeatRunning.Get()) { - lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); - lv_label_set_text_fmt(heartbeatValue, "%d", heartbeat.Get()); - } 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, ""); - } - - lv_obj_realign(heartbeatIcon); - lv_obj_realign(heartbeatValue); - } - - stepCount = motionController.NbSteps(); - if (stepCount.IsUpdated()) { - lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get()); - lv_obj_realign(stepValue); - lv_obj_realign(stepIcon); - } -} - -bool WatchFaceCasioStyleG7710::IsAvailable(Pinetime::Controllers::FS& filesystem) { - lfs_file file = {}; - - if (filesystem.FileOpen(&file, "/fonts/lv_font_dots_40.bin", LFS_O_RDONLY) < 0) { - return false; - } - - filesystem.FileClose(&file); - if (filesystem.FileOpen(&file, "/fonts/7segments_40.bin", LFS_O_RDONLY) < 0) { - return false; - } - - filesystem.FileClose(&file); - if (filesystem.FileOpen(&file, "/fonts/7segments_115.bin", LFS_O_RDONLY) < 0) { - return false; - } - - filesystem.FileClose(&file); - return true; -} diff --git a/src/displayapp/screens/WatchFaceCasioStyleG7710.h b/src/displayapp/screens/WatchFaceCasioStyleG7710.h deleted file mode 100644 index 0f46a692..00000000 --- a/src/displayapp/screens/WatchFaceCasioStyleG7710.h +++ /dev/null @@ -1,126 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include "displayapp/screens/Screen.h" -#include "components/datetime/DateTimeController.h" -#include "components/ble/BleController.h" -#include "utility/DirtyValue.h" -#include "displayapp/apps/Apps.h" - -namespace Pinetime { - namespace Controllers { - class Settings; - class Battery; - class Ble; - class NotificationManager; - class HeartRateController; - class MotionController; - } - - namespace Applications { - namespace Screens { - - class WatchFaceCasioStyleG7710 : public Screen { - public: - WatchFaceCasioStyleG7710(Controllers::DateTime& dateTimeController, - const Controllers::Battery& batteryController, - const Controllers::Ble& bleController, - Controllers::NotificationManager& notificatioManager, - Controllers::Settings& settingsController, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController, - Controllers::FS& filesystem); - ~WatchFaceCasioStyleG7710() override; - - void Refresh() override; - - static bool IsAvailable(Pinetime::Controllers::FS& filesystem); - - private: - Utility::DirtyValue batteryPercentRemaining {}; - Utility::DirtyValue powerPresent {}; - Utility::DirtyValue bleState {}; - Utility::DirtyValue bleRadioEnabled {}; - Utility::DirtyValue> currentDateTime {}; - Utility::DirtyValue stepCount {}; - Utility::DirtyValue heartbeat {}; - Utility::DirtyValue heartbeatRunning {}; - Utility::DirtyValue notificationState {}; - Utility::DirtyValue> currentDate; - - lv_point_t line_icons_points[3] {{0, 5}, {117, 5}, {122, 0}}; - lv_point_t line_day_of_week_number_points[4] {{0, 0}, {100, 0}, {95, 95}, {0, 95}}; - lv_point_t line_day_of_year_points[3] {{0, 5}, {130, 5}, {135, 0}}; - lv_point_t line_date_points[3] {{0, 5}, {135, 5}, {140, 0}}; - lv_point_t line_time_points[3] {{0, 0}, {230, 0}, {235, 5}}; - - lv_color_t color_text = lv_color_hex(0x98B69A); - - lv_style_t style_line; - lv_style_t style_border; - - lv_obj_t* label_time; - lv_obj_t* line_time; - lv_obj_t* label_time_ampm; - lv_obj_t* label_date; - lv_obj_t* line_date; - lv_obj_t* label_day_of_week; - lv_obj_t* label_week_number; - lv_obj_t* line_day_of_week_number; - lv_obj_t* label_day_of_year; - lv_obj_t* line_day_of_year; - lv_obj_t* backgroundLabel; - lv_obj_t* bleIcon; - lv_obj_t* batteryPlug; - lv_obj_t* label_battery_value; - lv_obj_t* heartbeatIcon; - lv_obj_t* heartbeatValue; - lv_obj_t* stepIcon; - lv_obj_t* stepValue; - lv_obj_t* notificationIcon; - lv_obj_t* line_icons; - - BatteryIcon batteryIcon; - - Controllers::DateTime& dateTimeController; - const Controllers::Battery& batteryController; - const Controllers::Ble& bleController; - Controllers::NotificationManager& notificatioManager; - Controllers::Settings& settingsController; - Controllers::HeartRateController& heartRateController; - Controllers::MotionController& motionController; - - lv_task_t* taskRefresh; - lv_font_t* font_dot40 = nullptr; - lv_font_t* font_segment40 = nullptr; - lv_font_t* font_segment115 = nullptr; - }; - } - - template <> - struct WatchFaceTraits { - static constexpr WatchFace watchFace = WatchFace::CasioStyleG7710; - static constexpr const char* name = "Casio G7710"; - - static Screens::Screen* Create(AppControllers& controllers) { - return new Screens::WatchFaceCasioStyleG7710(controllers.dateTimeController, - controllers.batteryController, - controllers.bleController, - controllers.notificationManager, - controllers.settingsController, - controllers.heartRateController, - controllers.motionController, - controllers.filesystem); - }; - - static bool IsAvailable(Pinetime::Controllers::FS& filesystem) { - return Screens::WatchFaceCasioStyleG7710::IsAvailable(filesystem); - } - }; - } -} diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp deleted file mode 100644 index 2e00ee98..00000000 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ /dev/null @@ -1,193 +0,0 @@ -#include "displayapp/screens/WatchFaceDigital.h" - -#include -#include -#include "displayapp/screens/NotificationIcon.h" -#include "displayapp/screens/Symbols.h" -#include "displayapp/screens/WeatherSymbols.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/ble/SimpleWeatherService.h" -#include "components/settings/Settings.h" - -using namespace Pinetime::Applications::Screens; - -WatchFaceDigital::WatchFaceDigital(Controllers::DateTime& dateTimeController, - const Controllers::Battery& batteryController, - const Controllers::Ble& bleController, - Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController, - Controllers::SimpleWeatherService& weatherService) - : currentDateTime {{}}, - dateTimeController {dateTimeController}, - notificationManager {notificationManager}, - settingsController {settingsController}, - heartRateController {heartRateController}, - motionController {motionController}, - weatherService {weatherService}, - statusIcons(batteryController, bleController) { - - statusIcons.Create(); - - notificationIcon = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_LIME); - lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(false)); - lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0); - - weatherIcon = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(weatherIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); - lv_obj_set_style_local_text_font(weatherIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &fontawesome_weathericons); - lv_label_set_text(weatherIcon, ""); - lv_obj_align(weatherIcon, nullptr, LV_ALIGN_IN_TOP_MID, -20, 50); - lv_obj_set_auto_realign(weatherIcon, true); - - temperature = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(temperature, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); - lv_label_set_text(temperature, ""); - lv_obj_align(temperature, nullptr, LV_ALIGN_IN_TOP_MID, 20, 50); - - label_date = lv_label_create(lv_scr_act(), nullptr); - lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); - lv_obj_set_style_local_text_color(label_date, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); - - label_time = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed); - - lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0); - - label_time_ampm = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(label_time_ampm, ""); - lv_obj_align(label_time_ampm, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, -30, -55); - - heartbeatIcon = lv_label_create(lv_scr_act(), nullptr); - 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_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_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_static(stepIcon, Symbols::shoe); - lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0); - - taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); - Refresh(); -} - -WatchFaceDigital::~WatchFaceDigital() { - lv_task_del(taskRefresh); - lv_obj_clean(lv_scr_act()); -} - -void WatchFaceDigital::Refresh() { - statusIcons.Update(); - - notificationState = notificationManager.AreNewNotificationsAvailable(); - if (notificationState.IsUpdated()) { - lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(notificationState.Get())); - } - - currentDateTime = std::chrono::time_point_cast(dateTimeController.CurrentDateTime()); - - if (currentDateTime.IsUpdated()) { - uint8_t hour = dateTimeController.Hours(); - uint8_t minute = dateTimeController.Minutes(); - - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { - char ampmChar[3] = "AM"; - if (hour == 0) { - hour = 12; - } else if (hour == 12) { - ampmChar[0] = 'P'; - } else if (hour > 12) { - hour = hour - 12; - ampmChar[0] = 'P'; - } - lv_label_set_text(label_time_ampm, ampmChar); - lv_label_set_text_fmt(label_time, "%2d:%02d", hour, minute); - lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0); - } else { - lv_label_set_text_fmt(label_time, "%02d:%02d", hour, minute); - lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); - } - - currentDate = std::chrono::time_point_cast(currentDateTime.Get()); - if (currentDate.IsUpdated()) { - uint16_t year = dateTimeController.Year(); - uint8_t day = dateTimeController.Day(); - 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_realign(label_date); - } - } - - heartbeat = heartRateController.HeartRate(); - heartbeatRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped; - if (heartbeat.IsUpdated() || heartbeatRunning.IsUpdated()) { - if (heartbeatRunning.Get()) { - 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()); - } 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, ""); - } - - lv_obj_realign(heartbeatIcon); - lv_obj_realign(heartbeatValue); - } - - stepCount = motionController.NbSteps(); - if (stepCount.IsUpdated()) { - lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get()); - lv_obj_realign(stepValue); - lv_obj_realign(stepIcon); - } - - currentWeather = weatherService.Current(); - if (currentWeather.IsUpdated()) { - auto optCurrentWeather = currentWeather.Get(); - if (optCurrentWeather) { - int16_t temp = optCurrentWeather->temperature; - char tempUnit = 'C'; - if (settingsController.GetWeatherFormat() == Controllers::Settings::WeatherFormat::Imperial) { - temp = Controllers::SimpleWeatherService::CelsiusToFahrenheit(temp); - tempUnit = 'F'; - } - temp = temp / 100 + (temp % 100 >= 50 ? 1 : 0); - lv_label_set_text_fmt(temperature, "%d°%c", temp, tempUnit); - lv_label_set_text(weatherIcon, Symbols::GetSymbol(optCurrentWeather->iconId)); - } else { - lv_label_set_text_static(temperature, ""); - lv_label_set_text(weatherIcon, ""); - } - lv_obj_realign(temperature); - lv_obj_realign(weatherIcon); - } -} diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h deleted file mode 100644 index 7bb713cb..00000000 --- a/src/displayapp/screens/WatchFaceDigital.h +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include "displayapp/screens/Screen.h" -#include "components/datetime/DateTimeController.h" -#include "components/ble/SimpleWeatherService.h" -#include "components/ble/BleController.h" -#include "displayapp/widgets/StatusIcons.h" -#include "utility/DirtyValue.h" -#include "displayapp/apps/Apps.h" - -namespace Pinetime { - namespace Controllers { - class Settings; - class Battery; - class Ble; - class NotificationManager; - class HeartRateController; - class MotionController; - } - - namespace Applications { - namespace Screens { - - class WatchFaceDigital : public Screen { - public: - WatchFaceDigital(Controllers::DateTime& dateTimeController, - const Controllers::Battery& batteryController, - const Controllers::Ble& bleController, - Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController, - Controllers::SimpleWeatherService& weather); - ~WatchFaceDigital() override; - - void Refresh() override; - - private: - uint8_t displayedHour = -1; - uint8_t displayedMinute = -1; - - Utility::DirtyValue> currentDateTime {}; - Utility::DirtyValue stepCount {}; - Utility::DirtyValue heartbeat {}; - Utility::DirtyValue heartbeatRunning {}; - Utility::DirtyValue notificationState {}; - Utility::DirtyValue> currentWeather {}; - - Utility::DirtyValue> currentDate; - - lv_obj_t* label_time; - lv_obj_t* label_time_ampm; - lv_obj_t* label_date; - lv_obj_t* heartbeatIcon; - lv_obj_t* heartbeatValue; - lv_obj_t* stepIcon; - lv_obj_t* stepValue; - lv_obj_t* notificationIcon; - lv_obj_t* weatherIcon; - lv_obj_t* temperature; - - Controllers::DateTime& dateTimeController; - Controllers::NotificationManager& notificationManager; - Controllers::Settings& settingsController; - Controllers::HeartRateController& heartRateController; - Controllers::MotionController& motionController; - Controllers::SimpleWeatherService& weatherService; - - lv_task_t* taskRefresh; - Widgets::StatusIcons statusIcons; - }; - } - - template <> - struct WatchFaceTraits { - static constexpr WatchFace watchFace = WatchFace::Digital; - static constexpr const char* name = "Digital face"; - - static Screens::Screen* Create(AppControllers& controllers) { - return new Screens::WatchFaceDigital(controllers.dateTimeController, - controllers.batteryController, - controllers.bleController, - controllers.notificationManager, - controllers.settingsController, - controllers.heartRateController, - controllers.motionController, - *controllers.weatherController); - }; - - static bool IsAvailable(Pinetime::Controllers::FS& /*filesystem*/) { - return true; - } - }; - } -} diff --git a/src/displayapp/screens/WatchFaceInfineat.cpp b/src/displayapp/screens/WatchFaceInfineat.cpp deleted file mode 100644 index 4c6fc196..00000000 --- a/src/displayapp/screens/WatchFaceInfineat.cpp +++ /dev/null @@ -1,509 +0,0 @@ -#include "displayapp/screens/WatchFaceInfineat.h" - -#include -#include -#include "displayapp/screens/Symbols.h" -#include "displayapp/screens/BleIcon.h" -#include "components/settings/Settings.h" -#include "components/battery/BatteryController.h" -#include "components/ble/BleController.h" -#include "components/ble/NotificationManager.h" -#include "components/motion/MotionController.h" - -using namespace Pinetime::Applications::Screens; - -namespace { - void event_handler(lv_obj_t* obj, lv_event_t event) { - auto* screen = static_cast(obj->user_data); - screen->UpdateSelected(obj, event); - } - - enum class colors { - orange, - blue, - green, - rainbow, - gray, - nordBlue, - nordGreen, - }; - - constexpr int nColors = 7; // must match number of colors in InfineatColors - - constexpr int nLines = WatchFaceInfineat::nLines; - - constexpr std::array orangeColors = {LV_COLOR_MAKE(0xfd, 0x87, 0x2b), - LV_COLOR_MAKE(0xdb, 0x33, 0x16), - LV_COLOR_MAKE(0x6f, 0x10, 0x00), - LV_COLOR_MAKE(0xfd, 0x7a, 0x0a), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xe8, 0x51, 0x02), - LV_COLOR_MAKE(0xea, 0x1c, 0x00)}; - constexpr std::array blueColors = {LV_COLOR_MAKE(0xe7, 0xf8, 0xff), - LV_COLOR_MAKE(0x22, 0x32, 0xd0), - LV_COLOR_MAKE(0x18, 0x2a, 0x8b), - LV_COLOR_MAKE(0xe7, 0xf8, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0x59, 0x91, 0xff), - LV_COLOR_MAKE(0x16, 0x36, 0xff)}; - constexpr std::array greenColors = {LV_COLOR_MAKE(0xb8, 0xff, 0x9b), - LV_COLOR_MAKE(0x08, 0x86, 0x08), - LV_COLOR_MAKE(0x00, 0x4a, 0x00), - LV_COLOR_MAKE(0xb8, 0xff, 0x9b), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0x62, 0xd5, 0x15), - LV_COLOR_MAKE(0x00, 0x74, 0x00)}; - constexpr std::array rainbowColors = {LV_COLOR_MAKE(0x2d, 0xa4, 0x00), - LV_COLOR_MAKE(0xac, 0x09, 0xc4), - LV_COLOR_MAKE(0xfe, 0x03, 0x03), - LV_COLOR_MAKE(0x0d, 0x57, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xe0, 0xb9, 0x00), - LV_COLOR_MAKE(0xe8, 0x51, 0x02)}; - constexpr std::array grayColors = {LV_COLOR_MAKE(0xee, 0xee, 0xee), - LV_COLOR_MAKE(0x98, 0x95, 0x9b), - LV_COLOR_MAKE(0x19, 0x19, 0x19), - LV_COLOR_MAKE(0xee, 0xee, 0xee), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0x91, 0x91, 0x91), - LV_COLOR_MAKE(0x3a, 0x3a, 0x3a)}; - constexpr std::array nordBlueColors = {LV_COLOR_MAKE(0xc3, 0xda, 0xf2), - LV_COLOR_MAKE(0x4d, 0x78, 0xce), - LV_COLOR_MAKE(0x15, 0x34, 0x51), - LV_COLOR_MAKE(0xc3, 0xda, 0xf2), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0x5d, 0x8a, 0xd2), - LV_COLOR_MAKE(0x21, 0x51, 0x8a)}; - constexpr std::array nordGreenColors = {LV_COLOR_MAKE(0xd5, 0xf0, 0xe9), - LV_COLOR_MAKE(0x23, 0x83, 0x73), - LV_COLOR_MAKE(0x1d, 0x41, 0x3f), - LV_COLOR_MAKE(0xd5, 0xf0, 0xe9), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0xff, 0xff, 0xff), - LV_COLOR_MAKE(0x2f, 0xb8, 0xa2), - LV_COLOR_MAKE(0x11, 0x70, 0x5a)}; - - constexpr const std::array* returnColor(colors color) { - if (color == colors::orange) { - return &orangeColors; - } - if (color == colors::blue) { - return &blueColors; - } - if (color == colors::green) { - return &greenColors; - } - if (color == colors::rainbow) { - return &rainbowColors; - } - if (color == colors::gray) { - return &grayColors; - } - if (color == colors::nordBlue) { - return &nordBlueColors; - } - return &nordGreenColors; - } -} - -WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, - const Controllers::Battery& batteryController, - const Controllers::Ble& bleController, - Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController, - Controllers::MotionController& motionController, - Controllers::FS& filesystem) - : currentDateTime {{}}, - dateTimeController {dateTimeController}, - batteryController {batteryController}, - bleController {bleController}, - notificationManager {notificationManager}, - settingsController {settingsController}, - motionController {motionController} { - lfs_file f = {}; - if (filesystem.FileOpen(&f, "/fonts/teko.bin", LFS_O_RDONLY) >= 0) { - filesystem.FileClose(&f); - font_teko = lv_font_load("F:/fonts/teko.bin"); - } - - if (filesystem.FileOpen(&f, "/fonts/bebas.bin", LFS_O_RDONLY) >= 0) { - filesystem.FileClose(&f); - font_bebas = lv_font_load("F:/fonts/bebas.bin"); - } - - // Side Cover - static constexpr lv_point_t linePoints[nLines][2] = {{{30, 25}, {68, -8}}, - {{26, 167}, {43, 216}}, - {{27, 40}, {27, 196}}, - {{12, 182}, {65, 249}}, - {{17, 99}, {17, 144}}, - {{14, 81}, {40, 127}}, - {{14, 163}, {40, 118}}, - {{-20, 124}, {25, -11}}, - {{-29, 89}, {27, 254}}}; - - static constexpr lv_style_int_t lineWidths[nLines] = {18, 15, 14, 22, 20, 18, 18, 52, 48}; - - const std::array* colors = returnColor(static_cast(settingsController.GetInfineatColorIndex())); - for (int i = 0; i < nLines; i++) { - lines[i] = lv_line_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_line_width(lines[i], LV_LINE_PART_MAIN, LV_STATE_DEFAULT, lineWidths[i]); - lv_color_t color = (*colors)[i]; - lv_obj_set_style_local_line_color(lines[i], LV_LINE_PART_MAIN, LV_STATE_DEFAULT, color); - lv_line_set_points(lines[i], linePoints[i], 2); - } - - logoPine = lv_img_create(lv_scr_act(), nullptr); - lv_img_set_src(logoPine, "F:/images/pine_small.bin"); - lv_obj_set_pos(logoPine, 15, 106); - - lineBattery = lv_line_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_line_width(lineBattery, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 24); - lv_obj_set_style_local_line_color(lineBattery, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, (*colors)[4]); - lv_obj_set_style_local_line_opa(lineBattery, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 190); - lineBatteryPoints[0] = {27, 105}; - lineBatteryPoints[1] = {27, 106}; - lv_line_set_points(lineBattery, lineBatteryPoints, 2); - lv_obj_move_foreground(lineBattery); - - notificationIcon = lv_obj_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_bg_color(notificationIcon, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, (*colors)[7]); - lv_obj_set_style_local_radius(notificationIcon, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); - lv_obj_set_size(notificationIcon, 13, 13); - lv_obj_set_hidden(notificationIcon, true); - - if (!settingsController.GetInfineatShowSideCover()) { - ToggleBatteryIndicatorColor(false); - for (auto& line : lines) { - lv_obj_set_hidden(line, true); - } - } - - timeContainer = lv_obj_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_bg_opa(timeContainer, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); - lv_obj_set_size(timeContainer, 185, 185); - lv_obj_align(timeContainer, lv_scr_act(), LV_ALIGN_CENTER, 0, -10); - - labelHour = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(labelHour, "01"); - lv_obj_set_style_local_text_font(labelHour, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_bebas); - lv_obj_align(labelHour, timeContainer, LV_ALIGN_IN_TOP_MID, 0, 0); - - labelMinutes = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_font(labelMinutes, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_bebas); - lv_label_set_text_static(labelMinutes, "00"); - lv_obj_align(labelMinutes, timeContainer, LV_ALIGN_IN_BOTTOM_MID, 0, 0); - - labelTimeAmPm = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_font(labelTimeAmPm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); - - lv_label_set_text_static(labelTimeAmPm, ""); - lv_obj_align(labelTimeAmPm, timeContainer, LV_ALIGN_OUT_RIGHT_TOP, 0, 15); - - dateContainer = lv_obj_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_bg_opa(dateContainer, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); - lv_obj_set_size(dateContainer, 60, 30); - lv_obj_align(dateContainer, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 5); - - static constexpr lv_color_t grayColor = LV_COLOR_MAKE(0x99, 0x99, 0x99); - labelDate = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(labelDate, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); - lv_obj_set_style_local_text_font(labelDate, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); - lv_obj_align(labelDate, dateContainer, LV_ALIGN_IN_TOP_MID, 0, 0); - lv_label_set_text_static(labelDate, "Mon 01"); - - bleIcon = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(bleIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); - lv_label_set_text_static(bleIcon, Symbols::bluetooth); - lv_obj_align(bleIcon, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, 0, 0); - - stepValue = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); - lv_obj_set_style_local_text_font(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); - lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 10, 0); - lv_label_set_text_static(stepValue, "0"); - - stepIcon = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(stepIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); - lv_label_set_text_static(stepIcon, Symbols::shoe); - lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0); - - // Setting buttons - btnClose = lv_btn_create(lv_scr_act(), nullptr); - btnClose->user_data = this; - lv_obj_set_size(btnClose, 60, 60); - lv_obj_align(btnClose, lv_scr_act(), LV_ALIGN_CENTER, 0, -80); - lv_obj_set_style_local_bg_opa(btnClose, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_70); - lv_obj_t* lblClose = lv_label_create(btnClose, nullptr); - lv_label_set_text_static(lblClose, "X"); - lv_obj_set_event_cb(btnClose, event_handler); - lv_obj_set_hidden(btnClose, true); - - btnNextColor = lv_btn_create(lv_scr_act(), nullptr); - btnNextColor->user_data = this; - lv_obj_set_size(btnNextColor, 60, 60); - lv_obj_align(btnNextColor, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, -15, 0); - lv_obj_set_style_local_bg_opa(btnNextColor, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_70); - lv_obj_t* lblNextColor = lv_label_create(btnNextColor, nullptr); - lv_label_set_text_static(lblNextColor, ">"); - lv_obj_set_event_cb(btnNextColor, event_handler); - lv_obj_set_hidden(btnNextColor, true); - - btnPrevColor = lv_btn_create(lv_scr_act(), nullptr); - btnPrevColor->user_data = this; - lv_obj_set_size(btnPrevColor, 60, 60); - lv_obj_align(btnPrevColor, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 15, 0); - lv_obj_set_style_local_bg_opa(btnPrevColor, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_70); - lv_obj_t* lblPrevColor = lv_label_create(btnPrevColor, nullptr); - lv_label_set_text_static(lblPrevColor, "<"); - lv_obj_set_event_cb(btnPrevColor, event_handler); - lv_obj_set_hidden(btnPrevColor, true); - - btnToggleCover = lv_btn_create(lv_scr_act(), nullptr); - btnToggleCover->user_data = this; - lv_obj_set_size(btnToggleCover, 60, 60); - lv_obj_align(btnToggleCover, lv_scr_act(), LV_ALIGN_CENTER, 0, 80); - lv_obj_set_style_local_bg_opa(btnToggleCover, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_70); - const char* labelToggle = settingsController.GetInfineatShowSideCover() ? "ON" : "OFF"; - lblToggle = lv_label_create(btnToggleCover, nullptr); - lv_label_set_text_static(lblToggle, labelToggle); - lv_obj_set_event_cb(btnToggleCover, event_handler); - lv_obj_set_hidden(btnToggleCover, true); - - // Button to access the settings - btnSettings = lv_btn_create(lv_scr_act(), nullptr); - btnSettings->user_data = this; - lv_obj_set_size(btnSettings, 150, 150); - lv_obj_align(btnSettings, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); - lv_obj_set_style_local_radius(btnSettings, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 30); - lv_obj_set_style_local_bg_opa(btnSettings, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_70); - lv_obj_set_event_cb(btnSettings, event_handler); - labelBtnSettings = lv_label_create(btnSettings, nullptr); - lv_obj_set_style_local_text_font(labelBtnSettings, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48); - lv_label_set_text_static(labelBtnSettings, Symbols::settings); - lv_obj_set_hidden(btnSettings, true); - - taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); - Refresh(); -} - -WatchFaceInfineat::~WatchFaceInfineat() { - lv_task_del(taskRefresh); - - if (font_bebas != nullptr) { - lv_font_free(font_bebas); - } - if (font_teko != nullptr) { - lv_font_free(font_teko); - } - - lv_obj_clean(lv_scr_act()); -} - -bool WatchFaceInfineat::OnTouchEvent(Pinetime::Applications::TouchEvents event) { - if ((event == Pinetime::Applications::TouchEvents::LongTap) && lv_obj_get_hidden(btnSettings)) { - lv_obj_set_hidden(btnSettings, false); - savedTick = lv_tick_get(); - return true; - } - // Prevent screen from sleeping when double tapping with settings on - if ((event == Pinetime::Applications::TouchEvents::DoubleTap) && !lv_obj_get_hidden(btnClose)) { - return true; - } - return false; -} - -void WatchFaceInfineat::CloseMenu() { - settingsController.SaveSettings(); - lv_obj_set_hidden(btnClose, true); - lv_obj_set_hidden(btnNextColor, true); - lv_obj_set_hidden(btnPrevColor, true); - lv_obj_set_hidden(btnToggleCover, true); -} - -bool WatchFaceInfineat::OnButtonPushed() { - if (!lv_obj_get_hidden(btnClose)) { - CloseMenu(); - return true; - } - return false; -} - -void WatchFaceInfineat::UpdateSelected(lv_obj_t* object, lv_event_t event) { - if (event == LV_EVENT_CLICKED) { - bool showSideCover = settingsController.GetInfineatShowSideCover(); - int colorIndex = settingsController.GetInfineatColorIndex(); - - if (object == btnSettings) { - lv_obj_set_hidden(btnSettings, true); - lv_obj_set_hidden(btnClose, false); - lv_obj_set_hidden(btnNextColor, !showSideCover); - lv_obj_set_hidden(btnPrevColor, !showSideCover); - lv_obj_set_hidden(btnToggleCover, false); - } - if (object == btnClose) { - CloseMenu(); - } - if (object == btnToggleCover) { - settingsController.SetInfineatShowSideCover(!showSideCover); - ToggleBatteryIndicatorColor(!showSideCover); - for (auto& line : lines) { - lv_obj_set_hidden(line, showSideCover); - } - lv_obj_set_hidden(btnNextColor, showSideCover); - lv_obj_set_hidden(btnPrevColor, showSideCover); - const char* labelToggle = showSideCover ? "OFF" : "ON"; - lv_label_set_text_static(lblToggle, labelToggle); - } - if (object == btnNextColor) { - colorIndex = (colorIndex + 1) % nColors; - settingsController.SetInfineatColorIndex(colorIndex); - } - if (object == btnPrevColor) { - colorIndex -= 1; - if (colorIndex < 0) - colorIndex = nColors - 1; - settingsController.SetInfineatColorIndex(colorIndex); - } - if (object == btnNextColor || object == btnPrevColor) { - const std::array* colors = returnColor(static_cast(settingsController.GetInfineatColorIndex())); - for (int i = 0; i < nLines; i++) { - lv_color_t color = (*colors)[i]; - lv_obj_set_style_local_line_color(lines[i], LV_LINE_PART_MAIN, LV_STATE_DEFAULT, color); - } - lv_obj_set_style_local_line_color(lineBattery, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, (*colors)[4]); - lv_obj_set_style_local_bg_color(notificationIcon, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, (*colors)[7]); - } - } -} - -void WatchFaceInfineat::Refresh() { - notificationState = notificationManager.AreNewNotificationsAvailable(); - if (notificationState.IsUpdated()) { - lv_obj_set_hidden(notificationIcon, !notificationState.Get()); - lv_obj_align(notificationIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0); - } - - currentDateTime = std::chrono::time_point_cast(dateTimeController.CurrentDateTime()); - if (currentDateTime.IsUpdated()) { - uint8_t hour = dateTimeController.Hours(); - uint8_t minute = dateTimeController.Minutes(); - - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { - char ampmChar[3] = "AM"; - if (hour == 0) { - hour = 12; - } else if (hour == 12) { - ampmChar[0] = 'P'; - } else if (hour > 12) { - hour = hour - 12; - ampmChar[0] = 'P'; - } - lv_label_set_text(labelTimeAmPm, ampmChar); - } - lv_label_set_text_fmt(labelHour, "%02d", hour); - lv_label_set_text_fmt(labelMinutes, "%02d", minute); - - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { - lv_obj_align(labelTimeAmPm, timeContainer, LV_ALIGN_OUT_RIGHT_TOP, 0, 10); - lv_obj_align(labelHour, timeContainer, LV_ALIGN_IN_TOP_MID, 0, 5); - lv_obj_align(labelMinutes, timeContainer, LV_ALIGN_IN_BOTTOM_MID, 0, 0); - } - - currentDate = std::chrono::time_point_cast(currentDateTime.Get()); - if (currentDate.IsUpdated()) { - uint8_t day = dateTimeController.Day(); - Controllers::DateTime::Days dayOfWeek = dateTimeController.DayOfWeek(); - lv_label_set_text_fmt(labelDate, "%s %02d", dateTimeController.DayOfWeekShortToStringLow(dayOfWeek), day); - lv_obj_realign(labelDate); - } - } - - batteryPercentRemaining = batteryController.PercentRemaining(); - isCharging = batteryController.IsCharging(); - if (batteryController.IsCharging()) { // Charging battery animation - chargingBatteryPercent += 1; - if (chargingBatteryPercent > 100) { - chargingBatteryPercent = batteryPercentRemaining.Get(); - } - SetBatteryLevel(chargingBatteryPercent); - } else if (isCharging.IsUpdated() || batteryPercentRemaining.IsUpdated()) { - chargingBatteryPercent = batteryPercentRemaining.Get(); - SetBatteryLevel(chargingBatteryPercent); - } - - bleState = bleController.IsConnected(); - bleRadioEnabled = bleController.IsRadioEnabled(); - if (bleState.IsUpdated()) { - lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); - lv_obj_align(bleIcon, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, 0, 3); - } - - stepCount = motionController.NbSteps(); - if (stepCount.IsUpdated()) { - lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get()); - lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 10, 0); - lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0); - } - - if (!lv_obj_get_hidden(btnSettings)) { - if ((savedTick > 0) && (lv_tick_get() - savedTick > 3000)) { - lv_obj_set_hidden(btnSettings, true); - savedTick = 0; - } - } -} - -void WatchFaceInfineat::SetBatteryLevel(uint8_t batteryPercent) { - // starting point (y) + Pine64 logo height * (100 - batteryPercent) / 100 - lineBatteryPoints[1] = {27, static_cast(105 + 32 * (100 - batteryPercent) / 100)}; - lv_line_set_points(lineBattery, lineBatteryPoints, 2); -} - -void WatchFaceInfineat::ToggleBatteryIndicatorColor(bool showSideCover) { - if (!showSideCover) { // make indicator and notification icon color white - lv_obj_set_style_local_image_recolor_opa(logoPine, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_100); - lv_obj_set_style_local_image_recolor(logoPine, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_obj_set_style_local_line_color(lineBattery, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); - lv_obj_set_style_local_bg_color(notificationIcon, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - } else { - lv_obj_set_style_local_image_recolor_opa(logoPine, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0); - const std::array* colors = returnColor(static_cast(settingsController.GetInfineatColorIndex())); - lv_obj_set_style_local_line_color(lineBattery, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, (*colors)[4]); - lv_obj_set_style_local_bg_color(notificationIcon, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, (*colors)[7]); - } -} - -bool WatchFaceInfineat::IsAvailable(Pinetime::Controllers::FS& filesystem) { - lfs_file file = {}; - - if (filesystem.FileOpen(&file, "/fonts/teko.bin", LFS_O_RDONLY) < 0) { - return false; - } - - filesystem.FileClose(&file); - if (filesystem.FileOpen(&file, "/fonts/bebas.bin", LFS_O_RDONLY) < 0) { - return false; - } - - filesystem.FileClose(&file); - if (filesystem.FileOpen(&file, "/images/pine_small.bin", LFS_O_RDONLY) < 0) { - return false; - } - - filesystem.FileClose(&file); - return true; -} diff --git a/src/displayapp/screens/WatchFaceInfineat.h b/src/displayapp/screens/WatchFaceInfineat.h deleted file mode 100644 index 55c43f98..00000000 --- a/src/displayapp/screens/WatchFaceInfineat.h +++ /dev/null @@ -1,123 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include "displayapp/screens/Screen.h" -#include "components/datetime/DateTimeController.h" -#include "utility/DirtyValue.h" -#include "displayapp/apps/Apps.h" - -namespace Pinetime { - namespace Controllers { - class Settings; - class Battery; - class Ble; - class NotificationManager; - class MotionController; - } - - namespace Applications { - namespace Screens { - - class WatchFaceInfineat : public Screen { - public: - static constexpr int nLines = 9; - WatchFaceInfineat(Controllers::DateTime& dateTimeController, - const Controllers::Battery& batteryController, - const Controllers::Ble& bleController, - Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController, - Controllers::MotionController& motionController, - Controllers::FS& fs); - - ~WatchFaceInfineat() override; - - bool OnTouchEvent(TouchEvents event) override; - bool OnButtonPushed() override; - void UpdateSelected(lv_obj_t* object, lv_event_t event); - void CloseMenu(); - - void Refresh() override; - - static bool IsAvailable(Pinetime::Controllers::FS& filesystem); - - private: - uint32_t savedTick = 0; - uint8_t chargingBatteryPercent = 101; // not a mistake ;) - - Utility::DirtyValue batteryPercentRemaining {}; - Utility::DirtyValue isCharging {}; - Utility::DirtyValue bleState {}; - Utility::DirtyValue bleRadioEnabled {}; - Utility::DirtyValue> currentDateTime {}; - Utility::DirtyValue stepCount {}; - Utility::DirtyValue notificationState {}; - Utility::DirtyValue> currentDate; - - // Lines making up the side cover - lv_obj_t* lineBattery; - - lv_point_t lineBatteryPoints[2]; - - lv_obj_t* logoPine; - - lv_obj_t* timeContainer; - lv_obj_t* labelHour; - lv_obj_t* labelMinutes; - lv_obj_t* labelTimeAmPm; - lv_obj_t* dateContainer; - lv_obj_t* labelDate; - lv_obj_t* bleIcon; - lv_obj_t* stepIcon; - lv_obj_t* stepValue; - lv_obj_t* notificationIcon; - lv_obj_t* btnClose; - lv_obj_t* btnNextColor; - lv_obj_t* btnToggleCover; - lv_obj_t* btnPrevColor; - lv_obj_t* btnSettings; - lv_obj_t* labelBtnSettings; - lv_obj_t* lblToggle; - - lv_obj_t* lines[nLines]; - - Controllers::DateTime& dateTimeController; - const Controllers::Battery& batteryController; - const Controllers::Ble& bleController; - Controllers::NotificationManager& notificationManager; - Controllers::Settings& settingsController; - Controllers::MotionController& motionController; - - void SetBatteryLevel(uint8_t batteryPercent); - void ToggleBatteryIndicatorColor(bool showSideCover); - - lv_task_t* taskRefresh; - lv_font_t* font_teko = nullptr; - lv_font_t* font_bebas = nullptr; - }; - } - - template <> - struct WatchFaceTraits { - static constexpr WatchFace watchFace = WatchFace::Infineat; - static constexpr const char* name = "Infineat face"; - - static Screens::Screen* Create(AppControllers& controllers) { - return new Screens::WatchFaceInfineat(controllers.dateTimeController, - controllers.batteryController, - controllers.bleController, - controllers.notificationManager, - controllers.settingsController, - controllers.motionController, - controllers.filesystem); - }; - - static bool IsAvailable(Pinetime::Controllers::FS& filesystem) { - return Screens::WatchFaceInfineat::IsAvailable(filesystem); - } - }; - } -} diff --git a/src/displayapp/screens/WatchFaceSundial.cpp b/src/displayapp/screens/WatchFaceSundial.cpp deleted file mode 100644 index 7bac1ff9..00000000 --- a/src/displayapp/screens/WatchFaceSundial.cpp +++ /dev/null @@ -1,259 +0,0 @@ -#include "displayapp/screens/WatchFaceSundial.h" - -#include -#include -// #include -#include "displayapp/screens/NotificationIcon.h" -#include "displayapp/screens/Symbols.h" -#include "displayapp/screens/WeatherSymbols.h" -#include "displayapp/InfiniTimeTheme.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/ble/SimpleWeatherService.h" -#include "components/settings/Settings.h" -#include "sunset/src/sunset.h" - -using namespace Pinetime::Applications::Screens; - -namespace { - int16_t HourLength = 70; - constexpr int16_t MinuteLength = 90; - constexpr int16_t SecondLength = 110; - constexpr int16_t SunDialVerticalOffset = 40; - - // sin(90) = 1 so the value of _lv_trigo_sin(90) is the scaling factor - const auto LV_TRIG_SCALE = _lv_trigo_sin(90); - const lv_color_t DARK_GRAY = lv_color_make(48, 48, 48); - const lv_color_t DARK_ORANGE = lv_color_make(48, 26, 0); - - 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 CoordinateXRelocate(int16_t x) { - return (x + LV_HOR_RES / 2); - } - - - int16_t CoordinateYRelocateSundial(int16_t y) { - return std::abs(y - SunDialVerticalOffset); - } - - lv_point_t CoordinateRelocateSundial(int16_t radius, int16_t angle) { - return lv_point_t {.x = CoordinateXRelocate(radius * static_cast(Sine(angle)) / LV_TRIG_SCALE), - .y = CoordinateYRelocateSundial(radius * static_cast(Cosine(angle)) / LV_TRIG_SCALE)}; - } - -} - -WatchFaceSundial::WatchFaceSundial(Controllers::DateTime& dateTimeController, - Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController) - : currentDateTime {{}}, - dateTimeController {dateTimeController}, - notificationManager {notificationManager}, - settingsController {settingsController} -{ - // minor_scales = lv_linemeter_create(lv_scr_act(), nullptr); - // lv_linemeter_set_scale(minor_scales, 300, 51); - // lv_linemeter_set_angle_offset(minor_scales, 180); - // lv_obj_set_size(minor_scales, 240, 240); - // lv_obj_align(minor_scales, nullptr, LV_ALIGN_CENTER, 0, 0); - // lv_obj_set_style_local_bg_opa(minor_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); - // lv_obj_set_style_local_scale_width(minor_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, 4); - // lv_obj_set_style_local_scale_end_line_width(minor_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, 1); - // lv_obj_set_style_local_scale_end_color(minor_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); - - // major_scales = lv_linemeter_create(lv_scr_act(), nullptr); - // lv_linemeter_set_scale(major_scales, 300, 11); - // lv_linemeter_set_angle_offset(major_scales, 180); - // lv_obj_set_size(major_scales, 240, 240); - // lv_obj_align(major_scales, nullptr, LV_ALIGN_CENTER, 0, 0); - // lv_obj_set_style_local_bg_opa(major_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); - // lv_obj_set_style_local_scale_width(major_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, 6); - // lv_obj_set_style_local_scale_end_line_width(major_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, 4); - // lv_obj_set_style_local_scale_end_color(major_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - - // large_scales = lv_linemeter_create(lv_scr_act(), nullptr); - // lv_linemeter_set_scale(large_scales, 180, 3); - // lv_linemeter_set_angle_offset(large_scales, 180); - // lv_obj_set_size(large_scales, 240, 240); - // lv_obj_align(large_scales, nullptr, LV_ALIGN_CENTER, 0, 0); - // lv_obj_set_style_local_bg_opa(large_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); - // lv_obj_set_style_local_scale_width(large_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, 20); - // lv_obj_set_style_local_scale_end_line_width(large_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, 4); - // lv_obj_set_style_local_scale_end_color(large_scales, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_AQUA); - - twelve = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_align(twelve, LV_LABEL_ALIGN_RIGHT); - lv_label_set_text_static(twelve, "XII"); - lv_obj_align(twelve, NULL, LV_ALIGN_IN_TOP_RIGHT, -20, SunDialVerticalOffset-20); - lv_obj_set_style_local_text_color(twelve, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - - one = lv_label_create(lv_scr_act(), NULL); - lv_label_set_align(one, LV_LABEL_ALIGN_LEFT); - lv_label_set_text(one, "I"); - lv_obj_align(one, NULL, LV_ALIGN_IN_TOP_LEFT, 20, SunDialVerticalOffset-20); - lv_obj_set_style_local_text_color(one, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - - 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_LIME); - lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(false)); - lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0); - - // Date - Day / Week day - label_date_day = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(label_date_day, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, DARK_ORANGE); - lv_label_set_text_fmt(label_date_day, "%s\n%02i", dateTimeController.DayOfWeekShortToString(), dateTimeController.Day()); - lv_label_set_align(label_date_day, LV_LABEL_ALIGN_CENTER); - lv_obj_align(label_date_day, nullptr, LV_ALIGN_CENTER, 50, 0); - - minute_body = lv_line_create(lv_scr_act(), nullptr); - minute_body_trace = lv_line_create(lv_scr_act(), nullptr); - hour_body = lv_line_create(lv_scr_act(), nullptr); - hour_body_trace = lv_line_create(lv_scr_act(), nullptr); - second_body = lv_line_create(lv_scr_act(), nullptr); - - lv_style_init(&second_line_style); - lv_style_set_line_width(&second_line_style, LV_STATE_DEFAULT, 3); - lv_style_set_line_color(&second_line_style, LV_STATE_DEFAULT, LV_COLOR_RED); - lv_style_set_line_rounded(&second_line_style, LV_STATE_DEFAULT, true); - lv_obj_add_style(second_body, LV_LINE_PART_MAIN, &second_line_style); - - lv_style_init(&minute_line_style); - lv_style_set_line_width(&minute_line_style, LV_STATE_DEFAULT, 7); - lv_style_set_line_color(&minute_line_style, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_style_set_line_rounded(&minute_line_style, LV_STATE_DEFAULT, true); - lv_obj_add_style(minute_body, LV_LINE_PART_MAIN, &minute_line_style); - - lv_style_init(&minute_line_style_trace); - lv_style_set_line_width(&minute_line_style_trace, LV_STATE_DEFAULT, 3); - lv_style_set_line_color(&minute_line_style_trace, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_style_set_line_rounded(&minute_line_style_trace, LV_STATE_DEFAULT, false); - lv_obj_add_style(minute_body_trace, LV_LINE_PART_MAIN, &minute_line_style_trace); - - lv_style_init(&hour_line_style); - lv_style_set_line_width(&hour_line_style, LV_STATE_DEFAULT, 7); - lv_style_set_line_color(&hour_line_style, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_style_set_line_rounded(&hour_line_style, LV_STATE_DEFAULT, true); - lv_obj_add_style(hour_body, LV_LINE_PART_MAIN, &hour_line_style); - - lv_style_init(&hour_line_style_trace); - lv_style_set_line_width(&hour_line_style_trace, LV_STATE_DEFAULT, 3); - lv_style_set_line_color(&hour_line_style_trace, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_style_set_line_rounded(&hour_line_style_trace, LV_STATE_DEFAULT, false); - lv_obj_add_style(hour_body_trace, LV_LINE_PART_MAIN, &hour_line_style_trace); - - taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); - UpdateClock(); - Refresh(); -} - -WatchFaceSundial::~WatchFaceSundial() { - lv_task_del(taskRefresh); - - lv_style_reset(&hour_line_style); - lv_style_reset(&hour_line_style_trace); - lv_style_reset(&minute_line_style); - lv_style_reset(&minute_line_style_trace); - lv_style_reset(&second_line_style); - - lv_obj_clean(lv_scr_act()); -} - -void WatchFaceSundial::Refresh() { - currentDateTime = std::chrono::time_point_cast(dateTimeController.CurrentDateTime()); - if (currentDateTime.IsUpdated()) { - currentDateTime = std::chrono::time_point_cast(dateTimeController.CurrentDateTime()); - UpdateClock(); - if (currentDate.IsUpdated()) { - char const* MonthsString[] = {"--", "IANUARIUS","FEBRUARIUS","MARTIUS","APRILIS","MARTIUSIUNIUS","QUINTILIS","SEXTILIS","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; - char const* DaysString[] = {"--", "LUNAE", "MARTIS", "MERCURII", "IOVIS", "VENERIS", "SATURNI", "SOLIS"}; - char const* RomanNumeralsString[] = {"--", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"}; - lv_label_set_text_fmt(label_date_day, "%s\n%s %s", - DaysString[static_cast(dateTimeController.DayOfWeek())], - RomanNumeralsString[static_cast(dateTimeController.Day())], - MonthsString[static_cast(dateTimeController.Month())]); - lv_obj_align(label_date_day, nullptr, LV_ALIGN_IN_BOTTOM_MID, 0, -20); - } - } - -} - -void WatchFaceSundial::UpdateClock() { - uint8_t hour = dateTimeController.Hours(); - uint8_t minute = dateTimeController.Minutes(); - location = settingsController.GetLocation(); - - if (sHour != hour || sMinute != minute) { - // sun.setPosition(settings.lat.toFloat(), settings.lon.toFloat(), settings.gmtOffset / 3600); - sun.setPosition((float)location.latitude, (float)location.longitude, location.tzOffset); - - //from minutes past midnight - sun.setCurrentDate(dateTimeController.Year(), static_cast(dateTimeController.Month())+1, dateTimeController.Day()); - sun.setTZOffset(location.tzOffset); - - minutesSunrise = sun.calcSunrise(); //360; - minutesSunset = sun.calcSunset(); //1080; - minutesDaytime = (minutesSunset - minutesSunrise); - minutesNighttime = (1440 - minutesDaytime); - - minutesBeforeSunset = minutesSunset - (hour * 60 + minute); // i.e.zero degrees - HourLength = 90; // sundial hand length - - int16_t hourAngle; - - if(minutesBeforeSunset > 0 && minutesBeforeSunset < minutesDaytime) { // day (after sunrise) - hourAngle = 180.0 * minutesBeforeSunset / minutesDaytime + 90; - lv_style_set_line_color(&hour_line_style, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_style_set_line_color(&hour_line_style_trace, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_obj_set_style_local_text_color(label_date_day, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); - lv_obj_set_style_local_text_color(one, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_obj_set_style_local_text_color(twelve, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - } else { // night (before sunrise or after sunset) - lv_style_set_line_color(&hour_line_style, LV_STATE_DEFAULT, DARK_GRAY); - lv_style_set_line_color(&hour_line_style_trace, LV_STATE_DEFAULT, DARK_GRAY); - lv_obj_set_style_local_text_color(label_date_day, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, DARK_ORANGE); - lv_obj_set_style_local_text_color(one, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, DARK_GRAY); - lv_obj_set_style_local_text_color(twelve, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, DARK_GRAY); - - if(minutesBeforeSunset > minutesDaytime) { // before sunrise - hourAngle = 180.0 * (minutesBeforeSunset - minutesDaytime) / minutesNighttime + 90; - } else { // after sunset - hourAngle = 180 + 180.0 * minutesBeforeSunset / minutesNighttime + 90; - } - } - /*NRF_LOG_INFO("a: %d, la: %f, lo: %f, ri: %d, se: %d, be: %d", - hourAngle, - (float)location.latitude, - (float)location.longitude, - minutesSunrise, - minutesSunset, - minutesBeforeSunset);*/ - - sHour = hour; - sMinute = minute; - - printf("H%d:%d lat%f lng%f z%d\n", hour, minute, (float)location.latitude, (float)location.longitude, location.tzOffset); - printf("%d before sunset, sunrise at %d:%d sunset at %d:%d angle %d\n", - minutesBeforeSunset, - minutesSunrise/60, minutesSunrise % 60, - minutesSunset/60, minutesSunset % 60, hourAngle); - - hour_point_trace[0] = CoordinateRelocateSundial(HourLength*.75, hourAngle); - hour_point_trace[1] = CoordinateRelocateSundial(HourLength, hourAngle); - - hour_point[0] = CoordinateRelocateSundial(0, hourAngle); - hour_point[1] = CoordinateRelocateSundial(HourLength*.75, hourAngle); - - lv_line_set_points(hour_body, hour_point, 2); - lv_line_set_points(hour_body_trace, hour_point_trace, 2); - } -} diff --git a/src/displayapp/screens/WatchFaceSundial.h b/src/displayapp/screens/WatchFaceSundial.h deleted file mode 100644 index b5721585..00000000 --- a/src/displayapp/screens/WatchFaceSundial.h +++ /dev/null @@ -1,111 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include "displayapp/screens/Screen.h" -#include "components/datetime/DateTimeController.h" -#include "components/battery/BatteryController.h" -#include "components/ble/BleController.h" -#include "components/ble/NotificationManager.h" -#include "displayapp/screens/BatteryIcon.h" -#include "utility/DirtyValue.h" -#include "sunset/src/sunset.h" - -namespace Pinetime { - namespace Controllers { - class Settings; - class Battery; - class Ble; - class NotificationManager; - } - - namespace Applications { - namespace Screens { - - class WatchFaceSundial : public Screen { - public: - WatchFaceSundial(Controllers::DateTime& dateTimeController, - Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController); - - ~WatchFaceSundial() override; - - void Refresh() override; - - private: - uint8_t sHour, sMinute, sSecond; - - Utility::DirtyValue batteryPercentRemaining {0}; - Utility::DirtyValue isCharging {}; - Utility::DirtyValue bleState {}; - Utility::DirtyValue> currentDateTime; - Utility::DirtyValue notificationState {false}; - using days = std::chrono::duration>; // TODO: days is standard in c++20 - Utility::DirtyValue> currentDate; - - lv_obj_t* major_scales; - lv_obj_t* one; - lv_obj_t* twelve; - - lv_obj_t* hour_body; - lv_obj_t* hour_body_trace; - lv_obj_t* minute_body; - lv_obj_t* minute_body_trace; - lv_obj_t* second_body; - - lv_point_t hour_point[2]; - lv_point_t hour_point_trace[2]; - lv_point_t minute_point[2]; - lv_point_t minute_point_trace[2]; - lv_point_t second_point[2]; - - lv_style_t hour_line_style; - lv_style_t hour_line_style_trace; - lv_style_t minute_line_style; - lv_style_t minute_line_style_trace; - lv_style_t second_line_style; - - lv_obj_t* label_date_day; - lv_obj_t* plugIcon; - lv_obj_t* notificationIcon; - lv_obj_t* bleIcon; - - Controllers::Settings::Location location; - SunSet sun; - int16_t minutesSunrise; - int16_t minutesSunset; - int16_t minutesDaytime; - int16_t minutesNighttime; - int16_t minutesBeforeSunset; - - const Controllers::DateTime& dateTimeController; - Controllers::NotificationManager& notificationManager; - Controllers::Settings& settingsController; - - void drawWatchFaceModeNight(); - void UpdateClock(); - void SetBatteryIcon(); - - lv_task_t* taskRefresh; - }; - } - - template <> - struct WatchFaceTraits { - static constexpr WatchFace watchFace = WatchFace::Sundial; - static constexpr const char* name = "Sundial face"; - - static Screens::Screen* Create(AppControllers& controllers) { - return new Screens::WatchFaceSundial(controllers.dateTimeController, - controllers.notificationManager, - controllers.settingsController); - }; - - static bool IsAvailable(Pinetime::Controllers::FS& /*filesystem*/) { - return true; - } - }; - } -} diff --git a/src/displayapp/screens/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp deleted file mode 100644 index 96d77741..00000000 --- a/src/displayapp/screens/WatchFaceTerminal.cpp +++ /dev/null @@ -1,151 +0,0 @@ -#include -#include "displayapp/screens/WatchFaceTerminal.h" -#include "displayapp/screens/BatteryIcon.h" -#include "displayapp/screens/NotificationIcon.h" -#include "displayapp/screens/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; - -WatchFaceTerminal::WatchFaceTerminal(Controllers::DateTime& dateTimeController, - const Controllers::Battery& batteryController, - const Controllers::Ble& bleController, - Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController) - : currentDateTime {{}}, - dateTimeController {dateTimeController}, - batteryController {batteryController}, - bleController {bleController}, - notificationManager {notificationManager}, - settingsController {settingsController}, - heartRateController {heartRateController}, - motionController {motionController} { - batteryValue = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_recolor(batteryValue, true); - lv_obj_align(batteryValue, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -20); - - connectState = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_recolor(connectState, true); - lv_obj_align(connectState, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 40); - - notificationIcon = lv_label_create(lv_scr_act(), nullptr); - lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_LEFT_MID, 0, -100); - - label_date = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_recolor(label_date, true); - lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -40); - - label_prompt_1 = lv_label_create(lv_scr_act(), nullptr); - lv_obj_align(label_prompt_1, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -80); - lv_label_set_text_static(label_prompt_1, "user@watch:~ $ now"); - - label_prompt_2 = lv_label_create(lv_scr_act(), nullptr); - lv_obj_align(label_prompt_2, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 60); - lv_label_set_text_static(label_prompt_2, "user@watch:~ $"); - - label_time = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_recolor(label_time, true); - lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -60); - - heartbeatValue = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_recolor(heartbeatValue, true); - lv_obj_align(heartbeatValue, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 20); - - stepValue = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_recolor(stepValue, true); - lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 0); - - taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); - Refresh(); -} - -WatchFaceTerminal::~WatchFaceTerminal() { - lv_task_del(taskRefresh); - lv_obj_clean(lv_scr_act()); -} - -void WatchFaceTerminal::Refresh() { - powerPresent = batteryController.IsPowerPresent(); - batteryPercentRemaining = batteryController.PercentRemaining(); - if (batteryPercentRemaining.IsUpdated() || powerPresent.IsUpdated()) { - lv_label_set_text_fmt(batteryValue, "[BATT]#387b54 %d%%", batteryPercentRemaining.Get()); - if (batteryController.IsPowerPresent()) { - lv_label_ins_text(batteryValue, LV_LABEL_POS_LAST, " Charging"); - } - } - - bleState = bleController.IsConnected(); - bleRadioEnabled = bleController.IsRadioEnabled(); - if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { - if (!bleRadioEnabled.Get()) { - lv_label_set_text_static(connectState, "[STAT]#0082fc Disabled#"); - } else { - if (bleState.Get()) { - lv_label_set_text_static(connectState, "[STAT]#0082fc Connected#"); - } else { - lv_label_set_text_static(connectState, "[STAT]#0082fc Disconnected#"); - } - } - } - - notificationState = notificationManager.AreNewNotificationsAvailable(); - if (notificationState.IsUpdated()) { - if (notificationState.Get()) { - lv_label_set_text_static(notificationIcon, "You have mail."); - } else { - lv_label_set_text_static(notificationIcon, ""); - } - } - - currentDateTime = std::chrono::time_point_cast(dateTimeController.CurrentDateTime()); - if (currentDateTime.IsUpdated()) { - uint8_t hour = dateTimeController.Hours(); - uint8_t minute = dateTimeController.Minutes(); - uint8_t second = dateTimeController.Seconds(); - - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { - char ampmChar[3] = "AM"; - if (hour == 0) { - hour = 12; - } else if (hour == 12) { - ampmChar[0] = 'P'; - } else if (hour > 12) { - hour = hour - 12; - ampmChar[0] = 'P'; - } - lv_label_set_text_fmt(label_time, "[TIME]#11cc55 %02d:%02d:%02d %s#", hour, minute, second, ampmChar); - } else { - lv_label_set_text_fmt(label_time, "[TIME]#11cc55 %02d:%02d:%02d", hour, minute, second); - } - - currentDate = std::chrono::time_point_cast(currentDateTime.Get()); - if (currentDate.IsUpdated()) { - uint16_t year = dateTimeController.Year(); - Controllers::DateTime::Months month = dateTimeController.Month(); - uint8_t day = dateTimeController.Day(); - lv_label_set_text_fmt(label_date, "[DATE]#007fff %04d-%02d-%02d#", short(year), char(month), char(day)); - } - } - - heartbeat = heartRateController.HeartRate(); - heartbeatRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped; - if (heartbeat.IsUpdated() || heartbeatRunning.IsUpdated()) { - if (heartbeatRunning.Get()) { - lv_label_set_text_fmt(heartbeatValue, "[L_HR]#ee3311 %d bpm#", heartbeat.Get()); - } else { - lv_label_set_text_static(heartbeatValue, "[L_HR]#ee3311 ---#"); - } - } - - stepCount = motionController.NbSteps(); - if (stepCount.IsUpdated()) { - lv_label_set_text_fmt(stepValue, "[STEP]#ee3377 %lu steps#", stepCount.Get()); - } -} diff --git a/src/displayapp/screens/WatchFaceTerminal.h b/src/displayapp/screens/WatchFaceTerminal.h deleted file mode 100644 index bf460866..00000000 --- a/src/displayapp/screens/WatchFaceTerminal.h +++ /dev/null @@ -1,92 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include "displayapp/screens/Screen.h" -#include "components/datetime/DateTimeController.h" -#include "utility/DirtyValue.h" - -namespace Pinetime { - namespace Controllers { - class Settings; - class Battery; - class Ble; - class NotificationManager; - class HeartRateController; - class MotionController; - } - - namespace Applications { - namespace Screens { - - class WatchFaceTerminal : public Screen { - public: - WatchFaceTerminal(Controllers::DateTime& dateTimeController, - const Controllers::Battery& batteryController, - const Controllers::Ble& bleController, - Controllers::NotificationManager& notificationManager, - Controllers::Settings& settingsController, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController); - ~WatchFaceTerminal() override; - - void Refresh() override; - - private: - Utility::DirtyValue batteryPercentRemaining {}; - Utility::DirtyValue powerPresent {}; - Utility::DirtyValue bleState {}; - Utility::DirtyValue bleRadioEnabled {}; - Utility::DirtyValue> currentDateTime {}; - Utility::DirtyValue stepCount {}; - Utility::DirtyValue heartbeat {}; - Utility::DirtyValue heartbeatRunning {}; - Utility::DirtyValue notificationState {}; - Utility::DirtyValue> currentDate; - - lv_obj_t* label_time; - lv_obj_t* label_date; - lv_obj_t* label_prompt_1; - lv_obj_t* label_prompt_2; - lv_obj_t* batteryValue; - lv_obj_t* heartbeatValue; - lv_obj_t* stepValue; - lv_obj_t* notificationIcon; - lv_obj_t* connectState; - - Controllers::DateTime& dateTimeController; - const Controllers::Battery& batteryController; - const Controllers::Ble& bleController; - Controllers::NotificationManager& notificationManager; - Controllers::Settings& settingsController; - Controllers::HeartRateController& heartRateController; - Controllers::MotionController& motionController; - - lv_task_t* taskRefresh; - }; - } - - template <> - struct WatchFaceTraits { - static constexpr WatchFace watchFace = WatchFace::Terminal; - static constexpr const char* name = "Terminal"; - - static Screens::Screen* Create(AppControllers& controllers) { - return new Screens::WatchFaceTerminal(controllers.dateTimeController, - controllers.batteryController, - controllers.bleController, - controllers.notificationManager, - controllers.settingsController, - controllers.heartRateController, - controllers.motionController); - }; - - static bool IsAvailable(Pinetime::Controllers::FS& /*filesystem*/) { - return true; - } - }; - } -} diff --git a/src/displayapp/screens/settings/SettingTimeFormat.cpp b/src/displayapp/screens/settings/SettingTimeFormat.cpp index 312f4bd2..a89cf216 100644 --- a/src/displayapp/screens/settings/SettingTimeFormat.cpp +++ b/src/displayapp/screens/settings/SettingTimeFormat.cpp @@ -16,7 +16,7 @@ namespace { constexpr std::array options = {{ {Pinetime::Controllers::Settings::ClockType::H12, "12-hour"}, {Pinetime::Controllers::Settings::ClockType::H24, "24-hour"}, - {Pinetime::Controllers::Settings::ClockType::Fuzzy, "Fuzzy"}, + {Pinetime::Controllers::Settings::ClockType::FUZZY, "Fuzzy"}, }}; std::array CreateOptionArray() { diff --git a/src/libs/lv_conf.h b/src/libs/lv_conf.h index cc6cd88d..bcbfcb72 100644 --- a/src/libs/lv_conf.h +++ b/src/libs/lv_conf.h @@ -415,6 +415,7 @@ typedef void* lv_indev_drv_user_data_t; /*Type of user data in the in #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(jetbrains_mono_bold_20) \ LV_FONT_DECLARE(jetbrains_mono_extrabold_compressed) \ + LV_FONT_DECLARE(jetbrains_mono_bold_24) \ LV_FONT_DECLARE(jetbrains_mono_42) \ LV_FONT_DECLARE(jetbrains_mono_76) \ LV_FONT_DECLARE(noto_serif_cjk_20) \