From 7b3c48a0e52276b87f6328e74b7a86f692e16c7f Mon Sep 17 00:00:00 2001 From: Will Bradley Date: Tue, 9 Jan 2024 20:31:25 -0800 Subject: [PATCH] Add fancy font and fuzzy logic --- .github/workflows/main.yml | 2 +- src/CMakeLists.txt | 6 +- src/displayapp/UserApps.h | 6 +- src/displayapp/apps/Apps.h.in | 8 +- src/displayapp/apps/CMakeLists.txt | 6 +- src/displayapp/fonts/fonts.json | 5 +- .../screens/WatchFaceCasioStyleG7710.cpp | 334 ------------ .../screens/WatchFaceCasioStyleG7710.h | 127 ----- src/displayapp/screens/WatchFaceDigital.cpp | 105 ++-- src/displayapp/screens/WatchFaceDigital.h | 7 +- src/displayapp/screens/WatchFaceInfineat.cpp | 508 ------------------ src/displayapp/screens/WatchFaceInfineat.h | 124 ----- src/displayapp/screens/WatchFaceTerminal.cpp | 151 ------ src/displayapp/screens/WatchFaceTerminal.h | 93 ---- .../screens/settings/SettingWatchFace.h | 4 +- 15 files changed, 64 insertions(+), 1422 deletions(-) delete mode 100644 src/displayapp/screens/WatchFaceCasioStyleG7710.cpp delete mode 100644 src/displayapp/screens/WatchFaceCasioStyleG7710.h delete mode 100644 src/displayapp/screens/WatchFaceInfineat.cpp delete mode 100644 src/displayapp/screens/WatchFaceInfineat.h delete mode 100644 src/displayapp/screens/WatchFaceTerminal.cpp delete mode 100644 src/displayapp/screens/WatchFaceTerminal.h diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0ae1825b..ce8240d4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,7 +3,7 @@ name: CI # Run this workflow whenever the build may be affected on: push: - branches: [ main, wb/fuzzy, wb/fuzzy-norm, wb/fuzzy-analog ] + branches: [ main, wb/fuzzy, wb/fuzzy-norm, wb/fuzzy-analog, wb/fuzzy-everything-wolf ] paths-ignore: - 'doc/**' - '**.md' diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2efa7997..bed76ffd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -425,10 +425,10 @@ list(APPEND SOURCE_FILES ## Watch faces displayapp/screens/WatchFaceAnalog.cpp displayapp/screens/WatchFaceDigital.cpp - displayapp/screens/WatchFaceInfineat.cpp - displayapp/screens/WatchFaceTerminal.cpp + #displayapp/screens/WatchFaceInfineat.cpp + #displayapp/screens/WatchFaceTerminal.cpp displayapp/screens/WatchFacePineTimeStyle.cpp - displayapp/screens/WatchFaceCasioStyleG7710.cpp + #displayapp/screens/WatchFaceCasioStyleG7710.cpp ## diff --git a/src/displayapp/UserApps.h b/src/displayapp/UserApps.h index 0307035a..3523cd81 100644 --- a/src/displayapp/UserApps.h +++ b/src/displayapp/UserApps.h @@ -9,10 +9,10 @@ #include "displayapp/screens/ApplicationList.h" #include "displayapp/screens/WatchFaceDigital.h" #include "displayapp/screens/WatchFaceAnalog.h" -#include "displayapp/screens/WatchFaceCasioStyleG7710.h" -#include "displayapp/screens/WatchFaceInfineat.h" +// #include "displayapp/screens/WatchFaceCasioStyleG7710.h" +// #include "displayapp/screens/WatchFaceInfineat.h" #include "displayapp/screens/WatchFacePineTimeStyle.h" -#include "displayapp/screens/WatchFaceTerminal.h" +// #include "displayapp/screens/WatchFaceTerminal.h" namespace Pinetime { namespace Applications { diff --git a/src/displayapp/apps/Apps.h.in b/src/displayapp/apps/Apps.h.in index a5e60c80..2bd82d5c 100644 --- a/src/displayapp/apps/Apps.h.in +++ b/src/displayapp/apps/Apps.h.in @@ -49,9 +49,6 @@ namespace Pinetime { Digital, Analog, PineTimeStyle, - Terminal, - Infineat, - CasioStyleG7710, }; template @@ -74,10 +71,7 @@ namespace Pinetime { using UserWatchFaceTypes = WatchFaceTypeList; + WatchFace::PineTimeStyle>; static_assert(UserWatchFaceTypes::Count >= 1); } diff --git a/src/displayapp/apps/CMakeLists.txt b/src/displayapp/apps/CMakeLists.txt index f2001a5e..076b02d0 100644 --- a/src/displayapp/apps/CMakeLists.txt +++ b/src/displayapp/apps/CMakeLists.txt @@ -1,10 +1,8 @@ if(DEFINED ENABLE_USERAPPS) set(USERAPP_TYPES ${ENABLE_USERAPPS} CACHE STRING "List of user apps to build into the firmware") else () - set(USERAPP_TYPES "Apps::Navigation, Apps::StopWatch, Apps::Alarm, Apps::Timer, Apps::Steps, Apps::HeartRate, Apps::Music, Apps::Twos" CACHE STRING "List of user apps to build into the firmware") - #Apps::Paint, - #Apps::Metronome, - #Apps::Paddle, + set(USERAPP_TYPES "Apps::Navigation, Apps::Alarm, Apps::Steps, Apps::HeartRate, Apps::Music, Apps::Twos" CACHE STRING "List of user apps to build into the firmware") + #Apps::Paint, Apps::Metronome, Apps::Paddle, Apps::StopWatch, Apps::Timer, endif () add_library(infinitime_apps INTERFACE) diff --git a/src/displayapp/fonts/fonts.json b/src/displayapp/fonts/fonts.json index 00c3cd85..9d90cb5d 100644 --- a/src/displayapp/fonts/fonts.json +++ b/src/displayapp/fonts/fonts.json @@ -17,12 +17,13 @@ "jetbrains_mono_42": { "sources": [ { - "file": "JetBrainsMono-Regular.ttf", + "disabledfile": "JetBrainsMono-Regular.ttf", + "file": "Vulf Mono Light Italic.ttf", "range": "0x20, 0x25, 0x27, 0x2b, 0x2d, 0x30-0x3a, 0x4b-0x4d, 0x61-0x7a" } ], "bpp": 1, - "size": 42 + "size": 30 }, "jetbrains_mono_76": { "sources": [ diff --git a/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp b/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp deleted file mode 100644 index 72bfaaa3..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 f10e931c..00000000 --- a/src/displayapp/screens/WatchFaceCasioStyleG7710.h +++ /dev/null @@ -1,127 +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 {}; - using days = std::chrono::duration>; // TODO: days is standard in c++20 - 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 index f8d9a314..e97b3eb2 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -38,21 +38,9 @@ WatchFaceDigital::WatchFaceDigital(Controllers::DateTime& dateTimeController, lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0); 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_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0); - if (settingsController.GetClockType() == Controllers::Settings::ClockType::Fuzzy) { - lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); - lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42); - } else if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { - lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0); - lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed); - } else { - lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); - lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed); - } label_time_ampm = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text_static(label_time_ampm, ""); @@ -107,31 +95,13 @@ void WatchFaceDigital::Refresh() { sHour = hour; sMinute = minute; - /* Begin difference from WatchFaceDigital*/ if (settingsController.GetClockType() == Controllers::Settings::ClockType::Fuzzy) { - std::string hourStr, timeStr; - hour = hour % 12; // 12 becomes 0, 13 becomes 1 - auto sector = minute / 15 + (minute % 15 > 7); - // advance the hour modulo 12 and reset the minutes if we're close to the top - // so we get "quarter to $hour+1" instead of needing "three quarters past $hour" - if (sector > 3) { - hour = (hour + 1) % 12; - sector = 0; - } - - timeStr = timeSectors[sector]; - if (timeStr.find("%1") != std::string::npos) { - hour = (hour + 1) % 12; - } - //hourStr = std::string("#") + timeAccent + " " + hourNames[hour] + "#"; - hourStr = hourNames[hour]; - timeStr.replace(timeStr.find("%"), 2, hourStr); - + printTimeWords(static_cast(hour), static_cast(minute)); lv_label_set_text(label_time_ampm, ""); - lv_label_set_text(label_time, timeStr.c_str()); - lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, -10); + lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -10); lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42); - /* End difference from WatchFaceDigital*/ + lv_label_set_recolor(label_time, true); + lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 60); } else if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { char ampmChar[3] = "AM"; if (hour == 0) { @@ -146,12 +116,15 @@ void WatchFaceDigital::Refresh() { 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); lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed); + lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); } 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); lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed); + lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); } lv_obj_realign(label_time); + lv_obj_realign(label_date); } currentDate = std::chrono::time_point_cast(currentDateTime.Get()); @@ -216,30 +189,40 @@ bool WatchFaceDigital::OnTouchEvent(Pinetime::Applications::TouchEvents event) { return false; } -/* Inspired by XFCE4-panel's fuzzy clock. - * - * https://salsa.debian.org/xfce-team/desktop/xfce4-panel/-/blob/debian/master/plugins/clock/clock-fuzzy.c - * - * Strings contain either a `%0` or a `%1`, indicating the position of - * the `hour` or `hour+1`, respectively. - */ -const char* WatchFaceDigital::timeSectors[] = { - "%0\no'clock", - "quarter\npast\n%0", - "half past\n%0", - "quarter\nto %1", - }; -const char* WatchFaceDigital::hourNames[] = { - "twelve", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "ten", - "eleven", -}; \ No newline at end of file + +char const* twelve = "twelve"; + +void WatchFaceDigital::printTimeWords(int h, int m) { + const char* mod; + char const* accent = "#808080"; + char const* color = "#ffffff"; + char const* oclock = "o' clock"; + char const* past = "past"; + char const* to = "to"; + char const* hash = "#"; + char const* nearly = "nearly"; + char const* fmt = "%s %s%s\n%s %s%s %s %s%s"; + + if (m <= 30) { + mod = mods[m / 5]; + } else { + mod = mods[(60-m) / 5]; + } + h = (h % 12); + + if (m >= 56) { + lv_label_set_text_fmt(label_time, "%s %s %s%s\n%s %s%s", color, nearly, nums[(h+1) % 12], hash, accent, oclock, hash); + } + else if (m == 0 || m <= 4) { + lv_label_set_text_fmt(label_time, "%s %s%s\n%s %s%s", color, nums[h], hash, accent, oclock, hash); + } + + else if (m <= 32) { + lv_label_set_text_fmt(label_time, fmt, color, mod, hash, accent, past, hash, color, nums[h], hash); + } + + else if (m > 32) { + lv_label_set_text_fmt(label_time, fmt, color, mod, hash, accent, to, hash, color, nums[(h+1) % 12], hash); + } + +} \ No newline at end of file diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index bfb50562..a33ce884 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -42,8 +42,9 @@ namespace Pinetime { uint8_t sHour, sMinute; uint8_t displayedHour = -1; uint8_t displayedMinute = -1; - static const char* timeSectors[4]; - static const char* hourNames[12]; + + char const* mods[7] = {"", "five", "ten", "quarter", "twenty", "twenty five", "half"}; + char const* nums[13] = {"twelve", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve"}; Utility::DirtyValue batteryPercentRemaining {}; Utility::DirtyValue powerPresent {}; @@ -75,6 +76,8 @@ namespace Pinetime { lv_task_t* taskRefresh; bool forceRefresh=false; Widgets::StatusIcons statusIcons; + + void printTimeWords(int h, int m); }; } diff --git a/src/displayapp/screens/WatchFaceInfineat.cpp b/src/displayapp/screens/WatchFaceInfineat.cpp deleted file mode 100644 index 3308303d..00000000 --- a/src/displayapp/screens/WatchFaceInfineat.cpp +++ /dev/null @@ -1,508 +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(); - lv_label_set_text_fmt(labelDate, "%s %02d", dateTimeController.DayOfWeekShortToStringLow(), 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 32c08f18..00000000 --- a/src/displayapp/screens/WatchFaceInfineat.h +++ /dev/null @@ -1,124 +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 {}; - using days = std::chrono::duration>; // TODO: days is standard in c++20 - 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/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp deleted file mode 100644 index 72383729..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 ce22005f..00000000 --- a/src/displayapp/screens/WatchFaceTerminal.h +++ /dev/null @@ -1,93 +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 {}; - using days = std::chrono::duration>; // TODO: days is standard in c++20 - 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/SettingWatchFace.h b/src/displayapp/screens/settings/SettingWatchFace.h index 66559c73..fa369ecb 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.h +++ b/src/displayapp/screens/settings/SettingWatchFace.h @@ -9,8 +9,8 @@ #include "displayapp/screens/Screen.h" #include "displayapp/screens/Symbols.h" #include "displayapp/screens/CheckboxList.h" -#include "displayapp/screens/WatchFaceInfineat.h" -#include "displayapp/screens/WatchFaceCasioStyleG7710.h" +// #include "displayapp/screens/WatchFaceInfineat.h" +// #include "displayapp/screens/WatchFaceCasioStyleG7710.h" namespace Pinetime {