From ae6fb5d51c7631aa33435947cfaac19bc1080895 Mon Sep 17 00:00:00 2001 From: SteveAmor Date: Fri, 21 Aug 2026 18:19:30 +0100 Subject: [PATCH 1/4] Notification screen at max brightness when walking --- src/components/motion/MotionController.cpp | 3 +++ src/components/motion/MotionController.h | 5 +++++ src/displayapp/DisplayApp.cpp | 4 ++++ src/displayapp/screens/Notifications.cpp | 11 +++++++++++ src/displayapp/screens/Notifications.h | 8 ++++++++ 5 files changed, 31 insertions(+) diff --git a/src/components/motion/MotionController.cpp b/src/components/motion/MotionController.cpp index ce959f0efb..79e16f192d 100644 --- a/src/components/motion/MotionController.cpp +++ b/src/components/motion/MotionController.cpp @@ -76,6 +76,9 @@ void MotionController::Update(int16_t x, int16_t y, int16_t z, uint32_t nbSteps) int32_t deltaSteps = nbSteps - oldSteps; if (deltaSteps > 0) { currentTripSteps += deltaSteps; + locomotionDecay = 50; // 5 seconds x 10Hz + } else if (locomotionDecay > 0) { + locomotionDecay--; } SetSteps(Days::Today, nbSteps); } diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h index ed6cbbd144..f98063677a 100644 --- a/src/components/motion/MotionController.h +++ b/src/components/motion/MotionController.h @@ -74,6 +74,10 @@ namespace Pinetime { return service; } + bool Locomotion() const { + return (locomotionDecay != 0); + } + private: Utility::CircularBuffer nbSteps = {0}; uint32_t currentTripSteps = 0; @@ -112,6 +116,7 @@ namespace Pinetime { DeviceTypes deviceType = DeviceTypes::Unknown; Pinetime::Controllers::MotionService* service = nullptr; + uint8_t locomotionDecay = 0; }; } } diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 84fa603622..fa9b98183c 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -568,6 +568,8 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio notificationManager, systemTask->nimble().alertService(), motorController, + brightnessController, + motionController, *systemTask, Screens::Notifications::Modes::Normal); break; @@ -576,6 +578,8 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio notificationManager, systemTask->nimble().alertService(), motorController, + brightnessController, + motionController, *systemTask, Screens::Notifications::Modes::Preview); break; diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 7d937c6d8a..0d0686d736 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -2,6 +2,8 @@ #include "displayapp/DisplayApp.h" #include "components/ble/MusicService.h" #include "components/ble/AlertNotificationService.h" +#include "components/brightness/BrightnessController.h" +#include "components/motion/MotionController.h" #include "displayapp/screens/Symbols.h" #include #include "displayapp/InfiniTimeTheme.h" @@ -14,12 +16,16 @@ Notifications::Notifications(DisplayApp* app, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::AlertNotificationService& alertNotificationService, Pinetime::Controllers::MotorController& motorController, + Pinetime::Controllers::BrightnessController& brightnessController, + Pinetime::Controllers::MotionController& motionController, System::SystemTask& systemTask, Modes mode) : app {app}, notificationManager {notificationManager}, alertNotificationService {alertNotificationService}, motorController {motorController}, + brightnessController {brightnessController}, + motionController {motionController}, wakeLock(systemTask), mode {mode} { @@ -58,6 +64,10 @@ Notifications::Notifications(DisplayApp* app, interacted = false; } + previousBrightnessLevel = brightnessController.Level(); + if (motionController.Locomotion()) { + brightnessController.Set(Pinetime::Controllers::BrightnessController::Levels::High); + } taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); } @@ -66,6 +76,7 @@ Notifications::~Notifications() { // make sure we stop any vibrations before exiting motorController.StopRinging(); lv_obj_clean(lv_scr_act()); + brightnessController.Set(previousBrightnessLevel); } void Notifications::Refresh() { diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index 8488dc5bb2..0a20472fb4 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -7,6 +7,8 @@ #include "displayapp/screens/Screen.h" #include "components/ble/NotificationManager.h" #include "components/motor/MotorController.h" +#include "components/brightness/BrightnessController.h" +#include "components/motion/MotionController.h" #include "systemtask/SystemTask.h" #include "systemtask/WakeLock.h" @@ -25,6 +27,8 @@ namespace Pinetime { Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::AlertNotificationService& alertNotificationService, Pinetime::Controllers::MotorController& motorController, + Pinetime::Controllers::BrightnessController& brightnessController, + Pinetime::Controllers::MotionController& motionController, System::SystemTask& systemTask, Modes mode); ~Notifications() override; @@ -74,6 +78,8 @@ namespace Pinetime { Pinetime::Controllers::NotificationManager& notificationManager; Pinetime::Controllers::AlertNotificationService& alertNotificationService; Pinetime::Controllers::MotorController& motorController; + Pinetime::Controllers::BrightnessController& brightnessController; + Pinetime::Controllers::MotionController& motionController; System::WakeLock wakeLock; Modes mode = Modes::Normal; std::unique_ptr currentItem; @@ -90,6 +96,8 @@ namespace Pinetime { bool dismissingNotification = false; + Pinetime::Controllers::BrightnessController::Levels previousBrightnessLevel; + lv_task_t* taskRefresh; }; } From b810d4974aa9dc880ce272f16fbe7af46f70584d Mon Sep 17 00:00:00 2001 From: SteveAmor Date: Sat, 22 Aug 2026 07:00:49 +0100 Subject: [PATCH 2/4] Let DisplayApp reset the brightness --- src/displayapp/screens/Notifications.cpp | 2 -- src/displayapp/screens/Notifications.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 0d0686d736..7e68b6aa72 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -64,7 +64,6 @@ Notifications::Notifications(DisplayApp* app, interacted = false; } - previousBrightnessLevel = brightnessController.Level(); if (motionController.Locomotion()) { brightnessController.Set(Pinetime::Controllers::BrightnessController::Levels::High); } @@ -76,7 +75,6 @@ Notifications::~Notifications() { // make sure we stop any vibrations before exiting motorController.StopRinging(); lv_obj_clean(lv_scr_act()); - brightnessController.Set(previousBrightnessLevel); } void Notifications::Refresh() { diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index 0a20472fb4..92eb36dd21 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -96,8 +96,6 @@ namespace Pinetime { bool dismissingNotification = false; - Pinetime::Controllers::BrightnessController::Levels previousBrightnessLevel; - lv_task_t* taskRefresh; }; } From b7c08e6f341ebcfd3468efe511f31889c06d7158 Mon Sep 17 00:00:00 2001 From: SteveAmor Date: Sat, 22 Aug 2026 17:17:11 +0100 Subject: [PATCH 3/4] Option to toggle Motion Auto Bright (MAB) in Display settings --- src/components/settings/Settings.h | 12 +++++++++++ src/displayapp/DisplayApp.cpp | 2 ++ src/displayapp/screens/Notifications.cpp | 4 +++- src/displayapp/screens/Notifications.h | 3 +++ .../screens/settings/SettingDisplay.cpp | 21 ++++++++++++++++++- .../screens/settings/SettingDisplay.h | 2 ++ 6 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 9133d3fea1..7c06768163 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -244,6 +244,17 @@ namespace Pinetime { return settings.alwaysOnDisplay; } + void SetMotionAutoBrightSetting(bool state) { + if (state != settings.motionAutoBright) { + settingsChanged = true; + } + settings.motionAutoBright = state; + } + + bool GetMotionAutoBrightSetting() const { + return settings.motionAutoBright; + } + void SetShakeThreshold(uint16_t thresh) { if (settings.shakeWakeThreshold != thresh) { settings.shakeWakeThreshold = thresh; @@ -362,6 +373,7 @@ namespace Pinetime { uint32_t screenTimeOut = 15000; bool alwaysOnDisplay = false; + bool motionAutoBright = false; ClockType clockType = ClockType::H24; WeatherFormat weatherFormat = WeatherFormat::Metric; diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index fa9b98183c..5c8aec0c71 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -570,6 +570,7 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio motorController, brightnessController, motionController, + settingsController, *systemTask, Screens::Notifications::Modes::Normal); break; @@ -580,6 +581,7 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio motorController, brightnessController, motionController, + settingsController, *systemTask, Screens::Notifications::Modes::Preview); break; diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 7e68b6aa72..f2ef2546e9 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -18,6 +18,7 @@ Notifications::Notifications(DisplayApp* app, Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Controllers::MotionController& motionController, + Pinetime::Controllers::Settings& settingsController, System::SystemTask& systemTask, Modes mode) : app {app}, @@ -26,6 +27,7 @@ Notifications::Notifications(DisplayApp* app, motorController {motorController}, brightnessController {brightnessController}, motionController {motionController}, + settingsController {settingsController}, wakeLock(systemTask), mode {mode} { @@ -64,7 +66,7 @@ Notifications::Notifications(DisplayApp* app, interacted = false; } - if (motionController.Locomotion()) { + if (settingsController.GetMotionAutoBrightSetting() && motionController.Locomotion()) { brightnessController.Set(Pinetime::Controllers::BrightnessController::Levels::High); } taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index 92eb36dd21..1b23f35cf9 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -9,6 +9,7 @@ #include "components/motor/MotorController.h" #include "components/brightness/BrightnessController.h" #include "components/motion/MotionController.h" +#include #include "systemtask/SystemTask.h" #include "systemtask/WakeLock.h" @@ -29,6 +30,7 @@ namespace Pinetime { Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Controllers::MotionController& motionController, + Pinetime::Controllers::Settings& settingsController, System::SystemTask& systemTask, Modes mode); ~Notifications() override; @@ -80,6 +82,7 @@ namespace Pinetime { Pinetime::Controllers::MotorController& motorController; Pinetime::Controllers::BrightnessController& brightnessController; Pinetime::Controllers::MotionController& motionController; + Pinetime::Controllers::Settings& settingsController; System::WakeLock wakeLock; Modes mode = Modes::Normal; std::unique_ptr currentItem; diff --git a/src/displayapp/screens/settings/SettingDisplay.cpp b/src/displayapp/screens/settings/SettingDisplay.cpp index bbc188a9d7..787e5e4040 100644 --- a/src/displayapp/screens/settings/SettingDisplay.cpp +++ b/src/displayapp/screens/settings/SettingDisplay.cpp @@ -20,6 +20,13 @@ namespace { screen->ToggleAlwaysOn(); } } + + void MotionAutoBrightEventHandler(lv_obj_t* obj, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { + auto* screen = static_cast(obj->user_data); + screen->ToggleMotionAutoBright(); + } + } } constexpr std::array SettingDisplay::options; @@ -64,11 +71,18 @@ SettingDisplay::SettingDisplay(Pinetime::Controllers::Settings& settingsControll } alwaysOnCheckbox = lv_checkbox_create(container1, nullptr); - lv_checkbox_set_text(alwaysOnCheckbox, "Always On"); + lv_checkbox_set_text(alwaysOnCheckbox, "AOD"); lv_checkbox_set_checked(alwaysOnCheckbox, settingsController.GetAlwaysOnDisplaySetting()); lv_obj_add_state(alwaysOnCheckbox, LV_STATE_DEFAULT); alwaysOnCheckbox->user_data = this; lv_obj_set_event_cb(alwaysOnCheckbox, AlwaysOnEventHandler); + + motionAutoBrightCheckbox = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text(motionAutoBrightCheckbox, "MAB"); + lv_checkbox_set_checked(motionAutoBrightCheckbox, settingsController.GetMotionAutoBrightSetting()); + lv_obj_add_state(motionAutoBrightCheckbox, LV_STATE_DEFAULT); + motionAutoBrightCheckbox->user_data = this; + lv_obj_set_event_cb(motionAutoBrightCheckbox, MotionAutoBrightEventHandler); } SettingDisplay::~SettingDisplay() { @@ -81,6 +95,11 @@ void SettingDisplay::ToggleAlwaysOn() { lv_checkbox_set_checked(alwaysOnCheckbox, settingsController.GetAlwaysOnDisplaySetting()); } +void SettingDisplay::ToggleMotionAutoBright() { + settingsController.SetMotionAutoBrightSetting(!settingsController.GetMotionAutoBrightSetting()); + lv_checkbox_set_checked(motionAutoBrightCheckbox, settingsController.GetMotionAutoBrightSetting()); +} + void SettingDisplay::UpdateSelected(lv_obj_t* object, lv_event_t event) { if (event == LV_EVENT_CLICKED) { for (unsigned int i = 0; i < options.size(); i++) { diff --git a/src/displayapp/screens/settings/SettingDisplay.h b/src/displayapp/screens/settings/SettingDisplay.h index 3bd10a62a4..c6109024ba 100644 --- a/src/displayapp/screens/settings/SettingDisplay.h +++ b/src/displayapp/screens/settings/SettingDisplay.h @@ -19,6 +19,7 @@ namespace Pinetime { void UpdateSelected(lv_obj_t* object, lv_event_t event); void ToggleAlwaysOn(); + void ToggleMotionAutoBright(); private: static constexpr std::array options = {5000, 7000, 10000, 15000, 20000, 30000}; @@ -26,6 +27,7 @@ namespace Pinetime { Controllers::Settings& settingsController; lv_obj_t* cbOption[options.size()]; lv_obj_t* alwaysOnCheckbox; + lv_obj_t* motionAutoBrightCheckbox; }; } } From 5c76154f67638c5f3f425f577a61fbb4cae89f1b Mon Sep 17 00:00:00 2001 From: SteveAmor Date: Sat, 22 Aug 2026 17:36:58 +0100 Subject: [PATCH 4/4] Increase decay to 10 seconds --- src/components/motion/MotionController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/motion/MotionController.cpp b/src/components/motion/MotionController.cpp index 79e16f192d..ce37412d42 100644 --- a/src/components/motion/MotionController.cpp +++ b/src/components/motion/MotionController.cpp @@ -76,7 +76,7 @@ void MotionController::Update(int16_t x, int16_t y, int16_t z, uint32_t nbSteps) int32_t deltaSteps = nbSteps - oldSteps; if (deltaSteps > 0) { currentTripSteps += deltaSteps; - locomotionDecay = 50; // 5 seconds x 10Hz + locomotionDecay = 100; // 10 seconds x 10Hz } else if (locomotionDecay > 0) { locomotionDecay--; }