From 7ad970ea8751deace62711ca0980d5650db4f7b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Sun, 7 May 2023 18:20:49 +0200 Subject: [PATCH 1/3] Power optimization - Increase SystemTaskPeriod. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Increase the timeout on the message queue in SystemTask. This reduces the power consumption by 60-70µs in sleep mode. --- src/systemtask/SystemTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index b199d53f..f0cc0adc 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -181,7 +181,7 @@ void SystemTask::Work() { UpdateMotion(); Messages msg; - if (xQueueReceive(systemTasksMsgQueue, &msg, 100) == pdTRUE) { + if (xQueueReceive(systemTasksMsgQueue, &msg, 4000) == pdTRUE) { switch (msg) { case Messages::EnableSleeping: // Make sure that exiting an app doesn't enable sleeping, From 491d3ae20f5d888e8eaa3ff49af1c3cff85c0fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Mon, 8 May 2023 21:07:30 +0200 Subject: [PATCH 2/3] Power optimization - Increase SystemTaskPeriod Improve the timeout on the queue : by default, the timeout is 100ms, and it's extended to 4s in sleep mode, when no motion based wake up option is enabled. --- src/systemtask/SystemTask.cpp | 13 ++++++++++++- src/systemtask/SystemTask.h | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index f0cc0adc..67b1dbba 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -181,7 +181,7 @@ void SystemTask::Work() { UpdateMotion(); Messages msg; - if (xQueueReceive(systemTasksMsgQueue, &msg, 4000) == pdTRUE) { + if (xQueueReceive(systemTasksMsgQueue, &msg, GetQueueTimeout()) == pdTRUE) { switch (msg) { case Messages::EnableSleeping: // Make sure that exiting an app doesn't enable sleeping, @@ -504,3 +504,14 @@ void SystemTask::PushMessage(System::Messages msg) { xQueueSend(systemTasksMsgQueue, &msg, portMAX_DELAY); } } + +TickType_t SystemTask::GetQueueTimeout() const { + // By default, the timeout on the queue is 100ms. + // It's extended to 4s in sleep mode, when no motion based wake up option is enabled. + TickType_t timeout = pdMS_TO_TICKS(100); + if (state == SystemTaskState::Sleeping && !settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) && + !settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake)) { + timeout = pdMS_TO_TICKS(4000); + } + return timeout; +} \ No newline at end of file diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index 79f1cf44..de5478f2 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -138,6 +138,8 @@ namespace Pinetime { bool stepCounterMustBeReset = false; static constexpr TickType_t batteryMeasurementPeriod = pdMS_TO_TICKS(10 * 60 * 1000); + TickType_t GetQueueTimeout() const; + SystemMonitor monitor; }; } From 6e03b47eb32615a91ee23133196e56554845570a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Thu, 18 May 2023 15:49:14 +0200 Subject: [PATCH 3/3] Power optimization - Increase SystemTask Period Increase the SystemTask period also when the notification mode is set to Sleep (as it also disables the motion-based wake options). --- src/systemtask/SystemTask.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 67b1dbba..899a94e9 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -509,8 +509,9 @@ TickType_t SystemTask::GetQueueTimeout() const { // By default, the timeout on the queue is 100ms. // It's extended to 4s in sleep mode, when no motion based wake up option is enabled. TickType_t timeout = pdMS_TO_TICKS(100); - if (state == SystemTaskState::Sleeping && !settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) && - !settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake)) { + if (state == SystemTaskState::Sleeping && ((!settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) && + !settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake)) || + settingsController.GetNotificationStatus() == Controllers::Settings::Notification::Sleep)) { timeout = pdMS_TO_TICKS(4000); } return timeout;