From 5316ac357a3cedae88dfccddc7cc960fdbe19821 Mon Sep 17 00:00:00 2001 From: Julian Vos Date: Sun, 26 Jan 2025 13:17:42 +0000 Subject: [PATCH 1/6] feat: add chime and notification vibration strength settings --- src/components/settings/Settings.h | 26 ++++ src/displayapp/DisplayApp.cpp | 15 +- src/displayapp/apps/Apps.h.in | 2 + src/displayapp/screens/Notifications.cpp | 3 +- src/displayapp/screens/Notifications.h | 1 + .../settings/SettingChimeVibration.cpp | 68 +++++++++ .../screens/settings/SettingChimeVibration.h | 28 ++++ .../settings/SettingNotifVibration.cpp | 134 ++++++++++++++++++ .../screens/settings/SettingNotifVibration.h | 28 ++++ src/displayapp/screens/settings/Settings.h | 4 +- 10 files changed, 304 insertions(+), 5 deletions(-) create mode 100644 src/displayapp/screens/settings/SettingChimeVibration.cpp create mode 100644 src/displayapp/screens/settings/SettingChimeVibration.h create mode 100644 src/displayapp/screens/settings/SettingNotifVibration.cpp create mode 100644 src/displayapp/screens/settings/SettingNotifVibration.h diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 063120774a..7875189c20 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -34,6 +34,7 @@ namespace Pinetime { Orange, Pink }; + enum class VibrationStrength : uint8_t { Weak = 15, Normal = 35, Strong = 75 }; enum class PTSGaugeStyle : uint8_t { Full, Half, Numeric }; enum class PTSWeather : uint8_t { On, Off }; @@ -283,6 +284,28 @@ namespace Pinetime { return bleRadioEnabled; }; + void SetNotifVibration(VibrationStrength strength) { + if (strength != settings.notifVibration) { + settingsChanged = true; + } + settings.notifVibration = strength; + }; + + VibrationStrength GetNotifVibration() const { + return settings.notifVibration; + } + + void SetChimeVibration(VibrationStrength strength) { + if (strength != settings.chimeVibration) { + settingsChanged = true; + } + settings.chimeVibration = strength; + }; + + VibrationStrength GetChimeVibration() const { + return settings.chimeVibration; + } + private: Pinetime::Controllers::FS& fs; @@ -308,6 +331,9 @@ namespace Pinetime { uint16_t shakeWakeThreshold = 150; Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; + + VibrationStrength notifVibration = VibrationStrength::Normal; + VibrationStrength chimeVibration = VibrationStrength::Normal; }; SettingsData settings; diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 3fd34b3a8c..cab2e0310d 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -49,6 +49,8 @@ #include "displayapp/screens/settings/SettingChimes.h" #include "displayapp/screens/settings/SettingShakeThreshold.h" #include "displayapp/screens/settings/SettingBluetooth.h" +#include "displayapp/screens/settings/SettingNotifVibration.h" +#include "displayapp/screens/settings/SettingChimeVibration.h" #include "libs/lv_conf.h" #include "UserApps.h" @@ -270,7 +272,7 @@ void DisplayApp::Refresh() { } else { LoadNewScreen(Apps::Timer, DisplayApp::FullRefreshDirections::Up); } - motorController.RunForDuration(35); + motorController.RunForDuration(static_cast(settingsController.GetNotifVibration())); break; case Messages::AlarmTriggered: if (currentApp == Apps::Alarm) { @@ -282,7 +284,7 @@ void DisplayApp::Refresh() { break; case Messages::ShowPairingKey: LoadNewScreen(Apps::PassKey, DisplayApp::FullRefreshDirections::Up); - motorController.RunForDuration(35); + motorController.RunForDuration(static_cast(settingsController.GetNotifVibration())); break; case Messages::TouchEvent: { if (state != States::Running) { @@ -375,7 +377,7 @@ void DisplayApp::Refresh() { break; case Messages::Chime: LoadNewScreen(Apps::Clock, DisplayApp::FullRefreshDirections::None); - motorController.RunForDuration(35); + motorController.RunForDuration(static_cast(settingsController.GetChimeVibration())); break; case Messages::OnChargingEvent: RestoreBrightness(); @@ -465,6 +467,7 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio notificationManager, systemTask->nimble().alertService(), motorController, + settingsController, *systemTask, Screens::Notifications::Modes::Normal); break; @@ -524,6 +527,12 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio case Apps::SettingBluetooth: currentScreen = std::make_unique(this, settingsController); break; + case Apps::SettingNotifVibration: + currentScreen = std::make_unique(settingsController, motorController); + break; + case Apps::SettingChimeVibration: + currentScreen = std::make_unique(settingsController, motorController); + break; case Apps::BatteryInfo: currentScreen = std::make_unique(batteryController); break; diff --git a/src/displayapp/apps/Apps.h.in b/src/displayapp/apps/Apps.h.in index 2104a267c0..3f40137507 100644 --- a/src/displayapp/apps/Apps.h.in +++ b/src/displayapp/apps/Apps.h.in @@ -42,6 +42,8 @@ namespace Pinetime { SettingChimes, SettingShakeThreshold, SettingBluetooth, + SettingNotifVibration, + SettingChimeVibration, Error }; diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 037c43a7f6..2f710300fb 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -14,6 +14,7 @@ Notifications::Notifications(DisplayApp* app, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::AlertNotificationService& alertNotificationService, Pinetime::Controllers::MotorController& motorController, + Pinetime::Controllers::Settings& settingsController, System::SystemTask& systemTask, Modes mode) : app {app}, @@ -44,7 +45,7 @@ Notifications::Notifications(DisplayApp* app, if (notification.category == Controllers::NotificationManager::Categories::IncomingCall) { motorController.StartRinging(); } else { - motorController.RunForDuration(35); + motorController.RunForDuration(static_cast(settingsController.GetNotifVibration())); } timeoutLine = lv_line_create(lv_scr_act(), nullptr); diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index 114316b35b..5eedd591d4 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -24,6 +24,7 @@ namespace Pinetime { Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::AlertNotificationService& alertNotificationService, Pinetime::Controllers::MotorController& motorController, + Pinetime::Controllers::Settings& settingsController, System::SystemTask& systemTask, Modes mode); ~Notifications() override; diff --git a/src/displayapp/screens/settings/SettingChimeVibration.cpp b/src/displayapp/screens/settings/SettingChimeVibration.cpp new file mode 100644 index 0000000000..ad129cfebb --- /dev/null +++ b/src/displayapp/screens/settings/SettingChimeVibration.cpp @@ -0,0 +1,68 @@ +#include "displayapp/screens/settings/SettingChimeVibration.h" + +#include + +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + struct Option { + Pinetime::Controllers::Settings::VibrationStrength vibrationStrength; + const char* name; + }; + + constexpr std::array options = {{ + {Pinetime::Controllers::Settings::VibrationStrength::Weak, "Weak"}, + {Pinetime::Controllers::Settings::VibrationStrength::Normal, "Normal"}, + {Pinetime::Controllers::Settings::VibrationStrength::Strong, "Strong"}, + }}; + + std::array CreateOptionArray() { + std::array optionArray; + for (size_t i = 0; i < CheckboxList::MaxItems; i++) { + if (i >= options.size()) { + optionArray[i].name = ""; + optionArray[i].enabled = false; + } else { + optionArray[i].name = options[i].name; + optionArray[i].enabled = true; + } + } + return optionArray; + } + + uint32_t GetDefaultOption(Pinetime::Controllers::Settings::VibrationStrength currentOption) { + for (size_t i = 0; i < options.size(); i++) { + if (options[i].vibrationStrength == currentOption) { + return i; + } + } + return 0; + } +} + +SettingChimeVibration::SettingChimeVibration(Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::MotorController& motorController) + : checkboxList( + 0, + 1, + "Chime strength", + Symbols::tachometer, + GetDefaultOption(settingsController.GetChimeVibration()), + [&settings = settingsController, &motor = motorController](uint32_t index) { + // Preview current setting + motor.RunForDuration(static_cast(options[index].vibrationStrength)); + + settings.SetChimeVibration(options[index].vibrationStrength); + settings.SaveSettings(); + }, + CreateOptionArray()) { +} + +SettingChimeVibration::~SettingChimeVibration() { + lv_obj_clean(lv_scr_act()); +} diff --git a/src/displayapp/screens/settings/SettingChimeVibration.h b/src/displayapp/screens/settings/SettingChimeVibration.h new file mode 100644 index 0000000000..3ab5088ef4 --- /dev/null +++ b/src/displayapp/screens/settings/SettingChimeVibration.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include + +#include "components/settings/Settings.h" +#include "components/motor/MotorController.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/CheckboxList.h" + +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingChimeVibration : public Screen { + public: + explicit SettingChimeVibration(Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::MotorController& motorController); + ~SettingChimeVibration() override; + + private: + CheckboxList checkboxList; + }; + } + } +} diff --git a/src/displayapp/screens/settings/SettingNotifVibration.cpp b/src/displayapp/screens/settings/SettingNotifVibration.cpp new file mode 100644 index 0000000000..65b61fcf72 --- /dev/null +++ b/src/displayapp/screens/settings/SettingNotifVibration.cpp @@ -0,0 +1,134 @@ +#include "displayapp/screens/settings/SettingNotifVibration.h" + +#include + +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + struct Option { + Pinetime::Controllers::Settings::VibrationStrength vibrationStrength; + const char* name; + }; + + constexpr std::array options = {{ + {Pinetime::Controllers::Settings::VibrationStrength::Weak, "Weak"}, + {Pinetime::Controllers::Settings::VibrationStrength::Normal, "Normal"}, + {Pinetime::Controllers::Settings::VibrationStrength::Strong, "Strong"}, + }}; + + std::array CreateOptionArray() { + std::array optionArray; + for (size_t i = 0; i < CheckboxList::MaxItems; i++) { + if (i >= options.size()) { + optionArray[i].name = ""; + optionArray[i].enabled = false; + } else { + optionArray[i].name = options[i].name; + optionArray[i].enabled = true; + } + } + return optionArray; + } + + uint32_t GetDefaultOption(Pinetime::Controllers::Settings::VibrationStrength currentOption) { + for (size_t i = 0; i < options.size(); i++) { + if (options[i].vibrationStrength == currentOption) { + return i; + } + } + return 0; + } +} + +SettingNotifVibration::SettingNotifVibration(Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::MotorController& motorController) + : checkboxList( + 0, + 1, + "Notif. strength", + Symbols::tachometer, + GetDefaultOption(settingsController.GetNotifVibration()), + [&settings = settingsController, &motor = motorController](uint32_t index) { + motor.RunForDuration(static_cast(options[index].vibrationStrength)); + + settings.SetNotifVibration(options[index].vibrationStrength); + settings.SaveSettings(); + }, + CreateOptionArray()) { +} + +SettingNotifVibration::~SettingNotifVibration() { + lv_obj_clean(lv_scr_act()); +} +#include "displayapp/screens/settings/SettingNotifVibration.h" + +#include + +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + struct Option { + Pinetime::Controllers::Settings::VibrationStrength vibrationStrength; + const char* name; + }; + + constexpr std::array options = {{ + {Pinetime::Controllers::Settings::VibrationStrength::Weak, "Weak"}, + {Pinetime::Controllers::Settings::VibrationStrength::Normal, "Normal"}, + {Pinetime::Controllers::Settings::VibrationStrength::Strong, "Strong"}, + }}; + + std::array CreateOptionArray() { + std::array optionArray; + for (size_t i = 0; i < CheckboxList::MaxItems; i++) { + if (i >= options.size()) { + optionArray[i].name = ""; + optionArray[i].enabled = false; + } else { + optionArray[i].name = options[i].name; + optionArray[i].enabled = true; + } + } + return optionArray; + } + + uint32_t GetDefaultOption(Pinetime::Controllers::Settings::VibrationStrength currentOption) { + for (size_t i = 0; i < options.size(); i++) { + if (options[i].vibrationStrength == currentOption) { + return i; + } + } + return 0; + } +} + +SettingNotifVibration::SettingNotifVibration(Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::MotorController& motorController) + : checkboxList( + 0, + 1, + "Notif. strength", + Symbols::tachometer, + GetDefaultOption(settingsController.GetNotifVibration()), + [&settings = settingsController, &motor = motorController](uint32_t index) { + motor.RunForDuration(static_cast(options[index].vibrationStrength)); + + settings.SetNotifVibration(options[index].vibrationStrength); + settings.SaveSettings(); + }, + CreateOptionArray()) { +} + +SettingNotifVibration::~SettingNotifVibration() { + lv_obj_clean(lv_scr_act()); +} diff --git a/src/displayapp/screens/settings/SettingNotifVibration.h b/src/displayapp/screens/settings/SettingNotifVibration.h new file mode 100644 index 0000000000..12df0733fd --- /dev/null +++ b/src/displayapp/screens/settings/SettingNotifVibration.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include + +#include "components/settings/Settings.h" +#include "components/motor/MotorController.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/CheckboxList.h" + +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingNotifVibration : public Screen { + public: + explicit SettingNotifVibration(Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::MotorController& motorController); + ~SettingNotifVibration() override; + + private: + CheckboxList checkboxList; + }; + } + } +} diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h index a21b4ccd85..9d6782e620 100644 --- a/src/displayapp/screens/settings/Settings.h +++ b/src/displayapp/screens/settings/Settings.h @@ -43,10 +43,12 @@ namespace Pinetime { {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}, {Symbols::clock, "Chimes", Apps::SettingChimes}, + {Symbols::tachometer, "Notif. str.", Apps::SettingNotifVibration}, + {Symbols::tachometer, "Chime strength", Apps::SettingChimeVibration}, {Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold}, + {Symbols::check, "Firmware", Apps::FirmwareValidation}, {Symbols::bluetooth, "Bluetooth", Apps::SettingBluetooth}, - {Symbols::list, "About", Apps::SysInfo}, // {Symbols::none, "None", Apps::None}, From b15fe99b26543d1b674b2ead953959539b752a22 Mon Sep 17 00:00:00 2001 From: Julian Vos Date: Sun, 26 Jan 2025 13:17:42 +0000 Subject: [PATCH 2/6] feat: add chime and notification vibration strength settings --- src/components/settings/Settings.h | 26 ++++ src/displayapp/DisplayApp.cpp | 15 +- src/displayapp/apps/Apps.h.in | 2 + src/displayapp/screens/Notifications.cpp | 3 +- src/displayapp/screens/Notifications.h | 1 + .../settings/SettingChimeVibration.cpp | 68 +++++++++ .../screens/settings/SettingChimeVibration.h | 28 ++++ .../settings/SettingNotifVibration.cpp | 134 ++++++++++++++++++ .../screens/settings/SettingNotifVibration.h | 28 ++++ src/displayapp/screens/settings/Settings.h | 4 +- 10 files changed, 304 insertions(+), 5 deletions(-) create mode 100644 src/displayapp/screens/settings/SettingChimeVibration.cpp create mode 100644 src/displayapp/screens/settings/SettingChimeVibration.h create mode 100644 src/displayapp/screens/settings/SettingNotifVibration.cpp create mode 100644 src/displayapp/screens/settings/SettingNotifVibration.h diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 602de3a585..3d419fad8e 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -34,6 +34,7 @@ namespace Pinetime { Orange, Pink }; + enum class VibrationStrength : uint8_t { Weak = 15, Normal = 35, Strong = 75 }; enum class PTSGaugeStyle : uint8_t { Full, Half, Numeric }; enum class PTSWeather : uint8_t { On, Off }; @@ -298,6 +299,28 @@ namespace Pinetime { return bleRadioEnabled; }; + void SetNotifVibration(VibrationStrength strength) { + if (strength != settings.notifVibration) { + settingsChanged = true; + } + settings.notifVibration = strength; + }; + + VibrationStrength GetNotifVibration() const { + return settings.notifVibration; + } + + void SetChimeVibration(VibrationStrength strength) { + if (strength != settings.chimeVibration) { + settingsChanged = true; + } + settings.chimeVibration = strength; + }; + + VibrationStrength GetChimeVibration() const { + return settings.chimeVibration; + } + private: Pinetime::Controllers::FS& fs; @@ -325,6 +348,9 @@ namespace Pinetime { uint16_t shakeWakeThreshold = 150; Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; + + VibrationStrength notifVibration = VibrationStrength::Normal; + VibrationStrength chimeVibration = VibrationStrength::Normal; }; SettingsData settings; diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 6671ac9e51..52ad3440b0 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -49,6 +49,8 @@ #include "displayapp/screens/settings/SettingChimes.h" #include "displayapp/screens/settings/SettingShakeThreshold.h" #include "displayapp/screens/settings/SettingBluetooth.h" +#include "displayapp/screens/settings/SettingNotifVibration.h" +#include "displayapp/screens/settings/SettingChimeVibration.h" #include "libs/lv_conf.h" #include "UserApps.h" @@ -372,7 +374,7 @@ void DisplayApp::Refresh() { } else { LoadNewScreen(Apps::Timer, DisplayApp::FullRefreshDirections::Up); } - motorController.RunForDuration(35); + motorController.RunForDuration(static_cast(settingsController.GetNotifVibration())); break; case Messages::AlarmTriggered: if (currentApp == Apps::Alarm) { @@ -384,7 +386,7 @@ void DisplayApp::Refresh() { break; case Messages::ShowPairingKey: LoadNewScreen(Apps::PassKey, DisplayApp::FullRefreshDirections::Up); - motorController.RunForDuration(35); + motorController.RunForDuration(static_cast(settingsController.GetNotifVibration())); break; case Messages::TouchEvent: { if (state != States::Running) { @@ -473,7 +475,7 @@ void DisplayApp::Refresh() { break; case Messages::Chime: LoadNewScreen(Apps::Clock, DisplayApp::FullRefreshDirections::None); - motorController.RunForDuration(35); + motorController.RunForDuration(static_cast(settingsController.GetChimeVibration())); break; case Messages::OnChargingEvent: motorController.RunForDuration(15); @@ -563,6 +565,7 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio notificationManager, systemTask->nimble().alertService(), motorController, + settingsController, *systemTask, Screens::Notifications::Modes::Normal); break; @@ -623,6 +626,12 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio case Apps::SettingBluetooth: currentScreen = std::make_unique(this, settingsController); break; + case Apps::SettingNotifVibration: + currentScreen = std::make_unique(settingsController, motorController); + break; + case Apps::SettingChimeVibration: + currentScreen = std::make_unique(settingsController, motorController); + break; case Apps::BatteryInfo: currentScreen = std::make_unique(batteryController); break; diff --git a/src/displayapp/apps/Apps.h.in b/src/displayapp/apps/Apps.h.in index 2104a267c0..3f40137507 100644 --- a/src/displayapp/apps/Apps.h.in +++ b/src/displayapp/apps/Apps.h.in @@ -42,6 +42,8 @@ namespace Pinetime { SettingChimes, SettingShakeThreshold, SettingBluetooth, + SettingNotifVibration, + SettingChimeVibration, Error }; diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 45f72f2e20..0d455f1e6e 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -14,6 +14,7 @@ Notifications::Notifications(DisplayApp* app, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::AlertNotificationService& alertNotificationService, Pinetime::Controllers::MotorController& motorController, + Pinetime::Controllers::Settings& settingsController, System::SystemTask& systemTask, Modes mode) : app {app}, @@ -44,7 +45,7 @@ Notifications::Notifications(DisplayApp* app, if (notification.category == Controllers::NotificationManager::Categories::IncomingCall) { motorController.StartRinging(); } else { - motorController.RunForDuration(35); + motorController.RunForDuration(static_cast(settingsController.GetNotifVibration())); } timeoutLine = lv_line_create(lv_scr_act(), nullptr); diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index 8488dc5bb2..c122d92305 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -25,6 +25,7 @@ namespace Pinetime { Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::AlertNotificationService& alertNotificationService, Pinetime::Controllers::MotorController& motorController, + Pinetime::Controllers::Settings& settingsController, System::SystemTask& systemTask, Modes mode); ~Notifications() override; diff --git a/src/displayapp/screens/settings/SettingChimeVibration.cpp b/src/displayapp/screens/settings/SettingChimeVibration.cpp new file mode 100644 index 0000000000..ad129cfebb --- /dev/null +++ b/src/displayapp/screens/settings/SettingChimeVibration.cpp @@ -0,0 +1,68 @@ +#include "displayapp/screens/settings/SettingChimeVibration.h" + +#include + +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + struct Option { + Pinetime::Controllers::Settings::VibrationStrength vibrationStrength; + const char* name; + }; + + constexpr std::array options = {{ + {Pinetime::Controllers::Settings::VibrationStrength::Weak, "Weak"}, + {Pinetime::Controllers::Settings::VibrationStrength::Normal, "Normal"}, + {Pinetime::Controllers::Settings::VibrationStrength::Strong, "Strong"}, + }}; + + std::array CreateOptionArray() { + std::array optionArray; + for (size_t i = 0; i < CheckboxList::MaxItems; i++) { + if (i >= options.size()) { + optionArray[i].name = ""; + optionArray[i].enabled = false; + } else { + optionArray[i].name = options[i].name; + optionArray[i].enabled = true; + } + } + return optionArray; + } + + uint32_t GetDefaultOption(Pinetime::Controllers::Settings::VibrationStrength currentOption) { + for (size_t i = 0; i < options.size(); i++) { + if (options[i].vibrationStrength == currentOption) { + return i; + } + } + return 0; + } +} + +SettingChimeVibration::SettingChimeVibration(Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::MotorController& motorController) + : checkboxList( + 0, + 1, + "Chime strength", + Symbols::tachometer, + GetDefaultOption(settingsController.GetChimeVibration()), + [&settings = settingsController, &motor = motorController](uint32_t index) { + // Preview current setting + motor.RunForDuration(static_cast(options[index].vibrationStrength)); + + settings.SetChimeVibration(options[index].vibrationStrength); + settings.SaveSettings(); + }, + CreateOptionArray()) { +} + +SettingChimeVibration::~SettingChimeVibration() { + lv_obj_clean(lv_scr_act()); +} diff --git a/src/displayapp/screens/settings/SettingChimeVibration.h b/src/displayapp/screens/settings/SettingChimeVibration.h new file mode 100644 index 0000000000..3ab5088ef4 --- /dev/null +++ b/src/displayapp/screens/settings/SettingChimeVibration.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include + +#include "components/settings/Settings.h" +#include "components/motor/MotorController.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/CheckboxList.h" + +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingChimeVibration : public Screen { + public: + explicit SettingChimeVibration(Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::MotorController& motorController); + ~SettingChimeVibration() override; + + private: + CheckboxList checkboxList; + }; + } + } +} diff --git a/src/displayapp/screens/settings/SettingNotifVibration.cpp b/src/displayapp/screens/settings/SettingNotifVibration.cpp new file mode 100644 index 0000000000..65b61fcf72 --- /dev/null +++ b/src/displayapp/screens/settings/SettingNotifVibration.cpp @@ -0,0 +1,134 @@ +#include "displayapp/screens/settings/SettingNotifVibration.h" + +#include + +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + struct Option { + Pinetime::Controllers::Settings::VibrationStrength vibrationStrength; + const char* name; + }; + + constexpr std::array options = {{ + {Pinetime::Controllers::Settings::VibrationStrength::Weak, "Weak"}, + {Pinetime::Controllers::Settings::VibrationStrength::Normal, "Normal"}, + {Pinetime::Controllers::Settings::VibrationStrength::Strong, "Strong"}, + }}; + + std::array CreateOptionArray() { + std::array optionArray; + for (size_t i = 0; i < CheckboxList::MaxItems; i++) { + if (i >= options.size()) { + optionArray[i].name = ""; + optionArray[i].enabled = false; + } else { + optionArray[i].name = options[i].name; + optionArray[i].enabled = true; + } + } + return optionArray; + } + + uint32_t GetDefaultOption(Pinetime::Controllers::Settings::VibrationStrength currentOption) { + for (size_t i = 0; i < options.size(); i++) { + if (options[i].vibrationStrength == currentOption) { + return i; + } + } + return 0; + } +} + +SettingNotifVibration::SettingNotifVibration(Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::MotorController& motorController) + : checkboxList( + 0, + 1, + "Notif. strength", + Symbols::tachometer, + GetDefaultOption(settingsController.GetNotifVibration()), + [&settings = settingsController, &motor = motorController](uint32_t index) { + motor.RunForDuration(static_cast(options[index].vibrationStrength)); + + settings.SetNotifVibration(options[index].vibrationStrength); + settings.SaveSettings(); + }, + CreateOptionArray()) { +} + +SettingNotifVibration::~SettingNotifVibration() { + lv_obj_clean(lv_scr_act()); +} +#include "displayapp/screens/settings/SettingNotifVibration.h" + +#include + +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + struct Option { + Pinetime::Controllers::Settings::VibrationStrength vibrationStrength; + const char* name; + }; + + constexpr std::array options = {{ + {Pinetime::Controllers::Settings::VibrationStrength::Weak, "Weak"}, + {Pinetime::Controllers::Settings::VibrationStrength::Normal, "Normal"}, + {Pinetime::Controllers::Settings::VibrationStrength::Strong, "Strong"}, + }}; + + std::array CreateOptionArray() { + std::array optionArray; + for (size_t i = 0; i < CheckboxList::MaxItems; i++) { + if (i >= options.size()) { + optionArray[i].name = ""; + optionArray[i].enabled = false; + } else { + optionArray[i].name = options[i].name; + optionArray[i].enabled = true; + } + } + return optionArray; + } + + uint32_t GetDefaultOption(Pinetime::Controllers::Settings::VibrationStrength currentOption) { + for (size_t i = 0; i < options.size(); i++) { + if (options[i].vibrationStrength == currentOption) { + return i; + } + } + return 0; + } +} + +SettingNotifVibration::SettingNotifVibration(Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::MotorController& motorController) + : checkboxList( + 0, + 1, + "Notif. strength", + Symbols::tachometer, + GetDefaultOption(settingsController.GetNotifVibration()), + [&settings = settingsController, &motor = motorController](uint32_t index) { + motor.RunForDuration(static_cast(options[index].vibrationStrength)); + + settings.SetNotifVibration(options[index].vibrationStrength); + settings.SaveSettings(); + }, + CreateOptionArray()) { +} + +SettingNotifVibration::~SettingNotifVibration() { + lv_obj_clean(lv_scr_act()); +} diff --git a/src/displayapp/screens/settings/SettingNotifVibration.h b/src/displayapp/screens/settings/SettingNotifVibration.h new file mode 100644 index 0000000000..12df0733fd --- /dev/null +++ b/src/displayapp/screens/settings/SettingNotifVibration.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include + +#include "components/settings/Settings.h" +#include "components/motor/MotorController.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/CheckboxList.h" + +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingNotifVibration : public Screen { + public: + explicit SettingNotifVibration(Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::MotorController& motorController); + ~SettingNotifVibration() override; + + private: + CheckboxList checkboxList; + }; + } + } +} diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h index 3722c2be39..6f00ef325f 100644 --- a/src/displayapp/screens/settings/Settings.h +++ b/src/displayapp/screens/settings/Settings.h @@ -43,10 +43,12 @@ namespace Pinetime { {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}, {Symbols::clock, "Chimes", Apps::SettingChimes}, + {Symbols::tachometer, "Notif. str.", Apps::SettingNotifVibration}, + {Symbols::tachometer, "Chime strength", Apps::SettingChimeVibration}, {Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold}, + {Symbols::check, "Firmware", Apps::FirmwareValidation}, {Symbols::bluetooth, "Bluetooth", Apps::SettingBluetooth}, - {Symbols::list, "About", Apps::SysInfo}, // {Symbols::none, "None", Apps::None}, From c89882aa27a023534a7992cbceca8ce38d750a1e Mon Sep 17 00:00:00 2001 From: Julian Vos Date: Sun, 26 Jan 2025 13:19:34 +0000 Subject: [PATCH 3/6] chore: ignore node_modules --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 81e49ae083..14872a71c1 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,5 @@ src/arm-none-eabi # clangd .cache/ + +node_modules/ \ No newline at end of file From f32ec363899cb2e3dac533eaf632bf9cd13e5205 Mon Sep 17 00:00:00 2001 From: Julian Vos Date: Sun, 26 Jan 2025 13:24:02 +0000 Subject: [PATCH 4/6] fix: not sure what happened there --- .../settings/SettingNotifVibration.cpp | 66 ------------------- 1 file changed, 66 deletions(-) diff --git a/src/displayapp/screens/settings/SettingNotifVibration.cpp b/src/displayapp/screens/settings/SettingNotifVibration.cpp index 65b61fcf72..8cade2617f 100644 --- a/src/displayapp/screens/settings/SettingNotifVibration.cpp +++ b/src/displayapp/screens/settings/SettingNotifVibration.cpp @@ -1,70 +1,4 @@ -#include "displayapp/screens/settings/SettingNotifVibration.h" - -#include - -#include "displayapp/DisplayApp.h" -#include "displayapp/screens/Styles.h" -#include "displayapp/screens/Screen.h" -#include "displayapp/screens/Symbols.h" - -using namespace Pinetime::Applications::Screens; - -namespace { - struct Option { - Pinetime::Controllers::Settings::VibrationStrength vibrationStrength; - const char* name; - }; - - constexpr std::array options = {{ - {Pinetime::Controllers::Settings::VibrationStrength::Weak, "Weak"}, - {Pinetime::Controllers::Settings::VibrationStrength::Normal, "Normal"}, - {Pinetime::Controllers::Settings::VibrationStrength::Strong, "Strong"}, - }}; - - std::array CreateOptionArray() { - std::array optionArray; - for (size_t i = 0; i < CheckboxList::MaxItems; i++) { - if (i >= options.size()) { - optionArray[i].name = ""; - optionArray[i].enabled = false; - } else { - optionArray[i].name = options[i].name; - optionArray[i].enabled = true; - } - } - return optionArray; - } - uint32_t GetDefaultOption(Pinetime::Controllers::Settings::VibrationStrength currentOption) { - for (size_t i = 0; i < options.size(); i++) { - if (options[i].vibrationStrength == currentOption) { - return i; - } - } - return 0; - } -} - -SettingNotifVibration::SettingNotifVibration(Pinetime::Controllers::Settings& settingsController, - Pinetime::Controllers::MotorController& motorController) - : checkboxList( - 0, - 1, - "Notif. strength", - Symbols::tachometer, - GetDefaultOption(settingsController.GetNotifVibration()), - [&settings = settingsController, &motor = motorController](uint32_t index) { - motor.RunForDuration(static_cast(options[index].vibrationStrength)); - - settings.SetNotifVibration(options[index].vibrationStrength); - settings.SaveSettings(); - }, - CreateOptionArray()) { -} - -SettingNotifVibration::~SettingNotifVibration() { - lv_obj_clean(lv_scr_act()); -} #include "displayapp/screens/settings/SettingNotifVibration.h" #include From ed824a9992bbf187be6ad4c4c5f18565a4382a87 Mon Sep 17 00:00:00 2001 From: Julian Vos Date: Sun, 26 Jan 2025 13:29:09 +0000 Subject: [PATCH 5/6] fix: actually pass settingsController to Notifications screen --- src/displayapp/DisplayApp.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 52ad3440b0..59bb7c2460 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -574,6 +574,7 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio notificationManager, systemTask->nimble().alertService(), motorController, + settingsController, *systemTask, Screens::Notifications::Modes::Preview); break; From 1ba95254c9bd9b2a68019cf64dc6bccfe9e715de Mon Sep 17 00:00:00 2001 From: Julian Vos Date: Sun, 26 Jan 2025 13:58:14 +0000 Subject: [PATCH 6/6] chore: remove leading newline --- src/displayapp/screens/settings/SettingNotifVibration.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/displayapp/screens/settings/SettingNotifVibration.cpp b/src/displayapp/screens/settings/SettingNotifVibration.cpp index 8cade2617f..35cd83da0d 100644 --- a/src/displayapp/screens/settings/SettingNotifVibration.cpp +++ b/src/displayapp/screens/settings/SettingNotifVibration.cpp @@ -1,4 +1,3 @@ - #include "displayapp/screens/settings/SettingNotifVibration.h" #include