From 319030d9e16e833cf8bff569a9ecfa452165ea27 Mon Sep 17 00:00:00 2001 From: "James A. Jerkins" Date: Thu, 23 Dec 2021 20:30:14 -0600 Subject: [PATCH 01/53] Add airplane mode feature Implements 'Airplane mode' feature to disable and enable bluetooth/ble Adds airplaneMode as a non-persisted setting Adds a setting menu for switching airplane mode on and off Displays an airplane symbol on the Digital watch face and the PineTimeStyle watch face when airplane mode is enabled Always enables bluetooth/ble on boot (disable airplane mode) Alphabetizes the settings menu options Style cleanups Closes #632 --- src/CMakeLists.txt | 1 + src/components/ble/BleController.cpp | 8 +- src/components/ble/BleController.h | 9 +- src/components/ble/NimbleController.cpp | 44 ++++++--- src/components/ble/NimbleController.h | 28 +++--- src/components/settings/Settings.h | 39 +++++++- src/displayapp/Apps.h | 3 +- src/displayapp/DisplayApp.cpp | 8 ++ src/displayapp/Messages.h | 3 +- src/displayapp/fonts/README.md | 2 +- src/displayapp/fonts/jetbrains_mono_bold_20.c | 74 ++++++++------- src/displayapp/screens/BleIcon.cpp | 10 ++- src/displayapp/screens/BleIcon.h | 6 +- src/displayapp/screens/PineTimeStyle.cpp | 6 +- src/displayapp/screens/PineTimeStyle.h | 7 +- src/displayapp/screens/Symbols.h | 1 + src/displayapp/screens/WatchFaceDigital.cpp | 2 +- src/displayapp/screens/WatchFaceDigital.h | 7 +- .../screens/settings/SettingAirplaneMode.cpp | 89 +++++++++++++++++++ .../screens/settings/SettingAirplaneMode.h | 30 +++++++ src/displayapp/screens/settings/Settings.cpp | 22 ++--- src/systemtask/Messages.h | 1 + src/systemtask/SystemTask.cpp | 6 +- 23 files changed, 307 insertions(+), 99 deletions(-) create mode 100644 src/displayapp/screens/settings/SettingAirplaneMode.cpp create mode 100644 src/displayapp/screens/settings/SettingAirplaneMode.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 809544c9..ae8eece8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -448,6 +448,7 @@ list(APPEND SOURCE_FILES displayapp/screens/settings/SettingPineTimeStyle.cpp displayapp/screens/settings/SettingSetDate.cpp displayapp/screens/settings/SettingSetTime.cpp + displayapp/screens/settings/SettingAirplaneMode.cpp ## Watch faces displayapp/icons/bg_clock.c diff --git a/src/components/ble/BleController.cpp b/src/components/ble/BleController.cpp index a80c9719..0e1c5d7e 100644 --- a/src/components/ble/BleController.cpp +++ b/src/components/ble/BleController.cpp @@ -2,12 +2,12 @@ using namespace Pinetime::Controllers; -void Ble::Connect() { - isConnected = true; +void Ble::SetConnectState(Ble::ConnectStates newState) { + connectionState = newState; } -void Ble::Disconnect() { - isConnected = false; +Ble::ConnectStates Ble::GetConnectState() const { + return connectionState; } void Ble::StartFirmwareUpdate() { diff --git a/src/components/ble/BleController.h b/src/components/ble/BleController.h index 72b87663..2714c0c3 100644 --- a/src/components/ble/BleController.h +++ b/src/components/ble/BleController.h @@ -10,13 +10,14 @@ namespace Pinetime { using BleAddress = std::array; enum class FirmwareUpdateStates { Idle, Running, Validated, Error }; enum class AddressTypes { Public, Random, RPA_Public, RPA_Random }; + enum class ConnectStates { Disconnected, Connected, Airplane }; Ble() = default; bool IsConnected() const { - return isConnected; + return (connectionState == ConnectStates::Connected); } - void Connect(); - void Disconnect(); + void SetConnectState(ConnectStates newState); + ConnectStates GetConnectState() const; void StartFirmwareUpdate(); void StopFirmwareUpdate(); @@ -56,7 +57,7 @@ namespace Pinetime { } private: - bool isConnected = false; + ConnectStates connectionState = ConnectStates::Disconnected; bool isFirmwareUpdating = false; uint32_t firmwareUpdateTotalBytes = 0; uint32_t firmwareUpdateCurrentBytes = 0; diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp index d8510bd3..d85ec5dc 100644 --- a/src/components/ble/NimbleController.cpp +++ b/src/components/ble/NimbleController.cpp @@ -23,14 +23,14 @@ using namespace Pinetime::Controllers; NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask, - Pinetime::Controllers::Ble& bleController, + Ble& bleController, DateTime& dateTimeController, - Pinetime::Controllers::NotificationManager& notificationManager, - Controllers::Battery& batteryController, + NotificationManager& notificationManager, + Battery& batteryController, Pinetime::Drivers::SpiNorFlash& spiNorFlash, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController, - Controllers::FS& fs) + HeartRateController& heartRateController, + MotionController& motionController, + FS& fs) : systemTask {systemTask}, bleController {bleController}, dateTimeController {dateTimeController}, @@ -184,7 +184,9 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { case BLE_GAP_EVENT_ADV_COMPLETE: NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_ADV_COMPLETE"); NRF_LOG_INFO("reason=%d; status=%0X", event->adv_complete.reason, event->connect.status); - StartAdvertising(); + if (bleController.GetConnectState() == Ble::ConnectStates::Disconnected) { + StartAdvertising(); + } break; case BLE_GAP_EVENT_CONNECT: @@ -197,12 +199,12 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { currentTimeClient.Reset(); alertNotificationClient.Reset(); connectionHandle = BLE_HS_CONN_HANDLE_NONE; - bleController.Disconnect(); + bleController.SetConnectState(Ble::ConnectStates::Disconnected); fastAdvCount = 0; StartAdvertising(); } else { connectionHandle = event->connect.conn_handle; - bleController.Connect(); + bleController.SetConnectState(Ble::ConnectStates::Connected); systemTask.PushMessage(Pinetime::System::Messages::BleConnected); // Service discovery is deferred via systemtask } @@ -220,9 +222,11 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { currentTimeClient.Reset(); alertNotificationClient.Reset(); connectionHandle = BLE_HS_CONN_HANDLE_NONE; - bleController.Disconnect(); - fastAdvCount = 0; - StartAdvertising(); + if (bleController.GetConnectState() == Ble::ConnectStates::Connected) { + bleController.SetConnectState(Ble::ConnectStates::Disconnected); + fastAdvCount = 0; + StartAdvertising(); + } break; case BLE_GAP_EVENT_CONN_UPDATE: @@ -376,6 +380,22 @@ void NimbleController::NotifyBatteryLevel(uint8_t level) { } } +void NimbleController::SwitchAirplaneMode(bool enabled) { + if (enabled) { + if (bleController.IsConnected()) { + bleController.SetConnectState(Ble::ConnectStates::Airplane); + ble_gap_terminate(connectionHandle, BLE_ERR_REM_USER_CONN_TERM); + } else { + bleController.SetConnectState(Ble::ConnectStates::Airplane); + ble_gap_adv_stop(); + } + } else { + bleController.SetConnectState(Ble::ConnectStates::Disconnected); + fastAdvCount = 0; + StartAdvertising(); + } +} + void NimbleController::PersistBond(struct ble_gap_conn_desc& desc) { union ble_store_key key; union ble_store_value our_sec, peer_sec, peer_cccd_set[MYNEWT_VAL(BLE_STORE_MAX_CCCDS)] = {0}; diff --git a/src/components/ble/NimbleController.h b/src/components/ble/NimbleController.h index 2b300e63..7219ba6b 100644 --- a/src/components/ble/NimbleController.h +++ b/src/components/ble/NimbleController.h @@ -14,6 +14,7 @@ #include "components/ble/CurrentTimeService.h" #include "components/ble/DeviceInformationService.h" #include "components/ble/DfuService.h" +#include "components/ble/FSService.h" #include "components/ble/HeartRateService.h" #include "components/ble/ImmediateAlertService.h" #include "components/ble/MusicService.h" @@ -22,7 +23,6 @@ #include "components/ble/MotionService.h" #include "components/ble/weather/WeatherService.h" #include "components/fs/FS.h" -#include "components/ble/FSService.h" namespace Pinetime { namespace Drivers { @@ -42,18 +42,19 @@ namespace Pinetime { public: NimbleController(Pinetime::System::SystemTask& systemTask, - Pinetime::Controllers::Ble& bleController, + Ble& bleController, DateTime& dateTimeController, - Pinetime::Controllers::NotificationManager& notificationManager, - Controllers::Battery& batteryController, + NotificationManager& notificationManager, + Battery& batteryController, Pinetime::Drivers::SpiNorFlash& spiNorFlash, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController, - Pinetime::Controllers::FS& fs); + HeartRateController& heartRateController, + MotionController& motionController, + FS& fs); void Init(); void StartAdvertising(); int OnGAPEvent(ble_gap_event* event); + /* these are not implemented yet int OnDiscoveryEvent(uint16_t i, const ble_gatt_error* pError, const ble_gatt_svc* pSvc); int OnCTSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic); int OnANSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic); @@ -62,6 +63,7 @@ namespace Pinetime { const ble_gatt_error* error, uint16_t characteristicValueHandle, const ble_gatt_dsc* descriptor); + */ void StartDiscovery(); @@ -83,7 +85,9 @@ namespace Pinetime { void RestartFastAdv() { fastAdvCount = 0; - } + }; + + void SwitchAirplaneMode(bool enabled); private: void PersistBond(struct ble_gap_conn_desc& desc); @@ -91,12 +95,12 @@ namespace Pinetime { static constexpr const char* deviceName = "InfiniTime"; Pinetime::System::SystemTask& systemTask; - Pinetime::Controllers::Ble& bleController; + Ble& bleController; DateTime& dateTimeController; - Pinetime::Controllers::NotificationManager& notificationManager; + NotificationManager& notificationManager; Pinetime::Drivers::SpiNorFlash& spiNorFlash; - Pinetime::Controllers::FS& fs; - Pinetime::Controllers::DfuService dfuService; + FS& fs; + DfuService dfuService; DeviceInformationService deviceInformationService; CurrentTimeClient currentTimeClient; diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 2d7973d8..a1529fec 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -17,7 +17,23 @@ namespace Pinetime { RaiseWrist = 2, }; enum class Colors : uint8_t { - White, Silver, Gray, Black, Red, Maroon, Yellow, Olive, Lime, Green, Cyan, Teal, Blue, Navy, Magenta, Purple, Orange + White, + Silver, + Gray, + Black, + Red, + Maroon, + Yellow, + Olive, + Lime, + Green, + Cyan, + Teal, + Blue, + Navy, + Magenta, + Purple, + Orange }; struct PineTimeStyle { Colors ColorTime = Colors::Teal; @@ -146,18 +162,29 @@ namespace Pinetime { } settings.brightLevel = level; }; + Controllers::BrightnessController::Levels GetBrightness() const { return settings.brightLevel; }; - void SetStepsGoal( uint32_t goal ) { - if ( goal != settings.stepsGoal ) { + void SetStepsGoal(uint32_t goal) { + if (goal != settings.stepsGoal) { settingsChanged = true; } settings.stepsGoal = goal; }; - uint32_t GetStepsGoal() const { return settings.stepsGoal; }; + uint32_t GetStepsGoal() const { + return settings.stepsGoal; + }; + + void SetAirplaneMode(bool mode) { + airplaneMode = mode; + }; + + bool GetAirplaneMode() const { + return airplaneMode; + }; private: Pinetime::Controllers::FS& fs; @@ -185,6 +212,10 @@ namespace Pinetime { uint8_t appMenu = 0; uint8_t settingsMenu = 0; + /* airplaneMode is intentionally not saved with the other watch settings and initialized + * to off (false) on every boot because we always want ble to be enabled on startup + */ + bool airplaneMode = false; void LoadSettingsFromFile(); void SaveSettingsToFile(); diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h index b2f55ccd..971c36b7 100644 --- a/src/displayapp/Apps.h +++ b/src/displayapp/Apps.h @@ -37,7 +37,8 @@ namespace Pinetime { SettingPineTimeStyle, SettingSetDate, SettingSetTime, - Error, + SettingAirplaneMode, + Error }; } } diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 233f433d..d3896b18 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -48,6 +48,7 @@ #include "displayapp/screens/settings/SettingPineTimeStyle.h" #include "displayapp/screens/settings/SettingSetDate.h" #include "displayapp/screens/settings/SettingSetTime.h" +#include "displayapp/screens/settings/SettingAirplaneMode.h" #include "libs/lv_conf.h" @@ -289,6 +290,9 @@ void DisplayApp::Refresh() { case Messages::BleFirmwareUpdateStarted: LoadApp(Apps::FirmwareUpdate, DisplayApp::FullRefreshDirections::Down); break; + case Messages::AirplaneModeToggle: + PushMessageToSystemTask(System::Messages::AirplaneModeToggle); + break; case Messages::UpdateDateTime: // Added to remove warning // What should happen here? @@ -420,6 +424,10 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) currentScreen = std::make_unique(this, settingsController); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; + case Apps::SettingAirplaneMode: + currentScreen = std::make_unique(this, settingsController); + ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; case Apps::BatteryInfo: currentScreen = std::make_unique(this, batteryController); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); diff --git a/src/displayapp/Messages.h b/src/displayapp/Messages.h index b22d6c3c..4d52df20 100644 --- a/src/displayapp/Messages.h +++ b/src/displayapp/Messages.h @@ -20,7 +20,8 @@ namespace Pinetime { DimScreen, RestoreBrightness, ShowPairingKey, - AlarmTriggered + AlarmTriggered, + AirplaneModeToggle }; } } diff --git a/src/displayapp/fonts/README.md b/src/displayapp/fonts/README.md index 8a260846..40ecd3e2 100644 --- a/src/displayapp/fonts/README.md +++ b/src/displayapp/fonts/README.md @@ -13,7 +13,7 @@ * Do not enable font compression and horizontal subpixel hinting * Load the file `JetBrainsMono-Bold.tff` (use the file in this repo to ensure the version matches) and specify the following range : `0x20-0x7f, 0x410-0x44f` * Add a 2nd font, load the file `FontAwesome5-Solid+Brands+Regular.woff` and specify the following - range : `0xf293, 0xf294, 0xf244, 0xf240, 0xf242, 0xf243, 0xf241, 0xf54b, 0xf21e, 0xf1e6, 0xf54b, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf069, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf029, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf201, 0xf06e, 0xf015` + range : `0xf293, 0xf294, 0xf244, 0xf240, 0xf242, 0xf243, 0xf241, 0xf54b, 0xf21e, 0xf1e6, 0xf54b, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf069, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf029, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf201, 0xf06e, 0xf015, 0xf072` * Click on Convert, and download the file `jetbrains_mono_bold_20.c` and copy it in `src/DisplayApp/Fonts` * Add the font .c file path to src/CMakeLists.txt * Add an LV_FONT_DECLARE line in src/libs/lv_conf.h diff --git a/src/displayapp/fonts/jetbrains_mono_bold_20.c b/src/displayapp/fonts/jetbrains_mono_bold_20.c index d8705528..944e47a1 100644 --- a/src/displayapp/fonts/jetbrains_mono_bold_20.c +++ b/src/displayapp/fonts/jetbrains_mono_bold_20.c @@ -840,6 +840,16 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf8, 0xf, 0x80, 0xf8, 0x3e, 0x0, 0xff, 0xf0, 0x0, 0x3f, 0x80, 0x0, + /* U+F072 "" */ + 0x1, 0xc0, 0x0, 0x7, 0xc0, 0x0, 0x7, 0x80, + 0x0, 0xf, 0x80, 0x0, 0x1f, 0x0, 0x0, 0x1f, + 0x0, 0x38, 0x3e, 0x0, 0x78, 0x7e, 0x0, 0x7f, + 0xff, 0xe0, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xe7, 0xff, 0xff, 0xdf, 0xff, 0xfc, + 0x3c, 0x3f, 0x0, 0x70, 0x7c, 0x0, 0x1, 0xf0, + 0x0, 0x3, 0xe0, 0x0, 0x7, 0x80, 0x0, 0xf, + 0x0, 0x0, 0x1c, 0x0, 0x0, + /* U+F095 "" */ 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x7, 0xf0, 0x0, 0x7f, 0x0, 0x7, 0xf0, 0x0, 0xff, 0x0, @@ -1220,31 +1230,32 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 3028, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, {.bitmap_index = 3056, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 3104, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3148, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3201, .adv_w = 120, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3220, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3270, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3306, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3354, .adv_w = 320, .box_w = 21, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3394, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3437, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3475, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3513, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3551, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3589, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3627, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3663, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3701, .adv_w = 200, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3730, .adv_w = 280, .box_w = 16, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 3768, .adv_w = 400, .box_w = 25, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3834, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3883, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3933, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3993, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4046, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4107, .adv_w = 360, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4162, .adv_w = 360, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4215, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0} + {.bitmap_index = 3148, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3209, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3262, .adv_w = 120, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3281, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3331, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3367, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3415, .adv_w = 320, .box_w = 21, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3455, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3498, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3536, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3574, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3612, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3650, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3688, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3724, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3762, .adv_w = 200, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3791, .adv_w = 280, .box_w = 16, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3829, .adv_w = 400, .box_w = 25, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3895, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3944, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3994, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4054, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4107, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4168, .adv_w = 360, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4223, .adv_w = 360, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4276, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0} }; /*--------------------- @@ -1253,10 +1264,11 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { static const uint16_t unicode_list_2[] = { 0x0, 0x14, 0x16, 0x23, 0x26, 0x27, 0x28, 0x39, - 0x47, 0x4a, 0x4b, 0x4c, 0x50, 0x68, 0x6d, 0x94, - 0x128, 0x184, 0x1e5, 0x1fb, 0x200, 0x21d, 0x23f, 0x240, - 0x241, 0x242, 0x243, 0x251, 0x292, 0x293, 0x2f1, 0x3dc, - 0x3fc, 0x45c, 0x54a, 0x55f, 0x568, 0x59e, 0x59f, 0x6a8 + 0x47, 0x4a, 0x4b, 0x4c, 0x50, 0x68, 0x6d, 0x71, + 0x94, 0x128, 0x184, 0x1e5, 0x1fb, 0x200, 0x21d, 0x23f, + 0x240, 0x241, 0x242, 0x243, 0x251, 0x292, 0x293, 0x2f1, + 0x3dc, 0x3fc, 0x45c, 0x54a, 0x55f, 0x568, 0x59e, 0x59f, + 0x6a8 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -1272,7 +1284,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 61441, .range_length = 1705, .glyph_id_start = 160, - .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 40, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 41, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; @@ -1321,7 +1333,7 @@ lv_font_t jetbrains_mono_bold_20 = { #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) .subpx = LV_FONT_SUBPX_NONE, #endif -#if LV_VERSION_CHECK(7, 4, 0) +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 .underline_position = -3, .underline_thickness = 1, #endif diff --git a/src/displayapp/screens/BleIcon.cpp b/src/displayapp/screens/BleIcon.cpp index 5058f3eb..a30d23bd 100644 --- a/src/displayapp/screens/BleIcon.cpp +++ b/src/displayapp/screens/BleIcon.cpp @@ -2,9 +2,11 @@ #include "displayapp/screens/Symbols.h" using namespace Pinetime::Applications::Screens; -const char* BleIcon::GetIcon(bool isConnected) { - if (isConnected) +const char* BleIcon::GetIcon(Pinetime::Controllers::Ble::ConnectStates state) { + if (state == Pinetime::Controllers::Ble::ConnectStates::Connected) return Symbols::bluetooth; + else if (state == Pinetime::Controllers::Ble::ConnectStates::Airplane) + return Symbols::airplane; else - return ""; -} \ No newline at end of file + return Symbols::none; +} diff --git a/src/displayapp/screens/BleIcon.h b/src/displayapp/screens/BleIcon.h index c1398d2a..d7410eae 100644 --- a/src/displayapp/screens/BleIcon.h +++ b/src/displayapp/screens/BleIcon.h @@ -1,12 +1,14 @@ #pragma once +#include "components/ble/BleController.h" + namespace Pinetime { namespace Applications { namespace Screens { class BleIcon { public: - static const char* GetIcon(bool isConnected); + static const char* GetIcon(Pinetime::Controllers::Ble::ConnectStates state); }; } } -} \ No newline at end of file +} diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp index d4368691..e7b1f393 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/PineTimeStyle.cpp @@ -208,10 +208,10 @@ void PineTimeStyle::SetBatteryIcon() { } void PineTimeStyle::AlignIcons() { - if (notificationState.Get() && bleState.Get()) { + if (notificationState.Get() && bleState.Get() != Pinetime::Controllers::Ble::ConnectStates::Disconnected) { lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 8, 25); lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, -8, 25); - } else if (notificationState.Get() && !bleState.Get()) { + } else if (notificationState.Get() && bleState.Get() == Pinetime::Controllers::Ble::ConnectStates::Disconnected) { lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25); } else { lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25); @@ -234,7 +234,7 @@ void PineTimeStyle::Refresh() { } } - bleState = bleController.IsConnected(); + bleState = bleController.GetConnectState(); if (bleState.IsUpdated()) { lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get())); AlignIcons(); diff --git a/src/displayapp/screens/PineTimeStyle.h b/src/displayapp/screens/PineTimeStyle.h index 8382c53c..c5136fc2 100644 --- a/src/displayapp/screens/PineTimeStyle.h +++ b/src/displayapp/screens/PineTimeStyle.h @@ -6,6 +6,7 @@ #include #include "displayapp/screens/Screen.h" #include "components/datetime/DateTimeController.h" +#include "components/ble/BleController.h" namespace Pinetime { namespace Controllers { @@ -36,13 +37,13 @@ namespace Pinetime { char displayedChar[5]; uint16_t currentYear = 1970; - Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; - Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; + Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; uint8_t currentDay = 0; DirtyValue batteryPercentRemaining {}; DirtyValue isCharging {}; - DirtyValue bleState {}; + DirtyValue bleState {}; DirtyValue> currentDateTime {}; DirtyValue motionSensorOk {}; DirtyValue stepCount {}; diff --git a/src/displayapp/screens/Symbols.h b/src/displayapp/screens/Symbols.h index e68a7af6..5ba8f953 100644 --- a/src/displayapp/screens/Symbols.h +++ b/src/displayapp/screens/Symbols.h @@ -44,6 +44,7 @@ namespace Pinetime { static constexpr const char* chartLine = "\xEF\x88\x81"; static constexpr const char* eye = "\xEF\x81\xAE"; static constexpr const char* home = "\xEF\x80\x95"; + static constexpr const char* airplane = "\xEF\x81\xB2"; // lv_font_sys_48.c static constexpr const char* settings = "\xEE\xA4\x82"; // e902 diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 87695793..8f06553f 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -119,7 +119,7 @@ void WatchFaceDigital::Refresh() { lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); } - bleState = bleController.IsConnected(); + bleState = bleController.GetConnectState(); if (bleState.IsUpdated()) { lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get())); } diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 627154c8..addb539a 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -6,6 +6,7 @@ #include #include "displayapp/screens/Screen.h" #include "components/datetime/DateTimeController.h" +#include "components/ble/BleController.h" namespace Pinetime { namespace Controllers { @@ -38,13 +39,13 @@ namespace Pinetime { char displayedChar[5] {}; uint16_t currentYear = 1970; - Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; - Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; + Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; uint8_t currentDay = 0; DirtyValue batteryPercentRemaining {}; DirtyValue powerPresent {}; - DirtyValue bleState {}; + DirtyValue bleState {}; DirtyValue> currentDateTime {}; DirtyValue motionSensorOk {}; DirtyValue stepCount {}; diff --git a/src/displayapp/screens/settings/SettingAirplaneMode.cpp b/src/displayapp/screens/settings/SettingAirplaneMode.cpp new file mode 100644 index 00000000..0a364ded --- /dev/null +++ b/src/displayapp/screens/settings/SettingAirplaneMode.cpp @@ -0,0 +1,89 @@ +#include "displayapp/screens/settings/SettingAirplaneMode.h" +#include +#include "displayapp/DisplayApp.h" +#include "displayapp/Messages.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + static void event_handler(lv_obj_t* obj, lv_event_t event) { + SettingAirplaneMode* screen = static_cast(obj->user_data); + screen->UpdateSelected(obj, event); + } +} + +constexpr std::array SettingAirplaneMode::options; + +SettingAirplaneMode::SettingAirplaneMode(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) + : Screen(app), settingsController {settingsController} { + + lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr); + + lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10); + lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5); + lv_obj_set_style_local_border_width(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 0); + + lv_obj_set_pos(container1, 10, 60); + lv_obj_set_width(container1, LV_HOR_RES - 20); + lv_obj_set_height(container1, LV_VER_RES - 50); + lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT); + + lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(title, "Airplane mode"); + lv_label_set_align(title, LV_LABEL_ALIGN_CENTER); + lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 15, 15); + + lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); + lv_label_set_text_static(icon, Symbols::airplane); + lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); + lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0); + + for (unsigned int i = 0; i < options.size(); i++) { + cbOption[i] = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text(cbOption[i], options[i]); + cbOption[i]->user_data = this; + lv_obj_set_event_cb(cbOption[i], event_handler); + SetRadioButtonStyle(cbOption[i]); + } + + if (settingsController.GetAirplaneMode() == false) { + lv_checkbox_set_checked(cbOption[0], true); + priorMode = false; + } else { + lv_checkbox_set_checked(cbOption[1], true); + priorMode = true; + } +} + +SettingAirplaneMode::~SettingAirplaneMode() { + lv_obj_clean(lv_scr_act()); + // Do not call SaveSettings - see src/components/settings/Settings.h + if (priorMode != settingsController.GetAirplaneMode()) { + app->PushMessage(Pinetime::Applications::Display::Messages::AirplaneModeToggle); + } +} + +void SettingAirplaneMode::UpdateSelected(lv_obj_t* object, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { + for (unsigned int i = 0; i < options.size(); i++) { + if (object == cbOption[i]) { + lv_checkbox_set_checked(cbOption[i], true); + + if (i == 0) { + settingsController.SetAirplaneMode(false); + }; + if (i == 1) { + settingsController.SetAirplaneMode(true); + }; + + } else { + lv_checkbox_set_checked(cbOption[i], false); + } + } + } +} diff --git a/src/displayapp/screens/settings/SettingAirplaneMode.h b/src/displayapp/screens/settings/SettingAirplaneMode.h new file mode 100644 index 00000000..fcc02228 --- /dev/null +++ b/src/displayapp/screens/settings/SettingAirplaneMode.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include + +#include "components/settings/Settings.h" +#include "displayapp/screens/Screen.h" + +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingAirplaneMode : public Screen { + public: + SettingAirplaneMode(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); + ~SettingAirplaneMode() override; + + void UpdateSelected(lv_obj_t* object, lv_event_t event); + + private: + static constexpr std::array options = {" No", " Yes"}; + Controllers::Settings& settingsController; + lv_obj_t* cbOption[options.size()]; + bool priorMode; + }; + } + } +} diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp index 392c12e0..6be00f57 100644 --- a/src/displayapp/screens/settings/Settings.cpp +++ b/src/displayapp/screens/settings/Settings.cpp @@ -36,10 +36,10 @@ bool Settings::OnTouchEvent(Pinetime::Applications::TouchEvents event) { std::unique_ptr Settings::CreateScreen1() { std::array applications {{ - {Symbols::sun, "Display", Apps::SettingDisplay}, - {Symbols::eye, "Wake Up", Apps::SettingWakeUp}, - {Symbols::clock, "Time format", Apps::SettingTimeFormat}, - {Symbols::home, "Watch face", Apps::SettingWatchFace}, + {Symbols::list, "About", Apps::SysInfo}, + {Symbols::airplane, "Airplane mode", Apps::SettingAirplaneMode}, + {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}, + {Symbols::sun, "Display", Apps::SettingDisplay} }}; return std::make_unique(0, 3, app, settingsController, applications); @@ -48,10 +48,10 @@ std::unique_ptr Settings::CreateScreen1() { std::unique_ptr Settings::CreateScreen2() { std::array applications {{ - {Symbols::shoe, "Steps", Apps::SettingSteps}, + {Symbols::check, "Firmware", Apps::FirmwareValidation}, + {Symbols::paintbrush, "PTS colors", Apps::SettingPineTimeStyle}, {Symbols::clock, "Set date", Apps::SettingSetDate}, - {Symbols::clock, "Set time", Apps::SettingSetTime}, - {Symbols::batteryHalf, "Battery", Apps::BatteryInfo} + {Symbols::clock, "Set time", Apps::SettingSetTime} }}; return std::make_unique(1, 3, app, settingsController, applications); @@ -60,10 +60,10 @@ std::unique_ptr Settings::CreateScreen2() { std::unique_ptr Settings::CreateScreen3() { std::array applications {{ - {Symbols::paintbrush, "PTS Colors", Apps::SettingPineTimeStyle}, - {Symbols::check, "Firmware", Apps::FirmwareValidation}, - {Symbols::list, "About", Apps::SysInfo}, - {Symbols::none, "None", Apps::None}, + {Symbols::shoe, "Steps", Apps::SettingSteps}, + {Symbols::clock, "Time format", Apps::SettingTimeFormat}, + {Symbols::eye, "Wake up", Apps::SettingWakeUp}, + {Symbols::home, "Watch face", Apps::SettingWatchFace} }}; return std::make_unique(2, 3, app, settingsController, applications); diff --git a/src/systemtask/Messages.h b/src/systemtask/Messages.h index cc30fdc6..886505b5 100644 --- a/src/systemtask/Messages.h +++ b/src/systemtask/Messages.h @@ -29,6 +29,7 @@ namespace Pinetime { BatteryPercentageUpdated, StartFileTransfer, StopFileTransfer, + AirplaneModeToggle }; } } diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index a95d479d..5ce223a6 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -261,7 +261,7 @@ void SystemTask::Work() { displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToRunning); heartRateApp.PushMessage(Pinetime::Applications::HeartRateTask::Messages::WakeUp); - if (!bleController.IsConnected()) { + if (bleController.GetConnectState() == Controllers::Ble::ConnectStates::Disconnected) { nimbleController.RestartFastAdv(); } @@ -424,7 +424,9 @@ void SystemTask::Work() { motorController.RunForDuration(35); displayApp.PushMessage(Pinetime::Applications::Display::Messages::ShowPairingKey); break; - + case Messages::AirplaneModeToggle: + nimbleController.SwitchAirplaneMode(settingsController.GetAirplaneMode()); + break; default: break; } From d5b78ecd6690180f4f0891780dc7fe7a8ef91212 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sat, 29 Jan 2022 22:08:52 +0100 Subject: [PATCH 02/53] SystemTask: remove unused ble includes Remove unused includes. The firmware still compiles fine without the includes. --- src/systemtask/SystemTask.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index e71ebc17..6460cd4b 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -1,13 +1,4 @@ #include "systemtask/SystemTask.h" -#define min // workaround: nimble's min/max macros conflict with libstdc++ -#define max -#include -#include -#include -#include -#include -#undef max -#undef min #include #include #include From 04eca81a956ad84a5604096515da1ac148fe8921 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sat, 29 Jan 2022 23:34:09 +0100 Subject: [PATCH 03/53] Notifications: use motorController object instead of class function We get the motoroController object, so store and use it. --- src/displayapp/screens/Notifications.cpp | 24 +++++++++++++++--------- src/displayapp/screens/Notifications.h | 5 ++++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 8fe08a82..3a39dacf 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -17,6 +17,7 @@ Notifications::Notifications(DisplayApp* app, : Screen(app), notificationManager {notificationManager}, alertNotificationService {alertNotificationService}, + motorController {motorController}, systemTask {systemTask}, mode {mode} { notificationManager.ClearNewNotificationFlag(); @@ -29,7 +30,8 @@ Notifications::Notifications(DisplayApp* app, notification.category, notificationManager.NbNotifications(), mode, - alertNotificationService); + alertNotificationService, + motorController); validDisplay = true; } else { currentItem = std::make_unique("Notification", @@ -38,7 +40,8 @@ Notifications::Notifications(DisplayApp* app, notification.category, notificationManager.NbNotifications(), Modes::Preview, - alertNotificationService); + alertNotificationService, + motorController); } if (mode == Modes::Preview) { @@ -66,7 +69,7 @@ Notifications::Notifications(DisplayApp* app, Notifications::~Notifications() { lv_task_del(taskRefresh); // make sure we stop any vibrations before exiting - Controllers::MotorController::StopRinging(); + motorController.StopRinging(); systemTask.PushMessage(System::Messages::EnableSleeping); lv_obj_clean(lv_scr_act()); } @@ -87,7 +90,7 @@ void Notifications::Refresh() { void Notifications::OnPreviewInteraction() { systemTask.PushMessage(System::Messages::EnableSleeping); - Controllers::MotorController::StopRinging(); + motorController.StopRinging(); if (timeoutLine != nullptr) { lv_obj_del(timeoutLine); timeoutLine = nullptr; @@ -125,7 +128,8 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) { previousNotification.category, notificationManager.NbNotifications(), mode, - alertNotificationService); + alertNotificationService, + motorController); } return true; case Pinetime::Applications::TouchEvents::SwipeUp: { @@ -150,7 +154,8 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) { nextNotification.category, notificationManager.NbNotifications(), mode, - alertNotificationService); + alertNotificationService, + motorController); } return true; default: @@ -171,8 +176,9 @@ Notifications::NotificationItem::NotificationItem(const char* title, Controllers::NotificationManager::Categories category, uint8_t notifNb, Modes mode, - Pinetime::Controllers::AlertNotificationService& alertNotificationService) - : mode {mode}, alertNotificationService {alertNotificationService} { + Pinetime::Controllers::AlertNotificationService& alertNotificationService, + Pinetime::Controllers::MotorController& motorController) + : mode {mode}, alertNotificationService {alertNotificationService}, motorController {motorController} { lv_obj_t* container1 = lv_cont_create(lv_scr_act(), NULL); lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x222222)); @@ -269,7 +275,7 @@ void Notifications::NotificationItem::OnCallButtonEvent(lv_obj_t* obj, lv_event_ return; } - Controllers::MotorController::StopRinging(); + motorController.StopRinging(); if (obj == bt_accept) { alertNotificationService.AcceptIncomingCall(); diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index 2f444c7c..f49d3b3a 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -39,7 +39,8 @@ namespace Pinetime { Controllers::NotificationManager::Categories, uint8_t notifNb, Modes mode, - Pinetime::Controllers::AlertNotificationService& alertNotificationService); + Pinetime::Controllers::AlertNotificationService& alertNotificationService, + Pinetime::Controllers::MotorController& motorController); ~NotificationItem(); bool IsRunning() const { return running; @@ -56,6 +57,7 @@ namespace Pinetime { lv_obj_t* label_reject; Modes mode; Pinetime::Controllers::AlertNotificationService& alertNotificationService; + Pinetime::Controllers::MotorController& motorController; bool running = true; }; @@ -66,6 +68,7 @@ namespace Pinetime { }; Pinetime::Controllers::NotificationManager& notificationManager; Pinetime::Controllers::AlertNotificationService& alertNotificationService; + Pinetime::Controllers::MotorController& motorController; System::SystemTask& systemTask; Modes mode = Modes::Normal; std::unique_ptr currentItem; From a2a70f8eda56b4cf859f456b2f842e4833cd3dbf Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sat, 29 Jan 2022 23:45:22 +0100 Subject: [PATCH 04/53] MotorController: no need to make this function a class function The `StopRinging()` function was used just in `Notifications.h` screen. That screen already has access to a `motorController` object. --- src/components/motor/MotorController.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/motor/MotorController.h b/src/components/motor/MotorController.h index c9326d57..b5a592b1 100644 --- a/src/components/motor/MotorController.h +++ b/src/components/motor/MotorController.h @@ -12,7 +12,7 @@ namespace Pinetime { void Init(); void RunForDuration(uint8_t motorDuration); void StartRinging(); - static void StopRinging(); + void StopRinging(); private: static void Ring(void* p_context); From 4aaa3a3b49b3b70509345f83ebe1c4f4bacd524d Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Tue, 15 Feb 2022 23:56:42 +0100 Subject: [PATCH 05/53] SettingShakeThreshold: add missing SystemTask.h, relative include SettingShakeThreshold.h uses SystemTask, but doesn't include the header. Fixing that for the simulator. For consistency make the header include a relative to src include. --- src/displayapp/screens/settings/SettingShakeThreshold.cpp | 2 +- src/displayapp/screens/settings/SettingShakeThreshold.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.cpp b/src/displayapp/screens/settings/SettingShakeThreshold.cpp index 1791b550..9d40fcf9 100644 --- a/src/displayapp/screens/settings/SettingShakeThreshold.cpp +++ b/src/displayapp/screens/settings/SettingShakeThreshold.cpp @@ -1,4 +1,4 @@ -#include "SettingShakeThreshold.h" +#include "displayapp/screens/settings/SettingShakeThreshold.h" #include #include "displayapp/DisplayApp.h" #include "displayapp/screens/Screen.h" diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.h b/src/displayapp/screens/settings/SettingShakeThreshold.h index b9ddd8b4..37f4a65e 100644 --- a/src/displayapp/screens/settings/SettingShakeThreshold.h +++ b/src/displayapp/screens/settings/SettingShakeThreshold.h @@ -5,6 +5,7 @@ #include "components/settings/Settings.h" #include "displayapp/screens/Screen.h" #include +#include "systemtask/SystemTask.h" namespace Pinetime { namespace Applications { From b857fdb9f438cd9a3440c82face944323301cfad Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Tue, 15 Feb 2022 23:59:38 +0100 Subject: [PATCH 06/53] SystemTask: forward declare BatteryController to fix of cyclic dependency SystemTask.h included BatteryController.h, and BatteryController.h included SystemTask.h. If unlucky the class SystemTask isn't created yet when BatteryController wants to use it. Fix that cyclic dependency by forward declaring the BatteryController class and including it in the SystemTask.cpp file, where it is needed. --- src/systemtask/SystemTask.cpp | 1 + src/systemtask/SystemTask.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 6460cd4b..8d9cb1d1 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -4,6 +4,7 @@ #include #include "BootloaderVersion.h" +#include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "drivers/Cst816s.h" #include "drivers/St7789.h" diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index abeffd2f..517ed1ae 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -13,7 +13,6 @@ #include #include "systemtask/SystemMonitor.h" -#include "components/battery/BatteryController.h" #include "components/ble/NimbleController.h" #include "components/ble/NotificationManager.h" #include "components/motor/MotorController.h" @@ -47,6 +46,7 @@ namespace Pinetime { class Hrs3300; } namespace Controllers { + class Battery; class TouchHandler; class ButtonHandler; } From f829427c4186ec003d51c689c6831d076f3b0b69 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Wed, 16 Feb 2022 22:33:59 +0100 Subject: [PATCH 07/53] Remove unused and not compiling DropDownDemo For ease of use the simulator uses a globbing expression to get all screens source files. This one was picked up as well and lead to a compilation error. --- src/CMakeLists.txt | 1 - src/displayapp/screens/DropDownDemo.cpp | 57 ------------------------- src/displayapp/screens/DropDownDemo.h | 27 ------------ 3 files changed, 85 deletions(-) delete mode 100644 src/displayapp/screens/DropDownDemo.cpp delete mode 100644 src/displayapp/screens/DropDownDemo.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index aec6ce04..39d80b05 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -626,7 +626,6 @@ set(INCLUDE_FILES displayapp/screens/InfiniPaint.h displayapp/screens/StopWatch.h displayapp/screens/Paddle.h - displayapp/screens/DropDownDemo.h displayapp/screens/BatteryIcon.h displayapp/screens/BleIcon.h displayapp/screens/NotificationIcon.h diff --git a/src/displayapp/screens/DropDownDemo.cpp b/src/displayapp/screens/DropDownDemo.cpp deleted file mode 100644 index cf239a2f..00000000 --- a/src/displayapp/screens/DropDownDemo.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "displayapp/screens/DropDownDemo.h" -#include -#include -#include "displayapp/DisplayApp.h" - -using namespace Pinetime::Applications::Screens; - -DropDownDemo::DropDownDemo(Pinetime::Applications::DisplayApp* app) : Screen(app) { - // Create the dropdown object, with many item, and fix its height - ddlist = lv_ddlist_create(lv_scr_act(), nullptr); - lv_ddlist_set_options(ddlist, - "Apple\n" - "Banana\n" - "Orange\n" - "Melon\n" - "Grape\n" - "Raspberry\n" - "A\n" - "B\n" - "C\n" - "D\n" - "E"); - lv_ddlist_set_fix_width(ddlist, 150); - lv_ddlist_set_draw_arrow(ddlist, true); - lv_ddlist_set_fix_height(ddlist, 150); - lv_obj_align(ddlist, nullptr, LV_ALIGN_IN_TOP_MID, 0, 20); -} - -DropDownDemo::~DropDownDemo() { - // Reset the touchmode - app->SetTouchMode(DisplayApp::TouchModes::Gestures); - lv_obj_clean(lv_scr_act()); -} - -bool DropDownDemo::Refresh() { - auto* list = static_cast(ddlist->ext_attr); - - // Switch touchmode to Polling if the dropdown is opened. This will allow to scroll inside the - // dropdown while it is opened. - // Disable the polling mode when the dropdown is closed to be able to handle the gestures. - if (list->opened) - app->SetTouchMode(DisplayApp::TouchModes::Polling); - else - app->SetTouchMode(DisplayApp::TouchModes::Gestures); - return running; -} - -bool DropDownDemo::OnTouchEvent(Pinetime::Applications::TouchEvents event) { - // If the dropdown is opened, notify Display app that it doesn't need to handle the event - // (this will prevent displayApp from going back to the menu or clock scree). - auto* list = static_cast(ddlist->ext_attr); - if (list->opened) { - return true; - } else { - return false; - } -} diff --git a/src/displayapp/screens/DropDownDemo.h b/src/displayapp/screens/DropDownDemo.h deleted file mode 100644 index bcf0f45c..00000000 --- a/src/displayapp/screens/DropDownDemo.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include -#include "displayapp/screens/Screen.h" -#include - -namespace Pinetime { - namespace Applications { - namespace Screens { - - class DropDownDemo : public Screen { - public: - DropDownDemo(DisplayApp* app); - ~DropDownDemo() override; - - bool Refresh() override; - - bool OnTouchEvent(TouchEvents event) override; - - private: - lv_obj_t* ddlist; - - bool isDropDownOpened = false; - }; - } - } -} From 407908686ac252615f35e5175fcb0c2fd19cce69 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sun, 30 Jan 2022 14:31:13 +0100 Subject: [PATCH 08/53] Provide reference to BrightnessController in DisplayApp For the simulator I need a way to get to the brightnessController object and handle the set brightness-levels accoringly. This is done by the constructor expecting a brightnessController object instead of initializing one itself --- src/displayapp/DisplayApp.cpp | 2 ++ src/displayapp/DisplayApp.h | 3 ++- src/displayapp/DisplayAppRecovery.cpp | 1 + src/displayapp/DisplayAppRecovery.h | 2 ++ src/main.cpp | 3 +++ 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 495969b3..fdd1682b 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -97,6 +97,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::TimerController& timerController, Pinetime::Controllers::AlarmController& alarmController, + Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Controllers::TouchHandler& touchHandler) : lcd {lcd}, lvgl {lvgl}, @@ -112,6 +113,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, motionController {motionController}, timerController {timerController}, alarmController {alarmController}, + brightnessController {brightnessController}, touchHandler {touchHandler} { } diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index 39fe6314..1eaefaa1 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -61,6 +61,7 @@ namespace Pinetime { Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::TimerController& timerController, Pinetime::Controllers::AlarmController& alarmController, + Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Controllers::TouchHandler& touchHandler); void Start(System::BootErrors error); void PushMessage(Display::Messages msg); @@ -87,10 +88,10 @@ namespace Pinetime { Pinetime::Controllers::MotionController& motionController; Pinetime::Controllers::TimerController& timerController; Pinetime::Controllers::AlarmController& alarmController; + Pinetime::Controllers::BrightnessController &brightnessController; Pinetime::Controllers::TouchHandler& touchHandler; Pinetime::Controllers::FirmwareValidator validator; - Controllers::BrightnessController brightnessController; TaskHandle_t taskHandle; diff --git a/src/displayapp/DisplayAppRecovery.cpp b/src/displayapp/DisplayAppRecovery.cpp index fd7017a4..9d6eb22f 100644 --- a/src/displayapp/DisplayAppRecovery.cpp +++ b/src/displayapp/DisplayAppRecovery.cpp @@ -23,6 +23,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::TimerController& timerController, Pinetime::Controllers::AlarmController& alarmController, + Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Controllers::TouchHandler& touchHandler) : lcd {lcd}, bleController {bleController} { diff --git a/src/displayapp/DisplayAppRecovery.h b/src/displayapp/DisplayAppRecovery.h index 86e956d1..61f1c9bf 100644 --- a/src/displayapp/DisplayAppRecovery.h +++ b/src/displayapp/DisplayAppRecovery.h @@ -34,6 +34,7 @@ namespace Pinetime { class MotorController; class TimerController; class AlarmController; + class BrightnessController; } namespace System { @@ -57,6 +58,7 @@ namespace Pinetime { Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::TimerController& timerController, Pinetime::Controllers::AlarmController& alarmController, + Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Controllers::TouchHandler& touchHandler); void Start(); void Start(Pinetime::System::BootErrors){ Start(); }; diff --git a/src/main.cpp b/src/main.cpp index 81d297f5..fa492d08 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,6 +33,7 @@ #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" +#include "components/brightness/BrightnessController.h" #include "components/motor/MotorController.h" #include "components/datetime/DateTimeController.h" #include "components/heartrate/HeartRateController.h" @@ -114,6 +115,7 @@ Pinetime::Controllers::TimerController timerController; Pinetime::Controllers::AlarmController alarmController {dateTimeController}; Pinetime::Controllers::TouchHandler touchHandler(touchPanel, lvgl); Pinetime::Controllers::ButtonHandler buttonHandler; +Pinetime::Controllers::BrightnessController brightnessController {}; Pinetime::Applications::DisplayApp displayApp(lcd, lvgl, @@ -129,6 +131,7 @@ Pinetime::Applications::DisplayApp displayApp(lcd, motionController, timerController, alarmController, + brightnessController, touchHandler); Pinetime::System::SystemTask systemTask(spi, From 69e4ab6be101e7993035b56db75f5c32eda713ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Sun, 20 Feb 2022 13:20:43 +0100 Subject: [PATCH 09/53] Manual squash merge of PR #932 (https://github.com/InfiniTimeOrg/InfiniTime/pull/932) from 13werwolf13 (https://github.com/13werwolf13). This PR adds a new Terminal watchface to InfiniTime! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Squashed commit of the following: commit 23ea840b059c69667c8711265cecaf992791acb6 Author: Jean-François Milants Date: Sun Feb 20 13:14:27 2022 +0100 Terminal watch face : fix includes and a few code cleaning. commit 3c244def25e3ad8e1f56d708fb0864c122059948 Merge: 40790868 138a6552 Author: Jean-François Milants Date: Sun Feb 20 12:45:54 2022 +0100 Merge branch 'develop' of https://github.com/13werwolf13/InfiniTime into 13werwolf13-develop commit 138a65528a86799fd5c37f065023a92f222fe044 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:13:00 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.h Co-authored-by: NeroBurner commit 35156166b2f7589bf005ec7c7192a4226578f6d9 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:12:43 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit 757ca2dd438f1f314267a8b81a6034c576f1d6be Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:12:30 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit 60b6b4e5824d04faa3efa45173358d04fa68a368 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:12:20 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit 6959d8c043013550a7a3e4e6588b234d3bb942b5 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:11:46 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit 4d850281bedf342d0856da5eafc22e46d0767c56 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:11:17 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit af483bee33c225fcb03432db1eb14c0453df0ae7 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:10:57 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit 6bc6c1a637be4e514ecd0097d1dc9e4aacdba1db Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:10:40 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.h Co-authored-by: NeroBurner commit 25fdafc6aba0d9e0173103501de3802af261e2ae Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:06:10 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit 12e1b0f8c0202a7f62e3e1c297af850ce3526d13 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:05:44 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit e6c0f32056e9fea878d270d761607ac5ddc263b0 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:05:22 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.h Co-authored-by: NeroBurner commit 342ce8cd114f4af265078bc0cfa6b2d8831706d7 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:05:06 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit 265fec5eeca27fcc1152a18e4af0273bcf119c46 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:04:06 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit b4669be38be0df2b6a3505d5f7a770c71636be60 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:03:29 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit 471a84390957ded2ac23ebfe1cb99408e3783b0f Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:03:10 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit 6853166cf546a4ce561195eba01f1b1fd6d56420 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Wed Feb 2 09:02:51 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit bba34f69bfdd6b44f142c93644f71c9eda007290 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Sat Jan 22 12:32:41 2022 +0500 some fixes commit 74eea9f5800f273249846e6e1c887d15ba6eb10b Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Sat Jan 22 12:32:17 2022 +0500 some fixes commit 1e4a6763d73c3ba39c680ad25f90813e6a6a36d1 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Fri Jan 21 08:59:44 2022 +0500 no errors, no warnings, no work.. commit eb8bd4dc4ecbbf61f1e0f725fd2116ee25319fd6 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Thu Jan 20 23:50:04 2022 +0500 add ble state text output commit fda1c088becb4a7f9ced451a0291694abe2249dc Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Thu Jan 20 22:25:35 2022 +0500 add ble state text output commit 68d3d9b343c0f37830bb640fab10b186faf73067 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Thu Jan 20 22:22:20 2022 +0500 add ble state text output commit 0ed45a9916787f68c0aa6bab9c97b090f2eebdd5 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Tue Jan 18 15:48:15 2022 +0500 typo fix commit 477a3a7f27c7486be2c8f985afab1f1739608fed Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Tue Jan 18 10:36:19 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit d6849888ea5cc152f04c5bf6fe2631e66296c357 Author: Марков Дмитрий <13werwolf13@mail.ru> Date: Tue Jan 18 10:36:09 2022 +0500 Update src/displayapp/screens/WatchFaceTerminal.cpp Co-authored-by: NeroBurner commit e2f7e318298b8a6f4d436cbbb1b92a738dacab7f Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Mon Jan 17 13:34:05 2022 +0500 typo fix commit fc246beb01d3feac4fd0b2fc9c45b38847e1d950 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Sat Jan 15 15:26:25 2022 +0500 typo fix commit ebbb31abf10ad9f61a8a7ecfdf29c2aaeaf33c19 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Fri Jan 14 10:08:29 2022 +0500 typo fix commit 3afedcaa28009f59e6960730e9349097ef455ea8 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Thu Jan 13 12:34:39 2022 +0500 time format commit 471a4c942f7e3cfd5c52bd61152ede770da5e026 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Thu Jan 13 12:27:10 2022 +0500 time format commit d3fd348de4b4a89c216a717de84fcc923cc099fe Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Thu Jan 13 12:26:49 2022 +0500 time format commit e540d103e3204649ff585742f8834d16136372d5 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Thu Jan 13 11:28:31 2022 +0500 add patch commit 728830178f31f71785c49cdc6b83daea4e0a7df6 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Wed Jan 12 22:08:07 2022 +0500 add menue item commit 4c5847669fa083f15ee3fdb404dadfdaef0f82aa Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Wed Jan 12 21:42:22 2022 +0500 typo fix commit 79273fe24f9162aca5508f07b17896149ad19839 Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Wed Jan 12 20:48:06 2022 +0500 typo fix commit 1808a78ad94d0dfe97b6410a93ba30560de22f4b Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Wed Jan 12 20:17:15 2022 +0500 typo fix commit 6dfa141dca176789da4e978f008eb842d9ec515a Author: Дмитрий Марков Date: Wed Jan 12 20:12:09 2022 +0500 typo fix commit 88f01902325505a9206ced4504aae0762042535d Author: Дмитрий Марков <13werwolf13@mail.ru> Date: Wed Jan 12 14:50:54 2022 +0500 add terminal watchface --- src/CMakeLists.txt | 1 + src/components/heartrate/Ppg.h | 2 + src/displayapp/screens/Clock.cpp | 24 ++- src/displayapp/screens/Clock.h | 1 + src/displayapp/screens/WatchFaceTerminal.cpp | 198 ++++++++++++++++++ src/displayapp/screens/WatchFaceTerminal.h | 82 ++++++++ .../screens/settings/SettingWatchFace.cpp | 2 +- .../screens/settings/SettingWatchFace.h | 2 +- 8 files changed, 303 insertions(+), 9 deletions(-) create mode 100644 src/displayapp/screens/WatchFaceTerminal.cpp create mode 100644 src/displayapp/screens/WatchFaceTerminal.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 39d80b05..5986d95f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -454,6 +454,7 @@ list(APPEND SOURCE_FILES displayapp/icons/bg_clock.c displayapp/screens/WatchFaceAnalog.cpp displayapp/screens/WatchFaceDigital.cpp + displayapp/screens/WatchFaceTerminal.cpp displayapp/screens/PineTimeStyle.cpp ## diff --git a/src/components/heartrate/Ppg.h b/src/components/heartrate/Ppg.h index ed79b082..7000c871 100644 --- a/src/components/heartrate/Ppg.h +++ b/src/components/heartrate/Ppg.h @@ -1,6 +1,8 @@ #pragma once #include +#include +#include #include "components/heartrate/Biquad.h" #include "components/heartrate/Ptagc.h" diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index 1415e8ec..fd74683a 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -9,6 +9,7 @@ #include "components/settings/Settings.h" #include "displayapp/DisplayApp.h" #include "displayapp/screens/WatchFaceDigital.h" +#include "displayapp/screens/WatchFaceTerminal.h" #include "displayapp/screens/WatchFaceAnalog.h" #include "displayapp/screens/PineTimeStyle.h" @@ -41,6 +42,9 @@ Clock::Clock(DisplayApp* app, case 2: return PineTimeStyleScreen(); break; + case 3: + return WatchFaceTerminalScreen(); + break; } return WatchFaceDigitalScreen(); }()} { @@ -76,11 +80,17 @@ std::unique_ptr Clock::WatchFaceAnalogScreen() { } std::unique_ptr Clock::PineTimeStyleScreen() { - return std::make_unique(app, - dateTimeController, - batteryController, - bleController, - notificatioManager, - settingsController, - motionController); + return std::make_unique( + app, dateTimeController, batteryController, bleController, notificatioManager, settingsController, motionController); +} + +std::unique_ptr Clock::WatchFaceTerminalScreen() { + return std::make_unique(app, + dateTimeController, + batteryController, + bleController, + notificatioManager, + settingsController, + heartRateController, + motionController); } diff --git a/src/displayapp/screens/Clock.h b/src/displayapp/screens/Clock.h index fcecc6b3..50996a73 100644 --- a/src/displayapp/screens/Clock.h +++ b/src/displayapp/screens/Clock.h @@ -47,6 +47,7 @@ namespace Pinetime { std::unique_ptr WatchFaceDigitalScreen(); std::unique_ptr WatchFaceAnalogScreen(); std::unique_ptr PineTimeStyleScreen(); + std::unique_ptr WatchFaceTerminalScreen(); }; } } diff --git a/src/displayapp/screens/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp new file mode 100644 index 00000000..033aad88 --- /dev/null +++ b/src/displayapp/screens/WatchFaceTerminal.cpp @@ -0,0 +1,198 @@ +#include +#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(DisplayApp* app, + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificatioManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, + Controllers::MotionController& motionController) + : Screen(app), + currentDateTime {{}}, + dateTimeController {dateTimeController}, + batteryController {batteryController}, + bleController {bleController}, + notificatioManager {notificatioManager}, + settingsController {settingsController}, + heartRateController {heartRateController}, + motionController {motionController} { + settingsController.SetClockFace(3); + + batteryIcon = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text(batteryIcon, Symbols::batteryFull); + lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -5, 2); + + batteryPlug = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text(batteryPlug, Symbols::plug); + lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0); + + 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_label_set_text(connectState, "[STAT]#387b54 Disconnected#"); + lv_obj_align(connectState, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 40); + + notificationIcon = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); + lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 10, 0); + + label_date = lv_label_create(lv_scr_act(), nullptr); + 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(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(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); + + 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(backgroundLabel, ""); + + heartbeatValue = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_recolor(heartbeatValue, true); + lv_label_set_text(heartbeatValue, "[L_HR]#ee3311 0 bpm#"); + 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_label_set_text(stepValue, "[STEP]#ee3377 0 steps#"); + 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(); + if (powerPresent.IsUpdated()) { + lv_label_set_text_static(batteryPlug, BatteryIcon::GetPlugIcon(powerPresent.Get())); + } + + batteryPercentRemaining = batteryController.PercentRemaining(); + if (batteryPercentRemaining.IsUpdated()) { + auto batteryPercent = batteryPercentRemaining.Get(); + if (batteryPercent == 100) { + lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); + } else { + lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); + } + lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); + lv_label_set_text_fmt(batteryValue, "[BATT]#387b54 %d%\%#", batteryPercent); + } + + bleState = bleController.IsConnected(); + if (bleState.IsUpdated()) { + if (bleState.Get()) { + lv_label_set_text_static(connectState, "[STAT]#387b54 Connected#"); + } else { + lv_label_set_text_static(connectState, "[STAT]#387b54 Disconnected#"); + } + } + + notificationState = notificatioManager.AreNewNotificationsAvailable(); + if (notificationState.IsUpdated()) { + if (notificationState.Get()) { + lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(true)); + } else { + lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); + } + } + + currentDateTime = dateTimeController.CurrentDateTime(); + + if (currentDateTime.IsUpdated()) { + auto newDateTime = currentDateTime.Get(); + + auto dp = date::floor(newDateTime); + auto time = date::make_time(newDateTime - dp); + auto yearMonthDay = date::year_month_day(dp); + + auto year = static_cast(yearMonthDay.year()); + auto month = static_cast(static_cast(yearMonthDay.month())); + auto day = static_cast(yearMonthDay.day()); + auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); + + uint8_t hour = time.hours().count(); + uint8_t minute = time.minutes().count(); + uint8_t second = time.seconds().count(); + + if (displayedHour != hour || displayedMinute != minute || displayedSecond != second) { + displayedHour = hour; + displayedMinute = minute; + displayedSecond = second; + + 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); + } + } + + if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { + lv_label_set_text_fmt(label_date, "[DATE]#007fff %04d.%02d.%02d#", short(year), char(month), char(day)); + + currentYear = year; + currentMonth = month; + currentDayOfWeek = dayOfWeek; + currentDay = 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(); + motionSensorOk = motionController.IsSensorOk(); + if (stepCount.IsUpdated() || motionSensorOk.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 new file mode 100644 index 00000000..c3df82b4 --- /dev/null +++ b/src/displayapp/screens/WatchFaceTerminal.h @@ -0,0 +1,82 @@ +#pragma once + +#include +#include +#include +#include +#include "displayapp/screens/Screen.h" +#include "components/datetime/DateTimeController.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(DisplayApp* app, + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificatioManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, + Controllers::MotionController& motionController); + ~WatchFaceTerminal() override; + + void Refresh() override; + + private: + uint8_t displayedHour = -1; + uint8_t displayedMinute = -1; + uint8_t displayedSecond = -1; + + uint16_t currentYear = 1970; + Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; + Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + uint8_t currentDay = 0; + + DirtyValue batteryPercentRemaining {}; + DirtyValue powerPresent {}; + DirtyValue bleState {}; + DirtyValue> currentDateTime {}; + DirtyValue motionSensorOk {}; + DirtyValue stepCount {}; + DirtyValue heartbeat {}; + DirtyValue heartbeatRunning {}; + DirtyValue notificationState {}; + + 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* backgroundLabel; + lv_obj_t* batteryIcon; + lv_obj_t* batteryPlug; + lv_obj_t* batteryValue; + lv_obj_t* heartbeatValue; + lv_obj_t* stepValue; + lv_obj_t* notificationIcon; + lv_obj_t* connectState; + + Controllers::DateTime& dateTimeController; + Controllers::Battery& batteryController; + Controllers::Ble& bleController; + Controllers::NotificationManager& notificatioManager; + Controllers::Settings& settingsController; + Controllers::HeartRateController& heartRateController; + Controllers::MotionController& motionController; + + lv_task_t* taskRefresh; + }; + } + } +} diff --git a/src/displayapp/screens/settings/SettingWatchFace.cpp b/src/displayapp/screens/settings/SettingWatchFace.cpp index a24eaa15..50085925 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.cpp +++ b/src/displayapp/screens/settings/SettingWatchFace.cpp @@ -14,7 +14,7 @@ namespace { } } -constexpr std::array SettingWatchFace::options; +constexpr std::array SettingWatchFace::options; SettingWatchFace::SettingWatchFace(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) : Screen(app), settingsController {settingsController} { diff --git a/src/displayapp/screens/settings/SettingWatchFace.h b/src/displayapp/screens/settings/SettingWatchFace.h index ccba7d13..62427b4f 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.h +++ b/src/displayapp/screens/settings/SettingWatchFace.h @@ -20,7 +20,7 @@ namespace Pinetime { void UpdateSelected(lv_obj_t* object, lv_event_t event); private: - static constexpr std::array options = {" Digital face", " Analog face", " PineTimeStyle"}; + static constexpr std::array options = {" Digital face", " Analog face", " PineTimeStyle", " Terminal"}; Controllers::Settings& settingsController; lv_obj_t* cbOption[options.size()]; From ef44b763d94cc6ff1be6f75ff3e638d7d356e99e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Sun, 20 Feb 2022 15:40:49 +0100 Subject: [PATCH 10/53] Merge branch 'airplane-mode' of https://github.com/evergreen22/InfiniTime into evergreen22-airplane-mode Apply a few changes that were requested in the PR during the review. # Conflicts: # src/CMakeLists.txt # src/displayapp/Apps.h # src/displayapp/DisplayApp.cpp # src/displayapp/Messages.h # src/displayapp/screens/settings/Settings.cpp --- src/components/ble/BleController.cpp | 24 +++++- src/components/ble/BleController.h | 16 ++-- src/components/ble/NimbleController.cpp | 35 ++++----- src/components/ble/NimbleController.h | 15 +--- src/components/settings/Settings.h | 10 +-- src/displayapp/DisplayApp.cpp | 4 +- src/displayapp/Messages.h | 2 +- src/displayapp/screens/BleIcon.cpp | 15 ++-- src/displayapp/screens/BleIcon.h | 2 +- src/displayapp/screens/PineTimeStyle.cpp | 20 +++-- src/displayapp/screens/PineTimeStyle.h | 3 +- src/displayapp/screens/WatchFaceDigital.cpp | 7 +- src/displayapp/screens/WatchFaceDigital.h | 3 +- src/displayapp/screens/WatchFaceTerminal.cpp | 13 +++- src/displayapp/screens/WatchFaceTerminal.h | 1 + .../screens/settings/SettingAirplaneMode.cpp | 74 ++++++++++--------- .../screens/settings/SettingAirplaneMode.h | 7 +- src/displayapp/screens/settings/Settings.cpp | 37 +++++++--- src/displayapp/screens/settings/Settings.h | 3 +- src/systemtask/Messages.h | 2 +- src/systemtask/SystemTask.cpp | 10 ++- 21 files changed, 179 insertions(+), 124 deletions(-) diff --git a/src/components/ble/BleController.cpp b/src/components/ble/BleController.cpp index 0e1c5d7e..b6b7383a 100644 --- a/src/components/ble/BleController.cpp +++ b/src/components/ble/BleController.cpp @@ -2,12 +2,28 @@ using namespace Pinetime::Controllers; -void Ble::SetConnectState(Ble::ConnectStates newState) { - connectionState = newState; +bool Ble::IsConnected() const { + return isConnected; } -Ble::ConnectStates Ble::GetConnectState() const { - return connectionState; +void Ble::Connect() { + isConnected = true; +} + +void Ble::Disconnect() { + isConnected = false; +} + +bool Ble::IsRadioEnabled() const { + return isRadioEnabled; +} + +void Ble::EnableRadio() { + isRadioEnabled = true; +} + +void Ble::DisableRadio() { + isRadioEnabled = false; } void Ble::StartFirmwareUpdate() { diff --git a/src/components/ble/BleController.h b/src/components/ble/BleController.h index 2714c0c3..675ede2d 100644 --- a/src/components/ble/BleController.h +++ b/src/components/ble/BleController.h @@ -10,14 +10,15 @@ namespace Pinetime { using BleAddress = std::array; enum class FirmwareUpdateStates { Idle, Running, Validated, Error }; enum class AddressTypes { Public, Random, RPA_Public, RPA_Random }; - enum class ConnectStates { Disconnected, Connected, Airplane }; Ble() = default; - bool IsConnected() const { - return (connectionState == ConnectStates::Connected); - } - void SetConnectState(ConnectStates newState); - ConnectStates GetConnectState() const; + bool IsConnected() const; + void Connect(); + void Disconnect(); + + bool IsRadioEnabled() const; + void EnableRadio(); + void DisableRadio(); void StartFirmwareUpdate(); void StopFirmwareUpdate(); @@ -57,7 +58,8 @@ namespace Pinetime { } private: - ConnectStates connectionState = ConnectStates::Disconnected; + bool isConnected = false; + bool isRadioEnabled = true; bool isFirmwareUpdating = false; uint32_t firmwareUpdateTotalBytes = 0; uint32_t firmwareUpdateCurrentBytes = 0; diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp index 94d2d155..f6ab6269 100644 --- a/src/components/ble/NimbleController.cpp +++ b/src/components/ble/NimbleController.cpp @@ -184,7 +184,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { case BLE_GAP_EVENT_ADV_COMPLETE: NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_ADV_COMPLETE"); NRF_LOG_INFO("reason=%d; status=%0X", event->adv_complete.reason, event->connect.status); - if (bleController.GetConnectState() == Ble::ConnectStates::Disconnected) { + if (bleController.IsRadioEnabled() && !bleController.IsConnected()) { StartAdvertising(); } break; @@ -199,12 +199,12 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { currentTimeClient.Reset(); alertNotificationClient.Reset(); connectionHandle = BLE_HS_CONN_HANDLE_NONE; - bleController.SetConnectState(Ble::ConnectStates::Disconnected); + bleController.Disconnect(); fastAdvCount = 0; StartAdvertising(); } else { connectionHandle = event->connect.conn_handle; - bleController.SetConnectState(Ble::ConnectStates::Connected); + bleController.Connect(); systemTask.PushMessage(Pinetime::System::Messages::BleConnected); // Service discovery is deferred via systemtask } @@ -222,8 +222,8 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { currentTimeClient.Reset(); alertNotificationClient.Reset(); connectionHandle = BLE_HS_CONN_HANDLE_NONE; - if (bleController.GetConnectState() == Ble::ConnectStates::Connected) { - bleController.SetConnectState(Ble::ConnectStates::Disconnected); + if(bleController.IsConnected()) { + bleController.Disconnect(); fastAdvCount = 0; StartAdvertising(); } @@ -401,19 +401,20 @@ void NimbleController::NotifyBatteryLevel(uint8_t level) { } } -void NimbleController::SwitchAirplaneMode(bool enabled) { - if (enabled) { - if (bleController.IsConnected()) { - bleController.SetConnectState(Ble::ConnectStates::Airplane); - ble_gap_terminate(connectionHandle, BLE_ERR_REM_USER_CONN_TERM); - } else { - bleController.SetConnectState(Ble::ConnectStates::Airplane); - ble_gap_adv_stop(); - } +void NimbleController::EnableRadio() { + bleController.EnableRadio(); + bleController.Disconnect(); + fastAdvCount = 0; + StartAdvertising(); +} + +void NimbleController::DisableRadio() { + bleController.DisableRadio(); + if (bleController.IsConnected()) { + ble_gap_terminate(connectionHandle, BLE_ERR_REM_USER_CONN_TERM); + bleController.Disconnect(); } else { - bleController.SetConnectState(Ble::ConnectStates::Disconnected); - fastAdvCount = 0; - StartAdvertising(); + ble_gap_adv_stop(); } } diff --git a/src/components/ble/NimbleController.h b/src/components/ble/NimbleController.h index 7219ba6b..ad194212 100644 --- a/src/components/ble/NimbleController.h +++ b/src/components/ble/NimbleController.h @@ -53,18 +53,6 @@ namespace Pinetime { void Init(); void StartAdvertising(); int OnGAPEvent(ble_gap_event* event); - - /* these are not implemented yet - int OnDiscoveryEvent(uint16_t i, const ble_gatt_error* pError, const ble_gatt_svc* pSvc); - int OnCTSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic); - int OnANSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic); - int OnCurrentTimeReadResult(uint16_t connectionHandle, const ble_gatt_error* error, ble_gatt_attr* attribute); - int OnANSDescriptorDiscoveryEventCallback(uint16_t connectionHandle, - const ble_gatt_error* error, - uint16_t characteristicValueHandle, - const ble_gatt_dsc* descriptor); - */ - void StartDiscovery(); Pinetime::Controllers::MusicService& music() { @@ -87,7 +75,8 @@ namespace Pinetime { fastAdvCount = 0; }; - void SwitchAirplaneMode(bool enabled); + void EnableRadio(); + void DisableRadio(); private: void PersistBond(struct ble_gap_conn_desc& desc); diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 9878aac5..24a82607 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -202,12 +202,12 @@ namespace Pinetime { return settings.stepsGoal; }; - void SetAirplaneMode(bool mode) { - airplaneMode = mode; + void SetBleRadioEnabled(bool enabled) { + bleRadioEnabled = enabled; }; - bool GetAirplaneMode() const { - return airplaneMode; + bool GetBleRadioEnabled() const { + return bleRadioEnabled; }; private: @@ -240,7 +240,7 @@ namespace Pinetime { /* airplaneMode is intentionally not saved with the other watch settings and initialized * to off (false) on every boot because we always want ble to be enabled on startup */ - bool airplaneMode = false; + bool bleRadioEnabled = true; void LoadSettingsFromFile(); void SaveSettingsToFile(); diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 25ae9ad6..fdc6376c 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -293,8 +293,8 @@ void DisplayApp::Refresh() { case Messages::BleFirmwareUpdateStarted: LoadApp(Apps::FirmwareUpdate, DisplayApp::FullRefreshDirections::Down); break; - case Messages::AirplaneModeToggle: - PushMessageToSystemTask(System::Messages::AirplaneModeToggle); + case Messages::BleRadioEnableToggle: + PushMessageToSystemTask(System::Messages::BleRadioEnableToggle); break; case Messages::UpdateDateTime: // Added to remove warning diff --git a/src/displayapp/Messages.h b/src/displayapp/Messages.h index 62256b9e..58df4556 100644 --- a/src/displayapp/Messages.h +++ b/src/displayapp/Messages.h @@ -22,7 +22,7 @@ namespace Pinetime { ShowPairingKey, AlarmTriggered, Clock, - AirplaneModeToggle + BleRadioEnableToggle }; } } diff --git a/src/displayapp/screens/BleIcon.cpp b/src/displayapp/screens/BleIcon.cpp index a30d23bd..019f8039 100644 --- a/src/displayapp/screens/BleIcon.cpp +++ b/src/displayapp/screens/BleIcon.cpp @@ -2,11 +2,14 @@ #include "displayapp/screens/Symbols.h" using namespace Pinetime::Applications::Screens; -const char* BleIcon::GetIcon(Pinetime::Controllers::Ble::ConnectStates state) { - if (state == Pinetime::Controllers::Ble::ConnectStates::Connected) - return Symbols::bluetooth; - else if (state == Pinetime::Controllers::Ble::ConnectStates::Airplane) +const char* BleIcon::GetIcon(bool isRadioEnabled, bool isConnected) { + if(!isRadioEnabled) { return Symbols::airplane; - else - return Symbols::none; + } + + if (isConnected) { + return Symbols::bluetooth; + } + + return Symbols::none; } diff --git a/src/displayapp/screens/BleIcon.h b/src/displayapp/screens/BleIcon.h index d7410eae..d32dfad7 100644 --- a/src/displayapp/screens/BleIcon.h +++ b/src/displayapp/screens/BleIcon.h @@ -7,7 +7,7 @@ namespace Pinetime { namespace Screens { class BleIcon { public: - static const char* GetIcon(Pinetime::Controllers::Ble::ConnectStates state); + static const char* GetIcon(bool isRadioEnabled, bool isConnected); }; } } diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp index f1f7f922..44bf47a4 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/PineTimeStyle.cpp @@ -42,6 +42,13 @@ namespace { auto* screen = static_cast(obj->user_data); screen->UpdateSelected(obj, event); } + + bool IsBleIconVisible(bool isRadioEnabled, bool isConnected) { + if(!isRadioEnabled) { + return true; + } + return isConnected; + } } PineTimeStyle::PineTimeStyle(DisplayApp* app, @@ -336,11 +343,13 @@ void PineTimeStyle::SetBatteryIcon() { lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); } + void PineTimeStyle::AlignIcons() { - if (notificationState.Get() && bleState.Get() != Pinetime::Controllers::Ble::ConnectStates::Disconnected) { + bool isBleIconVisible = IsBleIconVisible(bleRadioEnabled.Get(), bleState.Get()); + if (notificationState.Get() && isBleIconVisible) { lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 8, 25); lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, -8, 25); - } else if (notificationState.Get() && bleState.Get() == Pinetime::Controllers::Ble::ConnectStates::Disconnected) { + } else if (notificationState.Get() && !isBleIconVisible) { lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25); } else { lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25); @@ -363,9 +372,10 @@ void PineTimeStyle::Refresh() { } } - bleState = bleController.GetConnectState(); - if (bleState.IsUpdated()) { - lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); + bleState = bleController.IsConnected(); + bleRadioEnabled = bleController.IsRadioEnabled(); + if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { + lv_label_set_text(bleIcon, BleIcon::GetIcon(bleRadioEnabled.Get(), bleState.Get())); AlignIcons(); } diff --git a/src/displayapp/screens/PineTimeStyle.h b/src/displayapp/screens/PineTimeStyle.h index cb8f6804..5de9a5fa 100644 --- a/src/displayapp/screens/PineTimeStyle.h +++ b/src/displayapp/screens/PineTimeStyle.h @@ -51,7 +51,8 @@ namespace Pinetime { DirtyValue batteryPercentRemaining {}; DirtyValue isCharging {}; - DirtyValue bleState {}; + DirtyValue bleState {}; + DirtyValue bleRadioEnabled {}; DirtyValue> currentDateTime {}; DirtyValue motionSensorOk {}; DirtyValue stepCount {}; diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index fd36aa22..56155d52 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -119,9 +119,10 @@ void WatchFaceDigital::Refresh() { lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); } - bleState = bleController.GetConnectState(); - if (bleState.IsUpdated()) { - lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); + bleState = bleController.IsConnected(); + bleRadioEnabled = bleController.IsRadioEnabled(); + if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { + lv_label_set_text(bleIcon, BleIcon::GetIcon(bleRadioEnabled.Get(), bleState.Get())); } lv_obj_realign(batteryIcon); lv_obj_realign(batteryPlug); diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 6cf11310..d33434c0 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -46,7 +46,8 @@ namespace Pinetime { DirtyValue batteryPercentRemaining {}; DirtyValue powerPresent {}; - DirtyValue bleState {}; + DirtyValue bleState {}; + DirtyValue bleRadioEnabled {}; DirtyValue> currentDateTime {}; DirtyValue motionSensorOk {}; DirtyValue stepCount {}; diff --git a/src/displayapp/screens/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp index 033aad88..ccfbdd0b 100644 --- a/src/displayapp/screens/WatchFaceTerminal.cpp +++ b/src/displayapp/screens/WatchFaceTerminal.cpp @@ -114,11 +114,16 @@ void WatchFaceTerminal::Refresh() { } bleState = bleController.IsConnected(); - if (bleState.IsUpdated()) { - if (bleState.Get()) { - lv_label_set_text_static(connectState, "[STAT]#387b54 Connected#"); + bleRadioEnabled = bleController.IsRadioEnabled(); + if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { + if(!bleRadioEnabled.Get()) { + lv_label_set_text_static(connectState, "[STAT]#387b54 Disabled#"); } else { - lv_label_set_text_static(connectState, "[STAT]#387b54 Disconnected#"); + if (bleState.Get()) { + lv_label_set_text_static(connectState, "[STAT]#387b54 Connected#"); + } else { + lv_label_set_text_static(connectState, "[STAT]#387b54 Disconnected#"); + } } } diff --git a/src/displayapp/screens/WatchFaceTerminal.h b/src/displayapp/screens/WatchFaceTerminal.h index c3df82b4..78c7b8aa 100644 --- a/src/displayapp/screens/WatchFaceTerminal.h +++ b/src/displayapp/screens/WatchFaceTerminal.h @@ -47,6 +47,7 @@ namespace Pinetime { DirtyValue batteryPercentRemaining {}; DirtyValue powerPresent {}; DirtyValue bleState {}; + DirtyValue bleRadioEnabled {}; DirtyValue> currentDateTime {}; DirtyValue motionSensorOk {}; DirtyValue stepCount {}; diff --git a/src/displayapp/screens/settings/SettingAirplaneMode.cpp b/src/displayapp/screens/settings/SettingAirplaneMode.cpp index 0a364ded..85172787 100644 --- a/src/displayapp/screens/settings/SettingAirplaneMode.cpp +++ b/src/displayapp/screens/settings/SettingAirplaneMode.cpp @@ -9,14 +9,17 @@ using namespace Pinetime::Applications::Screens; namespace { - static void event_handler(lv_obj_t* obj, lv_event_t event) { - SettingAirplaneMode* screen = static_cast(obj->user_data); - screen->UpdateSelected(obj, event); + static void OnAirplaneModeEnabledEvent(lv_obj_t* obj, lv_event_t event) { + auto* screen = static_cast(obj->user_data); + screen->OnAirplaneModeEnabled(obj, event); + } + + static void OnAirplaneModeDisabledEvent(lv_obj_t* obj, lv_event_t event) { + auto* screen = static_cast(obj->user_data); + screen->OnAirplaneModeDisabled(obj, event); } } -constexpr std::array SettingAirplaneMode::options; - SettingAirplaneMode::SettingAirplaneMode(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) : Screen(app), settingsController {settingsController} { @@ -43,47 +46,48 @@ SettingAirplaneMode::SettingAirplaneMode(Pinetime::Applications::DisplayApp* app lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0); - for (unsigned int i = 0; i < options.size(); i++) { - cbOption[i] = lv_checkbox_create(container1, nullptr); - lv_checkbox_set_text(cbOption[i], options[i]); - cbOption[i]->user_data = this; - lv_obj_set_event_cb(cbOption[i], event_handler); - SetRadioButtonStyle(cbOption[i]); - } + cbEnabled = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text(cbEnabled, " Enable"); + cbEnabled->user_data = this; + lv_obj_set_event_cb(cbEnabled, OnAirplaneModeEnabledEvent); + SetRadioButtonStyle(cbEnabled); - if (settingsController.GetAirplaneMode() == false) { - lv_checkbox_set_checked(cbOption[0], true); - priorMode = false; - } else { - lv_checkbox_set_checked(cbOption[1], true); + cbDisabled = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text(cbDisabled, " Disable"); + cbDisabled->user_data = this; + lv_obj_set_event_cb(cbDisabled, OnAirplaneModeDisabledEvent); + SetRadioButtonStyle(cbDisabled); + + if (settingsController.GetBleRadioEnabled()) { + lv_checkbox_set_checked(cbDisabled, true); priorMode = true; + } else { + lv_checkbox_set_checked(cbEnabled, true); + priorMode = false; } } SettingAirplaneMode::~SettingAirplaneMode() { lv_obj_clean(lv_scr_act()); // Do not call SaveSettings - see src/components/settings/Settings.h - if (priorMode != settingsController.GetAirplaneMode()) { - app->PushMessage(Pinetime::Applications::Display::Messages::AirplaneModeToggle); + if (priorMode != settingsController.GetBleRadioEnabled()) { + app->PushMessage(Pinetime::Applications::Display::Messages::BleRadioEnableToggle); } } -void SettingAirplaneMode::UpdateSelected(lv_obj_t* object, lv_event_t event) { +void SettingAirplaneMode::OnAirplaneModeEnabled(lv_obj_t* object, lv_event_t event) { if (event == LV_EVENT_VALUE_CHANGED) { - for (unsigned int i = 0; i < options.size(); i++) { - if (object == cbOption[i]) { - lv_checkbox_set_checked(cbOption[i], true); - - if (i == 0) { - settingsController.SetAirplaneMode(false); - }; - if (i == 1) { - settingsController.SetAirplaneMode(true); - }; - - } else { - lv_checkbox_set_checked(cbOption[i], false); - } - } + lv_checkbox_set_checked(cbEnabled, true); + lv_checkbox_set_checked(cbDisabled, false); + settingsController.SetBleRadioEnabled(false); } } + +void SettingAirplaneMode::OnAirplaneModeDisabled(lv_obj_t* object, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { + lv_checkbox_set_checked(cbEnabled, false); + lv_checkbox_set_checked(cbDisabled, true); + settingsController.SetBleRadioEnabled(true); + } +} + diff --git a/src/displayapp/screens/settings/SettingAirplaneMode.h b/src/displayapp/screens/settings/SettingAirplaneMode.h index fcc02228..b3478c64 100644 --- a/src/displayapp/screens/settings/SettingAirplaneMode.h +++ b/src/displayapp/screens/settings/SettingAirplaneMode.h @@ -17,12 +17,13 @@ namespace Pinetime { SettingAirplaneMode(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); ~SettingAirplaneMode() override; - void UpdateSelected(lv_obj_t* object, lv_event_t event); + void OnAirplaneModeEnabled(lv_obj_t* object, lv_event_t event); + void OnAirplaneModeDisabled(lv_obj_t* object, lv_event_t event); private: - static constexpr std::array options = {" No", " Yes"}; Controllers::Settings& settingsController; - lv_obj_t* cbOption[options.size()]; + lv_obj_t* cbEnabled; + lv_obj_t* cbDisabled; bool priorMode; }; } diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp index 7bc90b47..981b4973 100644 --- a/src/displayapp/screens/settings/Settings.cpp +++ b/src/displayapp/screens/settings/Settings.cpp @@ -21,7 +21,11 @@ Settings::Settings(Pinetime::Applications::DisplayApp* app, Pinetime::Controller }, [this]() -> std::unique_ptr { return CreateScreen3(); - }}, + }, + [this]() -> std::unique_ptr { + return CreateScreen4(); + }, + }, Screens::ScreenListModes::UpDown} { } @@ -34,7 +38,6 @@ bool Settings::OnTouchEvent(Pinetime::Applications::TouchEvents event) { } std::unique_ptr Settings::CreateScreen1() { - std::array applications {{ {Symbols::sun, "Display", Apps::SettingDisplay}, {Symbols::eye, "Wake Up", Apps::SettingWakeUp}, @@ -42,17 +45,17 @@ std::unique_ptr Settings::CreateScreen1() { {Symbols::home, "Watch face", Apps::SettingWatchFace}, }}; - return std::make_unique(0, 3, app, settingsController, applications); + return std::make_unique(0, 4, app, settingsController, applications); } std::unique_ptr Settings::CreateScreen2() { + std::array applications {{ + {Symbols::shoe, "Steps", Apps::SettingSteps}, + {Symbols::clock, "Set date", Apps::SettingSetDate}, + {Symbols::clock, "Set time", Apps::SettingSetTime}, + {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}}}; - std::array applications {{{Symbols::shoe, "Steps", Apps::SettingSteps}, - {Symbols::clock, "Set date", Apps::SettingSetDate}, - {Symbols::clock, "Set time", Apps::SettingSetTime}, - {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}}}; - - return std::make_unique(1, 3, app, settingsController, applications); + return std::make_unique(1, 4, app, settingsController, applications); } std::unique_ptr Settings::CreateScreen3() { @@ -61,8 +64,20 @@ std::unique_ptr Settings::CreateScreen3() { {Symbols::clock, "Chimes", Apps::SettingChimes}, {Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold}, {Symbols::check, "Firmware", Apps::FirmwareValidation}, - {Symbols::list, "About", Apps::SysInfo} + {Symbols::list, "Airplane mode", Apps::SettingAirplaneMode} }}; - return std::make_unique(2, 3, app, settingsController, applications); + return std::make_unique(2, 4, app, settingsController, applications); +} + +std::unique_ptr Settings::CreateScreen4() { + + std::array applications {{ + {Symbols::list, "About", Apps::SysInfo}, + {Symbols::none, "None", Apps::None}, + {Symbols::none, "None", Apps::None}, + {Symbols::none, "None", Apps::None} + }}; + + return std::make_unique(3, 4, app, settingsController, applications); } diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h index 6c54cdeb..be090075 100644 --- a/src/displayapp/screens/settings/Settings.h +++ b/src/displayapp/screens/settings/Settings.h @@ -19,11 +19,12 @@ namespace Pinetime { private: Controllers::Settings& settingsController; - ScreenList<3> screens; + ScreenList<4> screens; std::unique_ptr CreateScreen1(); std::unique_ptr CreateScreen2(); std::unique_ptr CreateScreen3(); + std::unique_ptr CreateScreen4(); }; } } diff --git a/src/systemtask/Messages.h b/src/systemtask/Messages.h index ad13244f..2e3456a2 100644 --- a/src/systemtask/Messages.h +++ b/src/systemtask/Messages.h @@ -31,7 +31,7 @@ namespace Pinetime { BatteryPercentageUpdated, StartFileTransfer, StopFileTransfer, - AirplaneModeToggle + BleRadioEnableToggle }; } } diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 75a71ecc..1e45fac1 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -254,7 +254,7 @@ void SystemTask::Work() { displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToRunning); heartRateApp.PushMessage(Pinetime::Applications::HeartRateTask::Messages::WakeUp); - if (bleController.GetConnectState() == Controllers::Ble::ConnectStates::Disconnected) { + if (bleController.IsRadioEnabled() && !bleController.IsConnected()) { nimbleController.RestartFastAdv(); } @@ -440,8 +440,12 @@ void SystemTask::Work() { motorController.RunForDuration(35); displayApp.PushMessage(Pinetime::Applications::Display::Messages::ShowPairingKey); break; - case Messages::AirplaneModeToggle: - nimbleController.SwitchAirplaneMode(settingsController.GetAirplaneMode()); + case Messages::BleRadioEnableToggle: + if(settingsController.GetBleRadioEnabled()) { + nimbleController.EnableRadio(); + } else { + nimbleController.DisableRadio(); + } break; default: break; From 2803dd667f90bf8b19e45820235d3ab90490f96b Mon Sep 17 00:00:00 2001 From: avery Date: Tue, 22 Feb 2022 18:21:00 +0100 Subject: [PATCH 11/53] Use Bluetooth brand color for status text --- src/displayapp/screens/WatchFaceTerminal.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/displayapp/screens/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp index ccfbdd0b..c593e6bf 100644 --- a/src/displayapp/screens/WatchFaceTerminal.cpp +++ b/src/displayapp/screens/WatchFaceTerminal.cpp @@ -46,7 +46,7 @@ WatchFaceTerminal::WatchFaceTerminal(DisplayApp* app, connectState = lv_label_create(lv_scr_act(), nullptr); lv_label_set_recolor(connectState, true); - lv_label_set_text(connectState, "[STAT]#387b54 Disconnected#"); + lv_label_set_text(connectState, "[STAT]#0082fc Disconnected#"); lv_obj_align(connectState, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 40); notificationIcon = lv_label_create(lv_scr_act(), nullptr); @@ -117,12 +117,12 @@ void WatchFaceTerminal::Refresh() { bleRadioEnabled = bleController.IsRadioEnabled(); if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { if(!bleRadioEnabled.Get()) { - lv_label_set_text_static(connectState, "[STAT]#387b54 Disabled#"); + lv_label_set_text_static(connectState, "[STAT]#0082fc Disabled#"); } else { if (bleState.Get()) { - lv_label_set_text_static(connectState, "[STAT]#387b54 Connected#"); + lv_label_set_text_static(connectState, "[STAT]#0082fc Connected#"); } else { - lv_label_set_text_static(connectState, "[STAT]#387b54 Disconnected#"); + lv_label_set_text_static(connectState, "[STAT]#0082fc Disconnected#"); } } } From 8dae4c82990df8236faa57ef4b6ae00c92298a1d Mon Sep 17 00:00:00 2001 From: avery Date: Tue, 22 Feb 2022 18:42:54 +0100 Subject: [PATCH 12/53] terminal: Replace notification icon with a text entry --- src/displayapp/screens/WatchFaceTerminal.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/displayapp/screens/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp index c593e6bf..ebd463f9 100644 --- a/src/displayapp/screens/WatchFaceTerminal.cpp +++ b/src/displayapp/screens/WatchFaceTerminal.cpp @@ -50,8 +50,9 @@ WatchFaceTerminal::WatchFaceTerminal(DisplayApp* app, lv_obj_align(connectState, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 40); notificationIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); - lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 10, 0); + lv_label_set_recolor(notificationIcon, true); + lv_label_set_text(notificationIcon, "[NOTI]#387b54 ---"); + lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_LEFT_MID, 0, 60); label_date = lv_label_create(lv_scr_act(), nullptr); lv_label_set_recolor(label_date, true); @@ -62,7 +63,7 @@ WatchFaceTerminal::WatchFaceTerminal(DisplayApp* app, lv_label_set_text(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_obj_align(label_prompt_2, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 80); lv_label_set_text(label_prompt_2, "user@watch:~ $"); label_time = lv_label_create(lv_scr_act(), nullptr); @@ -130,9 +131,9 @@ void WatchFaceTerminal::Refresh() { notificationState = notificatioManager.AreNewNotificationsAvailable(); if (notificationState.IsUpdated()) { if (notificationState.Get()) { - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(true)); + lv_label_set_text_static(notificationIcon, "[NOTI]#387b54 Unread"); } else { - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); + lv_label_set_text_static(notificationIcon, "[NOTI]#387b54 ---"); } } From 51640c72489109149c8a7c6c7cf044862cceabf5 Mon Sep 17 00:00:00 2001 From: Arsen6331 Date: Thu, 3 Mar 2022 17:01:34 +0000 Subject: [PATCH 13/53] Add ITD as a companion app --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ae315f24..524f510e 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Fast open-source firmware for the [PineTime smartwatch](https://www.pine64.org/p - [AmazFish](https://openrepos.net/content/piggz/amazfish/) (SailfishOS) - [Siglo](https://github.com/alexr4535/siglo) (Linux) - [InfiniLink](https://github.com/xan-m/InfiniLink) **[Experimental]** (iOS) + - [ITD](https://gitea.arsenm.dev/Arsen6331/itd) (Linux) ## Development From 29f0bce46bd531ffa83f3445c0e0d893217aa50d Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Mon, 21 Feb 2022 22:50:20 +0100 Subject: [PATCH 14/53] Remove unused includes in HearRate and Motion.h The include `bits/unique_ptr.h` isn't used, so remove it. --- src/displayapp/screens/HeartRate.h | 1 - src/displayapp/screens/Motion.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/displayapp/screens/HeartRate.h b/src/displayapp/screens/HeartRate.h index baa0ccdd..2ad00351 100644 --- a/src/displayapp/screens/HeartRate.h +++ b/src/displayapp/screens/HeartRate.h @@ -3,7 +3,6 @@ #include #include #include "displayapp/screens/Screen.h" -#include #include "systemtask/SystemTask.h" #include #include diff --git a/src/displayapp/screens/Motion.h b/src/displayapp/screens/Motion.h index d6997409..4d2bd4f2 100644 --- a/src/displayapp/screens/Motion.h +++ b/src/displayapp/screens/Motion.h @@ -3,7 +3,6 @@ #include #include #include "displayapp/screens/Screen.h" -#include #include #include #include From a29e30c1876891e504ad62fb35d3b1be76b175a4 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sat, 29 Jan 2022 23:30:03 +0100 Subject: [PATCH 15/53] Notifications: replace newlines in label-copy because of const char* title The variable `title` is defined as `const char*`, which means, that `strchr()` returns a `const char*` as well according to https://www.cplusplus.com/reference/cstring/strchr/ But in the same line the return value is assigned to a non-const `char*`, which shouldn't be allowed (error with `-pedantic`). Because the `lv_label` creates an internal copy of the title sting, just modify that one instead and replace newline in the copied string. --- src/displayapp/screens/Notifications.cpp | 19 +++++++++++-------- src/displayapp/screens/Notifications.h | 4 ---- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 3a39dacf..f9afd8c7 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -198,15 +198,18 @@ Notifications::NotificationItem::NotificationItem(const char* title, lv_obj_t* alert_type = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(alert_type, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x888888)); - if (title == nullptr) - title = "Notification"; - char* pchar; - pchar = strchr(title, '\n'); - while (pchar != nullptr) { - *pchar = ' '; - pchar = strchr(pchar + 1, '\n'); + if(title == nullptr) { + lv_label_set_text_static(alert_type, "Notification"); + } else { + // copy title to label and replace newlines with spaces + lv_label_set_text(alert_type, title); + char *pchar = strchr(lv_label_get_text(alert_type), '\n'); + while (pchar != nullptr) { + *pchar = ' '; + pchar = strchr(pchar + 1, '\n'); + } + lv_label_refr_text(alert_type); } - lv_label_set_text(alert_type, title); lv_label_set_long_mode(alert_type, LV_LABEL_LONG_SROLL_CIRC); lv_obj_set_width(alert_type, 180); lv_obj_align(alert_type, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 16); diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index f49d3b3a..74160356 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -62,10 +62,6 @@ namespace Pinetime { }; private: - struct NotificationData { - const char* title; - const char* text; - }; Pinetime::Controllers::NotificationManager& notificationManager; Pinetime::Controllers::AlertNotificationService& alertNotificationService; Pinetime::Controllers::MotorController& motorController; From 1bfee61ef9f136b186199fb41abf04bf63918574 Mon Sep 17 00:00:00 2001 From: avery Date: Tue, 22 Feb 2022 17:37:28 +0100 Subject: [PATCH 16/53] Replace Airplane mode icon --- src/displayapp/screens/settings/Settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp index 981b4973..dce0c071 100644 --- a/src/displayapp/screens/settings/Settings.cpp +++ b/src/displayapp/screens/settings/Settings.cpp @@ -64,7 +64,7 @@ std::unique_ptr Settings::CreateScreen3() { {Symbols::clock, "Chimes", Apps::SettingChimes}, {Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold}, {Symbols::check, "Firmware", Apps::FirmwareValidation}, - {Symbols::list, "Airplane mode", Apps::SettingAirplaneMode} + {Symbols::airplane, "Airplane mode", Apps::SettingAirplaneMode} }}; return std::make_unique(2, 4, app, settingsController, applications); From f1c91e1ce0fb666449e751fc4a8216f1a672f95f Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Sun, 20 Feb 2022 15:06:28 +0200 Subject: [PATCH 17/53] terminal watchface: remove icons and other fixes --- src/displayapp/screens/WatchFaceTerminal.cpp | 38 +++++--------------- src/displayapp/screens/WatchFaceTerminal.h | 2 -- 2 files changed, 9 insertions(+), 31 deletions(-) diff --git a/src/displayapp/screens/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp index ccfbdd0b..08a9db5b 100644 --- a/src/displayapp/screens/WatchFaceTerminal.cpp +++ b/src/displayapp/screens/WatchFaceTerminal.cpp @@ -32,25 +32,15 @@ WatchFaceTerminal::WatchFaceTerminal(DisplayApp* app, motionController {motionController} { settingsController.SetClockFace(3); - batteryIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(batteryIcon, Symbols::batteryFull); - lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -5, 2); - - batteryPlug = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(batteryPlug, Symbols::plug); - lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0); - 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_label_set_text(connectState, "[STAT]#387b54 Disconnected#"); lv_obj_align(connectState, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 40); notificationIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 10, 0); label_date = lv_label_create(lv_scr_act(), nullptr); @@ -59,11 +49,11 @@ WatchFaceTerminal::WatchFaceTerminal(DisplayApp* app, 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(label_prompt_1, "user@watch:~ $ now"); + 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(label_prompt_2, "user@watch:~ $"); + 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); @@ -74,16 +64,14 @@ WatchFaceTerminal::WatchFaceTerminal(DisplayApp* app, lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); - lv_label_set_text(backgroundLabel, ""); + lv_label_set_text_static(backgroundLabel, ""); heartbeatValue = lv_label_create(lv_scr_act(), nullptr); lv_label_set_recolor(heartbeatValue, true); - lv_label_set_text(heartbeatValue, "[L_HR]#ee3311 0 bpm#"); 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_label_set_text(stepValue, "[STEP]#ee3377 0 steps#"); 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); @@ -97,20 +85,12 @@ WatchFaceTerminal::~WatchFaceTerminal() { void WatchFaceTerminal::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(); - if (batteryPercent == 100) { - lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); - } else { - lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); + 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"); } - lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); - lv_label_set_text_fmt(batteryValue, "[BATT]#387b54 %d%\%#", batteryPercent); } bleState = bleController.IsConnected(); @@ -130,9 +110,9 @@ void WatchFaceTerminal::Refresh() { notificationState = notificatioManager.AreNewNotificationsAvailable(); if (notificationState.IsUpdated()) { if (notificationState.Get()) { - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(true)); + lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(true)); } else { - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); + lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(false)); } } diff --git a/src/displayapp/screens/WatchFaceTerminal.h b/src/displayapp/screens/WatchFaceTerminal.h index 78c7b8aa..d236da34 100644 --- a/src/displayapp/screens/WatchFaceTerminal.h +++ b/src/displayapp/screens/WatchFaceTerminal.h @@ -60,8 +60,6 @@ namespace Pinetime { lv_obj_t* label_prompt_1; lv_obj_t* label_prompt_2; lv_obj_t* backgroundLabel; - lv_obj_t* batteryIcon; - lv_obj_t* batteryPlug; lv_obj_t* batteryValue; lv_obj_t* heartbeatValue; lv_obj_t* stepValue; From 1eaf258a633969abdd0e41fbcac9e17fe38eb409 Mon Sep 17 00:00:00 2001 From: medeyko Date: Mon, 7 Feb 2022 17:17:12 +0300 Subject: [PATCH 18/53] Update jetbrains_mono_bold_20.c Fix 0 (zero) symbol. For more details, #988 --- src/displayapp/fonts/jetbrains_mono_bold_20.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/displayapp/fonts/jetbrains_mono_bold_20.c b/src/displayapp/fonts/jetbrains_mono_bold_20.c index 944e47a1..6cd7aead 100644 --- a/src/displayapp/fonts/jetbrains_mono_bold_20.c +++ b/src/displayapp/fonts/jetbrains_mono_bold_20.c @@ -88,8 +88,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe, 0x3, 0x80, 0xc0, 0x70, 0x18, 0xe, 0x0, /* U+0030 "0" */ - 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7f, - 0xdf, 0xf7, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, + 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, + 0xdf, 0xb7, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, 0x8f, 0xc0, /* U+0031 "1" */ From 43399b3832df7375f9139d7bd3c082a49549c616 Mon Sep 17 00:00:00 2001 From: medeyko Date: Mon, 7 Feb 2022 17:25:56 +0300 Subject: [PATCH 19/53] Update README.md --- src/displayapp/fonts/README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/displayapp/fonts/README.md b/src/displayapp/fonts/README.md index 40ecd3e2..5007060e 100644 --- a/src/displayapp/fonts/README.md +++ b/src/displayapp/fonts/README.md @@ -31,6 +31,23 @@ Add new symbols: static constexpr const char* newSymbol = "\xEF\x86\x85"; ``` +#### Fix the zero symbol +If you don't wish the inner dot of the 0 (zero) symbol to stick to the boundary), edit `src/displayapp/fonts/jetbrains_mono_bold_20.c` and replace: + + /* U+0030 "0" */ + 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7f, + 0xdf, 0xf7, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, + 0x8f, 0xc0, + +with + + /* U+0030 "0" */ + 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, + 0xdf, 0xb7, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, + 0x8f, 0xc0, + +(there are two changes: 7f -> 7e and f7 -> b7) + ## Simple method to generate a font If you want to generate a basic font containing only numbers and letters, you can use the above settings but instead of specifying a range, simply list the characters you need in the Symbols field and leave the range blank. This is the approach used for the PineTimeStyle watchface. From dd28359571088cc850d315b5c3689c69f54e5838 Mon Sep 17 00:00:00 2001 From: medeyko Date: Mon, 7 Feb 2022 17:31:18 +0300 Subject: [PATCH 20/53] Update README.md remove unnecessary ) --- src/displayapp/fonts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/displayapp/fonts/README.md b/src/displayapp/fonts/README.md index 5007060e..a5f66b10 100644 --- a/src/displayapp/fonts/README.md +++ b/src/displayapp/fonts/README.md @@ -32,7 +32,7 @@ static constexpr const char* newSymbol = "\xEF\x86\x85"; ``` #### Fix the zero symbol -If you don't wish the inner dot of the 0 (zero) symbol to stick to the boundary), edit `src/displayapp/fonts/jetbrains_mono_bold_20.c` and replace: +If you don't wish the inner dot of the 0 (zero) symbol to stick to the boundary, edit `src/displayapp/fonts/jetbrains_mono_bold_20.c` and replace: /* U+0030 "0" */ 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7f, From dd47ba9782cb7a7a2268da5b493e6d385bdf08af Mon Sep 17 00:00:00 2001 From: medeyko Date: Mon, 7 Feb 2022 18:29:28 +0300 Subject: [PATCH 21/53] Update README.md More imperative tone --- src/displayapp/fonts/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/displayapp/fonts/README.md b/src/displayapp/fonts/README.md index a5f66b10..b4737681 100644 --- a/src/displayapp/fonts/README.md +++ b/src/displayapp/fonts/README.md @@ -31,8 +31,7 @@ Add new symbols: static constexpr const char* newSymbol = "\xEF\x86\x85"; ``` -#### Fix the zero symbol -If you don't wish the inner dot of the 0 (zero) symbol to stick to the boundary, edit `src/displayapp/fonts/jetbrains_mono_bold_20.c` and replace: +Then fix an error that happens during the font conversion (the inner dot of the 'zero' symbol sticks to the boundary): edit `src/displayapp/fonts/jetbrains_mono_bold_20.c` and replace: /* U+0030 "0" */ 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7f, From 5613449bfb16ed7bac672621f0f6c13afb1e1718 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Fri, 19 Nov 2021 23:14:19 +0100 Subject: [PATCH 22/53] Settings: more specific read and write mode For each filesystem interaction be more specific if we want to read from the file or write to it. Doing a non-creating read on the loading of the settings file, otherwise an empty file could be created, and when reading that empty file for the initial settings I would expect an error (or random data) when reading. --- src/components/settings/Settings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/settings/Settings.cpp b/src/components/settings/Settings.cpp index ef73ad1c..fee62daf 100644 --- a/src/components/settings/Settings.cpp +++ b/src/components/settings/Settings.cpp @@ -26,7 +26,7 @@ void Settings::LoadSettingsFromFile() { SettingsData bufferSettings; lfs_file_t settingsFile; - if ( fs.FileOpen(&settingsFile, "/settings.dat", LFS_O_RDWR | LFS_O_CREAT) != LFS_ERR_OK) { + if ( fs.FileOpen(&settingsFile, "/settings.dat", LFS_O_RDONLY) != LFS_ERR_OK) { return; } fs.FileRead(&settingsFile, reinterpret_cast(&bufferSettings), sizeof(settings)); @@ -39,7 +39,7 @@ void Settings::LoadSettingsFromFile() { void Settings::SaveSettingsToFile() { lfs_file_t settingsFile; - if ( fs.FileOpen(&settingsFile, "/settings.dat", LFS_O_RDWR | LFS_O_CREAT) != LFS_ERR_OK) { + if ( fs.FileOpen(&settingsFile, "/settings.dat", LFS_O_WRONLY | LFS_O_CREAT) != LFS_ERR_OK) { return; } fs.FileWrite(&settingsFile, reinterpret_cast(&settings), sizeof(settings)); From 30797b37bc509b24c86364f6d7b55be642a6dfb4 Mon Sep 17 00:00:00 2001 From: Yehoshua Pesach Wallach Date: Fri, 28 Jan 2022 14:34:59 +0200 Subject: [PATCH 23/53] removed SetClockFace from watchface Constructors --- src/displayapp/screens/WatchFaceAnalog.cpp | 1 - src/displayapp/screens/WatchFaceDigital.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index f027a744..f1b91444 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -57,7 +57,6 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, bleController {bleController}, notificationManager {notificationManager}, settingsController {settingsController} { - settingsController.SetClockFace(1); sHour = 99; sMinute = 99; diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 56155d52..59bde839 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -32,7 +32,6 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, settingsController {settingsController}, heartRateController {heartRateController}, motionController {motionController} { - settingsController.SetClockFace(0); batteryIcon = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text_static(batteryIcon, Symbols::batteryFull); From 5d974434ef2211c8feb7fe464bc9e2da3a3e1771 Mon Sep 17 00:00:00 2001 From: avery Date: Sat, 5 Mar 2022 13:01:50 +0100 Subject: [PATCH 24/53] Replace notif entry with "You have mail." text --- src/displayapp/screens/WatchFaceTerminal.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/displayapp/screens/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp index ebd463f9..d1d22305 100644 --- a/src/displayapp/screens/WatchFaceTerminal.cpp +++ b/src/displayapp/screens/WatchFaceTerminal.cpp @@ -50,9 +50,7 @@ WatchFaceTerminal::WatchFaceTerminal(DisplayApp* app, lv_obj_align(connectState, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 40); notificationIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_recolor(notificationIcon, true); - lv_label_set_text(notificationIcon, "[NOTI]#387b54 ---"); - lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_LEFT_MID, 0, 60); + 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); @@ -63,7 +61,7 @@ WatchFaceTerminal::WatchFaceTerminal(DisplayApp* app, lv_label_set_text(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, 80); + lv_obj_align(label_prompt_2, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 60); lv_label_set_text(label_prompt_2, "user@watch:~ $"); label_time = lv_label_create(lv_scr_act(), nullptr); @@ -131,9 +129,9 @@ void WatchFaceTerminal::Refresh() { notificationState = notificatioManager.AreNewNotificationsAvailable(); if (notificationState.IsUpdated()) { if (notificationState.Get()) { - lv_label_set_text_static(notificationIcon, "[NOTI]#387b54 Unread"); + lv_label_set_text_static(notificationIcon, "You have mail."); } else { - lv_label_set_text_static(notificationIcon, "[NOTI]#387b54 ---"); + lv_label_set_text_static(notificationIcon, ""); } } From 8844ea60b1ccb174e431f1dd96c72c5bb53c227b Mon Sep 17 00:00:00 2001 From: avery Date: Sun, 6 Mar 2022 14:01:20 +0100 Subject: [PATCH 25/53] Remove unnecessary line --- src/displayapp/screens/WatchFaceTerminal.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/displayapp/screens/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp index e77d594b..3a47fc53 100644 --- a/src/displayapp/screens/WatchFaceTerminal.cpp +++ b/src/displayapp/screens/WatchFaceTerminal.cpp @@ -38,7 +38,6 @@ WatchFaceTerminal::WatchFaceTerminal(DisplayApp* app, connectState = lv_label_create(lv_scr_act(), nullptr); lv_label_set_recolor(connectState, true); - lv_label_set_text(connectState, "[STAT]#0082fc Disconnected#"); lv_obj_align(connectState, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 40); notificationIcon = lv_label_create(lv_scr_act(), nullptr); From 5fe5cee9ef76fdb57810a4434517ebc6442393fb Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sun, 20 Feb 2022 14:45:59 +0100 Subject: [PATCH 26/53] Add missing nrf_log.h includes shadowed by SystemMonitor.h Some components were missing a `nrf_log.h` include. This missing include was accidentally provided by the SystemMonitor.h header, which was included by Systemtask.h --- src/components/ble/AlertNotificationClient.cpp | 1 + src/components/ble/DfuService.cpp | 1 + src/components/ble/HeartRateService.cpp | 1 + src/components/ble/MotionService.cpp | 1 + src/components/ble/NimbleController.cpp | 1 + 5 files changed, 5 insertions(+) diff --git a/src/components/ble/AlertNotificationClient.cpp b/src/components/ble/AlertNotificationClient.cpp index 0f850874..335845e3 100644 --- a/src/components/ble/AlertNotificationClient.cpp +++ b/src/components/ble/AlertNotificationClient.cpp @@ -2,6 +2,7 @@ #include #include "components/ble/NotificationManager.h" #include "systemtask/SystemTask.h" +#include using namespace Pinetime::Controllers; constexpr ble_uuid16_t AlertNotificationClient::ansServiceUuid; diff --git a/src/components/ble/DfuService.cpp b/src/components/ble/DfuService.cpp index 71dcc7e6..cf99f01f 100644 --- a/src/components/ble/DfuService.cpp +++ b/src/components/ble/DfuService.cpp @@ -3,6 +3,7 @@ #include "components/ble/BleController.h" #include "drivers/SpiNorFlash.h" #include "systemtask/SystemTask.h" +#include using namespace Pinetime::Controllers; diff --git a/src/components/ble/HeartRateService.cpp b/src/components/ble/HeartRateService.cpp index f178af79..4824a6b3 100644 --- a/src/components/ble/HeartRateService.cpp +++ b/src/components/ble/HeartRateService.cpp @@ -1,6 +1,7 @@ #include "components/ble/HeartRateService.h" #include "components/heartrate/HeartRateController.h" #include "systemtask/SystemTask.h" +#include using namespace Pinetime::Controllers; diff --git a/src/components/ble/MotionService.cpp b/src/components/ble/MotionService.cpp index 6381915d..87923c23 100644 --- a/src/components/ble/MotionService.cpp +++ b/src/components/ble/MotionService.cpp @@ -1,6 +1,7 @@ #include "components/ble/MotionService.h" #include "components/motion/MotionController.h" #include "systemtask/SystemTask.h" +#include using namespace Pinetime::Controllers; diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp index f6ab6269..0be7c0f7 100644 --- a/src/components/ble/NimbleController.cpp +++ b/src/components/ble/NimbleController.cpp @@ -2,6 +2,7 @@ #include #include +#include #define min // workaround: nimble's min/max macros conflict with libstdc++ #define max #include From 187d99c0f710cf4827a026f02e41ebbd2b1271e2 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Thu, 27 Jan 2022 23:10:59 +0100 Subject: [PATCH 27/53] SystemMonitor: implement FreeRtosMonitor only if trace facility is set Split SystemMonitor into h and cpp file and move the logging code of the `Process` function into the cpp file. Depending of the `configUSE_TRACE_FACILITY` define from `src/FreeRTOSConfig.h` create either a "FreeRtosMonitor" or a "DummyMonitor". Make the `Process()` function non-const, as the FreeRtosMonitor changes the member variable `lastTick`. In `SystemTask.h` we then only need to use `SystemMonitor`, without knowledge of the `configUSE_TRACE_FACILITY` define. --- src/CMakeLists.txt | 2 ++ src/systemtask/SystemMonitor.cpp | 26 +++++++++++++++++++++ src/systemtask/SystemMonitor.h | 40 +++++--------------------------- src/systemtask/SystemTask.h | 6 +---- 4 files changed, 35 insertions(+), 39 deletions(-) create mode 100644 src/systemtask/SystemMonitor.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 025fc330..ff0c9b0c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -516,6 +516,7 @@ list(APPEND SOURCE_FILES displayapp/lv_pinetime_theme.c systemtask/SystemTask.cpp + systemtask/SystemMonitor.cpp drivers/TwiMaster.cpp heartratetask/HeartRateTask.cpp @@ -577,6 +578,7 @@ list(APPEND RECOVERY_SOURCE_FILES FreeRTOS/port_cmsis.c systemtask/SystemTask.cpp + systemtask/SystemMonitor.cpp drivers/TwiMaster.cpp components/gfx/Gfx.cpp components/rle/RleDecoder.cpp diff --git a/src/systemtask/SystemMonitor.cpp b/src/systemtask/SystemMonitor.cpp new file mode 100644 index 00000000..90765e30 --- /dev/null +++ b/src/systemtask/SystemMonitor.cpp @@ -0,0 +1,26 @@ +#include "systemtask/SystemTask.h" +#if configUSE_TRACE_FACILITY == 1 +// FreeRtosMonitor +#include +#include +#include + +void Pinetime::System::SystemMonitor::Process() { + if (xTaskGetTickCount() - lastTick > 10000) { + NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize()); + TaskStatus_t tasksStatus[10]; + auto nb = uxTaskGetSystemState(tasksStatus, 10, nullptr); + for (uint32_t i = 0; i < nb; i++) { + NRF_LOG_INFO("Task [%s] - %d", tasksStatus[i].pcTaskName, tasksStatus[i].usStackHighWaterMark); + if (tasksStatus[i].usStackHighWaterMark < 20) + NRF_LOG_INFO("WARNING!!! Task %s task is nearly full, only %dB available", + tasksStatus[i].pcTaskName, + tasksStatus[i].usStackHighWaterMark * 4); + } + lastTick = xTaskGetTickCount(); + } +} +#else +// DummyMonitor +void Pinetime::System::SystemMonitor::Process() {} +#endif diff --git a/src/systemtask/SystemMonitor.h b/src/systemtask/SystemMonitor.h index 45c02c2c..08c87401 100644 --- a/src/systemtask/SystemMonitor.h +++ b/src/systemtask/SystemMonitor.h @@ -1,44 +1,16 @@ #pragma once -#include +#include // declares configUSE_TRACE_FACILITY #include -#include namespace Pinetime { namespace System { - struct DummyMonitor {}; - struct FreeRtosMonitor {}; - - template class SystemMonitor { + class SystemMonitor { public: - SystemMonitor() = delete; - }; - - template <> class SystemMonitor { - public: - void Process() const { - } - }; - - template <> class SystemMonitor { - public: - void Process() const { - if (xTaskGetTickCount() - lastTick > 10000) { - NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize()); - auto nb = uxTaskGetSystemState(tasksStatus, 10, nullptr); - for (uint32_t i = 0; i < nb; i++) { - NRF_LOG_INFO("Task [%s] - %d", tasksStatus[i].pcTaskName, tasksStatus[i].usStackHighWaterMark); - if (tasksStatus[i].usStackHighWaterMark < 20) - NRF_LOG_INFO("WARNING!!! Task %s task is nearly full, only %dB available", - tasksStatus[i].pcTaskName, - tasksStatus[i].usStackHighWaterMark * 4); - } - lastTick = xTaskGetTickCount(); - } - } - + void Process(); +#if configUSE_TRACE_FACILITY == 1 private: mutable TickType_t lastTick = 0; - mutable TaskStatus_t tasksStatus[10]; +#endif }; } -} \ No newline at end of file +} diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index 517ed1ae..c5b03792 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -148,11 +148,7 @@ namespace Pinetime { bool stepCounterMustBeReset = false; static constexpr TickType_t batteryMeasurementPeriod = pdMS_TO_TICKS(10 * 60 * 1000); -#if configUSE_TRACE_FACILITY == 1 - SystemMonitor monitor; -#else - SystemMonitor monitor; -#endif + SystemMonitor monitor; }; } } From 4c92ed410f89ba398b8762384bae395ff1d344c9 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Tue, 1 Feb 2022 21:48:56 +0100 Subject: [PATCH 28/53] CI: add lv_sim workflow and upload 'infinisim' executable use InfiniSim repo to build simulator in CI --- .github/workflows/lv_sim.yml | 74 ++++++++++++++++++++++++++++++++++++ README.md | 4 ++ 2 files changed, 78 insertions(+) create mode 100644 .github/workflows/lv_sim.yml diff --git a/.github/workflows/lv_sim.yml b/.github/workflows/lv_sim.yml new file mode 100644 index 00000000..a3479f05 --- /dev/null +++ b/.github/workflows/lv_sim.yml @@ -0,0 +1,74 @@ +# GitHub Actions Workflow to build Simulator for PineTime Smart Watch LVGL Interface + +# Name of this Workflow +name: Build PineTime LVGL Simulator + +# When to run this Workflow... +on: + + # Run on all branches + push: + branches: [] + + # Also run this Workflow when a Pull Request is created or updated in the "master" and "develop" Branch + pull_request: + branches: [ master, develop ] + +# Steps to run for the Workflow +jobs: + build: + + # Run these steps on Ubuntu + runs-on: ubuntu-latest + + steps: + + ######################################################################################### + # Download and Install Dependencies + + - name: Install cmake + uses: lukka/get-cmake@v3.18.3 + + - name: Install SDL2 development package + run: | + sudo apt-get update + sudo apt-get -y install libsdl2-dev + + ######################################################################################### + # Checkout + + - name: Checkout source files + uses: actions/checkout@v2 + with: + submodules: recursive + + ######################################################################################### + # get InfiniSim repo + + - name: Get InfiniSim repo + run: | + git clone https://github.com/InfiniTimeOrg/InfiniSim.git --depth 1 --branch main + git -C InfiniSim submodule update --init lv_drivers + + ######################################################################################### + # CMake + + - name: CMake + run: | + cmake -G Ninja -S InfiniSim -B build_lv_sim -DInfiniTime_DIR="${PWD}" + + ######################################################################################### + # Build and Upload simulator + + # For Debugging Builds: Remove "make" option "-j" for clearer output. Add "--trace" to see details. + # For Faster Builds: Add "make" option "-j" + + - name: Build simulator executable + run: | + cmake --build build_lv_sim + + - name: Upload simulator executable + uses: actions/upload-artifact@v2 + with: + name: infinisim + path: build_lv_sim/infinisim diff --git a/README.md b/README.md index 524f510e..8443e43e 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,10 @@ Fast open-source firmware for the [PineTime smartwatch](https://www.pine64.org/p - [Creating a stopwatch in Pinetime(article)](https://pankajraghav.com/2021/04/03/PINETIME-STOPCLOCK.html) - [Tips on designing an app UI](doc/ui_guidelines.md) +### InfiniSim Simulator +Use the [InfiniSim Simulator](https://github.com/InfiniTimeOrg/InfiniSim) to experience the `InfiniTime` user interface directly on your PC, to shorten the time until you get your hands on a real [PineTime smartwatch](https://www.pine64.org/pinetime/). +Or use it to develop new Watchfaces, new Screens, or quickly iterate on the user interface. + ### Contributing - [How to contribute?](/doc/contribute.md) - [Coding conventions](/doc/coding-convention.md) From 204ad7ca2a8bf30caee7bc9b7395001c0d720b10 Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Sun, 27 Feb 2022 14:30:47 +0200 Subject: [PATCH 29/53] Update font readme, update fonts, add missing files --- src/displayapp/fonts/JetBrainsMono-Bold.ttf | Bin 173264 -> 210128 bytes .../fonts/JetBrainsMono-Regular.ttf | Bin 0 -> 203952 bytes src/displayapp/fonts/README.md | 58 +-- src/displayapp/fonts/jetbrains_mono_42.c | 20 +- src/displayapp/fonts/jetbrains_mono_76.c | 44 +-- src/displayapp/fonts/jetbrains_mono_bold_20.c | 362 +++++++++--------- src/displayapp/fonts/open_sans_light.c | 2 +- 7 files changed, 248 insertions(+), 238 deletions(-) create mode 100644 src/displayapp/fonts/JetBrainsMono-Regular.ttf diff --git a/src/displayapp/fonts/JetBrainsMono-Bold.ttf b/src/displayapp/fonts/JetBrainsMono-Bold.ttf index 0cd1cb66bd193f2b178d0a69a7b0658d76b3a670..0a9280916cef9ef3e0a8061c26834409b27e5fcb 100644 GIT binary patch delta 84890 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 F1_11Oa(@5- delta 49295 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 diff --git a/src/displayapp/fonts/JetBrainsMono-Regular.ttf b/src/displayapp/fonts/JetBrainsMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8da8aa405130e21ec0ed889de44b43ef51bea914 GIT binary patch literal 203952 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

V8&~Zel@6X&3Ki8fh7zwt^g`$LH&FdP#u4n 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≫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∈|OcixfD?`*h~eZq8fC%#T*j) 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

pR47=jp5K<4N@VPFJdBhYSKuDm10ys< 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 7e and f7 -> b7) -## Simple method to generate a font -If you want to generate a basic font containing only numbers and letters, you can use the above settings but instead of specifying a range, simply list the characters you need in the Symbols field and leave the range blank. This is the approach used for the PineTimeStyle watchface. -This works well for fonts which will only be used to display numbers, but will fail if you try to add a colon or other punctuation. +### Medium font + +* Name: jetbrains_mono_42 +* Size: 42 +* Bpp: 1 bit-per-pixel +* Do not enable font compression or horizontal subpixel rendering +* Load the file `JetBrainsMono-Regular.tff` (use the file in this repo to ensure the version matches) and specify the following range : `0x25, 0x30-0x3a` + +### Large font +* Name: jetbrains_mono_76 +* Size: 76 +* Bpp: 1 bit-per-pixel +* Do not enable font compression or horizontal subpixel rendering +* Load the file `JetBrainsMono-Regular.tff` (use the file in this repo to ensure the version matches) and specify the following range : `0x25, 0x2D, 0x2F, 0x30-0x3a` + +### PineTimeStyle font -* Open the [LVGL font converter](https://lvgl.io/tools/fontconverter) * Name : open_sans_light * Size : 150 * Bpp : 1 bit-per-pixel -* Do not enable font compression and horizontal subpixel hinting +* Do not enable font compression or horizontal subpixel rendering * Load the file `open_sans_light.tff` (use the file in this repo to ensure the version matches) and specify the following symbols : `0123456789` -* Click on Convert, and download the file `open_sans_light.c` and copy it in `src/DisplayApp/Fonts` -* Add the font .c file path to src/CMakeLists.txt (search for jetbrains to find the appropriate location/format) -* Add an LV_FONT_DECLARE line in src/libs/lv_conf.h (as above) #### Navigation font To create the navigtion.ttf I use the web app [icomoon](https://icomoon.io/app) -this app can import the svg files from the folder *src/displayapp/icons/navigation/unique* and creat a ttf file the +this app can import the svg files from the folder *src/displayapp/icons/navigation/unique* and create a ttf file the project for the site is *lv_font_navi_80.json* you can import it to add or remove icons You can also use the online LVGL tool to create the .c @@ -74,5 +86,3 @@ ttf file : navigation.ttf name : lv_font_navi_80 size : 80px Bpp : 2 bit-per-pix $lv_font_conv --font navigation.ttf -r '0xe900-0xe929' --size 80 --format lvgl --bpp 2 --no-prefilter -o lv_font_navi_80.c - -#### I use the method above to create the other ttf diff --git a/src/displayapp/fonts/jetbrains_mono_42.c b/src/displayapp/fonts/jetbrains_mono_42.c index 6f25f5ab..b5218b95 100644 --- a/src/displayapp/fonts/jetbrains_mono_42.c +++ b/src/displayapp/fonts/jetbrains_mono_42.c @@ -61,13 +61,13 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0xf8, /* U+0032 "2" */ - 0x3, 0xf8, 0x1, 0xff, 0xc0, 0x7f, 0xfe, 0x1f, - 0x7, 0xc7, 0xc0, 0x3c, 0xf0, 0x7, 0xbc, 0x0, + 0x3, 0xf8, 0x1, 0xff, 0xc0, 0xff, 0xfc, 0x1f, + 0x7, 0xc7, 0xc0, 0x7c, 0xf0, 0x7, 0xbc, 0x0, 0x7f, 0x80, 0xf, 0xf0, 0x1, 0xe0, 0x0, 0x3c, 0x0, 0x7, 0x80, 0x1, 0xf0, 0x0, 0x3c, 0x0, 0xf, 0x80, 0x1, 0xe0, 0x0, 0x7c, 0x0, 0x1f, - 0x0, 0x7, 0xc0, 0x1, 0xf0, 0x0, 0x7e, 0x0, - 0xf, 0x80, 0x3, 0xe0, 0x0, 0xf8, 0x0, 0x3e, + 0x0, 0x7, 0xc0, 0x1, 0xf0, 0x0, 0x7c, 0x0, + 0x1f, 0x0, 0x3, 0xc0, 0x0, 0xf0, 0x0, 0x3e, 0x0, 0xf, 0x80, 0x3, 0xe0, 0x0, 0xf8, 0x0, 0x3e, 0x0, 0x7, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xff, 0xf8, @@ -75,12 +75,12 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0033 "3" */ 0x7f, 0xff, 0x8f, 0xff, 0xf1, 0xff, 0xfe, 0x0, 0x3, 0xc0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0xf, - 0x0, 0x3, 0xc0, 0x0, 0xf0, 0x0, 0x3e, 0x0, - 0x7, 0x80, 0x1, 0xfe, 0x0, 0x3f, 0xf0, 0x7, - 0xff, 0x0, 0x3, 0xf0, 0x0, 0x1e, 0x0, 0x3, - 0xc0, 0x0, 0x3c, 0x0, 0x7, 0x80, 0x0, 0xf0, + 0x0, 0x3, 0xe0, 0x0, 0x78, 0x0, 0x1e, 0x0, + 0x7, 0x80, 0x1, 0xfc, 0x0, 0x3f, 0xe0, 0x7, + 0xfe, 0x0, 0xff, 0xe0, 0x0, 0x3e, 0x0, 0x3, + 0xc0, 0x0, 0x7c, 0x0, 0x7, 0x80, 0x0, 0xf0, 0x0, 0x1e, 0x0, 0x3, 0xfc, 0x0, 0x7f, 0x80, - 0xf, 0xf0, 0x1, 0xef, 0x0, 0x79, 0xf0, 0x1f, + 0xf, 0xf0, 0x1, 0xff, 0x0, 0x79, 0xe0, 0x1f, 0x1f, 0x7, 0xc3, 0xff, 0xf0, 0x1f, 0xfc, 0x0, 0xfe, 0x0, @@ -245,7 +245,7 @@ lv_font_t jetbrains_mono_42 = { #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) .subpx = LV_FONT_SUBPX_NONE, #endif -#if LV_VERSION_CHECK(7, 4, 0) +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 .underline_position = -7, .underline_thickness = 2, #endif diff --git a/src/displayapp/fonts/jetbrains_mono_76.c b/src/displayapp/fonts/jetbrains_mono_76.c index 9c92e144..2200e393 100644 --- a/src/displayapp/fonts/jetbrains_mono_76.c +++ b/src/displayapp/fonts/jetbrains_mono_76.c @@ -175,30 +175,30 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* U+0032 "2" */ - 0x0, 0x7, 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xe0, + 0x0, 0xf, 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xfe, 0x0, 0xf, 0xff, 0xff, - 0xe0, 0x7, 0xff, 0xff, 0xfc, 0x3, 0xff, 0xff, - 0xff, 0x81, 0xff, 0xc0, 0x7f, 0xe0, 0xff, 0x80, + 0xc0, 0x7, 0xff, 0xff, 0xf8, 0x3, 0xff, 0xff, + 0xff, 0x1, 0xff, 0xc0, 0x7f, 0xe0, 0xff, 0x80, 0x7, 0xfc, 0x3f, 0xc0, 0x0, 0xff, 0x1f, 0xe0, 0x0, 0x1f, 0xe7, 0xf0, 0x0, 0x3, 0xf9, 0xfc, - 0x0, 0x0, 0xfe, 0xff, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0xfe, 0xff, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x1, 0xff, 0xf8, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0, - 0x3f, 0xc0, 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, - 0x7, 0xf8, 0x0, 0x0, 0x1, 0xfe, 0x0, 0x0, - 0x0, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xc0, 0x0, + 0x3f, 0x80, 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, + 0x7, 0xf8, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x3f, 0x80, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0x7, 0xfc, 0x0, 0x0, 0x3, 0xfe, 0x0, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xc0, - 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x1f, 0xf0, + 0x0, 0x7, 0xf8, 0x0, 0x0, 0x3, 0xfe, 0x0, + 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x7, 0xfc, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x1f, - 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x7, - 0xfe, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, + 0xf0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x7, + 0xfc, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x7, 0xfc, 0x0, 0x0, @@ -214,22 +214,22 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0x80, 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0, 0xfe, 0x0, 0x0, - 0x0, 0x7f, 0x80, 0x0, 0x0, 0x1f, 0xc0, 0x0, - 0x0, 0xf, 0xe0, 0x0, 0x0, 0x7, 0xf0, 0x0, + 0x0, 0x7f, 0x80, 0x0, 0x0, 0x3f, 0xc0, 0x0, + 0x0, 0x1f, 0xe0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x1, 0xfc, 0x0, - 0x0, 0x0, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0x80, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x7f, 0x80, 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x1f, 0xe0, - 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x1, 0xff, + 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0xf8, 0x0, 0x7, 0xff, 0xff, 0x0, 0x1, - 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xfc, 0x0, - 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xe0, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x0, 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, - 0x0, 0x7f, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x80, + 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x1, 0xff, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x3f, 0xdf, 0xc0, 0x0, 0xf, 0xe7, 0xf8, 0x0, 0x7, 0xf9, @@ -466,10 +466,10 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 878, .adv_w = 730, .box_w = 34, .box_h = 56, .ofs_x = 7, .ofs_y = 0}, {.bitmap_index = 1116, .adv_w = 730, .box_w = 34, .box_h = 57, .ofs_x = 6, .ofs_y = 0}, {.bitmap_index = 1359, .adv_w = 730, .box_w = 34, .box_h = 57, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 1602, .adv_w = 730, .box_w = 32, .box_h = 56, .ofs_x = 6, .ofs_y = 0}, + {.bitmap_index = 1602, .adv_w = 730, .box_w = 32, .box_h = 56, .ofs_x = 5, .ofs_y = 0}, {.bitmap_index = 1826, .adv_w = 730, .box_w = 32, .box_h = 57, .ofs_x = 7, .ofs_y = -1}, {.bitmap_index = 2054, .adv_w = 730, .box_w = 36, .box_h = 58, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 2315, .adv_w = 730, .box_w = 36, .box_h = 56, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 2315, .adv_w = 730, .box_w = 36, .box_h = 56, .ofs_x = 6, .ofs_y = 0}, {.bitmap_index = 2567, .adv_w = 730, .box_w = 36, .box_h = 58, .ofs_x = 5, .ofs_y = -1}, {.bitmap_index = 2828, .adv_w = 730, .box_w = 36, .box_h = 57, .ofs_x = 5, .ofs_y = 0}, {.bitmap_index = 3085, .adv_w = 730, .box_w = 13, .box_h = 44, .ofs_x = 16, .ofs_y = -1} @@ -541,7 +541,7 @@ lv_font_t jetbrains_mono_76 = { #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) .subpx = LV_FONT_SUBPX_NONE, #endif -#if LV_VERSION_CHECK(7, 4, 0) +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 .underline_position = -12, .underline_thickness = 4, #endif diff --git a/src/displayapp/fonts/jetbrains_mono_bold_20.c b/src/displayapp/fonts/jetbrains_mono_bold_20.c index 6cd7aead..cc67532a 100644 --- a/src/displayapp/fonts/jetbrains_mono_bold_20.c +++ b/src/displayapp/fonts/jetbrains_mono_bold_20.c @@ -32,9 +32,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xef, 0xdf, 0xbf, 0x7e, 0xfd, 0xc0, /* U+0023 "#" */ - 0x8, 0xc3, 0x10, 0x66, 0x3f, 0xf7, 0xfe, 0x23, - 0x4, 0x61, 0x88, 0x31, 0x1f, 0xfb, 0xff, 0x19, - 0x82, 0x30, 0xc4, 0x0, + 0x8, 0xc3, 0x18, 0x62, 0x3f, 0xf7, 0xfe, 0x23, + 0xc, 0x61, 0x88, 0xff, 0xdf, 0xf8, 0x8c, 0x11, + 0x86, 0x30, 0xc4, 0x0, /* U+0024 "$" */ 0x8, 0x2, 0x0, 0x81, 0xfc, 0x7f, 0xba, 0x7e, @@ -93,11 +93,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x8f, 0xc0, /* U+0031 "1" */ - 0x1e, 0x3f, 0x3b, 0x99, 0xc8, 0xe0, 0x70, 0x38, + 0x1e, 0x3f, 0x3f, 0x99, 0xc8, 0xe0, 0x70, 0x38, 0x1c, 0xe, 0x7, 0x3, 0x81, 0xcf, 0xff, 0xfc, /* U+0032 "2" */ - 0x3e, 0x3f, 0xbc, 0xfc, 0x70, 0x38, 0x1c, 0x1c, + 0x3e, 0x3f, 0xbd, 0xfc, 0x70, 0x38, 0x1c, 0x1c, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0xf, 0xff, 0xfc, /* U+0033 "3" */ @@ -122,7 +122,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0037 "7" */ 0xff, 0xff, 0xfe, 0x1f, 0x86, 0x3, 0x80, 0xe0, 0x30, 0x1c, 0x6, 0x3, 0x80, 0xc0, 0x70, 0x1c, - 0x6, 0x0, + 0xe, 0x0, /* U+0038 "8" */ 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xdc, 0xe3, @@ -157,7 +157,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x30, 0x30, 0x0, 0x0, 0x70, 0x70, /* U+0040 "@" */ - 0x1f, 0x7, 0xf9, 0xc3, 0x70, 0x3c, 0x7, 0x8f, + 0x1f, 0x7, 0xf9, 0xc3, 0x70, 0x3c, 0x7, 0x8e, 0xf3, 0xfe, 0x63, 0xcc, 0x79, 0x8f, 0x31, 0xe6, 0x3c, 0xff, 0x8e, 0xf8, 0x3, 0x80, 0x3e, 0x3, 0xc0, @@ -168,8 +168,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf0, 0x30, /* U+0042 "B" */ - 0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xb8, 0xcf, - 0xe3, 0xfc, 0xe3, 0xb8, 0x7e, 0x1f, 0x8f, 0xff, + 0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xb8, 0xef, + 0xe3, 0xfc, 0xe3, 0xf8, 0x7e, 0x1f, 0x8f, 0xff, 0xbf, 0xc0, /* U+0043 "C" */ @@ -217,9 +217,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0xf, 0xff, 0xfc, /* U+004D "M" */ - 0xe1, 0xf8, 0x7f, 0x3f, 0xcf, 0xd2, 0xf7, 0xbd, - 0xef, 0x33, 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, - 0xf0, 0x30, + 0xf3, 0xfc, 0xfd, 0x3f, 0xcf, 0xff, 0xff, 0xfe, + 0xdf, 0xb7, 0xe1, 0xf8, 0x7e, 0x1f, 0x87, 0xe1, + 0xf8, 0x70, /* U+004E "N" */ 0xe1, 0xf0, 0xfc, 0x7e, 0x3f, 0x9e, 0xcf, 0x67, @@ -245,7 +245,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xb8, 0x70, /* U+0053 "S" */ - 0x3f, 0x1f, 0xee, 0x3f, 0x87, 0xe0, 0x3c, 0x7, + 0x3f, 0x1f, 0xee, 0x3f, 0x87, 0xe0, 0x3e, 0x7, 0xf0, 0xfe, 0x3, 0xc0, 0x7e, 0x1f, 0xcf, 0x7f, 0x8f, 0xc0, @@ -260,7 +260,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0056 "V" */ 0xc0, 0xf8, 0x7e, 0x1d, 0x86, 0x61, 0x9c, 0xe7, - 0x38, 0xcc, 0x33, 0xf, 0xc3, 0xf0, 0x78, 0x1e, + 0x38, 0xcc, 0x33, 0xe, 0xc3, 0xf0, 0x78, 0x1e, 0x7, 0x80, /* U+0057 "W" */ @@ -314,8 +314,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x7f, 0xf7, 0x70, /* U+0063 "c" */ - 0x3e, 0x3f, 0xb8, 0xfc, 0x7e, 0x7, 0x3, 0x81, - 0xc7, 0xe3, 0xbf, 0x8f, 0x80, + 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe0, 0x38, 0xe, + 0x3, 0x87, 0xf3, 0xdf, 0xe3, 0xf0, /* U+0064 "d" */ 0x3, 0x81, 0xc0, 0xe7, 0x77, 0xff, 0x1f, 0x8f, @@ -382,12 +382,12 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe, /* U+0072 "r" */ - 0xee, 0x7f, 0xb9, 0xfc, 0x7e, 0x3f, 0x3, 0x81, + 0xee, 0x7f, 0xb8, 0xfc, 0x7e, 0x3f, 0x3, 0x81, 0xc0, 0xe0, 0x70, 0x38, 0x0, /* U+0073 "s" */ 0x1f, 0x1f, 0xf7, 0x1d, 0xc0, 0x7c, 0xf, 0xe0, - 0x3c, 0x7, 0x71, 0xdf, 0xe3, 0xf0, + 0x3c, 0x7, 0x71, 0xdf, 0xf3, 0xf0, /* U+0074 "t" */ 0x1c, 0x7, 0x1, 0xc3, 0xff, 0xff, 0xc7, 0x1, @@ -399,12 +399,12 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc7, 0xe3, 0xbf, 0x8f, 0x80, /* U+0076 "v" */ - 0xe0, 0xf8, 0x76, 0x19, 0x86, 0x73, 0x8c, 0xc3, + 0xc0, 0xf8, 0x7e, 0x1d, 0x86, 0x73, 0x8c, 0xc3, 0x30, 0xfc, 0x1e, 0x7, 0x81, 0xe0, /* U+0077 "w" */ - 0xe6, 0x36, 0x66, 0x66, 0x66, 0xf6, 0x6f, 0x66, - 0x96, 0x69, 0x62, 0x94, 0x39, 0xc3, 0x9c, 0x39, + 0xc6, 0x36, 0x66, 0x66, 0x66, 0xf6, 0x6f, 0x66, + 0x96, 0x69, 0x62, 0x94, 0x29, 0x43, 0x9c, 0x39, 0xc0, /* U+0078 "x" */ @@ -412,7 +412,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe0, 0xfc, 0x73, 0x9c, 0xee, 0x1c, /* U+0079 "y" */ - 0xe1, 0xf8, 0x76, 0x19, 0xce, 0x73, 0x8c, 0xc3, + 0xe0, 0xf8, 0x76, 0x19, 0xce, 0x73, 0x8c, 0xc3, 0xf0, 0x7c, 0x1e, 0x7, 0x80, 0xe0, 0x30, 0x1c, 0x6, 0x3, 0x80, @@ -421,17 +421,17 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe0, 0xe0, 0x7f, 0xff, 0xe0, /* U+007B "{" */ - 0x3, 0x87, 0xc3, 0x81, 0xc0, 0xe0, 0x70, 0x38, + 0x7, 0x87, 0xc3, 0x81, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0xfc, 0x7e, 0x3, 0x81, 0xc0, 0xe0, 0x70, - 0x38, 0x1c, 0xf, 0x81, 0xc0, + 0x30, 0x1c, 0xf, 0x83, 0xc0, /* U+007C "|" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, /* U+007D "}" */ - 0xf0, 0x3e, 0x1, 0xc0, 0x70, 0x1c, 0x7, 0x1, - 0xc0, 0x70, 0xf, 0xc3, 0xf1, 0xc0, 0x70, 0x1c, - 0x7, 0x1, 0xc0, 0x70, 0xf8, 0x3c, 0x0, + 0xf0, 0x7c, 0xe, 0x7, 0x3, 0x81, 0xc0, 0xe0, + 0x70, 0x1f, 0x8f, 0xce, 0x7, 0x3, 0x81, 0xc0, + 0x60, 0x70, 0xf8, 0x78, 0x0, /* U+007E "~" */ 0x78, 0xff, 0x3c, 0xcf, 0x3f, 0xc7, 0x80, @@ -447,8 +447,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xbf, 0xc0, /* U+0412 "В" */ - 0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xb8, 0xcf, - 0xe3, 0xfc, 0xe3, 0xb8, 0x7e, 0x1f, 0x8f, 0xff, + 0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xb8, 0xef, + 0xe3, 0xfc, 0xe3, 0xf8, 0x7e, 0x1f, 0x8f, 0xff, 0xbf, 0xc0, /* U+0413 "Г" */ @@ -470,9 +470,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x66, 0x66, 0x66, 0x6c, 0x63, /* U+0417 "З" */ - 0x1f, 0xf, 0xf3, 0xc7, 0x0, 0x60, 0x1c, 0x1e, - 0x3, 0xf0, 0xe, 0x0, 0xe0, 0x1f, 0x83, 0xf8, - 0xf7, 0xfc, 0x3e, 0x0, + 0x3f, 0x1f, 0xef, 0x1f, 0x87, 0x1, 0xc7, 0xc1, + 0xf8, 0xf, 0x1, 0xc0, 0x7e, 0x1f, 0xcf, 0x7f, + 0x8f, 0x80, /* U+0418 "И" */ 0xc3, 0xe3, 0xf1, 0xf8, 0xfc, 0xde, 0x6f, 0x37, @@ -494,9 +494,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf8, 0x70, /* U+041C "М" */ - 0xe1, 0xf8, 0x7f, 0x3f, 0xcf, 0xd2, 0xf7, 0xbd, - 0xef, 0x33, 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, - 0xf0, 0x30, + 0xf3, 0xfc, 0xfd, 0x3f, 0xcf, 0xff, 0xff, 0xfe, + 0xdf, 0xb7, 0xe1, 0xf8, 0x7e, 0x1f, 0x87, 0xe1, + 0xf8, 0x70, /* U+041D "Н" */ 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0xff, @@ -546,7 +546,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0xf0, 0x1c, 0x7, 0x1, 0xc0, /* U+0427 "Ч" */ - 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0xce, + 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, 0xff, 0x3f, 0x81, 0xc0, 0xe0, 0x70, 0x38, 0x1c, /* U+0428 "Ш" */ @@ -593,8 +593,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1f, 0x87, 0xe3, 0xff, 0xf3, 0xdc, /* U+0431 "б" */ - 0x1f, 0x3f, 0x9c, 0x1c, 0xe, 0xe7, 0xfb, 0x8f, - 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x77, 0xf1, 0xf0, + 0x1f, 0x3f, 0x9c, 0x1c, 0xe, 0xe7, 0xfb, 0x9f, + 0xc7, 0xe3, 0xf1, 0xf8, 0xfe, 0xf7, 0xf1, 0xf0, /* U+0432 "в" */ 0xff, 0x3f, 0xee, 0x3b, 0x8e, 0xfe, 0x3f, 0xee, @@ -619,7 +619,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x70, /* U+0437 "з" */ - 0x3f, 0x1f, 0xfe, 0x1c, 0x7, 0x1f, 0x87, 0xe0, + 0x3f, 0x1f, 0xfe, 0x1c, 0x7, 0x1f, 0x7, 0xe0, 0x1c, 0x7, 0xe1, 0xdf, 0xe3, 0xf0, /* U+0438 "и" */ @@ -632,8 +632,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc7, 0xc3, /* U+043A "к" */ - 0xe1, 0xf8, 0xee, 0x33, 0x9c, 0xfe, 0x3f, 0x8e, - 0x73, 0x9c, 0xe3, 0xb8, 0x6e, 0x1c, + 0xe1, 0xf8, 0xee, 0x3b, 0x9c, 0xfe, 0x3f, 0x8e, + 0x73, 0x8c, 0xe3, 0xb8, 0x6e, 0x1c, /* U+043B "л" */ 0x3f, 0xcf, 0xf3, 0x9c, 0xe7, 0x39, 0xce, 0x73, @@ -644,7 +644,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xef, 0x33, 0xc0, 0xf0, 0x3c, 0xc, /* U+043D "н" */ - 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0xff, 0xff, + 0xe3, 0xf1, 0xf8, 0xfc, 0x7f, 0xff, 0xff, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0xe0, /* U+043E "о" */ @@ -661,15 +661,15 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x80, /* U+0441 "с" */ - 0x3e, 0x3f, 0xb8, 0xfc, 0x7e, 0x7, 0x3, 0x81, - 0xc7, 0xe3, 0xbf, 0x8f, 0x80, + 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe0, 0x38, 0xe, + 0x3, 0x87, 0xf3, 0xdf, 0xe3, 0xf0, /* U+0442 "т" */ 0xff, 0xff, 0xf0, 0xe0, 0x38, 0xe, 0x3, 0x80, 0xe0, 0x38, 0xe, 0x3, 0x80, 0xe0, /* U+0443 "у" */ - 0xe1, 0xf8, 0x76, 0x19, 0xce, 0x73, 0x8c, 0xc3, + 0xe0, 0xf8, 0x76, 0x19, 0xce, 0x73, 0x8c, 0xc3, 0xf0, 0x7c, 0x1e, 0x7, 0x80, 0xe0, 0x30, 0x1c, 0x6, 0x3, 0x80, @@ -688,7 +688,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, 0x70, /* U+0447 "ч" */ - 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3b, 0xfc, 0xfe, + 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0xfd, 0xfe, 0x7, 0x3, 0x81, 0xc0, 0xe0, /* U+0448 "ш" */ @@ -714,8 +714,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1f, 0x87, 0xe1, 0xff, 0xef, 0xf0, /* U+044D "э" */ - 0x3e, 0x3f, 0xb8, 0xe0, 0x70, 0xf8, 0x7c, 0xf, - 0xc7, 0xe7, 0xbf, 0x8f, 0x80, + 0x1f, 0x1f, 0xe6, 0x3c, 0x7, 0xf, 0xc3, 0xf0, + 0x1d, 0x87, 0x73, 0xdf, 0xe1, 0xf0, /* U+044E "ю" */ 0xc7, 0xb3, 0xfc, 0xcf, 0x33, 0xfc, 0xff, 0x3c, @@ -1123,139 +1123,139 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 975, .adv_w = 192, .box_w = 5, .box_h = 3, .ofs_x = 3, .ofs_y = 13}, {.bitmap_index = 977, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, {.bitmap_index = 991, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1007, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1020, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1036, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1049, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1067, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1084, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1100, .adv_w = 192, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1120, .adv_w = 192, .box_w = 8, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1139, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1157, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1177, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1191, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1204, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1217, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 1234, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1251, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1264, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1278, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1296, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1309, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1323, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1340, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1354, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1373, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1386, .adv_w = 192, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 1407, .adv_w = 192, .box_w = 3, .box_h = 18, .ofs_x = 5, .ofs_y = -2}, - {.bitmap_index = 1414, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1437, .adv_w = 192, .box_w = 10, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 1444, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1462, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1480, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1498, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1514, .adv_w = 192, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1538, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1554, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1575, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1595, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1611, .adv_w = 192, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1633, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1651, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1669, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1687, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1703, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1719, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1735, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1753, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1771, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1789, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1807, .adv_w = 192, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1827, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1845, .adv_w = 192, .box_w = 10, .box_h = 17, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 1867, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1883, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1901, .adv_w = 192, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1923, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1944, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1962, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1980, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1996, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2014, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2032, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2046, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2062, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2076, .adv_w = 192, .box_w = 8, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2087, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2107, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2120, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2137, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2151, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2164, .adv_w = 192, .box_w = 9, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2182, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2196, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2210, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2224, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2237, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2250, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2263, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 2280, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2293, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2307, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2326, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2349, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2363, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 2381, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2394, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2408, .adv_w = 192, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 2426, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2443, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2457, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2471, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2484, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2498, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2511, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2561, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2610, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2658, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2708, .adv_w = 240, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2737, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2792, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2831, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2874, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 2902, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2950, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2989, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3028, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 3056, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3104, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3148, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3209, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3262, .adv_w = 120, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3281, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3331, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3367, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3415, .adv_w = 320, .box_w = 21, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3455, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3498, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3536, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3574, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3612, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3650, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3688, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3724, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3762, .adv_w = 200, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3791, .adv_w = 280, .box_w = 16, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 3829, .adv_w = 400, .box_w = 25, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3895, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3944, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3994, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4054, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4107, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4168, .adv_w = 360, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4223, .adv_w = 360, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4276, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0} + {.bitmap_index = 1007, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1021, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1037, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1050, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1068, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1085, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1101, .adv_w = 192, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1121, .adv_w = 192, .box_w = 8, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1140, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1158, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1178, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1192, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1205, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1218, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 1235, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1252, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1265, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1279, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1297, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1310, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1324, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1341, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1355, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1374, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1387, .adv_w = 192, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1408, .adv_w = 192, .box_w = 3, .box_h = 18, .ofs_x = 5, .ofs_y = -2}, + {.bitmap_index = 1415, .adv_w = 192, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 1436, .adv_w = 192, .box_w = 10, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 1443, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1461, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1479, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1497, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1513, .adv_w = 192, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1537, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1553, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1574, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1592, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1608, .adv_w = 192, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1630, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1648, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1666, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1684, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1700, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1716, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1732, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1750, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1768, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1786, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1804, .adv_w = 192, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1824, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1842, .adv_w = 192, .box_w = 10, .box_h = 17, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 1864, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1880, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1898, .adv_w = 192, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1920, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1941, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1959, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1977, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1993, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2011, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2029, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2043, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2059, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2073, .adv_w = 192, .box_w = 8, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2084, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2104, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2117, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2134, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2148, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2161, .adv_w = 192, .box_w = 9, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2179, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2193, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2207, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2221, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2234, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2247, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2260, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 2277, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2291, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2305, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2324, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2347, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2361, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 2379, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2392, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2406, .adv_w = 192, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 2424, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2441, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2455, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2469, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2483, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2497, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2510, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2560, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2609, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2657, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2707, .adv_w = 240, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2736, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2791, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2830, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2873, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2901, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2949, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2988, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3027, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3055, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3103, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3147, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3208, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3261, .adv_w = 120, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3280, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3330, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3366, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3414, .adv_w = 320, .box_w = 21, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3454, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3497, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3535, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3573, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3611, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3649, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3687, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3723, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3761, .adv_w = 200, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3790, .adv_w = 280, .box_w = 16, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3828, .adv_w = 400, .box_w = 25, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3894, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3943, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3993, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4053, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4106, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4167, .adv_w = 360, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4222, .adv_w = 360, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4275, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0} }; /*--------------------- diff --git a/src/displayapp/fonts/open_sans_light.c b/src/displayapp/fonts/open_sans_light.c index 15f0ddf6..84b78690 100644 --- a/src/displayapp/fonts/open_sans_light.c +++ b/src/displayapp/fonts/open_sans_light.c @@ -1248,7 +1248,7 @@ lv_font_t open_sans_light = { #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) .subpx = LV_FONT_SUBPX_NONE, #endif -#if LV_VERSION_CHECK(7, 4, 0) +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 .underline_position = -11, .underline_thickness = 7, #endif From 13c66dd54b6ffcd3ea529457c3d5a0864ca1bdae Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Sun, 27 Feb 2022 14:53:06 +0200 Subject: [PATCH 30/53] Further updates to font readme. --- src/displayapp/fonts/README.md | 33 +- .../jetbrains_mono_extrabold_compressed.c | 788 +++++++++--------- src/displayapp/fonts/lv_font_sys_48.c | 2 +- 3 files changed, 427 insertions(+), 396 deletions(-) diff --git a/src/displayapp/fonts/README.md b/src/displayapp/fonts/README.md index c8fb0d35..2e900d12 100644 --- a/src/displayapp/fonts/README.md +++ b/src/displayapp/fonts/README.md @@ -29,9 +29,9 @@ static constexpr const char* newSymbol = "\xEF\x86\x85"; * Size: 20 * Bpp: 1 bit-per-pixel * Do not enable font compression or horizontal subpixel rendering -* Load the file `JetBrainsMono-Bold.tff` (use the file in this repo to ensure the version matches) and specify the following range : `0x20-0x7e, 0x410-0x44f` +* Load the file `JetBrainsMono-Bold.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0x20-0x7e, 0x410-0x44f` * Add a 2nd font, load the file `FontAwesome5-Solid+Brands+Regular.woff` and specify the following - range : `0xf293, 0xf294, 0xf244, 0xf240, 0xf242, 0xf243, 0xf241, 0xf54b, 0xf21e, 0xf1e6, 0xf54b, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf069, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf029, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf201, 0xf06e, 0xf015, 0xf072` + range: `0xf293, 0xf294, 0xf244, 0xf240, 0xf242, 0xf243, 0xf241, 0xf54b, 0xf21e, 0xf1e6, 0xf54b, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf069, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf029, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf201, 0xf06e, 0xf015, 0xf072` * Fix an error in the font conversion. Replace the following: @@ -50,29 +50,44 @@ with (there are two changes: 7f -> 7e and f7 -> b7) - ### Medium font * Name: jetbrains_mono_42 * Size: 42 * Bpp: 1 bit-per-pixel * Do not enable font compression or horizontal subpixel rendering -* Load the file `JetBrainsMono-Regular.tff` (use the file in this repo to ensure the version matches) and specify the following range : `0x25, 0x30-0x3a` +* Load the file `JetBrainsMono-Regular.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0x25, 0x30-0x3a` ### Large font * Name: jetbrains_mono_76 * Size: 76 * Bpp: 1 bit-per-pixel * Do not enable font compression or horizontal subpixel rendering -* Load the file `JetBrainsMono-Regular.tff` (use the file in this repo to ensure the version matches) and specify the following range : `0x25, 0x2D, 0x2F, 0x30-0x3a` +* Load the file `JetBrainsMono-Regular.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0x25, 0x2D, 0x2F, 0x30-0x3a` + +### Digital watchface font + +* Name: jetbrains_mono_extrabold_compressed +* Size: 80 +* Bpp: 1 bit-per-pixel +* Do not enable font compression or horizontal subpixel rendering +* Load the file `JetBrainsMono-ExtraBold.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0x30-0x3a` ### PineTimeStyle font -* Name : open_sans_light -* Size : 150 -* Bpp : 1 bit-per-pixel +* Name: open_sans_light +* Size: 150 +* Bpp: 1 bit-per-pixel * Do not enable font compression or horizontal subpixel rendering -* Load the file `open_sans_light.tff` (use the file in this repo to ensure the version matches) and specify the following symbols : `0123456789` +* Load the file `open_sans_light.tff` (use the file in this repo to ensure the version matches) and specify the following symbols: `0123456789` + +### Symbols font (Used in QuickSettings for example) + +* Name: lv_font_sys_48 +* Size: 48 +* Bpp: 1 bit-per-pixel +* Do not enable font compression or horizontal subpixel rendering +* Load the file `icons_sys_48.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0xe902, 0xe904-0xe907, 0xe90b-0xe90c` #### Navigation font diff --git a/src/displayapp/fonts/jetbrains_mono_extrabold_compressed.c b/src/displayapp/fonts/jetbrains_mono_extrabold_compressed.c index c9917e40..ab0a5c4e 100644 --- a/src/displayapp/fonts/jetbrains_mono_extrabold_compressed.c +++ b/src/displayapp/fonts/jetbrains_mono_extrabold_compressed.c @@ -1,11 +1,15 @@ -#include "lvgl/lvgl.h" - /******************************************************************************* * Size: 80 px * Bpp: 1 * Opts: ******************************************************************************/ +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + #ifndef JETBRAINS_MONO_EXTRABOLD_COMPRESSED #define JETBRAINS_MONO_EXTRABOLD_COMPRESSED 1 #endif @@ -17,418 +21,412 @@ *----------------*/ /*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { - /* U+30 "0" */ - 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, - 0xfe, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc0, 0x0, - 0x3f, 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, - 0xfe, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x3f, - 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, - 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0xff, 0xe0, 0x3f, 0xff, - 0xcf, 0xff, 0xc0, 0x7, 0xff, 0xe7, 0xff, 0xc0, - 0x1, 0xff, 0xf7, 0xff, 0xc0, 0x0, 0x7f, 0xff, - 0xff, 0xe0, 0x0, 0x3f, 0xff, 0xff, 0xe0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, - 0xf8, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x1, - 0xff, 0xff, 0xfe, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, 0x3f, - 0xff, 0xff, 0xc0, 0x70, 0x1f, 0xff, 0xff, 0xe0, - 0x7c, 0xf, 0xff, 0xff, 0xf0, 0x7f, 0x7, 0xff, - 0xff, 0xf8, 0x3f, 0x83, 0xff, 0xff, 0xfc, 0x1f, - 0xc1, 0xff, 0xff, 0xfe, 0xf, 0xe0, 0xff, 0xff, - 0xff, 0x7, 0xf0, 0x7f, 0xff, 0xff, 0x83, 0xf8, - 0x3f, 0xff, 0xff, 0xc1, 0xfc, 0x1f, 0xff, 0xff, - 0xe0, 0xfe, 0xf, 0xff, 0xff, 0xf0, 0x7f, 0x7, - 0xff, 0xff, 0xf8, 0x3f, 0x83, 0xff, 0xff, 0xfc, - 0x1f, 0xc1, 0xff, 0xff, 0xfe, 0xf, 0xe0, 0xff, - 0xff, 0xff, 0x3, 0xe0, 0x7f, 0xff, 0xff, 0x80, - 0xe0, 0x3f, 0xff, 0xff, 0xc0, 0x0, 0x1f, 0xff, - 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, - 0x7, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, - 0xfc, 0x0, 0x1, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x7f, 0xf9, 0xff, 0xf0, 0x0, 0x7f, - 0xfc, 0xff, 0xfc, 0x0, 0x7f, 0xfe, 0x7f, 0xff, - 0x80, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0x7, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x3f, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, - 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0030 "0" */ + 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, + 0xe0, 0x0, 0x1, 0xff, 0xff, 0xf0, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xf8, 0x3, 0xff, 0xff, + 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, 0xf8, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xfc, 0x7, 0xff, 0xf3, 0xff, 0xe0, + 0x3, 0xff, 0xe7, 0xff, 0x80, 0x3, 0xff, 0xdf, + 0xfe, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x3, + 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0xe0, + 0x0, 0xf, 0xff, 0xff, 0xc0, 0x0, 0x1f, 0xff, + 0xff, 0x80, 0x0, 0x3f, 0xff, 0xff, 0x0, 0x0, + 0x7f, 0xff, 0xfe, 0x0, 0x0, 0xff, 0xff, 0xfc, + 0x0, 0x1, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, + 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0xe0, 0x7c, + 0xf, 0xff, 0xff, 0xc1, 0xfe, 0x1f, 0xff, 0xff, + 0x87, 0xfc, 0x3f, 0xff, 0xff, 0x1f, 0xfc, 0x7f, + 0xff, 0xfe, 0x3f, 0xf8, 0xff, 0xff, 0xfc, 0x7f, + 0xf1, 0xff, 0xff, 0xf8, 0xff, 0xe3, 0xff, 0xff, + 0xf1, 0xff, 0xc7, 0xff, 0xff, 0xe1, 0xff, 0xf, + 0xff, 0xff, 0xc1, 0xfc, 0x1f, 0xff, 0xff, 0x81, + 0xf0, 0x3f, 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, + 0xfe, 0x0, 0x0, 0xff, 0xff, 0xfc, 0x0, 0x1, + 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, 0xf0, + 0x0, 0x7, 0xff, 0xff, 0xe0, 0x0, 0xf, 0xff, + 0xff, 0xc0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xfe, + 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x7, 0xff, 0xbf, 0xfc, 0x0, + 0x1f, 0xfe, 0x7f, 0xfc, 0x0, 0x7f, 0xfc, 0xff, + 0xfe, 0x3, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0x1, 0xff, 0xff, 0xff, 0xfc, 0x1, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, + 0xc0, 0x1, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0xc0, 0x0, + 0x0, 0x1f, 0xfc, 0x0, 0x0, - /* U+31 "1" */ - 0x0, 0x7, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, - 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, - 0x7f, 0xff, 0xe0, 0x0, 0x1, 0xff, 0xff, 0xe0, - 0x0, 0x3, 0xff, 0xff, 0xe0, 0x0, 0x7, 0xff, - 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xe0, 0x0, - 0x3f, 0xff, 0xff, 0xe0, 0x0, 0x7f, 0xff, 0xff, - 0xe0, 0x0, 0x7f, 0xff, 0xff, 0xe0, 0x0, 0x7f, - 0xfd, 0xff, 0xe0, 0x0, 0x7f, 0xf9, 0xff, 0xe0, - 0x0, 0x7f, 0xf1, 0xff, 0xe0, 0x0, 0x7f, 0xe1, - 0xff, 0xe0, 0x0, 0x7f, 0x81, 0xff, 0xe0, 0x0, - 0x7f, 0x1, 0xff, 0xe0, 0x0, 0x7c, 0x1, 0xff, - 0xe0, 0x0, 0x78, 0x1, 0xff, 0xe0, 0x0, 0x60, - 0x1, 0xff, 0xe0, 0x0, 0x40, 0x1, 0xff, 0xe0, - 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, - 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, - 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, - 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, - 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, - 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, - 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, - 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, - 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, - 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, - 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, - 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, - 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, - 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, - 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, - 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, - 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, + /* U+0031 "1" */ + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, + 0x80, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, + 0x7, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xfe, + 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, + 0xff, 0xe0, 0x1, 0xff, 0xff, 0xff, 0x80, 0xf, + 0xff, 0xff, 0xfe, 0x0, 0x3f, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xfd, 0xff, 0xe0, 0x3, 0xff, 0xc7, + 0xff, 0x80, 0xf, 0xfe, 0x1f, 0xfe, 0x0, 0x3f, + 0xe0, 0x7f, 0xf8, 0x0, 0xff, 0x1, 0xff, 0xe0, + 0x3, 0xf8, 0x7, 0xff, 0x80, 0xf, 0x80, 0x1f, + 0xfe, 0x0, 0x3c, 0x0, 0x7f, 0xf8, 0x0, 0xe0, + 0x1, 0xff, 0xe0, 0x2, 0x0, 0x7, 0xff, 0x80, + 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x7f, + 0xf8, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, + 0x7, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfe, 0x0, + 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x1, 0xff, + 0xe0, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, + 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x7, 0xff, + 0x80, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, + 0x7f, 0xf8, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, + 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfe, + 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, + 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x7, + 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, + 0x0, 0x7f, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, + 0xc0, - /* U+32 "2" */ - 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, - 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0, - 0x3f, 0xff, 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, - 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xff, - 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, - 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xe0, 0x7f, 0xff, - 0x8f, 0xff, 0xc0, 0xf, 0xff, 0xc7, 0xff, 0xc0, - 0x3, 0xff, 0xe7, 0xff, 0xc0, 0x0, 0xff, 0xfb, - 0xff, 0xc0, 0x0, 0x7f, 0xfd, 0xff, 0xe0, 0x0, - 0x1f, 0xfe, 0xff, 0xf0, 0x0, 0xf, 0xff, 0x0, - 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x3, - 0xff, 0xc0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, - 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xfe, - 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, - 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, - 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, - 0x80, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, - 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0x80, - 0x0, 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, - 0xff, 0x80, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, - 0x1, 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, - 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x3, - 0xff, 0xfe, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, - 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, - 0xfc, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + /* U+0032 "2" */ + 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, + 0xe0, 0x0, 0x1, 0xff, 0xff, 0xf8, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xfc, 0x3, 0xff, 0xff, + 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, 0xf8, 0x1f, + 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xfc, + 0xf, 0xff, 0xe7, 0xff, 0xe0, 0xf, 0xff, 0xcf, + 0xff, 0x80, 0xf, 0xff, 0xff, 0xfe, 0x0, 0xf, + 0xff, 0xff, 0xfc, 0x0, 0x1f, 0xff, 0xff, 0xf0, + 0x0, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x3f, 0xff, + 0xff, 0xc0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0, + 0x0, 0xf, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x3, + 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x3, 0xff, 0xf8, + 0x0, 0x0, 0xf, 0xff, 0xe0, 0x0, 0x0, 0x3f, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, - 0xff, 0xc0, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xf0, - /* U+33 "3" */ - 0x1f, 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, 0xff, - 0xff, 0xff, 0x7, 0xff, 0xff, 0xff, 0xff, 0x83, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, + /* U+0033 "3" */ + 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, + 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, + 0x83, 0xff, 0xff, 0xff, 0xff, 0x7, 0xff, 0xff, + 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, - 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, - 0xff, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x80, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, - 0x1f, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0x80, - 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfe, - 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, - 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, 0xf, - 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xe0, 0x0, 0x1, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, 0x3f, 0xff, - 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, - 0xf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, - 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x1, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfe, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, 0xc0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x7f, 0xf9, 0xff, 0xf0, 0x0, 0x7f, - 0xfc, 0xff, 0xfc, 0x0, 0x7f, 0xfe, 0x7f, 0xff, - 0x80, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x3f, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, - 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, + 0xf0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0xc0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x7f, 0xf8, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, + 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfe, + 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x1, + 0xff, 0xf8, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x80, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0x80, 0x1, 0xff, + 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x7f, + 0xfc, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x1f, 0xfe, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x0, + 0x7f, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x0, 0x7, 0xff, + 0xff, 0xfe, 0x0, 0xf, 0xff, 0xbf, 0xfe, 0x0, + 0x3f, 0xfe, 0x7f, 0xff, 0x1, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x81, 0xff, 0xff, + 0xff, 0xff, 0x1, 0xff, 0xff, 0xff, 0xfc, 0x1, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x7f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, - /* U+34 "4" */ + /* U+0034 "4" */ 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x80, - 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, - 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0xff, 0xfc, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x3, 0xff, + 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xff, 0xfc, - 0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x0, 0x3f, - 0xff, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, - 0x7, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x7, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, - 0xc0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x1, - 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, - 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x1, 0xff, 0xf8, - 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x3f, - 0xfe, 0x0, 0xff, 0xf1, 0xff, 0xf0, 0x3, 0xff, - 0xcf, 0xff, 0xc0, 0xf, 0xff, 0x7f, 0xfe, 0x0, - 0x3f, 0xfd, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, + 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x3f, + 0xff, 0x0, 0xff, 0xf0, 0xff, 0xf8, 0x3, 0xff, + 0xc7, 0xff, 0xc0, 0xf, 0xff, 0x3f, 0xff, 0x0, + 0x3f, 0xfd, 0xff, 0xf8, 0x0, 0xff, 0xf7, 0xff, 0xc0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0xf, 0xff, - 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xe0, 0x0, 0x3f, 0xff, + 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, - 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0xc0, - /* U+35 "5" */ - 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0x87, - 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, - 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, - 0xfc, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, - 0xff, 0xff, 0xff, 0xf, 0xff, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, 0xc0, - 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, - 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1f, - 0xfe, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, - 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, - 0xc0, 0x7f, 0x80, 0x1, 0xff, 0xe1, 0xff, 0xf8, - 0x0, 0xff, 0xf1, 0xff, 0xff, 0x0, 0x7f, 0xf9, - 0xff, 0xff, 0xc0, 0x3f, 0xfd, 0xff, 0xff, 0xf0, - 0x1f, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, - 0xff, 0xff, 0x7, 0xff, 0xff, 0xff, 0xff, 0xc3, - 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xfc, 0x7, - 0xff, 0xf8, 0xff, 0xf8, 0x0, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, - 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, - 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfe, - 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, - 0x7, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, 0xc0, - 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x0, 0x1, - 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xfb, 0xff, - 0xe0, 0x0, 0xff, 0xf9, 0xff, 0xf8, 0x0, 0xff, - 0xfc, 0xff, 0xff, 0x81, 0xff, 0xfe, 0x3f, 0xff, - 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0x7, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x0, - 0x1f, 0xff, 0xff, 0xff, 0x0, 0x7, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x0, - 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xe0, - 0x0, 0x0, + /* U+0035 "5" */ + 0x7f, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0x0, 0x0, + 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x1, 0xff, 0xe0, + 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x1f, + 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, + 0x1, 0xff, 0xe0, 0x0, 0x0, 0x7, 0xff, 0x80, + 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x7f, + 0xf8, 0x1f, 0xf0, 0x1, 0xff, 0xe1, 0xff, 0xf0, + 0x7, 0xff, 0x9f, 0xff, 0xf0, 0x1f, 0xfe, 0xff, + 0xff, 0xe0, 0x7f, 0xfb, 0xff, 0xff, 0xc1, 0xff, + 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, + 0xf0, 0x3f, 0xff, 0x9f, 0xff, 0x0, 0x3f, 0xfe, + 0x7f, 0xf8, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3, + 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x7, 0xff, 0xff, + 0xfe, 0x0, 0x1f, 0xfe, 0xff, 0xfc, 0x0, 0xff, + 0xf9, 0xff, 0xfc, 0xf, 0xff, 0xe7, 0xff, 0xff, + 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xfc, 0x3f, + 0xff, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xfc, 0x1, 0xff, 0xff, + 0xff, 0xe0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0x3, + 0xff, 0xff, 0xf0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x1, 0xff, 0xc0, 0x0, - /* U+36 "6" */ - 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x7, - 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, - 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, - 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, - 0xc0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, - 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, - 0xf, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, 0xc0, - 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x1, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, - 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, - 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x3f, 0xc0, - 0x0, 0x1f, 0xfe, 0x3f, 0xfe, 0x0, 0xf, 0xff, - 0xbf, 0xff, 0xe0, 0x3, 0xff, 0xdf, 0xff, 0xfc, - 0x1, 0xff, 0xef, 0xff, 0xff, 0x80, 0x7f, 0xff, - 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xfe, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0xff, 0xff, 0x3, 0xff, 0xfc, - 0x7f, 0xff, 0x0, 0x3f, 0xff, 0x9f, 0xff, 0x0, - 0x3, 0xff, 0xef, 0xff, 0xc0, 0x0, 0xff, 0xfb, - 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xf8, 0x0, - 0x7, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x0, - 0xf, 0xff, 0xff, 0xf0, 0x0, 0x3, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0x7f, - 0xf8, 0x0, 0x7, 0xff, 0xdf, 0xfe, 0x0, 0x3, - 0xff, 0xe7, 0xff, 0xc0, 0x0, 0xff, 0xf9, 0xff, - 0xfc, 0x0, 0xff, 0xfe, 0x3f, 0xff, 0xc0, 0xff, - 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, - 0xf0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, - 0xff, 0xff, 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xfe, - 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, - - /* U+37 "7" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x0, 0xf, 0xff, 0xff, 0xe0, 0x0, 0x1f, - 0xfe, 0xff, 0xe0, 0x0, 0x1f, 0xfe, 0xff, 0xe0, - 0x0, 0x3f, 0xfc, 0xff, 0xe0, 0x0, 0x3f, 0xfc, - 0xff, 0xe0, 0x0, 0x7f, 0xf8, 0xff, 0xe0, 0x0, - 0x7f, 0xf8, 0xff, 0xe0, 0x0, 0xff, 0xf8, 0xff, - 0xe0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, - 0xf0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, - 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xc0, - 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x7, - 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, - 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, - 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, - 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x7f, - 0xfc, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, - 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, - 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x1, - 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, - 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, - 0xc0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, - 0x7, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, 0x80, - 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x1f, + /* U+0036 "6" */ + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, - 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, + 0x80, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, + 0x7, 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xc0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, - 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, + 0x87, 0xf8, 0x0, 0x7, 0xff, 0x8f, 0xff, 0x0, + 0x7, 0xff, 0xcf, 0xff, 0xe0, 0x3, 0xff, 0xdf, + 0xff, 0xf8, 0x3, 0xff, 0xef, 0xff, 0xfe, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, + 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0x81, 0xff, + 0xff, 0x3f, 0xff, 0x0, 0x3f, 0xff, 0x9f, 0xff, + 0x0, 0x7, 0xff, 0xdf, 0xff, 0x80, 0x3, 0xff, + 0xef, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x7f, 0xff, 0xff, 0xc0, 0x0, 0x1f, 0xff, + 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x7, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, + 0xfc, 0x0, 0x1, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xfb, 0xff, + 0xc0, 0x0, 0x7f, 0xfd, 0xff, 0xf0, 0x0, 0x7f, + 0xfc, 0xff, 0xf8, 0x0, 0x3f, 0xfe, 0x3f, 0xfe, + 0x0, 0x3f, 0xff, 0x1f, 0xff, 0xc0, 0x7f, 0xff, + 0x7, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x3f, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, + 0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, 0xff, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x0, 0x0, + + /* U+0037 "7" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x3, 0xff, + 0xff, 0xfe, 0x0, 0x1, 0xff, 0xef, 0xff, 0x0, + 0x1, 0xff, 0xf7, 0xff, 0x80, 0x0, 0xff, 0xf3, + 0xff, 0xc0, 0x0, 0xff, 0xf9, 0xff, 0xe0, 0x0, + 0x7f, 0xfc, 0xff, 0xf0, 0x0, 0x7f, 0xfc, 0x7f, + 0xf8, 0x0, 0x3f, 0xfe, 0x3f, 0xfc, 0x0, 0x3f, + 0xfe, 0x1f, 0xfe, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x80, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, + 0x7, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, - 0xf8, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, - 0x1, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, + 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x7, + 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, + 0xe0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, - /* U+38 "8" */ - 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x80, 0x0, 0x7, 0xff, 0xff, 0xf8, 0x0, - 0x7, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, - 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, 0xfe, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xff, - 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0xf, - 0xff, 0xe0, 0x3f, 0xff, 0xc3, 0xff, 0xe0, 0x3, - 0xff, 0xf0, 0xff, 0xf0, 0x0, 0x7f, 0xfc, 0x7f, - 0xf8, 0x0, 0xf, 0xff, 0x9f, 0xfe, 0x0, 0x3, - 0xff, 0xe7, 0xff, 0x0, 0x0, 0x7f, 0xf9, 0xff, - 0xc0, 0x0, 0x1f, 0xfe, 0x7f, 0xf0, 0x0, 0x7, - 0xff, 0x9f, 0xfc, 0x0, 0x1, 0xff, 0xe7, 0xff, - 0x0, 0x0, 0x7f, 0xf9, 0xff, 0xc0, 0x0, 0x1f, - 0xfe, 0x3f, 0xf8, 0x0, 0xf, 0xff, 0xf, 0xfe, - 0x0, 0x3, 0xff, 0xc3, 0xff, 0xc0, 0x1, 0xff, - 0xe0, 0x7f, 0xf8, 0x0, 0xff, 0xf8, 0xf, 0xff, - 0x80, 0xff, 0xfc, 0x1, 0xff, 0xff, 0xff, 0xfe, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x7, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, - 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x7, 0xff, - 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x80, - 0x7, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xff, 0xff, - 0xff, 0xff, 0x1, 0xff, 0xf8, 0xf, 0xff, 0xe0, - 0xff, 0xf8, 0x0, 0x7f, 0xf8, 0x3f, 0xfc, 0x0, - 0xf, 0xff, 0x1f, 0xfe, 0x0, 0x1, 0xff, 0xe7, - 0xff, 0x80, 0x0, 0x7f, 0xfb, 0xff, 0xc0, 0x0, - 0xf, 0xfe, 0xff, 0xf0, 0x0, 0x3, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x3f, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, - 0xf0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0x1, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, - 0xf0, 0x0, 0x3f, 0xff, 0x7f, 0xfe, 0x0, 0x1f, - 0xff, 0x9f, 0xff, 0xe0, 0x3f, 0xff, 0xe3, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x3, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, - 0x80, 0xf, 0xff, 0xff, 0xff, 0xc0, 0x1, 0xff, - 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xe0, - 0x0, 0x1, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x7, - 0xff, 0x80, 0x0, + /* U+0038 "8" */ + 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, + 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0, + 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, + 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, + 0xff, 0xff, 0xfe, 0xf, 0xff, 0xe0, 0x7f, 0xff, + 0x7, 0xff, 0xc0, 0xf, 0xff, 0x87, 0xff, 0xc0, + 0x3, 0xff, 0xe3, 0xff, 0xe0, 0x1, 0xff, 0xf1, + 0xff, 0xe0, 0x0, 0x7f, 0xf8, 0xff, 0xf0, 0x0, + 0x3f, 0xfc, 0x7f, 0xf8, 0x0, 0x1f, 0xfe, 0x3f, + 0xfc, 0x0, 0xf, 0xff, 0x1f, 0xfe, 0x0, 0x7, + 0xff, 0x8f, 0xff, 0x80, 0x7, 0xff, 0xc3, 0xff, + 0xc0, 0x3, 0xff, 0xc1, 0xff, 0xf0, 0x3, 0xff, + 0xe0, 0x7f, 0xfc, 0x3, 0xff, 0xe0, 0x3f, 0xff, + 0x3, 0xff, 0xf0, 0xf, 0xff, 0xe7, 0xff, 0xf0, + 0x3, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, + 0x7, 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff, + 0xf0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x3, + 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, + 0xe0, 0x3, 0xff, 0xff, 0xff, 0xf8, 0x3, 0xff, + 0xf0, 0xff, 0xfe, 0x3, 0xff, 0xf0, 0x1f, 0xff, + 0x83, 0xff, 0xe0, 0x7, 0xff, 0xe3, 0xff, 0xe0, + 0x1, 0xff, 0xf1, 0xff, 0xe0, 0x0, 0x7f, 0xfc, + 0xff, 0xf0, 0x0, 0x1f, 0xfe, 0xff, 0xf0, 0x0, + 0x7, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, + 0xfc, 0x0, 0x1, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xc0, 0x0, 0x7f, 0xff, 0xff, 0xe0, 0x0, 0x3f, + 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0x7f, 0xfe, + 0x0, 0x3f, 0xff, 0x3f, 0xff, 0xc0, 0x7f, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, + 0xff, 0xe0, 0x7, 0xff, 0xff, 0xff, 0xe0, 0x1, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x3f, 0xff, 0xff, + 0x80, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x0, 0x0, - /* U+39 "9" */ - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, - 0xff, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, 0x0, - 0x3, 0xff, 0xff, 0xff, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xe0, 0x1, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xff, - 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0xf, - 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xfc, 0xf, - 0xff, 0xf1, 0xff, 0xf8, 0x0, 0xff, 0xfc, 0x7f, - 0xfc, 0x0, 0xf, 0xff, 0x9f, 0xff, 0x0, 0x3, - 0xff, 0xef, 0xff, 0x80, 0x0, 0x7f, 0xfb, 0xff, - 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x3, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x0, 0xf, - 0xff, 0xff, 0xf0, 0x0, 0x3, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, - 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0x7f, 0xf8, - 0x0, 0xf, 0xff, 0xdf, 0xff, 0x0, 0x3, 0xff, - 0xe7, 0xff, 0xf0, 0x3, 0xff, 0xf8, 0xff, 0xff, - 0x3, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0x87, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xf8, - 0x7, 0xff, 0xff, 0xdf, 0xfe, 0x0, 0xff, 0xff, - 0xef, 0xff, 0x80, 0x1f, 0xff, 0xf7, 0xff, 0xc0, - 0x1, 0xff, 0xf1, 0xff, 0xf0, 0x0, 0xf, 0xf0, + /* U+0039 "9" */ + 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, + 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x1f, 0xff, 0xff, + 0xfc, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, + 0xff, 0xff, 0xfe, 0xf, 0xff, 0xf0, 0x7f, 0xff, + 0x8f, 0xff, 0xe0, 0xf, 0xff, 0xc7, 0xff, 0xc0, + 0x1, 0xff, 0xf3, 0xff, 0xe0, 0x0, 0xff, 0xfb, + 0xff, 0xe0, 0x0, 0x3f, 0xfd, 0xff, 0xf0, 0x0, + 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, + 0xf8, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x1, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, 0x3f, + 0xff, 0xff, 0xe0, 0x0, 0x3f, 0xff, 0xff, 0xf0, + 0x0, 0x1f, 0xff, 0x7f, 0xfc, 0x0, 0x1f, 0xff, + 0x3f, 0xfe, 0x0, 0xf, 0xff, 0x9f, 0xff, 0xc0, + 0x1f, 0xff, 0xc7, 0xff, 0xf8, 0x3f, 0xff, 0xe3, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x1f, + 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, 0xbf, + 0xfc, 0x1, 0xff, 0xff, 0xbf, 0xfc, 0x0, 0x7f, + 0xff, 0xbf, 0xfe, 0x0, 0xf, 0xff, 0x1f, 0xfe, + 0x0, 0x1, 0xfe, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x7, + 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, + 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, + 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xf, - 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, - 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, - 0x80, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x0, - 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, - 0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x0, 0x3, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, - 0x0, 0x7, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x3f, + 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, + 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x7, + 0xff, 0xc0, 0x0, 0x0, - /* U+3A ":" */ + /* U+003A ":" */ 0x7, 0xe0, 0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe, - 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, - 0x7f, 0xfe, 0x3f, 0xfc, 0x1f, 0xf8, 0x7, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xe0, 0x1f, 0xf8, - 0x3f, 0xfc, 0x7f, 0xfe, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0xfe, 0x7f, 0xfe, 0x3f, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x3f, 0xfc, + 0x1f, 0xf8, 0x7, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xe0, 0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x3f, 0xfc, 0x1f, 0xf8, 0x7, 0xe0 }; @@ -439,17 +437,17 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 768, .box_w = 41, .box_h = 59, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 303, .adv_w = 768, .box_w = 40, .box_h = 58, .ofs_x = 6, .ofs_y = 0}, - {.bitmap_index = 593, .adv_w = 768, .box_w = 41, .box_h = 58, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 891, .adv_w = 768, .box_w = 41, .box_h = 59, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 1194, .adv_w = 768, .box_w = 38, .box_h = 58, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 1470, .adv_w = 768, .box_w = 41, .box_h = 58, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 1768, .adv_w = 768, .box_w = 42, .box_h = 59, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 2078, .adv_w = 768, .box_w = 40, .box_h = 58, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 2368, .adv_w = 768, .box_w = 42, .box_h = 60, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 2683, .adv_w = 768, .box_w = 42, .box_h = 59, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2993, .adv_w = 768, .box_w = 16, .box_h = 46, .ofs_x = 16, .ofs_y = -1} + {.bitmap_index = 0, .adv_w = 768, .box_w = 39, .box_h = 60, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 293, .adv_w = 768, .box_w = 38, .box_h = 59, .ofs_x = 6, .ofs_y = 0}, + {.bitmap_index = 574, .adv_w = 768, .box_w = 39, .box_h = 60, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 867, .adv_w = 768, .box_w = 39, .box_h = 59, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 1155, .adv_w = 768, .box_w = 38, .box_h = 59, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 1436, .adv_w = 768, .box_w = 38, .box_h = 60, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 1721, .adv_w = 768, .box_w = 41, .box_h = 60, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 2029, .adv_w = 768, .box_w = 41, .box_h = 58, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 2327, .adv_w = 768, .box_w = 41, .box_h = 60, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 2635, .adv_w = 768, .box_w = 41, .box_h = 60, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 2943, .adv_w = 768, .box_w = 16, .box_h = 46, .ofs_x = 16, .ofs_y = -1} }; /*--------------------- @@ -473,9 +471,14 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = * ALL CUSTOM DATA *--------------------*/ +#if LV_VERSION_CHECK(8, 0, 0) /*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else static lv_font_fmt_txt_dsc_t font_dsc = { - .glyph_bitmap = gylph_bitmap, +#endif + .glyph_bitmap = glyph_bitmap, .glyph_dsc = glyph_dsc, .cmaps = cmaps, .kern_dsc = NULL, @@ -483,7 +486,10 @@ static lv_font_fmt_txt_dsc_t font_dsc = { .cmap_num = 1, .bpp = 1, .kern_classes = 0, - .bitmap_format = 0 + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif }; @@ -492,16 +498,26 @@ static lv_font_fmt_txt_dsc_t font_dsc = { *----------------*/ /*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t jetbrains_mono_extrabold_compressed = { +#else lv_font_t jetbrains_mono_extrabold_compressed = { +#endif .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 60, /*The maximum line height required by the font*/ + .line_height = 61, /*The maximum line height required by the font*/ .base_line = 1, /*Baseline measured from the bottom of the line*/ #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -12, + .underline_thickness = 4, #endif .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; + + #endif /*#if JETBRAINS_MONO_EXTRABOLD_COMPRESSED*/ diff --git a/src/displayapp/fonts/lv_font_sys_48.c b/src/displayapp/fonts/lv_font_sys_48.c index 19f3ec2d..ca007e30 100644 --- a/src/displayapp/fonts/lv_font_sys_48.c +++ b/src/displayapp/fonts/lv_font_sys_48.c @@ -311,7 +311,7 @@ lv_font_t lv_font_sys_48 = { #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) .subpx = LV_FONT_SUBPX_NONE, #endif -#if LV_VERSION_CHECK(7, 4, 0) +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 .underline_position = 0, .underline_thickness = 0, #endif From 04d21dcd932c7e75b2d45314b2f68d9ba91c5d68 Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Sun, 27 Feb 2022 15:02:02 +0200 Subject: [PATCH 31/53] Add ExtraBold font ttf --- .../fonts/JetBrainsMono-ExtraBold.ttf | Bin 0 -> 210688 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/displayapp/fonts/JetBrainsMono-ExtraBold.ttf diff --git a/src/displayapp/fonts/JetBrainsMono-ExtraBold.ttf b/src/displayapp/fonts/JetBrainsMono-ExtraBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f85a85b5f7dd416327ad0c5d9052ca94c5b764d7 GIT binary patch literal 210688 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 literal 0 HcmV?d00001 From 61a9a97e267799f76c64279887a9845d4760a77c Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Tue, 1 Mar 2022 01:09:48 +0200 Subject: [PATCH 32/53] Update navigation font readme section --- src/displayapp/fonts/README.md | 16 ++++++---------- src/displayapp/fonts/lv_font_navi_80.c | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/displayapp/fonts/README.md b/src/displayapp/fonts/README.md index 2e900d12..7e6203ff 100644 --- a/src/displayapp/fonts/README.md +++ b/src/displayapp/fonts/README.md @@ -59,6 +59,7 @@ with * Load the file `JetBrainsMono-Regular.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0x25, 0x30-0x3a` ### Large font + * Name: jetbrains_mono_76 * Size: 76 * Bpp: 1 bit-per-pixel @@ -87,17 +88,12 @@ with * Size: 48 * Bpp: 1 bit-per-pixel * Do not enable font compression or horizontal subpixel rendering -* Load the file `icons_sys_48.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0xe902, 0xe904-0xe907, 0xe90b-0xe90c` +* Load the file `icons_sys_48.tff` and specify the following range: `0xe902, 0xe904-0xe907, 0xe90b-0xe90c` -#### Navigation font +### Navigation font -To create the navigtion.ttf I use the web app [icomoon](https://icomoon.io/app) -this app can import the svg files from the folder *src/displayapp/icons/navigation/unique* and create a ttf file the -project for the site is *lv_font_navi_80.json* you can import it to add or remove icons +`navigtion.ttf` is created with the web app [icomoon](https://icomoon.io/app) by importing the svg files from `src/displayapp/icons/navigation/unique` and generating the font. `lv_font_navi_80.json` is a project file for the site, which you can import to add or remove icons. -You can also use the online LVGL tool to create the .c +This font must be generated with the `lv_font_conv` tool, which has additional options not available in the online converter. -ttf file : navigation.ttf name : lv_font_navi_80 size : 80px Bpp : 2 bit-per-pixel range : 0xe900-0xe929 - -$lv_font_conv --font navigation.ttf -r '0xe900-0xe929' --size 80 --format lvgl --bpp 2 --no-prefilter -o -lv_font_navi_80.c +`lv_font_conv --font navigation.ttf -r '0xe900-0xe929' --size 80 --format lvgl --bpp 2 -o lv_font_navi_80.c` diff --git a/src/displayapp/fonts/lv_font_navi_80.c b/src/displayapp/fonts/lv_font_navi_80.c index d5a8400e..8fd3979f 100644 --- a/src/displayapp/fonts/lv_font_navi_80.c +++ b/src/displayapp/fonts/lv_font_navi_80.c @@ -2623,7 +2623,7 @@ lv_font_t lv_font_navi_80 = { #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) .subpx = LV_FONT_SUBPX_NONE, #endif -#if LV_VERSION_CHECK(7, 4, 0) +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 .underline_position = 0, .underline_thickness = 0, #endif From 7e0b053b38d0491eb4ee666be34d0ea2ab029d19 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Tue, 8 Mar 2022 21:28:57 +0100 Subject: [PATCH 33/53] CI: lv_sim: initialize libpng submodule for WITH_PNG=ON screenshot InfiniSim PR https://github.com/InfiniTimeOrg/InfiniSim/pull/10 adds support for screenshots in png/bmp format using `libpng` submodule. This new submodule must be added to the lv_sim workflow as well. --- .github/workflows/lv_sim.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lv_sim.yml b/.github/workflows/lv_sim.yml index a3479f05..59ee7b31 100644 --- a/.github/workflows/lv_sim.yml +++ b/.github/workflows/lv_sim.yml @@ -48,7 +48,7 @@ jobs: - name: Get InfiniSim repo run: | git clone https://github.com/InfiniTimeOrg/InfiniSim.git --depth 1 --branch main - git -C InfiniSim submodule update --init lv_drivers + git -C InfiniSim submodule update --init lv_drivers libpng ######################################################################################### # CMake From f47b04ffd0ee401381f18cfedd716d492b4c7db8 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Tue, 8 Mar 2022 23:10:06 +0100 Subject: [PATCH 34/53] Fix SettingChimes cbOption array size There are 3 options, but the array-size is set to 2. This leads to memory corruption in the initialization of the SettingChimes screen when assigning the third option object pointer. Found in https://github.com/InfiniTimeOrg/InfiniSim/issues/11 --- src/displayapp/screens/settings/SettingChimes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/displayapp/screens/settings/SettingChimes.h b/src/displayapp/screens/settings/SettingChimes.h index 653f87f7..a251e95b 100644 --- a/src/displayapp/screens/settings/SettingChimes.h +++ b/src/displayapp/screens/settings/SettingChimes.h @@ -20,7 +20,7 @@ namespace Pinetime { private: Controllers::Settings& settingsController; uint8_t optionsTotal; - lv_obj_t* cbOption[2]; + lv_obj_t* cbOption[3]; }; } } From ea14c580ca6296cb93facf526d65a2db0e3ff1b0 Mon Sep 17 00:00:00 2001 From: mabuch Date: Sat, 12 Mar 2022 17:55:54 +0100 Subject: [PATCH 35/53] Rename PineTimeStyle to WatchFacePineTimeStyle --- src/CMakeLists.txt | 2 +- src/displayapp/screens/Clock.cpp | 8 +++--- src/displayapp/screens/Clock.h | 2 +- ...meStyle.cpp => WatchFacePineTimeStyle.cpp} | 26 +++++++++---------- ...neTimeStyle.h => WatchFacePineTimeStyle.h} | 6 ++--- 5 files changed, 22 insertions(+), 22 deletions(-) rename src/displayapp/screens/{PineTimeStyle.cpp => WatchFacePineTimeStyle.cpp} (96%) rename src/displayapp/screens/{PineTimeStyle.h => WatchFacePineTimeStyle.h} (96%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ff0c9b0c..2f7df3a1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -456,7 +456,7 @@ list(APPEND SOURCE_FILES displayapp/screens/WatchFaceAnalog.cpp displayapp/screens/WatchFaceDigital.cpp displayapp/screens/WatchFaceTerminal.cpp - displayapp/screens/PineTimeStyle.cpp + displayapp/screens/WatchFacePineTimeStyle.cpp ## diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index fd74683a..693e42a9 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -11,7 +11,7 @@ #include "displayapp/screens/WatchFaceDigital.h" #include "displayapp/screens/WatchFaceTerminal.h" #include "displayapp/screens/WatchFaceAnalog.h" -#include "displayapp/screens/PineTimeStyle.h" +#include "displayapp/screens/WatchFacePineTimeStyle.h" using namespace Pinetime::Applications::Screens; @@ -40,7 +40,7 @@ Clock::Clock(DisplayApp* app, return WatchFaceAnalogScreen(); break; case 2: - return PineTimeStyleScreen(); + return WatchFacePineTimeStyleScreen(); break; case 3: return WatchFaceTerminalScreen(); @@ -79,8 +79,8 @@ std::unique_ptr Clock::WatchFaceAnalogScreen() { app, dateTimeController, batteryController, bleController, notificatioManager, settingsController); } -std::unique_ptr Clock::PineTimeStyleScreen() { - return std::make_unique( +std::unique_ptr Clock::WatchFacePineTimeStyleScreen() { + return std::make_unique( app, dateTimeController, batteryController, bleController, notificatioManager, settingsController, motionController); } diff --git a/src/displayapp/screens/Clock.h b/src/displayapp/screens/Clock.h index 50996a73..1ba752c7 100644 --- a/src/displayapp/screens/Clock.h +++ b/src/displayapp/screens/Clock.h @@ -46,7 +46,7 @@ namespace Pinetime { std::unique_ptr screen; std::unique_ptr WatchFaceDigitalScreen(); std::unique_ptr WatchFaceAnalogScreen(); - std::unique_ptr PineTimeStyleScreen(); + std::unique_ptr WatchFacePineTimeStyleScreen(); std::unique_ptr WatchFaceTerminalScreen(); }; } diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/WatchFacePineTimeStyle.cpp similarity index 96% rename from src/displayapp/screens/PineTimeStyle.cpp rename to src/displayapp/screens/WatchFacePineTimeStyle.cpp index 44bf47a4..e032ac2e 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/WatchFacePineTimeStyle.cpp @@ -19,7 +19,7 @@ * Style/layout copied from TimeStyle for Pebble by Dan Tilden (github.com/tilden) */ -#include "displayapp/screens/PineTimeStyle.h" +#include "displayapp/screens/WatchFacePineTimeStyle.h" #include #include #include @@ -39,7 +39,7 @@ using namespace Pinetime::Applications::Screens; namespace { void event_handler(lv_obj_t* obj, lv_event_t event) { - auto* screen = static_cast(obj->user_data); + auto* screen = static_cast(obj->user_data); screen->UpdateSelected(obj, event); } @@ -51,7 +51,7 @@ namespace { } } -PineTimeStyle::PineTimeStyle(DisplayApp* app, +WatchFacePineTimeStyle::WatchFacePineTimeStyle(DisplayApp* app, Controllers::DateTime& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, @@ -300,12 +300,12 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app, Refresh(); } -PineTimeStyle::~PineTimeStyle() { +WatchFacePineTimeStyle::~WatchFacePineTimeStyle() { lv_task_del(taskRefresh); lv_obj_clean(lv_scr_act()); } -bool PineTimeStyle::OnTouchEvent(Pinetime::Applications::TouchEvents event) { +bool WatchFacePineTimeStyle::OnTouchEvent(Pinetime::Applications::TouchEvents event) { if ((event == Pinetime::Applications::TouchEvents::LongTap) && lv_obj_get_hidden(btnRandom)) { lv_obj_set_hidden(btnSet, false); savedTick = lv_tick_get(); @@ -317,7 +317,7 @@ bool PineTimeStyle::OnTouchEvent(Pinetime::Applications::TouchEvents event) { return false; } -void PineTimeStyle::CloseMenu() { +void WatchFacePineTimeStyle::CloseMenu() { settingsController.SaveSettings(); lv_obj_set_hidden(btnNextTime, true); lv_obj_set_hidden(btnPrevTime, true); @@ -330,7 +330,7 @@ void PineTimeStyle::CloseMenu() { lv_obj_set_hidden(btnClose, true); } -bool PineTimeStyle::OnButtonPushed() { +bool WatchFacePineTimeStyle::OnButtonPushed() { if (!lv_obj_get_hidden(btnClose)) { CloseMenu(); return true; @@ -338,13 +338,13 @@ bool PineTimeStyle::OnButtonPushed() { return false; } -void PineTimeStyle::SetBatteryIcon() { +void WatchFacePineTimeStyle::SetBatteryIcon() { auto batteryPercent = batteryPercentRemaining.Get(); lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); } -void PineTimeStyle::AlignIcons() { +void WatchFacePineTimeStyle::AlignIcons() { bool isBleIconVisible = IsBleIconVisible(bleRadioEnabled.Get(), bleState.Get()); if (notificationState.Get() && isBleIconVisible) { lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 8, 25); @@ -356,7 +356,7 @@ void PineTimeStyle::AlignIcons() { } } -void PineTimeStyle::Refresh() { +void WatchFacePineTimeStyle::Refresh() { isCharging = batteryController.IsCharging(); if (isCharging.IsUpdated()) { if (isCharging.Get()) { @@ -456,7 +456,7 @@ void PineTimeStyle::Refresh() { } } -void PineTimeStyle::UpdateSelected(lv_obj_t* object, lv_event_t event) { +void WatchFacePineTimeStyle::UpdateSelected(lv_obj_t* object, lv_event_t event) { auto valueTime = settingsController.GetPTSColorTime(); auto valueBar = settingsController.GetPTSColorBar(); auto valueBG = settingsController.GetPTSColorBG(); @@ -577,7 +577,7 @@ void PineTimeStyle::UpdateSelected(lv_obj_t* object, lv_event_t event) { } } -Pinetime::Controllers::Settings::Colors PineTimeStyle::GetNext(Pinetime::Controllers::Settings::Colors color) { +Pinetime::Controllers::Settings::Colors WatchFacePineTimeStyle::GetNext(Pinetime::Controllers::Settings::Colors color) { auto colorAsInt = static_cast(color); Pinetime::Controllers::Settings::Colors nextColor; if (colorAsInt < 16) { @@ -588,7 +588,7 @@ Pinetime::Controllers::Settings::Colors PineTimeStyle::GetNext(Pinetime::Control return nextColor; } -Pinetime::Controllers::Settings::Colors PineTimeStyle::GetPrevious(Pinetime::Controllers::Settings::Colors color) { +Pinetime::Controllers::Settings::Colors WatchFacePineTimeStyle::GetPrevious(Pinetime::Controllers::Settings::Colors color) { auto colorAsInt = static_cast(color); Pinetime::Controllers::Settings::Colors prevColor; diff --git a/src/displayapp/screens/PineTimeStyle.h b/src/displayapp/screens/WatchFacePineTimeStyle.h similarity index 96% rename from src/displayapp/screens/PineTimeStyle.h rename to src/displayapp/screens/WatchFacePineTimeStyle.h index 5de9a5fa..465aa705 100644 --- a/src/displayapp/screens/PineTimeStyle.h +++ b/src/displayapp/screens/WatchFacePineTimeStyle.h @@ -21,16 +21,16 @@ namespace Pinetime { namespace Applications { namespace Screens { - class PineTimeStyle : public Screen { + class WatchFacePineTimeStyle : public Screen { public: - PineTimeStyle(DisplayApp* app, + WatchFacePineTimeStyle(DisplayApp* app, Controllers::DateTime& dateTimeController, Controllers::Battery& batteryController, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, Controllers::MotionController& motionController); - ~PineTimeStyle() override; + ~WatchFacePineTimeStyle() override; bool OnTouchEvent(TouchEvents event) override; bool OnButtonPushed() override; From 0933d60b1627df18c5615c610b8e26a685901b44 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sun, 13 Mar 2022 21:58:53 +0100 Subject: [PATCH 36/53] Music: fix warning about overridden function Clang warns on `OnTouchEvent()` function, which is overridden, but is missing the `override` keyword ``` In file included from InfiniTime/src/displayapp/screens/Music.cpp:18: InfiniTime/src/displayapp/screens/Music.h:43:14: warning: 'OnTouchEvent' overrides a member function but is not marked 'override' [-Winconsistent-missing-override] bool OnTouchEvent(TouchEvents event); ^ ``` --- src/displayapp/screens/Music.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/displayapp/screens/Music.h b/src/displayapp/screens/Music.h index 35f7bab5..27b2d3d2 100644 --- a/src/displayapp/screens/Music.h +++ b/src/displayapp/screens/Music.h @@ -40,7 +40,7 @@ namespace Pinetime { void OnObjectEvent(lv_obj_t* obj, lv_event_t event); private: - bool OnTouchEvent(TouchEvents event); + bool OnTouchEvent(TouchEvents event) override; void UpdateLength(); From 51716898aa00ea2d38dfe38d28a33b4ffbdf22ff Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sun, 13 Mar 2022 22:03:29 +0100 Subject: [PATCH 37/53] Twos: fix warning about extra paranthesis We have a comparison like `if (( a == b ))`, which is a parenthesis too much, which generates the following warning ``` InfiniTime/src/displayapp/screens/Twos.cpp:133:35: warning: equality comparison with extraneous parentheses [-Wparentheses-equality] if ((grid[newRow][newCol].value == grid[oldRow][oldCol].value)) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ InfiniTime/src/displayapp/screens/Twos.cpp:133:35: note: remove extraneous parentheses around the comparison to silence this warning if ((grid[newRow][newCol].value == grid[oldRow][oldCol].value)) { ~ ^ ~ ``` --- src/displayapp/screens/Twos.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/displayapp/screens/Twos.cpp b/src/displayapp/screens/Twos.cpp index b15332f1..6d675859 100644 --- a/src/displayapp/screens/Twos.cpp +++ b/src/displayapp/screens/Twos.cpp @@ -130,7 +130,7 @@ bool Twos::placeNewTile() { } bool Twos::tryMerge(TwosTile grid[][4], int& newRow, int& newCol, int oldRow, int oldCol) { - if ((grid[newRow][newCol].value == grid[oldRow][oldCol].value)) { + if (grid[newRow][newCol].value == grid[oldRow][oldCol].value) { if ((newCol != oldCol) || (newRow != oldRow)) { if (!grid[newRow][newCol].merged) { unsigned int newVal = grid[oldRow][oldCol].value *= 2; From db41d9081a61b2370a4633568a9cb01bc948a5ab Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Mon, 14 Mar 2022 20:28:51 +0100 Subject: [PATCH 38/53] DateTimeController: make possible functions const MonthShortToString and DayOfWeekShortToString don't change the underlying object. Those are just getters and can be declared `const`. --- src/components/datetime/DateTimeController.cpp | 4 ++-- src/components/datetime/DateTimeController.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/datetime/DateTimeController.cpp b/src/components/datetime/DateTimeController.cpp index e0d12431..3bfbdc7e 100644 --- a/src/components/datetime/DateTimeController.cpp +++ b/src/components/datetime/DateTimeController.cpp @@ -108,11 +108,11 @@ void DateTime::UpdateTime(uint32_t systickCounter) { } } -const char* DateTime::MonthShortToString() { +const char* DateTime::MonthShortToString() const { return MonthsString[static_cast(month)]; } -const char* DateTime::DayOfWeekShortToString() { +const char* DateTime::DayOfWeekShortToString() const { return DaysStringShort[static_cast(dayOfWeek)]; } diff --git a/src/components/datetime/DateTimeController.h b/src/components/datetime/DateTimeController.h index 6e5ee3ca..00bbc2ee 100644 --- a/src/components/datetime/DateTimeController.h +++ b/src/components/datetime/DateTimeController.h @@ -61,8 +61,8 @@ namespace Pinetime { return second; } - const char* MonthShortToString(); - const char* DayOfWeekShortToString(); + const char* MonthShortToString() const; + const char* DayOfWeekShortToString() const; static const char* MonthShortToStringLow(Months month); std::chrono::time_point CurrentDateTime() const { From bebc072e78145af69aacb1c2c9549da8653b7b0c Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Mon, 14 Mar 2022 20:55:20 +0100 Subject: [PATCH 39/53] WatchFaceAnalog: const ref to dateTimeController The clock app only reads from the dateTimeController, never modifies it. --- src/displayapp/screens/WatchFaceAnalog.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index a18eb299..3377d39e 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -74,7 +74,7 @@ namespace Pinetime { lv_obj_t* batteryIcon; lv_obj_t* notificationIcon; - Controllers::DateTime& dateTimeController; + const Controllers::DateTime& dateTimeController; Controllers::Battery& batteryController; Controllers::Ble& bleController; Controllers::NotificationManager& notificationManager; From 1379b7902fca8628614af358bac7d546cc94efdc Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Mon, 14 Mar 2022 20:33:14 +0100 Subject: [PATCH 40/53] WatchFaceAnalog: local date/time variables Use local date and time variables. No need to store them in the object. --- src/displayapp/screens/WatchFaceAnalog.cpp | 12 ++++++------ src/displayapp/screens/WatchFaceAnalog.h | 7 ------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index f1b91444..61042816 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -137,9 +137,9 @@ WatchFaceAnalog::~WatchFaceAnalog() { } void WatchFaceAnalog::UpdateClock() { - hour = dateTimeController.Hours(); - minute = dateTimeController.Minutes(); - second = dateTimeController.Seconds(); + uint8_t hour = dateTimeController.Hours(); + uint8_t minute = dateTimeController.Minutes(); + uint8_t second = dateTimeController.Seconds(); if (sMinute != minute) { auto const angle = minute * 6; @@ -214,9 +214,9 @@ void WatchFaceAnalog::Refresh() { currentDateTime = dateTimeController.CurrentDateTime(); if (currentDateTime.IsUpdated()) { - month = dateTimeController.Month(); - day = dateTimeController.Day(); - dayOfWeek = dateTimeController.DayOfWeek(); + Pinetime::Controllers::DateTime::Months month = dateTimeController.Month(); + uint8_t day = dateTimeController.Day(); + Pinetime::Controllers::DateTime::Days dayOfWeek = dateTimeController.DayOfWeek(); UpdateClock(); diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index a18eb299..9412d739 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -35,13 +35,6 @@ namespace Pinetime { private: uint8_t sHour, sMinute, sSecond; - uint8_t hour; - uint8_t minute; - uint8_t second; - - Pinetime::Controllers::DateTime::Months month; - uint8_t day; - Pinetime::Controllers::DateTime::Days dayOfWeek; Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; From df61907073fab7d4c2f9595c7771e894a3841b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Mon, 14 Mar 2022 20:44:19 +0100 Subject: [PATCH 41/53] Limit the size of the track and album name received by MusicService. This should work around this bug : https://github.com/InfiniTimeOrg/InfiniTime/issues/825 and prevent heap over-allocation. --- src/components/ble/MusicService.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/ble/MusicService.cpp b/src/components/ble/MusicService.cpp index 3457ce4c..7b74ac2e 100644 --- a/src/components/ble/MusicService.cpp +++ b/src/components/ble/MusicService.cpp @@ -47,6 +47,8 @@ namespace { constexpr ble_uuid128_t msRepeatCharUuid {CharUuid(0x0b, 0x00)}; constexpr ble_uuid128_t msShuffleCharUuid {CharUuid(0x0c, 0x00)}; + constexpr uint8_t MaxStringSize {40}; + int MusicCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { return static_cast(arg)->OnCommand(conn_handle, attr_handle, ctxt); } @@ -125,6 +127,11 @@ void Pinetime::Controllers::MusicService::Init() { int Pinetime::Controllers::MusicService::OnCommand(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt) { if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { size_t notifSize = OS_MBUF_PKTLEN(ctxt->om); + + if(notifSize > MaxStringSize) { + notifSize = MaxStringSize; + } + char data[notifSize + 1]; data[notifSize] = '\0'; os_mbuf_copydata(ctxt->om, 0, notifSize, data); From f973f1c12c5f82ddacfdaca29fbe1043d94313ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Mon, 14 Mar 2022 21:03:08 +0100 Subject: [PATCH 42/53] Add missing space in if expression. --- src/components/ble/MusicService.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ble/MusicService.cpp b/src/components/ble/MusicService.cpp index 7b74ac2e..0e53b9cb 100644 --- a/src/components/ble/MusicService.cpp +++ b/src/components/ble/MusicService.cpp @@ -128,7 +128,7 @@ int Pinetime::Controllers::MusicService::OnCommand(uint16_t conn_handle, uint16_ if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { size_t notifSize = OS_MBUF_PKTLEN(ctxt->om); - if(notifSize > MaxStringSize) { + if (notifSize > MaxStringSize) { notifSize = MaxStringSize; } From 88197b66328ab8cbecc199c91d1ce1e1688ade83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Thu, 17 Mar 2022 21:15:05 +0100 Subject: [PATCH 43/53] Music app : when title/track name are truncated, add an ellipsis at the end of the strings. --- src/components/ble/MusicService.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/ble/MusicService.cpp b/src/components/ble/MusicService.cpp index 0e53b9cb..c99aa1e3 100644 --- a/src/components/ble/MusicService.cpp +++ b/src/components/ble/MusicService.cpp @@ -17,6 +17,7 @@ */ #include "components/ble/MusicService.h" #include "systemtask/SystemTask.h" +#include namespace { // 0000yyxx-78fc-48fe-8e23-433b3a1942d0 @@ -127,14 +128,21 @@ void Pinetime::Controllers::MusicService::Init() { int Pinetime::Controllers::MusicService::OnCommand(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt) { if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { size_t notifSize = OS_MBUF_PKTLEN(ctxt->om); - + size_t bufferSize = notifSize; if (notifSize > MaxStringSize) { - notifSize = MaxStringSize; + bufferSize = MaxStringSize; } - char data[notifSize + 1]; - data[notifSize] = '\0'; - os_mbuf_copydata(ctxt->om, 0, notifSize, data); + char data[bufferSize + 1]; + os_mbuf_copydata(ctxt->om, 0, bufferSize, data); + + if (notifSize > bufferSize) { + data[bufferSize-1] = '.'; + data[bufferSize-2] = '.'; + data[bufferSize-3] = '.'; + } + data[bufferSize] = '\0'; + char* s = &data[0]; if (ble_uuid_cmp(ctxt->chr->uuid, &msArtistCharUuid.u) == 0) { artistName = s; From f1194a5f74fa7e02805940a39489210783b94878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Mon, 14 Mar 2022 20:54:04 +0100 Subject: [PATCH 44/53] In current configuration, the timer task (the one from FreeRTOS) has the lowest priority (0). Both display and system tasks are also set on priority 0. In cases where any other task takes too much time to execute (it can happen in Display Task, see https://github.com/InfiniTimeOrg/InfiniTime/issues/825), the timer task does not have the opportunity to run fast enough to detect and debounce presses on the button. This commit sets the following priorities: - [0] : Display Task - [1] : Timer and System tasks - [2] : BLE Host - [3] : BLE LL This way, we ensure that button presses will always be detected, even if the rendering of the display takes a huge amount of time. --- src/FreeRTOSConfig.h | 4 ++-- src/systemtask/SystemTask.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/FreeRTOSConfig.h b/src/FreeRTOSConfig.h index adbbc8f0..5462b93c 100644 --- a/src/FreeRTOSConfig.h +++ b/src/FreeRTOSConfig.h @@ -60,7 +60,7 @@ #define configUSE_TICKLESS_IDLE_SIMPLE_DEBUG 0 /* See into vPortSuppressTicksAndSleep source code for explanation */ #define configCPU_CLOCK_HZ (SystemCoreClock) #define configTICK_RATE_HZ 1024 -#define configMAX_PRIORITIES (3) +#define configMAX_PRIORITIES (4) #define configMINIMAL_STACK_SIZE (120) #define configTOTAL_HEAP_SIZE (1024 * 17) #define configMAX_TASK_NAME_LEN (4) @@ -93,7 +93,7 @@ /* Software timer definitions. */ #define configUSE_TIMERS 1 -#define configTIMER_TASK_PRIORITY (0) +#define configTIMER_TASK_PRIORITY (1) #define configTIMER_QUEUE_LENGTH 32 #define configTIMER_TASK_STACK_DEPTH (300) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 1e45fac1..77cf411b 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -107,7 +107,7 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi, void SystemTask::Start() { systemTasksMsgQueue = xQueueCreate(10, 1); - if (pdPASS != xTaskCreate(SystemTask::Process, "MAIN", 350, this, 0, &taskHandle)) { + if (pdPASS != xTaskCreate(SystemTask::Process, "MAIN", 350, this, 1, &taskHandle)) { APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); } } From cd1f218dd8710f61238307a9fa5b0d11e229bffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Mon, 14 Mar 2022 21:54:13 +0100 Subject: [PATCH 45/53] Fix priorities of BLE tasks --- .../porting/npl/freertos/src/nimble_port_freertos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/mynewt-nimble/porting/npl/freertos/src/nimble_port_freertos.c b/src/libs/mynewt-nimble/porting/npl/freertos/src/nimble_port_freertos.c index b9902781..205831a9 100644 --- a/src/libs/mynewt-nimble/porting/npl/freertos/src/nimble_port_freertos.c +++ b/src/libs/mynewt-nimble/porting/npl/freertos/src/nimble_port_freertos.c @@ -38,7 +38,7 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn) * since it has compatible prototype. */ xTaskCreate(nimble_port_ll_task_func, "ll", configMINIMAL_STACK_SIZE + 200, - NULL, configMAX_PRIORITIES - 1, &ll_task_h); + NULL, 3, &ll_task_h); #endif /* @@ -47,5 +47,5 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn) * default queue it is just easier to make separate task which does this. */ xTaskCreate(host_task_fn, "ble", configMINIMAL_STACK_SIZE + 600, - NULL, tskIDLE_PRIORITY + 1, &host_task_h); + NULL, 2, &host_task_h); } From a8b7fbe48b4a86238f38ed0f084b277b44c428fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Thu, 17 Mar 2022 21:22:59 +0100 Subject: [PATCH 46/53] New changes according to the review : Priority 0 for display, 1 for system, timer and ble host, and 2 for ble LL --- src/FreeRTOSConfig.h | 2 +- src/components/ble/NimbleController.cpp | 1 + .../porting/npl/freertos/src/nimble_port_freertos.c | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/FreeRTOSConfig.h b/src/FreeRTOSConfig.h index 5462b93c..263d8031 100644 --- a/src/FreeRTOSConfig.h +++ b/src/FreeRTOSConfig.h @@ -60,7 +60,7 @@ #define configUSE_TICKLESS_IDLE_SIMPLE_DEBUG 0 /* See into vPortSuppressTicksAndSleep source code for explanation */ #define configCPU_CLOCK_HZ (SystemCoreClock) #define configTICK_RATE_HZ 1024 -#define configMAX_PRIORITIES (4) +#define configMAX_PRIORITIES (3) #define configMINIMAL_STACK_SIZE (120) #define configTOTAL_HEAP_SIZE (1024 * 17) #define configMAX_TASK_NAME_LEN (4) diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp index 0be7c0f7..10eb429a 100644 --- a/src/components/ble/NimbleController.cpp +++ b/src/components/ble/NimbleController.cpp @@ -77,6 +77,7 @@ int GAPEventCallback(struct ble_gap_event* event, void* arg) { void NimbleController::Init() { while (!ble_hs_synced()) { + vTaskDelay(10); } nptr = this; diff --git a/src/libs/mynewt-nimble/porting/npl/freertos/src/nimble_port_freertos.c b/src/libs/mynewt-nimble/porting/npl/freertos/src/nimble_port_freertos.c index 205831a9..49834db1 100644 --- a/src/libs/mynewt-nimble/porting/npl/freertos/src/nimble_port_freertos.c +++ b/src/libs/mynewt-nimble/porting/npl/freertos/src/nimble_port_freertos.c @@ -38,7 +38,7 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn) * since it has compatible prototype. */ xTaskCreate(nimble_port_ll_task_func, "ll", configMINIMAL_STACK_SIZE + 200, - NULL, 3, &ll_task_h); + NULL, 2, &ll_task_h); #endif /* @@ -47,5 +47,5 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn) * default queue it is just easier to make separate task which does this. */ xTaskCreate(host_task_fn, "ble", configMINIMAL_STACK_SIZE + 600, - NULL, 2, &host_task_h); + NULL, 1, &host_task_h); } From 4761fcb63a55749c5e46c5fe6bb53ae25b4716c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Sun, 27 Mar 2022 20:29:52 +0200 Subject: [PATCH 47/53] DisplayApp : Call the event handler of the current app before loading the new one. This way, we ensure that lv_task_handler() is called before sending event to the newly loaded app. --- src/displayapp/DisplayApp.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index fdc6376c..c8429563 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -306,14 +306,14 @@ void DisplayApp::Refresh() { } } + if (touchHandler.IsTouching()) { + currentScreen->OnTouchEvent(touchHandler.GetX(), touchHandler.GetY()); + } + if (nextApp != Apps::None) { LoadApp(nextApp, nextDirection); nextApp = Apps::None; } - - if (touchHandler.IsTouching()) { - currentScreen->OnTouchEvent(touchHandler.GetX(), touchHandler.GetY()); - } } void DisplayApp::StartApp(Apps app, DisplayApp::FullRefreshDirections direction) { From 8f436e1d74ffdd497c68dc2f34f6a67e430a1932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Sun, 27 Mar 2022 20:21:44 +0200 Subject: [PATCH 48/53] Timer App : add background label to ensure that the app will be displayed correctly after a full refresh (HW scrolling transition). Code cleaning and rename methods. --- src/displayapp/DisplayApp.cpp | 2 +- src/displayapp/screens/Timer.cpp | 19 ++++++++++++------- src/displayapp/screens/Timer.h | 27 +++++++++++++++------------ 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index c8429563..f6d27477 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -207,7 +207,7 @@ void DisplayApp::Refresh() { case Messages::TimerDone: if (currentApp == Apps::Timer) { auto* timer = static_cast(currentScreen.get()); - timer->setDone(); + timer->SetDone(); } else { LoadApp(Apps::Timer, DisplayApp::FullRefreshDirections::Down); } diff --git a/src/displayapp/screens/Timer.cpp b/src/displayapp/screens/Timer.cpp index a5e40195..5cd496c7 100644 --- a/src/displayapp/screens/Timer.cpp +++ b/src/displayapp/screens/Timer.cpp @@ -1,5 +1,4 @@ #include "displayapp/screens/Timer.h" - #include "displayapp/screens/Screen.h" #include "displayapp/screens/Symbols.h" #include @@ -7,11 +6,11 @@ using namespace Pinetime::Applications::Screens; static void btnEventHandler(lv_obj_t* obj, lv_event_t event) { - Timer* screen = static_cast(obj->user_data); + auto* screen = static_cast(obj->user_data); screen->OnButtonEvent(obj, event); } -void Timer::createButtons() { +void Timer::CreateButtons() { btnMinutesUp = lv_btn_create(lv_scr_act(), nullptr); btnMinutesUp->user_data = this; lv_obj_set_event_cb(btnMinutesUp, btnEventHandler); @@ -51,6 +50,12 @@ void Timer::createButtons() { Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController) : Screen(app), running {true}, timerController {timerController} { + 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(backgroundLabel, ""); time = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); @@ -71,7 +76,7 @@ Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController) lv_label_set_text(txtPlayPause, Symbols::pause); } else { lv_label_set_text(txtPlayPause, Symbols::play); - createButtons(); + CreateButtons(); } taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); @@ -98,7 +103,7 @@ void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) { minutesToSet = seconds / 60; secondsToSet = seconds % 60; timerController.StopTimer(); - createButtons(); + CreateButtons(); } else if (secondsToSet + minutesToSet > 0) { lv_label_set_text(txtPlayPause, Symbols::pause); @@ -152,10 +157,10 @@ void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) { } } -void Timer::setDone() { +void Timer::SetDone() { lv_label_set_text(time, "00:00"); lv_label_set_text(txtPlayPause, Symbols::play); secondsToSet = 0; minutesToSet = 0; - createButtons(); + CreateButtons(); } diff --git a/src/displayapp/screens/Timer.h b/src/displayapp/screens/Timer.h index 23c87345..93e84c82 100644 --- a/src/displayapp/screens/Timer.h +++ b/src/displayapp/screens/Timer.h @@ -8,32 +8,35 @@ #include "components/timer/TimerController.h" namespace Pinetime::Applications::Screens { - class Timer : public Screen { public: enum class Modes { Normal, Done }; Timer(DisplayApp* app, Controllers::TimerController& timerController); - ~Timer() override; - void Refresh() override; - - void setDone(); - + void SetDone(); void OnButtonEvent(lv_obj_t* obj, lv_event_t event); private: + void CreateButtons(); bool running; uint8_t secondsToSet = 0; uint8_t minutesToSet = 0; Controllers::TimerController& timerController; - - void createButtons(); - - lv_obj_t *time, *msecTime, *btnPlayPause, *txtPlayPause, *btnMinutesUp, *btnMinutesDown, *btnSecondsUp, *btnSecondsDown, *txtMUp, - *txtMDown, *txtSUp, *txtSDown; - + lv_obj_t* backgroundLabel; + lv_obj_t* time; + lv_obj_t* msecTime; + lv_obj_t* btnPlayPause; + lv_obj_t* txtPlayPause; + lv_obj_t* btnMinutesUp; + lv_obj_t* btnMinutesDown; + lv_obj_t* btnSecondsUp; + lv_obj_t* btnSecondsDown; + lv_obj_t* txtMUp; + lv_obj_t* txtMDown; + lv_obj_t* txtSUp; + lv_obj_t* txtSDown; lv_task_t* taskRefresh; }; } From 78cab3604d307d48db5d2b38b54a00bbaaaf67ec Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Mon, 21 Feb 2022 23:45:59 +0100 Subject: [PATCH 49/53] AlarmController: allow loss of precision for alarmTime cast Allow a loss of precision if the system clock has a lower resolution than nanoseconds. This is the case for web assembly. --- src/components/alarm/AlarmController.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/alarm/AlarmController.cpp b/src/components/alarm/AlarmController.cpp index 28b328d5..11d96e7a 100644 --- a/src/components/alarm/AlarmController.cpp +++ b/src/components/alarm/AlarmController.cpp @@ -54,7 +54,8 @@ void AlarmController::ScheduleAlarm() { auto now = dateTimeController.CurrentDateTime(); alarmTime = now; - time_t ttAlarmTime = std::chrono::system_clock::to_time_t(alarmTime); + time_t ttAlarmTime = std::chrono::system_clock::to_time_t( + std::chrono::time_point_cast(alarmTime)); tm* tmAlarmTime = std::localtime(&ttAlarmTime); // If the time being set has already passed today,the alarm should be set for tomorrow From 78365548f70d9a6ef9a040d8e0039e640e386dc3 Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Sat, 2 Apr 2022 16:03:20 +0300 Subject: [PATCH 50/53] Replace airplane mode with a bluetooth toggle --- src/CMakeLists.txt | 2 +- src/components/settings/Settings.h | 2 +- src/displayapp/Apps.h | 2 +- src/displayapp/DisplayApp.cpp | 6 +- src/displayapp/fonts/README.md | 2 +- src/displayapp/fonts/jetbrains_mono_bold_20.c | 72 ++++++++----------- src/displayapp/screens/BleIcon.cpp | 6 +- src/displayapp/screens/BleIcon.h | 2 +- src/displayapp/screens/PineTimeStyle.cpp | 7 +- src/displayapp/screens/Symbols.h | 1 - src/displayapp/screens/WatchFaceDigital.cpp | 2 +- ...gAirplaneMode.cpp => SettingBluetooth.cpp} | 46 ++++++------ ...ttingAirplaneMode.h => SettingBluetooth.h} | 10 +-- src/displayapp/screens/settings/Settings.cpp | 2 +- 14 files changed, 72 insertions(+), 90 deletions(-) rename src/displayapp/screens/settings/{SettingAirplaneMode.cpp => SettingBluetooth.cpp} (68%) rename src/displayapp/screens/settings/{SettingAirplaneMode.h => SettingBluetooth.h} (55%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ff0c9b0c..077546a0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -449,7 +449,7 @@ list(APPEND SOURCE_FILES displayapp/screens/settings/SettingSetTime.cpp displayapp/screens/settings/SettingChimes.cpp displayapp/screens/settings/SettingShakeThreshold.cpp - displayapp/screens/settings/SettingAirplaneMode.cpp + displayapp/screens/settings/SettingBluetooth.cpp ## Watch faces displayapp/icons/bg_clock.c diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 24a82607..44a1a85c 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -237,7 +237,7 @@ namespace Pinetime { uint8_t appMenu = 0; uint8_t settingsMenu = 0; - /* airplaneMode is intentionally not saved with the other watch settings and initialized + /* ble state is intentionally not saved with the other watch settings and initialized * to off (false) on every boot because we always want ble to be enabled on startup */ bool bleRadioEnabled = true; diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h index dc9e6253..8aad9535 100644 --- a/src/displayapp/Apps.h +++ b/src/displayapp/Apps.h @@ -38,7 +38,7 @@ namespace Pinetime { SettingSetTime, SettingChimes, SettingShakeThreshold, - SettingAirplaneMode, + SettingBluetooth, Error }; } diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index f6d27477..9ce29da6 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -49,7 +49,7 @@ #include "displayapp/screens/settings/SettingSetTime.h" #include "displayapp/screens/settings/SettingChimes.h" #include "displayapp/screens/settings/SettingShakeThreshold.h" -#include "displayapp/screens/settings/SettingAirplaneMode.h" +#include "displayapp/screens/settings/SettingBluetooth.h" #include "libs/lv_conf.h" @@ -434,8 +434,8 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) currentScreen = std::make_unique(this, settingsController, motionController, *systemTask); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; - case Apps::SettingAirplaneMode: - currentScreen = std::make_unique(this, settingsController); + case Apps::SettingBluetooth: + currentScreen = std::make_unique(this, settingsController); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; case Apps::BatteryInfo: diff --git a/src/displayapp/fonts/README.md b/src/displayapp/fonts/README.md index 7e6203ff..c7a8e2bf 100644 --- a/src/displayapp/fonts/README.md +++ b/src/displayapp/fonts/README.md @@ -31,7 +31,7 @@ static constexpr const char* newSymbol = "\xEF\x86\x85"; * Do not enable font compression or horizontal subpixel rendering * Load the file `JetBrainsMono-Bold.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0x20-0x7e, 0x410-0x44f` * Add a 2nd font, load the file `FontAwesome5-Solid+Brands+Regular.woff` and specify the following - range: `0xf293, 0xf294, 0xf244, 0xf240, 0xf242, 0xf243, 0xf241, 0xf54b, 0xf21e, 0xf1e6, 0xf54b, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf069, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf029, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf201, 0xf06e, 0xf015, 0xf072` + range: `0xf293, 0xf294, 0xf244, 0xf240, 0xf242, 0xf243, 0xf241, 0xf54b, 0xf21e, 0xf1e6, 0xf54b, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf069, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf029, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf201, 0xf06e, 0xf015` * Fix an error in the font conversion. Replace the following: diff --git a/src/displayapp/fonts/jetbrains_mono_bold_20.c b/src/displayapp/fonts/jetbrains_mono_bold_20.c index cc67532a..5c40d494 100644 --- a/src/displayapp/fonts/jetbrains_mono_bold_20.c +++ b/src/displayapp/fonts/jetbrains_mono_bold_20.c @@ -840,16 +840,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf8, 0xf, 0x80, 0xf8, 0x3e, 0x0, 0xff, 0xf0, 0x0, 0x3f, 0x80, 0x0, - /* U+F072 "" */ - 0x1, 0xc0, 0x0, 0x7, 0xc0, 0x0, 0x7, 0x80, - 0x0, 0xf, 0x80, 0x0, 0x1f, 0x0, 0x0, 0x1f, - 0x0, 0x38, 0x3e, 0x0, 0x78, 0x7e, 0x0, 0x7f, - 0xff, 0xe0, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xf3, - 0xff, 0xff, 0xe7, 0xff, 0xff, 0xdf, 0xff, 0xfc, - 0x3c, 0x3f, 0x0, 0x70, 0x7c, 0x0, 0x1, 0xf0, - 0x0, 0x3, 0xe0, 0x0, 0x7, 0x80, 0x0, 0xf, - 0x0, 0x0, 0x1c, 0x0, 0x0, - /* U+F095 "" */ 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x7, 0xf0, 0x0, 0x7f, 0x0, 0x7, 0xf0, 0x0, 0xff, 0x0, @@ -1230,32 +1220,31 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 3027, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, {.bitmap_index = 3055, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 3103, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3147, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3208, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3261, .adv_w = 120, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3280, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3330, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3366, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3414, .adv_w = 320, .box_w = 21, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3454, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3497, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3535, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3573, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3611, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3649, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3687, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3723, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3761, .adv_w = 200, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3790, .adv_w = 280, .box_w = 16, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 3828, .adv_w = 400, .box_w = 25, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3894, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3943, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3993, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4053, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4106, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4167, .adv_w = 360, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4222, .adv_w = 360, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4275, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0} + {.bitmap_index = 3147, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3200, .adv_w = 120, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3219, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3269, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3305, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3353, .adv_w = 320, .box_w = 21, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3393, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3436, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3474, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3512, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3550, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3588, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3626, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3662, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3700, .adv_w = 200, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3729, .adv_w = 280, .box_w = 16, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3767, .adv_w = 400, .box_w = 25, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3833, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3882, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3932, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3992, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4045, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4106, .adv_w = 360, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4161, .adv_w = 360, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4214, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0} }; /*--------------------- @@ -1264,11 +1253,10 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { static const uint16_t unicode_list_2[] = { 0x0, 0x14, 0x16, 0x23, 0x26, 0x27, 0x28, 0x39, - 0x47, 0x4a, 0x4b, 0x4c, 0x50, 0x68, 0x6d, 0x71, - 0x94, 0x128, 0x184, 0x1e5, 0x1fb, 0x200, 0x21d, 0x23f, - 0x240, 0x241, 0x242, 0x243, 0x251, 0x292, 0x293, 0x2f1, - 0x3dc, 0x3fc, 0x45c, 0x54a, 0x55f, 0x568, 0x59e, 0x59f, - 0x6a8 + 0x47, 0x4a, 0x4b, 0x4c, 0x50, 0x68, 0x6d, 0x94, + 0x128, 0x184, 0x1e5, 0x1fb, 0x200, 0x21d, 0x23f, 0x240, + 0x241, 0x242, 0x243, 0x251, 0x292, 0x293, 0x2f1, 0x3dc, + 0x3fc, 0x45c, 0x54a, 0x55f, 0x568, 0x59e, 0x59f, 0x6a8 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -1284,7 +1272,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 61441, .range_length = 1705, .glyph_id_start = 160, - .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 41, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 40, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/src/displayapp/screens/BleIcon.cpp b/src/displayapp/screens/BleIcon.cpp index 019f8039..780a14cf 100644 --- a/src/displayapp/screens/BleIcon.cpp +++ b/src/displayapp/screens/BleIcon.cpp @@ -2,11 +2,7 @@ #include "displayapp/screens/Symbols.h" using namespace Pinetime::Applications::Screens; -const char* BleIcon::GetIcon(bool isRadioEnabled, bool isConnected) { - if(!isRadioEnabled) { - return Symbols::airplane; - } - +const char* BleIcon::GetIcon(bool isConnected) { if (isConnected) { return Symbols::bluetooth; } diff --git a/src/displayapp/screens/BleIcon.h b/src/displayapp/screens/BleIcon.h index d32dfad7..d9a46541 100644 --- a/src/displayapp/screens/BleIcon.h +++ b/src/displayapp/screens/BleIcon.h @@ -7,7 +7,7 @@ namespace Pinetime { namespace Screens { class BleIcon { public: - static const char* GetIcon(bool isRadioEnabled, bool isConnected); + static const char* GetIcon(bool isConnected); }; } } diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp index 44bf47a4..e807289c 100644 --- a/src/displayapp/screens/PineTimeStyle.cpp +++ b/src/displayapp/screens/PineTimeStyle.cpp @@ -345,11 +345,10 @@ void PineTimeStyle::SetBatteryIcon() { void PineTimeStyle::AlignIcons() { - bool isBleIconVisible = IsBleIconVisible(bleRadioEnabled.Get(), bleState.Get()); - if (notificationState.Get() && isBleIconVisible) { + if (notificationState.Get() && bleState.Get()) { lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 8, 25); lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, -8, 25); - } else if (notificationState.Get() && !isBleIconVisible) { + } else if (notificationState.Get() && !bleState.Get()) { lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25); } else { lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25); @@ -375,7 +374,7 @@ void PineTimeStyle::Refresh() { bleState = bleController.IsConnected(); bleRadioEnabled = bleController.IsRadioEnabled(); if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { - lv_label_set_text(bleIcon, BleIcon::GetIcon(bleRadioEnabled.Get(), bleState.Get())); + lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get())); AlignIcons(); } diff --git a/src/displayapp/screens/Symbols.h b/src/displayapp/screens/Symbols.h index 5ba8f953..e68a7af6 100644 --- a/src/displayapp/screens/Symbols.h +++ b/src/displayapp/screens/Symbols.h @@ -44,7 +44,6 @@ namespace Pinetime { static constexpr const char* chartLine = "\xEF\x88\x81"; static constexpr const char* eye = "\xEF\x81\xAE"; static constexpr const char* home = "\xEF\x80\x95"; - static constexpr const char* airplane = "\xEF\x81\xB2"; // lv_font_sys_48.c static constexpr const char* settings = "\xEE\xA4\x82"; // e902 diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 59bde839..6a914884 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -121,7 +121,7 @@ void WatchFaceDigital::Refresh() { bleState = bleController.IsConnected(); bleRadioEnabled = bleController.IsRadioEnabled(); if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { - lv_label_set_text(bleIcon, BleIcon::GetIcon(bleRadioEnabled.Get(), bleState.Get())); + lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get())); } lv_obj_realign(batteryIcon); lv_obj_realign(batteryPlug); diff --git a/src/displayapp/screens/settings/SettingAirplaneMode.cpp b/src/displayapp/screens/settings/SettingBluetooth.cpp similarity index 68% rename from src/displayapp/screens/settings/SettingAirplaneMode.cpp rename to src/displayapp/screens/settings/SettingBluetooth.cpp index 85172787..ab1af223 100644 --- a/src/displayapp/screens/settings/SettingAirplaneMode.cpp +++ b/src/displayapp/screens/settings/SettingBluetooth.cpp @@ -1,4 +1,4 @@ -#include "displayapp/screens/settings/SettingAirplaneMode.h" +#include "displayapp/screens/settings/SettingBluetooth.h" #include #include "displayapp/DisplayApp.h" #include "displayapp/Messages.h" @@ -9,18 +9,18 @@ using namespace Pinetime::Applications::Screens; namespace { - static void OnAirplaneModeEnabledEvent(lv_obj_t* obj, lv_event_t event) { - auto* screen = static_cast(obj->user_data); - screen->OnAirplaneModeEnabled(obj, event); + static void OnBluetoothDisabledEvent(lv_obj_t* obj, lv_event_t event) { + auto* screen = static_cast(obj->user_data); + screen->OnBluetoothDisabled(obj, event); } - static void OnAirplaneModeDisabledEvent(lv_obj_t* obj, lv_event_t event) { - auto* screen = static_cast(obj->user_data); - screen->OnAirplaneModeDisabled(obj, event); + static void OnBluetoothEnabledEvent(lv_obj_t* obj, lv_event_t event) { + auto* screen = static_cast(obj->user_data); + screen->OnBluetoothEnabled(obj, event); } } -SettingAirplaneMode::SettingAirplaneMode(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) +SettingBluetooth::SettingBluetooth(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) : Screen(app), settingsController {settingsController} { lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr); @@ -36,38 +36,38 @@ SettingAirplaneMode::SettingAirplaneMode(Pinetime::Applications::DisplayApp* app lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT); lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(title, "Airplane mode"); + lv_label_set_text_static(title, "Bluetooth"); lv_label_set_align(title, LV_LABEL_ALIGN_CENTER); lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 15, 15); lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); - lv_label_set_text_static(icon, Symbols::airplane); + lv_label_set_text_static(icon, Symbols::bluetooth); lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0); cbEnabled = lv_checkbox_create(container1, nullptr); - lv_checkbox_set_text(cbEnabled, " Enable"); + lv_checkbox_set_text(cbEnabled, " Enabled"); cbEnabled->user_data = this; - lv_obj_set_event_cb(cbEnabled, OnAirplaneModeEnabledEvent); + lv_obj_set_event_cb(cbEnabled, OnBluetoothEnabledEvent); SetRadioButtonStyle(cbEnabled); cbDisabled = lv_checkbox_create(container1, nullptr); - lv_checkbox_set_text(cbDisabled, " Disable"); + lv_checkbox_set_text(cbDisabled, " Disabled"); cbDisabled->user_data = this; - lv_obj_set_event_cb(cbDisabled, OnAirplaneModeDisabledEvent); + lv_obj_set_event_cb(cbDisabled, OnBluetoothDisabledEvent); SetRadioButtonStyle(cbDisabled); if (settingsController.GetBleRadioEnabled()) { - lv_checkbox_set_checked(cbDisabled, true); + lv_checkbox_set_checked(cbEnabled, true); priorMode = true; } else { - lv_checkbox_set_checked(cbEnabled, true); + lv_checkbox_set_checked(cbDisabled, true); priorMode = false; } } -SettingAirplaneMode::~SettingAirplaneMode() { +SettingBluetooth::~SettingBluetooth() { lv_obj_clean(lv_scr_act()); // Do not call SaveSettings - see src/components/settings/Settings.h if (priorMode != settingsController.GetBleRadioEnabled()) { @@ -75,18 +75,18 @@ SettingAirplaneMode::~SettingAirplaneMode() { } } -void SettingAirplaneMode::OnAirplaneModeEnabled(lv_obj_t* object, lv_event_t event) { +void SettingBluetooth::OnBluetoothDisabled(lv_obj_t* object, lv_event_t event) { if (event == LV_EVENT_VALUE_CHANGED) { - lv_checkbox_set_checked(cbEnabled, true); - lv_checkbox_set_checked(cbDisabled, false); + lv_checkbox_set_checked(cbEnabled, false); + lv_checkbox_set_checked(cbDisabled, true); settingsController.SetBleRadioEnabled(false); } } -void SettingAirplaneMode::OnAirplaneModeDisabled(lv_obj_t* object, lv_event_t event) { +void SettingBluetooth::OnBluetoothEnabled(lv_obj_t* object, lv_event_t event) { if (event == LV_EVENT_VALUE_CHANGED) { - lv_checkbox_set_checked(cbEnabled, false); - lv_checkbox_set_checked(cbDisabled, true); + lv_checkbox_set_checked(cbEnabled, true); + lv_checkbox_set_checked(cbDisabled, false); settingsController.SetBleRadioEnabled(true); } } diff --git a/src/displayapp/screens/settings/SettingAirplaneMode.h b/src/displayapp/screens/settings/SettingBluetooth.h similarity index 55% rename from src/displayapp/screens/settings/SettingAirplaneMode.h rename to src/displayapp/screens/settings/SettingBluetooth.h index b3478c64..12bb459a 100644 --- a/src/displayapp/screens/settings/SettingAirplaneMode.h +++ b/src/displayapp/screens/settings/SettingBluetooth.h @@ -12,13 +12,13 @@ namespace Pinetime { namespace Applications { namespace Screens { - class SettingAirplaneMode : public Screen { + class SettingBluetooth : public Screen { public: - SettingAirplaneMode(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); - ~SettingAirplaneMode() override; + SettingBluetooth(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); + ~SettingBluetooth() override; - void OnAirplaneModeEnabled(lv_obj_t* object, lv_event_t event); - void OnAirplaneModeDisabled(lv_obj_t* object, lv_event_t event); + void OnBluetoothEnabled(lv_obj_t* object, lv_event_t event); + void OnBluetoothDisabled(lv_obj_t* object, lv_event_t event); private: Controllers::Settings& settingsController; diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp index dce0c071..bc7efcc2 100644 --- a/src/displayapp/screens/settings/Settings.cpp +++ b/src/displayapp/screens/settings/Settings.cpp @@ -64,7 +64,7 @@ std::unique_ptr Settings::CreateScreen3() { {Symbols::clock, "Chimes", Apps::SettingChimes}, {Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold}, {Symbols::check, "Firmware", Apps::FirmwareValidation}, - {Symbols::airplane, "Airplane mode", Apps::SettingAirplaneMode} + {Symbols::bluetooth, "Bluetooth", Apps::SettingBluetooth} }}; return std::make_unique(2, 4, app, settingsController, applications); From b498e1d633522eed975d78b04508834b7a79befe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Sat, 2 Apr 2022 16:31:39 +0200 Subject: [PATCH 51/53] Set version to 1.9.0 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8846531e..55b68bc7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10) -project(pinetime VERSION 1.8.0 LANGUAGES C CXX ASM) +project(pinetime VERSION 1.9.0 LANGUAGES C CXX ASM) set(CMAKE_C_STANDARD 99) set(CMAKE_CXX_STANDARD 14) From 2607c3d79947e900ce4c5ded296f649677511a34 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sun, 16 Jan 2022 23:37:15 +0100 Subject: [PATCH 52/53] Let TouchHandler return TouchEvents instead of driver specific enum Let the TouchHandler::GestureGet() function return a TouchEvent instead of the touchpanel-driver specific enum. This helps to move the driver specific helper function `ConvertGesture` from `DisplayApp` into `TouchHandler`. --- src/displayapp/DisplayApp.cpp | 24 +------------------ src/systemtask/SystemTask.cpp | 7 +++--- src/touchhandler/TouchHandler.cpp | 38 +++++++++++++++++++++++++++---- src/touchhandler/TouchHandler.h | 6 ++--- 4 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 9ce29da6..32280615 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -60,28 +60,6 @@ namespace { static inline bool in_isr(void) { return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0; } - - TouchEvents ConvertGesture(Pinetime::Drivers::Cst816S::Gestures gesture) { - switch (gesture) { - case Pinetime::Drivers::Cst816S::Gestures::SingleTap: - return TouchEvents::Tap; - case Pinetime::Drivers::Cst816S::Gestures::LongPress: - return TouchEvents::LongTap; - case Pinetime::Drivers::Cst816S::Gestures::DoubleTap: - return TouchEvents::DoubleTap; - case Pinetime::Drivers::Cst816S::Gestures::SlideRight: - return TouchEvents::SwipeRight; - case Pinetime::Drivers::Cst816S::Gestures::SlideLeft: - return TouchEvents::SwipeLeft; - case Pinetime::Drivers::Cst816S::Gestures::SlideDown: - return TouchEvents::SwipeDown; - case Pinetime::Drivers::Cst816S::Gestures::SlideUp: - return TouchEvents::SwipeUp; - case Pinetime::Drivers::Cst816S::Gestures::None: - default: - return TouchEvents::None; - } - } } DisplayApp::DisplayApp(Drivers::St7789& lcd, @@ -227,7 +205,7 @@ void DisplayApp::Refresh() { if (state != States::Running) { break; } - auto gesture = ConvertGesture(touchHandler.GestureGet()); + auto gesture = touchHandler.GestureGet(); if (gesture == TouchEvents::None) { break; } diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 77cf411b..38c728f8 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -6,6 +6,7 @@ #include "BootloaderVersion.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" +#include "displayapp/TouchEvents.h" #include "drivers/Cst816s.h" #include "drivers/St7789.h" #include "drivers/InternalFlash.h" @@ -265,10 +266,10 @@ void SystemTask::Work() { case Messages::TouchWakeUp: { if (touchHandler.GetNewTouchInfo()) { auto gesture = touchHandler.GestureGet(); - if (gesture != Pinetime::Drivers::Cst816S::Gestures::None and - ((gesture == Pinetime::Drivers::Cst816S::Gestures::DoubleTap and + if (gesture != Pinetime::Applications::TouchEvents::None and + ((gesture == Pinetime::Applications::TouchEvents::DoubleTap and settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) or - (gesture == Pinetime::Drivers::Cst816S::Gestures::SingleTap and + (gesture == Pinetime::Applications::TouchEvents::Tap and settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap)))) { GoToRunning(); } diff --git a/src/touchhandler/TouchHandler.cpp b/src/touchhandler/TouchHandler.cpp index 0be33476..0e4fb541 100644 --- a/src/touchhandler/TouchHandler.cpp +++ b/src/touchhandler/TouchHandler.cpp @@ -1,6 +1,36 @@ #include "touchhandler/TouchHandler.h" +#ifdef PINETIME_IS_RECOVERY + #include "displayapp/DummyLittleVgl.h" +#else + #include "displayapp/LittleVgl.h" +#endif using namespace Pinetime::Controllers; +using namespace Pinetime::Applications; + +namespace { + TouchEvents ConvertGesture(Pinetime::Drivers::Cst816S::Gestures gesture) { + switch (gesture) { + case Pinetime::Drivers::Cst816S::Gestures::SingleTap: + return TouchEvents::Tap; + case Pinetime::Drivers::Cst816S::Gestures::LongPress: + return TouchEvents::LongTap; + case Pinetime::Drivers::Cst816S::Gestures::DoubleTap: + return TouchEvents::DoubleTap; + case Pinetime::Drivers::Cst816S::Gestures::SlideRight: + return TouchEvents::SwipeRight; + case Pinetime::Drivers::Cst816S::Gestures::SlideLeft: + return TouchEvents::SwipeLeft; + case Pinetime::Drivers::Cst816S::Gestures::SlideDown: + return TouchEvents::SwipeDown; + case Pinetime::Drivers::Cst816S::Gestures::SlideUp: + return TouchEvents::SwipeUp; + case Pinetime::Drivers::Cst816S::Gestures::None: + default: + return TouchEvents::None; + } + } +} TouchHandler::TouchHandler(Drivers::Cst816S& touchPanel, Components::LittleVgl& lvgl) : touchPanel {touchPanel}, lvgl {lvgl} { } @@ -12,9 +42,9 @@ void TouchHandler::CancelTap() { } } -Pinetime::Drivers::Cst816S::Gestures TouchHandler::GestureGet() { +Pinetime::Applications::TouchEvents TouchHandler::GestureGet() { auto returnGesture = gesture; - gesture = Drivers::Cst816S::Gestures::None; + gesture = Pinetime::Applications::TouchEvents::None; return returnGesture; } @@ -33,11 +63,11 @@ bool TouchHandler::GetNewTouchInfo() { info.gesture == Pinetime::Drivers::Cst816S::Gestures::SlideRight || info.gesture == Pinetime::Drivers::Cst816S::Gestures::LongPress) { if (info.touching) { - gesture = info.gesture; + gesture = ConvertGesture(info.gesture); gestureReleased = false; } } else { - gesture = info.gesture; + gesture = ConvertGesture(info.gesture); } } } diff --git a/src/touchhandler/TouchHandler.h b/src/touchhandler/TouchHandler.h index ed452b3a..fb3d2654 100644 --- a/src/touchhandler/TouchHandler.h +++ b/src/touchhandler/TouchHandler.h @@ -1,6 +1,6 @@ #pragma once #include "drivers/Cst816s.h" -#include "systemtask/SystemTask.h" +#include "displayapp/TouchEvents.h" namespace Pinetime { namespace Components { @@ -26,13 +26,13 @@ namespace Pinetime { uint8_t GetY() const { return info.y; } - Drivers::Cst816S::Gestures GestureGet(); + Pinetime::Applications::TouchEvents GestureGet(); private: Pinetime::Drivers::Cst816S::TouchInfos info; Pinetime::Drivers::Cst816S& touchPanel; Pinetime::Components::LittleVgl& lvgl; - Pinetime::Drivers::Cst816S::Gestures gesture; + Pinetime::Applications::TouchEvents gesture; bool isCancelled = false; bool gestureReleased = true; }; From 68a7016080115dd7a7eae1041eb2a75457aae0cd Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Sun, 20 Mar 2022 16:47:25 +0200 Subject: [PATCH 53/53] Replace lv_label_set_text where possible --- src/displayapp/screens/Alarm.cpp | 8 +-- src/displayapp/screens/FirmwareUpdate.cpp | 11 ++-- src/displayapp/screens/FirmwareUpdate.h | 1 - src/displayapp/screens/FirmwareValidation.cpp | 4 +- src/displayapp/screens/FlashLight.cpp | 2 +- src/displayapp/screens/HeartRate.cpp | 14 +++--- src/displayapp/screens/Motion.cpp | 2 +- src/displayapp/screens/Music.cpp | 50 +++++++++---------- src/displayapp/screens/Navigation.cpp | 8 +-- src/displayapp/screens/Notifications.cpp | 10 ++-- src/displayapp/screens/Paddle.cpp | 2 +- src/displayapp/screens/PassKey.cpp | 2 +- src/displayapp/screens/Steps.cpp | 2 +- src/displayapp/screens/StopWatch.cpp | 28 +++++------ src/displayapp/screens/Tile.cpp | 4 +- src/displayapp/screens/Timer.cpp | 22 ++++---- src/displayapp/screens/Twos.cpp | 2 +- src/displayapp/screens/WatchFaceAnalog.cpp | 10 ++-- src/displayapp/screens/WatchFaceDigital.cpp | 2 +- .../screens/WatchFacePineTimeStyle.cpp | 6 +-- .../screens/settings/QuickSettings.cpp | 4 +- .../settings/SettingShakeThreshold.cpp | 8 +-- 22 files changed, 98 insertions(+), 104 deletions(-) diff --git a/src/displayapp/screens/Alarm.cpp b/src/displayapp/screens/Alarm.cpp index 879e50d8..d5fc2c04 100644 --- a/src/displayapp/screens/Alarm.cpp +++ b/src/displayapp/screens/Alarm.cpp @@ -303,7 +303,7 @@ void Alarm::ShowInfo() { lv_label_set_text_fmt( txtMessage, "Time to\nalarm:\n%2lu Days\n%2lu Hours\n%2lu Minutes\n%2lu Seconds", daysToAlarm, hrsToAlarm, minToAlarm, secToAlarm); } else { - lv_label_set_text(txtMessage, "Alarm\nis not\nset."); + lv_label_set_text_static(txtMessage, "Alarm\nis not\nset."); } } @@ -317,13 +317,13 @@ void Alarm::SetRecurButtonState() { using Pinetime::Controllers::AlarmController; switch (alarmController.Recurrence()) { case AlarmController::RecurType::None: - lv_label_set_text(txtRecur, "ONCE"); + lv_label_set_text_static(txtRecur, "ONCE"); break; case AlarmController::RecurType::Daily: - lv_label_set_text(txtRecur, "DAILY"); + lv_label_set_text_static(txtRecur, "DAILY"); break; case AlarmController::RecurType::Weekdays: - lv_label_set_text(txtRecur, "MON-FRI"); + lv_label_set_text_static(txtRecur, "MON-FRI"); } } diff --git a/src/displayapp/screens/FirmwareUpdate.cpp b/src/displayapp/screens/FirmwareUpdate.cpp index 373fcae4..0a8544b3 100644 --- a/src/displayapp/screens/FirmwareUpdate.cpp +++ b/src/displayapp/screens/FirmwareUpdate.cpp @@ -15,7 +15,7 @@ FirmwareUpdate::FirmwareUpdate(Pinetime::Applications::DisplayApp* app, Pinetime lv_label_set_text_static(backgroundLabel, ""); titleLabel = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(titleLabel, "Firmware update"); + lv_label_set_text_static(titleLabel, "Firmware update"); lv_obj_set_auto_realign(titleLabel, true); lv_obj_align(titleLabel, nullptr, LV_ALIGN_IN_TOP_MID, 0, 50); @@ -27,7 +27,7 @@ FirmwareUpdate::FirmwareUpdate(Pinetime::Applications::DisplayApp* app, Pinetime lv_bar_set_value(bar1, 0, LV_ANIM_OFF); percentLabel = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(percentLabel, "Waiting..."); + lv_label_set_text_static(percentLabel, "Waiting..."); lv_obj_set_auto_realign(percentLabel, true); lv_obj_align(percentLabel, bar1, LV_ALIGN_OUT_TOP_MID, 0, 60); taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); @@ -81,20 +81,19 @@ void FirmwareUpdate::DisplayProgression() const { float current = bleController.FirmwareUpdateCurrentBytes() / 1024.0f; float total = bleController.FirmwareUpdateTotalBytes() / 1024.0f; int16_t pc = (current / total) * 100.0f; - sprintf(percentStr, "%d %%", pc); - lv_label_set_text(percentLabel, percentStr); + lv_label_set_text_fmt(percentLabel, "%d %%", pc); lv_bar_set_value(bar1, pc, LV_ANIM_OFF); } void FirmwareUpdate::UpdateValidated() { lv_label_set_recolor(percentLabel, true); - lv_label_set_text(percentLabel, "#00ff00 Image Ok!#"); + lv_label_set_text_static(percentLabel, "#00ff00 Image Ok!#"); } void FirmwareUpdate::UpdateError() { lv_label_set_recolor(percentLabel, true); - lv_label_set_text(percentLabel, "#ff0000 Error!#"); + lv_label_set_text_static(percentLabel, "#ff0000 Error!#"); startTime = xTaskGetTickCount(); } diff --git a/src/displayapp/screens/FirmwareUpdate.h b/src/displayapp/screens/FirmwareUpdate.h index a61178ce..5156b7ea 100644 --- a/src/displayapp/screens/FirmwareUpdate.h +++ b/src/displayapp/screens/FirmwareUpdate.h @@ -24,7 +24,6 @@ namespace Pinetime { lv_obj_t* bar1; lv_obj_t* percentLabel; lv_obj_t* titleLabel; - mutable char percentStr[10]; States state = States::Idle; diff --git a/src/displayapp/screens/FirmwareValidation.cpp b/src/displayapp/screens/FirmwareValidation.cpp index c7a5b27e..16244ad5 100644 --- a/src/displayapp/screens/FirmwareValidation.cpp +++ b/src/displayapp/screens/FirmwareValidation.cpp @@ -33,9 +33,9 @@ FirmwareValidation::FirmwareValidation(Pinetime::Applications::DisplayApp* app, lv_obj_set_width(labelIsValidated, 240); if (validator.IsValidated()) - lv_label_set_text(labelIsValidated, "You have already\n#00ff00 validated# this firmware#"); + lv_label_set_text_static(labelIsValidated, "You have already\n#00ff00 validated# this firmware#"); else { - lv_label_set_text(labelIsValidated, "Please #00ff00 Validate# this version or\n#ff0000 Reset# to rollback to the previous version."); + lv_label_set_text_static(labelIsValidated, "Please #00ff00 Validate# this version or\n#ff0000 Reset# to rollback to the previous version."); buttonValidate = lv_btn_create(lv_scr_act(), nullptr); buttonValidate->user_data = this; diff --git a/src/displayapp/screens/FlashLight.cpp b/src/displayapp/screens/FlashLight.cpp index c4d02643..0634187d 100644 --- a/src/displayapp/screens/FlashLight.cpp +++ b/src/displayapp/screens/FlashLight.cpp @@ -45,7 +45,7 @@ FlashLight::FlashLight(Pinetime::Applications::DisplayApp* app, lv_label_set_long_mode(backgroundAction, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundAction, 240, 240); lv_obj_set_pos(backgroundAction, 0, 0); - lv_label_set_text(backgroundAction, ""); + lv_label_set_text_static(backgroundAction, ""); lv_obj_set_click(backgroundAction, true); backgroundAction->user_data = this; lv_obj_set_event_cb(backgroundAction, event_handler); diff --git a/src/displayapp/screens/HeartRate.cpp b/src/displayapp/screens/HeartRate.cpp index 513c40bf..89b43bb5 100644 --- a/src/displayapp/screens/HeartRate.cpp +++ b/src/displayapp/screens/HeartRate.cpp @@ -41,16 +41,16 @@ HeartRate::HeartRate(Pinetime::Applications::DisplayApp* app, else lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); - lv_label_set_text(label_hr, "000"); + lv_label_set_text_static(label_hr, "000"); lv_obj_align(label_hr, nullptr, LV_ALIGN_CENTER, 0, -40); label_bpm = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(label_bpm, "Heart rate BPM"); + lv_label_set_text_static(label_bpm, "Heart rate BPM"); lv_obj_align(label_bpm, label_hr, LV_ALIGN_OUT_TOP_MID, 0, -20); label_status = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(label_status, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x222222)); - lv_label_set_text(label_status, ToString(Pinetime::Controllers::HeartRateController::States::NotEnoughData)); + lv_label_set_text_static(label_status, ToString(Pinetime::Controllers::HeartRateController::States::NotEnoughData)); lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); @@ -81,13 +81,13 @@ void HeartRate::Refresh() { case Controllers::HeartRateController::States::NoTouch: case Controllers::HeartRateController::States::NotEnoughData: // case Controllers::HeartRateController::States::Stopped: - lv_label_set_text(label_hr, "000"); + lv_label_set_text_static(label_hr, "000"); break; default: lv_label_set_text_fmt(label_hr, "%03d", heartRateController.HeartRate()); } - lv_label_set_text(label_status, ToString(state)); + lv_label_set_text_static(label_status, ToString(state)); lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); } @@ -109,7 +109,7 @@ void HeartRate::OnStartStopEvent(lv_event_t event) { void HeartRate::UpdateStartStopButton(bool isRunning) { if (isRunning) - lv_label_set_text(label_startStop, "Stop"); + lv_label_set_text_static(label_startStop, "Stop"); else - lv_label_set_text(label_startStop, "Start"); + lv_label_set_text_static(label_startStop, "Start"); } diff --git a/src/displayapp/screens/Motion.cpp b/src/displayapp/screens/Motion.cpp index 23eb2765..799dcb3b 100644 --- a/src/displayapp/screens/Motion.cpp +++ b/src/displayapp/screens/Motion.cpp @@ -35,7 +35,7 @@ Motion::Motion(Pinetime::Applications::DisplayApp* app, Controllers::MotionContr labelStep = lv_label_create(lv_scr_act(), NULL); lv_obj_align(labelStep, chart, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); - lv_label_set_text(labelStep, "Steps ---"); + lv_label_set_text_static(labelStep, "Steps ---"); taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); } diff --git a/src/displayapp/screens/Music.cpp b/src/displayapp/screens/Music.cpp index 9f17b956..dd4609cf 100644 --- a/src/displayapp/screens/Music.cpp +++ b/src/displayapp/screens/Music.cpp @@ -62,7 +62,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus lv_obj_align(btnVolDown, nullptr, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); lv_obj_add_style(btnVolDown, LV_STATE_DEFAULT, &btn_style); label = lv_label_create(btnVolDown, nullptr); - lv_label_set_text(label, Symbols::volumDown); + lv_label_set_text_static(label, Symbols::volumDown); lv_obj_set_hidden(btnVolDown, true); btnVolUp = lv_btn_create(lv_scr_act(), nullptr); @@ -72,7 +72,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus lv_obj_align(btnVolUp, nullptr, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); lv_obj_add_style(btnVolUp, LV_STATE_DEFAULT, &btn_style); label = lv_label_create(btnVolUp, nullptr); - lv_label_set_text(label, Symbols::volumUp); + lv_label_set_text_static(label, Symbols::volumUp); lv_obj_set_hidden(btnVolUp, true); btnPrev = lv_btn_create(lv_scr_act(), nullptr); @@ -82,7 +82,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus lv_obj_align(btnPrev, nullptr, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); lv_obj_add_style(btnPrev, LV_STATE_DEFAULT, &btn_style); label = lv_label_create(btnPrev, nullptr); - lv_label_set_text(label, Symbols::stepBackward); + lv_label_set_text_static(label, Symbols::stepBackward); btnNext = lv_btn_create(lv_scr_act(), nullptr); btnNext->user_data = this; @@ -91,7 +91,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus lv_obj_align(btnNext, nullptr, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); lv_obj_add_style(btnNext, LV_STATE_DEFAULT, &btn_style); label = lv_label_create(btnNext, nullptr); - lv_label_set_text(label, Symbols::stepForward); + lv_label_set_text_static(label, Symbols::stepForward); btnPlayPause = lv_btn_create(lv_scr_act(), nullptr); btnPlayPause->user_data = this; @@ -100,12 +100,12 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus lv_obj_align(btnPlayPause, nullptr, LV_ALIGN_IN_BOTTOM_MID, 0, 0); lv_obj_add_style(btnPlayPause, LV_STATE_DEFAULT, &btn_style); txtPlayPause = lv_label_create(btnPlayPause, nullptr); - lv_label_set_text(txtPlayPause, Symbols::play); + lv_label_set_text_static(txtPlayPause, Symbols::play); txtTrackDuration = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(txtTrackDuration, LV_LABEL_LONG_SROLL); lv_obj_align(txtTrackDuration, nullptr, LV_ALIGN_IN_TOP_LEFT, 12, 20); - lv_label_set_text(txtTrackDuration, "--:--/--:--"); + lv_label_set_text_static(txtTrackDuration, "--:--/--:--"); lv_label_set_align(txtTrackDuration, LV_ALIGN_IN_LEFT_MID); lv_obj_set_width(txtTrackDuration, LV_HOR_RES); @@ -117,7 +117,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus lv_obj_align(txtArtist, nullptr, LV_ALIGN_IN_LEFT_MID, 12, MIDDLE_OFFSET + 1 * FONT_HEIGHT); lv_label_set_align(txtArtist, LV_ALIGN_IN_LEFT_MID); lv_obj_set_width(txtArtist, LV_HOR_RES - 12); - lv_label_set_text(txtArtist, "Artist Name"); + lv_label_set_text_static(txtArtist, "Artist Name"); txtTrack = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(txtTrack, LV_LABEL_LONG_SROLL_CIRC); @@ -125,7 +125,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus lv_label_set_align(txtTrack, LV_ALIGN_IN_LEFT_MID); lv_obj_set_width(txtTrack, LV_HOR_RES - 12); - lv_label_set_text(txtTrack, "This is a very long getTrack name"); + lv_label_set_text_static(txtTrack, "This is a very long getTrack name"); /** Init animation */ imgDisc = lv_img_create(lv_scr_act(), nullptr); @@ -187,7 +187,7 @@ void Music::Refresh() { } if (playing == Pinetime::Controllers::MusicService::MusicStatus::Playing) { - lv_label_set_text(txtPlayPause, Symbols::pause); + lv_label_set_text_static(txtPlayPause, Symbols::pause); if (xTaskGetTickCount() - 1024 >= lastIncrement) { if (frameB) { @@ -211,31 +211,27 @@ void Music::Refresh() { UpdateLength(); } } else { - lv_label_set_text(txtPlayPause, Symbols::play); + lv_label_set_text_static(txtPlayPause, Symbols::play); } } void Music::UpdateLength() { if (totalLength > (99 * 60 * 60)) { - lv_label_set_text(txtTrackDuration, "Inf/Inf"); + lv_label_set_text_static(txtTrackDuration, "Inf/Inf"); } else if (totalLength > (99 * 60)) { - char timer[12]; - sprintf(timer, - "%02d:%02d/%02d:%02d", - (currentLength / (60 * 60)) % 100, - ((currentLength % (60 * 60)) / 60) % 100, - (totalLength / (60 * 60)) % 100, - ((totalLength % (60 * 60)) / 60) % 100); - lv_label_set_text(txtTrackDuration, timer); + lv_label_set_text_fmt(txtTrackDuration, + "%02d:%02d/%02d:%02d", + (currentLength / (60 * 60)) % 100, + ((currentLength % (60 * 60)) / 60) % 100, + (totalLength / (60 * 60)) % 100, + ((totalLength % (60 * 60)) / 60) % 100); } else { - char timer[12]; - sprintf(timer, - "%02d:%02d/%02d:%02d", - (currentLength / 60) % 100, - (currentLength % 60) % 100, - (totalLength / 60) % 100, - (totalLength % 60) % 100); - lv_label_set_text(txtTrackDuration, timer); + lv_label_set_text_fmt(txtTrackDuration, + "%02d:%02d/%02d:%02d", + (currentLength / 60) % 100, + (currentLength % 60) % 100, + (totalLength / 60) % 100, + (totalLength % 60) % 100); } } diff --git a/src/displayapp/screens/Navigation.cpp b/src/displayapp/screens/Navigation.cpp index 674362a6..0dd0d303 100644 --- a/src/displayapp/screens/Navigation.cpp +++ b/src/displayapp/screens/Navigation.cpp @@ -134,13 +134,13 @@ Navigation::Navigation(Pinetime::Applications::DisplayApp* app, Pinetime::Contro imgFlag = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(imgFlag, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_navi_80); lv_obj_set_style_local_text_color(imgFlag, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_CYAN); - lv_label_set_text(imgFlag, iconForName("flag")); + lv_label_set_text_static(imgFlag, iconForName("flag")); lv_obj_align(imgFlag, nullptr, LV_ALIGN_CENTER, 0, -60); txtNarrative = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(txtNarrative, LV_LABEL_LONG_BREAK); lv_obj_set_width(txtNarrative, LV_HOR_RES); - lv_label_set_text(txtNarrative, "Navigation"); + lv_label_set_text_static(txtNarrative, "Navigation"); lv_label_set_align(txtNarrative, LV_LABEL_ALIGN_CENTER); lv_obj_align(txtNarrative, nullptr, LV_ALIGN_CENTER, 0, 10); @@ -148,7 +148,7 @@ Navigation::Navigation(Pinetime::Applications::DisplayApp* app, Pinetime::Contro lv_label_set_long_mode(txtManDist, LV_LABEL_LONG_BREAK); lv_obj_set_style_local_text_color(txtManDist, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); lv_obj_set_width(txtManDist, LV_HOR_RES); - lv_label_set_text(txtManDist, "--M"); + lv_label_set_text_static(txtManDist, "--M"); lv_label_set_align(txtManDist, LV_LABEL_ALIGN_CENTER); lv_obj_align(txtManDist, nullptr, LV_ALIGN_CENTER, 0, 60); @@ -173,7 +173,7 @@ Navigation::~Navigation() { void Navigation::Refresh() { if (flag != navService.getFlag()) { flag = navService.getFlag(); - lv_label_set_text(imgFlag, iconForName(flag)); + lv_label_set_text_static(imgFlag, iconForName(flag)); } if (narrative != navService.getNarrative()) { diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index f9afd8c7..600f7488 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -229,7 +229,7 @@ Notifications::NotificationItem::NotificationItem(const char* title, lv_obj_set_style_local_text_color(alert_subject, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); lv_label_set_long_mode(alert_subject, LV_LABEL_LONG_BREAK); lv_obj_set_width(alert_subject, LV_HOR_RES - 20); - lv_label_set_text(alert_subject, "Incoming call from"); + lv_label_set_text_static(alert_subject, "Incoming call from"); lv_obj_t* alert_caller = lv_label_create(container1, nullptr); lv_obj_align(alert_caller, alert_subject, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); @@ -243,7 +243,7 @@ Notifications::NotificationItem::NotificationItem(const char* title, lv_obj_set_size(bt_accept, 76, 76); lv_obj_align(bt_accept, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); label_accept = lv_label_create(bt_accept, nullptr); - lv_label_set_text(label_accept, Symbols::phone); + lv_label_set_text_static(label_accept, Symbols::phone); lv_obj_set_style_local_bg_color(bt_accept, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); bt_reject = lv_btn_create(lv_scr_act(), nullptr); @@ -252,7 +252,7 @@ Notifications::NotificationItem::NotificationItem(const char* title, lv_obj_set_size(bt_reject, 76, 76); lv_obj_align(bt_reject, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0); label_reject = lv_label_create(bt_reject, nullptr); - lv_label_set_text(label_reject, Symbols::phoneSlash); + lv_label_set_text_static(label_reject, Symbols::phoneSlash); lv_obj_set_style_local_bg_color(bt_reject, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED); bt_mute = lv_btn_create(lv_scr_act(), nullptr); @@ -261,7 +261,7 @@ Notifications::NotificationItem::NotificationItem(const char* title, lv_obj_set_size(bt_mute, 76, 76); lv_obj_align(bt_mute, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); label_mute = lv_label_create(bt_mute, nullptr); - lv_label_set_text(label_mute, Symbols::volumMute); + lv_label_set_text_static(label_mute, Symbols::volumMute); lv_obj_set_style_local_bg_color(bt_mute, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); } break; } @@ -270,7 +270,7 @@ Notifications::NotificationItem::NotificationItem(const char* title, lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); - lv_label_set_text(backgroundLabel, ""); + lv_label_set_text_static(backgroundLabel, ""); } void Notifications::NotificationItem::OnCallButtonEvent(lv_obj_t* obj, lv_event_t event) { diff --git a/src/displayapp/screens/Paddle.cpp b/src/displayapp/screens/Paddle.cpp index 608eb644..79401ff9 100644 --- a/src/displayapp/screens/Paddle.cpp +++ b/src/displayapp/screens/Paddle.cpp @@ -17,7 +17,7 @@ Paddle::Paddle(Pinetime::Applications::DisplayApp* app, Pinetime::Components::Li points = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(points, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42); - lv_label_set_text(points, "0000"); + lv_label_set_text_static(points, "0000"); lv_obj_align(points, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 10); paddle = lv_obj_create(lv_scr_act(), nullptr); diff --git a/src/displayapp/screens/PassKey.cpp b/src/displayapp/screens/PassKey.cpp index 9e43a541..e9715cd6 100644 --- a/src/displayapp/screens/PassKey.cpp +++ b/src/displayapp/screens/PassKey.cpp @@ -15,7 +15,7 @@ PassKey::PassKey(Pinetime::Applications::DisplayApp* app, uint32_t key) : Screen lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); - lv_label_set_text(backgroundLabel, ""); + lv_label_set_text_static(backgroundLabel, ""); } PassKey::~PassKey() { diff --git a/src/displayapp/screens/Steps.cpp b/src/displayapp/screens/Steps.cpp index 3e7f8201..df137585 100644 --- a/src/displayapp/screens/Steps.cpp +++ b/src/displayapp/screens/Steps.cpp @@ -61,7 +61,7 @@ Steps::Steps(Pinetime::Applications::DisplayApp* app, lv_obj_set_width(resetBtn, 115); lv_obj_align(resetBtn, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0); resetButtonLabel = lv_label_create(resetBtn, nullptr); - lv_label_set_text(resetButtonLabel, "Reset"); + lv_label_set_text_static(resetButtonLabel, "Reset"); currentTripSteps = motionController.GetTripSteps(); diff --git a/src/displayapp/screens/StopWatch.cpp b/src/displayapp/screens/StopWatch.cpp index 8749839f..fcff5f12 100644 --- a/src/displayapp/screens/StopWatch.cpp +++ b/src/displayapp/screens/StopWatch.cpp @@ -55,13 +55,13 @@ StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask) time = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); - lv_label_set_text(time, "00:00"); + lv_label_set_text_static(time, "00:00"); lv_obj_align(time, lv_scr_act(), LV_ALIGN_CENTER, 0, -45); msecTime = lv_label_create(lv_scr_act(), nullptr); // lv_obj_set_style_local_text_font(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); - lv_label_set_text(msecTime, "00"); + lv_label_set_text_static(msecTime, "00"); lv_obj_align(msecTime, lv_scr_act(), LV_ALIGN_CENTER, 0, 3); btnPlayPause = lv_btn_create(lv_scr_act(), nullptr); @@ -71,7 +71,7 @@ StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask) lv_obj_set_width(btnPlayPause, 115); lv_obj_align(btnPlayPause, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); txtPlayPause = lv_label_create(btnPlayPause, nullptr); - lv_label_set_text(txtPlayPause, Symbols::play); + lv_label_set_text_static(txtPlayPause, Symbols::play); btnStopLap = lv_btn_create(lv_scr_act(), nullptr); btnStopLap->user_data = this; @@ -82,7 +82,7 @@ StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask) lv_obj_set_style_local_bg_color(btnStopLap, LV_BTN_PART_MAIN, LV_STATE_DISABLED, lv_color_hex(0x080808)); txtStopLap = lv_label_create(btnStopLap, nullptr); lv_obj_set_style_local_text_color(txtStopLap, LV_BTN_PART_MAIN, LV_STATE_DISABLED, lv_color_hex(0x888888)); - lv_label_set_text(txtStopLap, Symbols::stop); + lv_label_set_text_static(txtStopLap, Symbols::stop); lv_obj_set_state(btnStopLap, LV_STATE_DISABLED); lv_obj_set_state(txtStopLap, LV_STATE_DISABLED); @@ -90,13 +90,13 @@ StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask) // lv_obj_set_style_local_text_font(lapOneText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); lv_obj_set_style_local_text_color(lapOneText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW); lv_obj_align(lapOneText, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 50, 30); - lv_label_set_text(lapOneText, ""); + lv_label_set_text_static(lapOneText, ""); lapTwoText = lv_label_create(lv_scr_act(), nullptr); // lv_obj_set_style_local_text_font(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); lv_obj_set_style_local_text_color(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW); lv_obj_align(lapTwoText, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 50, 55); - lv_label_set_text(lapTwoText, ""); + lv_label_set_text_static(lapTwoText, ""); taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); } @@ -113,11 +113,11 @@ void StopWatch::reset() { lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); - lv_label_set_text(time, "00:00"); - lv_label_set_text(msecTime, "00"); + lv_label_set_text_static(time, "00:00"); + lv_label_set_text_static(msecTime, "00"); - lv_label_set_text(lapOneText, ""); - lv_label_set_text(lapTwoText, ""); + lv_label_set_text_static(lapOneText, ""); + lv_label_set_text_static(lapTwoText, ""); lapBuffer.clearBuffer(); lapNr = 0; lv_obj_set_state(btnStopLap, LV_STATE_DISABLED); @@ -129,8 +129,8 @@ void StopWatch::start() { lv_obj_set_state(txtStopLap, LV_STATE_DEFAULT); lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); - lv_label_set_text(txtPlayPause, Symbols::pause); - lv_label_set_text(txtStopLap, Symbols::lapsFlag); + lv_label_set_text_static(txtPlayPause, Symbols::pause); + lv_label_set_text_static(txtStopLap, Symbols::lapsFlag); startTime = xTaskGetTickCount(); currentState = States::Running; systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping); @@ -141,8 +141,8 @@ void StopWatch::pause() { // Store the current time elapsed in cache oldTimeElapsed += timeElapsed; currentState = States::Halted; - lv_label_set_text(txtPlayPause, Symbols::play); - lv_label_set_text(txtStopLap, Symbols::stop); + lv_label_set_text_static(txtPlayPause, Symbols::play); + lv_label_set_text_static(txtStopLap, Symbols::stop); lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW); lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW); systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping); diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp index 23d9bca7..4df69fed 100644 --- a/src/displayapp/screens/Tile.cpp +++ b/src/displayapp/screens/Tile.cpp @@ -39,7 +39,7 @@ Tile::Tile(uint8_t screenID, // Battery batteryIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); + lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); lv_obj_align(batteryIcon, nullptr, LV_ALIGN_IN_TOP_RIGHT, -8, 0); if (numScreens > 1) { @@ -120,7 +120,7 @@ Tile::~Tile() { void Tile::UpdateScreen() { lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str()); - lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); + lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); } void Tile::OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId) { diff --git a/src/displayapp/screens/Timer.cpp b/src/displayapp/screens/Timer.cpp index 5cd496c7..167b7b1e 100644 --- a/src/displayapp/screens/Timer.cpp +++ b/src/displayapp/screens/Timer.cpp @@ -18,7 +18,7 @@ void Timer::CreateButtons() { lv_obj_set_height(btnMinutesUp, 40); lv_obj_set_width(btnMinutesUp, 60); txtMUp = lv_label_create(btnMinutesUp, nullptr); - lv_label_set_text(txtMUp, "+"); + lv_label_set_text_static(txtMUp, "+"); btnMinutesDown = lv_btn_create(lv_scr_act(), nullptr); btnMinutesDown->user_data = this; @@ -27,7 +27,7 @@ void Timer::CreateButtons() { lv_obj_set_height(btnMinutesDown, 40); lv_obj_set_width(btnMinutesDown, 60); txtMDown = lv_label_create(btnMinutesDown, nullptr); - lv_label_set_text(txtMDown, "-"); + lv_label_set_text_static(txtMDown, "-"); btnSecondsUp = lv_btn_create(lv_scr_act(), nullptr); btnSecondsUp->user_data = this; @@ -36,7 +36,7 @@ void Timer::CreateButtons() { lv_obj_set_height(btnSecondsUp, 40); lv_obj_set_width(btnSecondsUp, 60); txtSUp = lv_label_create(btnSecondsUp, nullptr); - lv_label_set_text(txtSUp, "+"); + lv_label_set_text_static(txtSUp, "+"); btnSecondsDown = lv_btn_create(lv_scr_act(), nullptr); btnSecondsDown->user_data = this; @@ -45,7 +45,7 @@ void Timer::CreateButtons() { lv_obj_set_height(btnSecondsDown, 40); lv_obj_set_width(btnSecondsDown, 60); txtSDown = lv_label_create(btnSecondsDown, nullptr); - lv_label_set_text(txtSDown, "-"); + lv_label_set_text_static(txtSDown, "-"); } Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController) @@ -55,7 +55,7 @@ Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController) lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); - lv_label_set_text(backgroundLabel, ""); + lv_label_set_text_static(backgroundLabel, ""); time = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); @@ -73,9 +73,9 @@ Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController) lv_obj_set_height(btnPlayPause, 40); txtPlayPause = lv_label_create(btnPlayPause, nullptr); if (timerController.IsRunning()) { - lv_label_set_text(txtPlayPause, Symbols::pause); + lv_label_set_text_static(txtPlayPause, Symbols::pause); } else { - lv_label_set_text(txtPlayPause, Symbols::play); + lv_label_set_text_static(txtPlayPause, Symbols::play); CreateButtons(); } @@ -98,7 +98,7 @@ void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) { if (event == LV_EVENT_CLICKED) { if (obj == btnPlayPause) { if (timerController.IsRunning()) { - lv_label_set_text(txtPlayPause, Symbols::play); + lv_label_set_text_static(txtPlayPause, Symbols::play); uint32_t seconds = timerController.GetTimeRemaining() / 1000; minutesToSet = seconds / 60; secondsToSet = seconds % 60; @@ -106,7 +106,7 @@ void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) { CreateButtons(); } else if (secondsToSet + minutesToSet > 0) { - lv_label_set_text(txtPlayPause, Symbols::pause); + lv_label_set_text_static(txtPlayPause, Symbols::pause); timerController.StartTimer((secondsToSet + minutesToSet * 60) * 1000); lv_obj_del(btnSecondsDown); @@ -158,8 +158,8 @@ void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) { } void Timer::SetDone() { - lv_label_set_text(time, "00:00"); - lv_label_set_text(txtPlayPause, Symbols::play); + lv_label_set_text_static(time, "00:00"); + lv_label_set_text_static(txtPlayPause, Symbols::play); secondsToSet = 0; minutesToSet = 0; CreateButtons(); diff --git a/src/displayapp/screens/Twos.cpp b/src/displayapp/screens/Twos.cpp index 6d675859..ca9295d5 100644 --- a/src/displayapp/screens/Twos.cpp +++ b/src/displayapp/screens/Twos.cpp @@ -90,7 +90,7 @@ Twos::Twos(Pinetime::Applications::DisplayApp* app) : Screen(app) { lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); - lv_label_set_text(backgroundLabel, ""); + lv_label_set_text_static(backgroundLabel, ""); } Twos::~Twos() { diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index 61042816..4cfc9692 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -67,13 +67,13 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, lv_obj_align(bg_clock_img, NULL, LV_ALIGN_CENTER, 0, 0); batteryIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(batteryIcon, Symbols::batteryHalf); + lv_label_set_text_static(batteryIcon, Symbols::batteryHalf); lv_obj_align(batteryIcon, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); lv_obj_set_auto_realign(batteryIcon, true); notificationIcon = lv_label_create(lv_scr_act(), NULL); lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FF00)); - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); + lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(false)); lv_obj_align(notificationIcon, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); // Date - Day / Week day @@ -185,7 +185,7 @@ void WatchFaceAnalog::SetBatteryIcon() { } else { lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); } - lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); + lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); } void WatchFaceAnalog::Refresh() { @@ -193,7 +193,7 @@ void WatchFaceAnalog::Refresh() { if (isCharging.IsUpdated()) { if (isCharging.Get()) { lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED); - lv_label_set_text(batteryIcon, Symbols::plug); + lv_label_set_text_static(batteryIcon, Symbols::plug); } else { SetBatteryIcon(); } @@ -208,7 +208,7 @@ void WatchFaceAnalog::Refresh() { notificationState = notificationManager.AreNewNotificationsAvailable(); if (notificationState.IsUpdated()) { - lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(notificationState.Get())); + lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(notificationState.Get())); } currentDateTime = dateTimeController.CurrentDateTime(); diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 6a914884..ad328e1a 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -121,7 +121,7 @@ void WatchFaceDigital::Refresh() { bleState = bleController.IsConnected(); bleRadioEnabled = bleController.IsRadioEnabled(); if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { - lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get())); + lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); } lv_obj_realign(batteryIcon); lv_obj_realign(batteryPlug); diff --git a/src/displayapp/screens/WatchFacePineTimeStyle.cpp b/src/displayapp/screens/WatchFacePineTimeStyle.cpp index d0fbf059..28e7a6a3 100644 --- a/src/displayapp/screens/WatchFacePineTimeStyle.cpp +++ b/src/displayapp/screens/WatchFacePineTimeStyle.cpp @@ -373,7 +373,7 @@ void WatchFacePineTimeStyle::Refresh() { bleState = bleController.IsConnected(); bleRadioEnabled = bleController.IsRadioEnabled(); if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { - lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get())); + lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); AlignIcons(); } @@ -424,10 +424,10 @@ void WatchFacePineTimeStyle::Refresh() { } if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { - lv_label_set_text_fmt(dateDayOfWeek, "%s", dateTimeController.DayOfWeekShortToString()); + lv_label_set_text_static(dateDayOfWeek, dateTimeController.DayOfWeekShortToString()); lv_label_set_text_fmt(dateDay, "%d", day); lv_obj_realign(dateDay); - lv_label_set_text_fmt(dateMonth, "%s", dateTimeController.MonthShortToString()); + lv_label_set_text_static(dateMonth, dateTimeController.MonthShortToString()); currentYear = year; currentMonth = month; diff --git a/src/displayapp/screens/settings/QuickSettings.cpp b/src/displayapp/screens/settings/QuickSettings.cpp index cd56c145..97faaa79 100644 --- a/src/displayapp/screens/settings/QuickSettings.cpp +++ b/src/displayapp/screens/settings/QuickSettings.cpp @@ -40,7 +40,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 0, 0); batteryIcon = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); + lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); lv_obj_align(batteryIcon, nullptr, LV_ALIGN_IN_TOP_RIGHT, 0, 0); static constexpr uint8_t barHeight = 20 + innerDistance; @@ -124,7 +124,7 @@ QuickSettings::~QuickSettings() { void QuickSettings::UpdateScreen() { lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str()); - lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); + lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); } void QuickSettings::OnButtonEvent(lv_obj_t* object, lv_event_t event) { diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.cpp b/src/displayapp/screens/settings/SettingShakeThreshold.cpp index 9d40fcf9..c354bdc4 100644 --- a/src/displayapp/screens/settings/SettingShakeThreshold.cpp +++ b/src/displayapp/screens/settings/SettingShakeThreshold.cpp @@ -57,7 +57,7 @@ SettingShakeThreshold::SettingShakeThreshold(DisplayApp* app, lv_obj_align(calButton, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0); lv_btn_set_checkable(calButton, true); calLabel = lv_label_create(calButton, NULL); - lv_label_set_text(calLabel, "Calibrate"); + lv_label_set_text_static(calLabel, "Calibrate"); lv_arc_set_value(positionArc, settingsController.GetShakeThreshold()); @@ -91,7 +91,7 @@ void SettingShakeThreshold::Refresh() { calibrating = 2; lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_RED); lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_RED); - lv_label_set_text(calLabel, "Shake!!"); + lv_label_set_text_static(calLabel, "Shake!"); } } if (calibrating == 2) { @@ -121,14 +121,14 @@ void SettingShakeThreshold::UpdateSelected(lv_obj_t* object, lv_event_t event) { lv_arc_set_value(positionArc, 0); calibrating = 1; vCalTime = xTaskGetTickCount(); - lv_label_set_text(calLabel, "Ready!"); + lv_label_set_text_static(calLabel, "Ready!"); lv_obj_set_click(positionArc, false); lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_GREEN); lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_GREEN); } else if (lv_btn_get_state(calButton) == LV_BTN_STATE_RELEASED) { calibrating = 0; lv_obj_set_click(positionArc, true); - lv_label_set_text(calLabel, "Calibrate"); + lv_label_set_text_static(calLabel, "Calibrate"); } break; }