From b16e13f47180a922c097ba2169f58d729a7d990a Mon Sep 17 00:00:00 2001 From: ecarlett Date: Thu, 23 May 2024 11:07:12 +0200 Subject: [PATCH] add WatchFaceInfineatColors that has different color sets than infineat --- doc/palettes.xcf | Bin 0 -> 151003 bytes src/CMakeLists.txt | 3 +- src/components/settings/Settings.h | 7 + src/displayapp/UserApps.h | 1 + src/displayapp/apps/Apps.h.in | 1 + src/displayapp/apps/CMakeLists.txt | 3 +- .../screens/WatchFaceInfineatColors.cpp | 510 ++++++++++++++++++ .../screens/WatchFaceInfineatColors.h | 123 +++++ .../screens/settings/SettingWatchFace.h | 1 + 9 files changed, 647 insertions(+), 2 deletions(-) create mode 100644 doc/palettes.xcf create mode 100644 src/displayapp/screens/WatchFaceInfineatColors.cpp create mode 100644 src/displayapp/screens/WatchFaceInfineatColors.h diff --git a/doc/palettes.xcf b/doc/palettes.xcf new file mode 100644 index 0000000000000000000000000000000000000000..bfad74e04e73ac4ee19c70cfbfa222a5e9d36d36 GIT binary patch literal 151003 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 z wakeUpMode {0}; uint16_t shakeWakeThreshold = 150; diff --git a/src/displayapp/UserApps.h b/src/displayapp/UserApps.h index 67bbfa7d..76ffa684 100644 --- a/src/displayapp/UserApps.h +++ b/src/displayapp/UserApps.h @@ -12,6 +12,7 @@ #include "displayapp/screens/WatchFaceAnalog.h" #include "displayapp/screens/WatchFaceCasioStyleG7710.h" #include "displayapp/screens/WatchFaceInfineat.h" +#include "displayapp/screens/WatchFaceInfineatColors.h" #include "displayapp/screens/WatchFacePineTimeStyle.h" #include "displayapp/screens/WatchFaceTerminal.h" diff --git a/src/displayapp/apps/Apps.h.in b/src/displayapp/apps/Apps.h.in index 2104a267..a591497b 100644 --- a/src/displayapp/apps/Apps.h.in +++ b/src/displayapp/apps/Apps.h.in @@ -51,6 +51,7 @@ namespace Pinetime { PineTimeStyle, Terminal, Infineat, + InfineatColors, CasioStyleG7710, }; diff --git a/src/displayapp/apps/CMakeLists.txt b/src/displayapp/apps/CMakeLists.txt index d7858760..8925b246 100644 --- a/src/displayapp/apps/CMakeLists.txt +++ b/src/displayapp/apps/CMakeLists.txt @@ -26,7 +26,8 @@ else() set(DEFAULT_WATCHFACE_TYPES "${DEFAULT_WATCHFACE_TYPES}, WatchFace::PineTimeStyle") set(DEFAULT_WATCHFACE_TYPES "${DEFAULT_WATCHFACE_TYPES}, WatchFace::Terminal") set(DEFAULT_WATCHFACE_TYPES "${DEFAULT_WATCHFACE_TYPES}, WatchFace::Infineat") - set(DEFAULT_WATCHFACE_TYPES "${DEFAULT_WATCHFACE_TYPES}, WatchFace::CasioStyleG7710") + set(DEFAULT_WATCHFACE_TYPES "${DEFAULT_WATCHFACE_TYPES}, WatchFace::InfineatColors") + #set(DEFAULT_WATCHFACE_TYPES "${DEFAULT_WATCHFACE_TYPES}, WatchFace::CasioStyleG7710") set(WATCHFACE_TYPES "${DEFAULT_WATCHFACE_TYPES}" CACHE STRING "List of watch faces to build into the firmware") endif() diff --git a/src/displayapp/screens/WatchFaceInfineatColors.cpp b/src/displayapp/screens/WatchFaceInfineatColors.cpp new file mode 100644 index 00000000..88241942 --- /dev/null +++ b/src/displayapp/screens/WatchFaceInfineatColors.cpp @@ -0,0 +1,510 @@ +#include "displayapp/screens/WatchFaceInfineatColors.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, + vivid, + pink, + nordGreen, + }; + + constexpr int nColors = 7; // must match number of colors in InfineatColorsColors + + constexpr int nLines = WatchFaceInfineatColors::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), //vert petit triangle le plus haut + LV_COLOR_MAKE(0xac, 0x09, 0xc4), //purple petit triangle bas côté horloge + LV_COLOR_MAKE(0xfe, 0x03, 0x03), //rouge 2 petits triangles à côté de batterie + LV_COLOR_MAKE(0x0d, 0x57, 0xff), //bleu petit triangle le plus bas + LV_COLOR_MAKE(0xff, 0xff, 0xff), + LV_COLOR_MAKE(0xff, 0xff, 0xff), + LV_COLOR_MAKE(0xff, 0xff, 0xff), + LV_COLOR_MAKE(0xe0, 0xb9, 0x00), //jaune gd triangle haut + LV_COLOR_MAKE(0xe8, 0x51, 0x02)}; //orange gd triangle bas + constexpr std::array rainbowVividColors ={LV_COLOR_MAKE(0xa5, 0xeb, 0x64), + LV_COLOR_MAKE(0xfc, 0x42, 0xb5), + LV_COLOR_MAKE(0xe7, 0xc1, 0xff), + LV_COLOR_MAKE(0x11, 0xdf, 0xfa), + LV_COLOR_MAKE(0xff, 0xff, 0xff), + LV_COLOR_MAKE(0xff, 0xff, 0xff), + LV_COLOR_MAKE(0xff, 0xff, 0xff), + LV_COLOR_MAKE(0xff, 0xec, 0x5d), + LV_COLOR_MAKE(0xff, 0x93, 0xaf)}; + + constexpr std::array pinkColors = {LV_COLOR_MAKE(0xff, 0xe5, 0xec), + LV_COLOR_MAKE(0xff, 0xb3, 0xc6), + LV_COLOR_MAKE(0xfb, 0x6f, 0x92), + LV_COLOR_MAKE(0xff, 0xe5, 0xec), + LV_COLOR_MAKE(0xff, 0xff, 0xff), + LV_COLOR_MAKE(0xff, 0xff, 0xff), + LV_COLOR_MAKE(0xff, 0xff, 0xff), + LV_COLOR_MAKE(0xff, 0xc2, 0xd1), + LV_COLOR_MAKE(0xff, 0x8f, 0xab)}; + 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::vivid) { + return &rainbowVividColors; + } + if (color == colors::pink) { + return &pinkColors; + } + return &nordGreenColors; + } +} + +WatchFaceInfineatColors::WatchFaceInfineatColors(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(); +} + +WatchFaceInfineatColors::~WatchFaceInfineatColors() { + 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 WatchFaceInfineatColors::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 WatchFaceInfineatColors::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 WatchFaceInfineatColors::OnButtonPushed() { + if (!lv_obj_get_hidden(btnClose)) { + CloseMenu(); + return true; + } + return false; +} + +void WatchFaceInfineatColors::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 WatchFaceInfineatColors::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 WatchFaceInfineatColors::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 WatchFaceInfineatColors::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 WatchFaceInfineatColors::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/WatchFaceInfineatColors.h b/src/displayapp/screens/WatchFaceInfineatColors.h new file mode 100644 index 00000000..3a164278 --- /dev/null +++ b/src/displayapp/screens/WatchFaceInfineatColors.h @@ -0,0 +1,123 @@ +#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 WatchFaceInfineatColors : public Screen { + public: + static constexpr int nLines = 9; + WatchFaceInfineatColors(Controllers::DateTime& dateTimeController, + const Controllers::Battery& batteryController, + const Controllers::Ble& bleController, + Controllers::NotificationManager& notificationManager, + Controllers::Settings& settingsController, + Controllers::MotionController& motionController, + Controllers::FS& fs); + + ~WatchFaceInfineatColors() 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::InfineatColors; + static constexpr const char* name = "InfineatColors face"; + + static Screens::Screen* Create(AppControllers& controllers) { + return new Screens::WatchFaceInfineatColors(controllers.dateTimeController, + controllers.batteryController, + controllers.bleController, + controllers.notificationManager, + controllers.settingsController, + controllers.motionController, + controllers.filesystem); + }; + + static bool IsAvailable(Pinetime::Controllers::FS& filesystem) { + return Screens::WatchFaceInfineatColors::IsAvailable(filesystem); + } + }; + } +} diff --git a/src/displayapp/screens/settings/SettingWatchFace.h b/src/displayapp/screens/settings/SettingWatchFace.h index 4c75b0ab..1ff03e22 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.h +++ b/src/displayapp/screens/settings/SettingWatchFace.h @@ -10,6 +10,7 @@ #include "displayapp/screens/Symbols.h" #include "displayapp/screens/CheckboxList.h" #include "displayapp/screens/WatchFaceInfineat.h" +#include "displayapp/screens/WatchFaceInfineatColors.h" #include "displayapp/screens/WatchFaceCasioStyleG7710.h" namespace Pinetime {