From 319030d9e16e833cf8bff569a9ecfa452165ea27 Mon Sep 17 00:00:00 2001 From: "James A. Jerkins" Date: Thu, 23 Dec 2021 20:30:14 -0600 Subject: 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/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 ++++++++++++++++++++++++++--- 5 files changed, 92 insertions(+), 36 deletions(-) (limited to 'src/components') 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(); -- cgit v1.2.3-70-g09d2 From a2a70f8eda56b4cf859f456b2f842e4833cd3dbf Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sat, 29 Jan 2022 23:45:22 +0100 Subject: 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(-) (limited to 'src/components') 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); -- cgit v1.2.3-70-g09d2 From 69e4ab6be101e7993035b56db75f5c32eda713ac Mon Sep 17 00:00:00 2001 From: Jean-François Milants Date: Sun, 20 Feb 2022 13:20:43 +0100 Subject: 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 +- src/displayapp/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 (limited to 'src/components') 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()]; -- cgit v1.2.3-70-g09d2 From ef44b763d94cc6ff1be6f75ff3e638d7d356e99e Mon Sep 17 00:00:00 2001 From: Jean-François Milants Date: Sun, 20 Feb 2022 15:40:49 +0100 Subject: 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(-) (limited to 'src/components') 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,13 +9,16 @@ 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); } -} -constexpr std::array SettingAirplaneMode::options; + static void OnAirplaneModeDisabledEvent(lv_obj_t* obj, lv_event_t event) { + auto* screen = static_cast(obj->user_data); + screen->OnAirplaneModeDisabled(obj, event); + } +} 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, 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(2, 3, app, settingsController, applications); + 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; -- cgit v1.2.3-70-g09d2 From 5613449bfb16ed7bac672621f0f6c13afb1e1718 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Fri, 19 Nov 2021 23:14:19 +0100 Subject: 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(-) (limited to 'src/components') 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)); -- cgit v1.2.3-70-g09d2 From 5fe5cee9ef76fdb57810a4434517ebc6442393fb Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sun, 20 Feb 2022 14:45:59 +0100 Subject: 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(+) (limited to 'src/components') 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 -- cgit v1.2.3-70-g09d2 From db41d9081a61b2370a4633568a9cb01bc948a5ab Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Mon, 14 Mar 2022 20:28:51 +0100 Subject: 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(-) (limited to 'src/components') 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 { -- cgit v1.2.3-70-g09d2 From df61907073fab7d4c2f9595c7771e894a3841b65 Mon Sep 17 00:00:00 2001 From: Jean-François Milants Date: Mon, 14 Mar 2022 20:44:19 +0100 Subject: 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(+) (limited to 'src/components') 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); -- cgit v1.2.3-70-g09d2 From f973f1c12c5f82ddacfdaca29fbe1043d94313ee Mon Sep 17 00:00:00 2001 From: Jean-François Milants Date: Mon, 14 Mar 2022 21:03:08 +0100 Subject: Add missing space in if expression. --- src/components/ble/MusicService.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/components') 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; } -- cgit v1.2.3-70-g09d2 From 88197b66328ab8cbecc199c91d1ce1e1688ade83 Mon Sep 17 00:00:00 2001 From: Jean-François Milants Date: Thu, 17 Mar 2022 21:15:05 +0100 Subject: 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(-) (limited to 'src/components') 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[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 data[notifSize + 1]; - data[notifSize] = '\0'; - os_mbuf_copydata(ctxt->om, 0, notifSize, data); char* s = &data[0]; if (ble_uuid_cmp(ctxt->chr->uuid, &msArtistCharUuid.u) == 0) { artistName = s; -- cgit v1.2.3-70-g09d2 From a8b7fbe48b4a86238f38ed0f084b277b44c428fb Mon Sep 17 00:00:00 2001 From: Jean-François Milants Date: Thu, 17 Mar 2022 21:22:59 +0100 Subject: 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 + .../mynewt-nimble/porting/npl/freertos/src/nimble_port_freertos.c | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src/components') 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); } -- cgit v1.2.3-70-g09d2 From 78cab3604d307d48db5d2b38b54a00bbaaaf67ec Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Mon, 21 Feb 2022 23:45:59 +0100 Subject: 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(-) (limited to 'src/components') 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 -- cgit v1.2.3-70-g09d2 From 78365548f70d9a6ef9a040d8e0039e640e386dc3 Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Sat, 2 Apr 2022 16:03:20 +0300 Subject: 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 +- .../screens/settings/SettingAirplaneMode.cpp | 93 ---------------------- .../screens/settings/SettingAirplaneMode.h | 31 -------- .../screens/settings/SettingBluetooth.cpp | 93 ++++++++++++++++++++++ src/displayapp/screens/settings/SettingBluetooth.h | 31 ++++++++ src/displayapp/screens/settings/Settings.cpp | 2 +- 16 files changed, 168 insertions(+), 186 deletions(-) delete mode 100644 src/displayapp/screens/settings/SettingAirplaneMode.cpp delete mode 100644 src/displayapp/screens/settings/SettingAirplaneMode.h create mode 100644 src/displayapp/screens/settings/SettingBluetooth.cpp create mode 100644 src/displayapp/screens/settings/SettingBluetooth.h (limited to 'src/components') 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/SettingAirplaneMode.cpp deleted file mode 100644 index 85172787..00000000 --- a/src/displayapp/screens/settings/SettingAirplaneMode.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#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 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); - } -} - -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); - - 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); - - 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.GetBleRadioEnabled()) { - app->PushMessage(Pinetime::Applications::Display::Messages::BleRadioEnableToggle); - } -} - -void SettingAirplaneMode::OnAirplaneModeEnabled(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); - 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 deleted file mode 100644 index b3478c64..00000000 --- a/src/displayapp/screens/settings/SettingAirplaneMode.h +++ /dev/null @@ -1,31 +0,0 @@ -#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 OnAirplaneModeEnabled(lv_obj_t* object, lv_event_t event); - void OnAirplaneModeDisabled(lv_obj_t* object, lv_event_t event); - - private: - Controllers::Settings& settingsController; - lv_obj_t* cbEnabled; - lv_obj_t* cbDisabled; - bool priorMode; - }; - } - } -} diff --git a/src/displayapp/screens/settings/SettingBluetooth.cpp b/src/displayapp/screens/settings/SettingBluetooth.cpp new file mode 100644 index 00000000..ab1af223 --- /dev/null +++ b/src/displayapp/screens/settings/SettingBluetooth.cpp @@ -0,0 +1,93 @@ +#include "displayapp/screens/settings/SettingBluetooth.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 OnBluetoothDisabledEvent(lv_obj_t* obj, lv_event_t event) { + auto* screen = static_cast(obj->user_data); + screen->OnBluetoothDisabled(obj, event); + } + + static void OnBluetoothEnabledEvent(lv_obj_t* obj, lv_event_t event) { + auto* screen = static_cast(obj->user_data); + screen->OnBluetoothEnabled(obj, event); + } +} + +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); + + 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, "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::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, " Enabled"); + cbEnabled->user_data = this; + lv_obj_set_event_cb(cbEnabled, OnBluetoothEnabledEvent); + SetRadioButtonStyle(cbEnabled); + + cbDisabled = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text(cbDisabled, " Disabled"); + cbDisabled->user_data = this; + lv_obj_set_event_cb(cbDisabled, OnBluetoothDisabledEvent); + SetRadioButtonStyle(cbDisabled); + + if (settingsController.GetBleRadioEnabled()) { + lv_checkbox_set_checked(cbEnabled, true); + priorMode = true; + } else { + lv_checkbox_set_checked(cbDisabled, true); + priorMode = false; + } +} + +SettingBluetooth::~SettingBluetooth() { + lv_obj_clean(lv_scr_act()); + // Do not call SaveSettings - see src/components/settings/Settings.h + if (priorMode != settingsController.GetBleRadioEnabled()) { + app->PushMessage(Pinetime::Applications::Display::Messages::BleRadioEnableToggle); + } +} + +void SettingBluetooth::OnBluetoothDisabled(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(false); + } +} + +void SettingBluetooth::OnBluetoothEnabled(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); + settingsController.SetBleRadioEnabled(true); + } +} + diff --git a/src/displayapp/screens/settings/SettingBluetooth.h b/src/displayapp/screens/settings/SettingBluetooth.h new file mode 100644 index 00000000..12bb459a --- /dev/null +++ b/src/displayapp/screens/settings/SettingBluetooth.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include +#include + +#include "components/settings/Settings.h" +#include "displayapp/screens/Screen.h" + +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingBluetooth : public Screen { + public: + SettingBluetooth(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); + ~SettingBluetooth() override; + + void OnBluetoothEnabled(lv_obj_t* object, lv_event_t event); + void OnBluetoothDisabled(lv_obj_t* object, lv_event_t event); + + private: + Controllers::Settings& settingsController; + 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 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); -- cgit v1.2.3-70-g09d2