InfiniTime.git

commit 7ca0418c82173fa1cff9537eaf1f030b5a712e9a

Author: mark9064 <30447455+mark9064@users.noreply.github.com>

Refactor doNotGoToSleep to a wakelock counter

 src/CMakeLists.txt | 3 ++
 src/displayapp/screens/Alarm.cpp | 6 ++--
 src/displayapp/screens/Alarm.h | 3 +
 src/displayapp/screens/FlashLight.cpp | 5 +--
 src/displayapp/screens/FlashLight.h | 3 +
 src/displayapp/screens/HeartRate.cpp | 9 +++----
 src/displayapp/screens/HeartRate.h | 3 +
 src/displayapp/screens/Metronome.cpp | 7 ++---
 src/displayapp/screens/Metronome.h | 3 +
 src/displayapp/screens/Notifications.cpp | 7 ++---
 src/displayapp/screens/Notifications.h | 3 +
 src/displayapp/screens/StopWatch.cpp | 7 ++---
 src/displayapp/screens/StopWatch.h | 3 +
 src/systemtask/SystemTask.cpp | 16 +++++---------
 src/systemtask/SystemTask.h | 4 +-
 src/systemtask/WakeLock.cpp | 27 +++++++++++++++++++++++++
 src/systemtask/WakeLock.h | 19 ++++++++++++++++++


diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index dc3b6176a17117cf30ac6c8bd5a128bac3b9284a..0a97a0158b2f9af46d4ef4a073906e25ea5481e8 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -478,6 +478,7 @@         displayapp/InfiniTimeTheme.cpp
 
         systemtask/SystemTask.cpp
         systemtask/SystemMonitor.cpp
+        systemtask/WakeLock.cpp
         drivers/TwiMaster.cpp
 
         heartratetask/HeartRateTask.cpp
@@ -542,6 +543,7 @@         FreeRTOS/port_cmsis.c
 
         systemtask/SystemTask.cpp
         systemtask/SystemMonitor.cpp
+        systemtask/WakeLock.cpp
         drivers/TwiMaster.cpp
         components/rle/RleDecoder.cpp
         components/heartrate/HeartRateController.cpp
@@ -660,6 +662,7 @@         displayapp/LittleVgl.h
         displayapp/InfiniTimeTheme.h
         systemtask/SystemTask.h
         systemtask/SystemMonitor.h
+        systemtask/WakeLock.h
         displayapp/screens/Symbols.h
         drivers/TwiMaster.h
         heartratetask/HeartRateTask.h




diff --git a/src/displayapp/screens/Alarm.cpp b/src/displayapp/screens/Alarm.cpp
index cbc702f3124b222facf9b7ca92c59f2b0596f789..292fb075afe73d5fe0d060e87132bdc580f5e6ac 100644
--- a/src/displayapp/screens/Alarm.cpp
+++ b/src/displayapp/screens/Alarm.cpp
@@ -48,7 +48,7 @@ Alarm::Alarm(Controllers::AlarmController& alarmController,
              Controllers::Settings::ClockType clockType,
              System::SystemTask& systemTask,
              Controllers::MotorController& motorController)
-  : alarmController {alarmController}, systemTask {systemTask}, motorController {motorController} {
+  : alarmController {alarmController}, wakeLock(systemTask), motorController {motorController} {
 
   hourCounter.Create();
   lv_obj_align(hourCounter.GetObject(), nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0);
@@ -205,7 +205,7 @@   lv_obj_set_hidden(enableSwitch, true);
   lv_obj_set_hidden(btnStop, false);
   taskStopAlarm = lv_task_create(StopAlarmTaskCallback, pdMS_TO_TICKS(60 * 1000), LV_TASK_PRIO_MID, this);
   motorController.StartRinging();
-  systemTask.PushMessage(System::Messages::DisableSleeping);
+  wakeLock.Lock();
 }
 
 void Alarm::StopAlerting() {
@@ -216,7 +216,7 @@   if (taskStopAlarm != nullptr) {
     lv_task_del(taskStopAlarm);
     taskStopAlarm = nullptr;
   }
-  systemTask.PushMessage(System::Messages::EnableSleeping);
+  wakeLock.Release();
   lv_obj_set_hidden(enableSwitch, false);
   lv_obj_set_hidden(btnStop, true);
 }




diff --git a/src/displayapp/screens/Alarm.h b/src/displayapp/screens/Alarm.h
index 444102cb011307ce26935ba50ac68c7701d7c3ca..a875b2756ea067d33df19e6fbd9881cc758ce101 100644
--- a/src/displayapp/screens/Alarm.h
+++ b/src/displayapp/screens/Alarm.h
@@ -22,6 +22,7 @@ #include "components/settings/Settings.h"
 #include "displayapp/screens/Screen.h"
 #include "displayapp/widgets/Counter.h"
 #include "displayapp/Controllers.h"
+#include "systemtask/WakeLock.h"
 #include "Symbols.h"
 
 namespace Pinetime {
@@ -43,7 +44,7 @@         void StopAlerting();
 
       private:
         Controllers::AlarmController& alarmController;
-        System::SystemTask& systemTask;
+        System::WakeLock wakeLock;
         Controllers::MotorController& motorController;
 
         lv_obj_t *btnStop, *txtStop, *btnRecur, *txtRecur, *btnInfo, *enableSwitch;




diff --git a/src/displayapp/screens/FlashLight.cpp b/src/displayapp/screens/FlashLight.cpp
index f169fac121e916e2e9b42659fc73c3f3f5071557..7e0caff16d0a938416bf0c5215400340b504da51 100644
--- a/src/displayapp/screens/FlashLight.cpp
+++ b/src/displayapp/screens/FlashLight.cpp
@@ -15,7 +15,7 @@   }
 }
 
 FlashLight::FlashLight(System::SystemTask& systemTask, Controllers::BrightnessController& brightnessController)
-  : systemTask {systemTask}, brightnessController {brightnessController} {
+  : wakeLock(systemTask), brightnessController {brightnessController} {
 
   previousBrightnessLevel = brightnessController.Level();
   brightnessController.Set(Controllers::BrightnessController::Levels::Low);
@@ -47,14 +47,13 @@   lv_obj_set_click(backgroundAction, true);
   backgroundAction->user_data = this;
   lv_obj_set_event_cb(backgroundAction, EventHandler);
 
-  systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping);
+  wakeLock.Lock();
 }
 
 FlashLight::~FlashLight() {
   lv_obj_clean(lv_scr_act());
   lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
   brightnessController.Set(previousBrightnessLevel);
-  systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
 }
 
 void FlashLight::SetColors() {




diff --git a/src/displayapp/screens/FlashLight.h b/src/displayapp/screens/FlashLight.h
index c5404e93f92f5956adb5a1bc986bcbec9a989de3..00ef4a7e0bb789fa11de1e02458e7d731cc2f0fa 100644
--- a/src/displayapp/screens/FlashLight.h
+++ b/src/displayapp/screens/FlashLight.h
@@ -3,6 +3,7 @@
 #include "displayapp/screens/Screen.h"
 #include "components/brightness/BrightnessController.h"
 #include "systemtask/SystemTask.h"
+#include "systemtask/WakeLock.h"
 #include <cstdint>
 #include <lvgl/lvgl.h>
 
@@ -23,7 +24,7 @@       private:
         void SetIndicators();
         void SetColors();
 
-        Pinetime::System::SystemTask& systemTask;
+        Pinetime::System::WakeLock wakeLock;
         Controllers::BrightnessController& brightnessController;
 
         Controllers::BrightnessController::Levels brightnessLevel = Controllers::BrightnessController::Levels::High;




diff --git a/src/displayapp/screens/HeartRate.cpp b/src/displayapp/screens/HeartRate.cpp
index 9677be3b81ace8ed7f1556b9b5bfa25d649b68d0..1a84d349289aa96ee596acb591892f24f57b187c 100644
--- a/src/displayapp/screens/HeartRate.cpp
+++ b/src/displayapp/screens/HeartRate.cpp
@@ -29,7 +29,7 @@   }
 }
 
 HeartRate::HeartRate(Controllers::HeartRateController& heartRateController, System::SystemTask& systemTask)
-  : heartRateController {heartRateController}, systemTask {systemTask} {
+  : heartRateController {heartRateController}, wakeLock(systemTask) {
   bool isHrRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped;
   label_hr = lv_label_create(lv_scr_act(), nullptr);
 
@@ -63,7 +63,7 @@
   label_startStop = lv_label_create(btn_startStop, nullptr);
   UpdateStartStopButton(isHrRunning);
   if (isHrRunning) {
-    systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping);
+    wakeLock.Lock();
   }
 
   taskRefresh = lv_task_create(RefreshTaskCallback, 100, LV_TASK_PRIO_MID, this);
@@ -72,7 +72,6 @@
 HeartRate::~HeartRate() {
   lv_task_del(taskRefresh);
   lv_obj_clean(lv_scr_act());
-  systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
 }
 
 void HeartRate::Refresh() {
@@ -101,12 +100,12 @@   if (event == LV_EVENT_CLICKED) {
     if (heartRateController.State() == Controllers::HeartRateController::States::Stopped) {
       heartRateController.Start();
       UpdateStartStopButton(heartRateController.State() != Controllers::HeartRateController::States::Stopped);
-      systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping);
+      wakeLock.Lock();
       lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Colors::highlight);
     } else {
       heartRateController.Stop();
       UpdateStartStopButton(heartRateController.State() != Controllers::HeartRateController::States::Stopped);
-      systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
+      wakeLock.Release();
       lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Colors::lightGray);
     }
   }




diff --git a/src/displayapp/screens/HeartRate.h b/src/displayapp/screens/HeartRate.h
index bf39209a4f9dbf81ae363de45fa0ee814726e9a5..88b4918ca0ac6bd91594e894e657d4536199be0d 100644
--- a/src/displayapp/screens/HeartRate.h
+++ b/src/displayapp/screens/HeartRate.h
@@ -4,6 +4,7 @@ #include 
 #include <chrono>
 #include "displayapp/screens/Screen.h"
 #include "systemtask/SystemTask.h"
+#include "systemtask/WakeLock.h"
 #include "Symbols.h"
 #include <lvgl/src/lv_core/lv_style.h>
 #include <lvgl/src/lv_core/lv_obj.h>
@@ -27,7 +28,7 @@         void OnStartStopEvent(lv_event_t event);
 
       private:
         Controllers::HeartRateController& heartRateController;
-        Pinetime::System::SystemTask& systemTask;
+        Pinetime::System::WakeLock wakeLock;
         void UpdateStartStopButton(bool isRunning);
         lv_obj_t* label_hr;
         lv_obj_t* label_bpm;




diff --git a/src/displayapp/screens/Metronome.cpp b/src/displayapp/screens/Metronome.cpp
index 314fde73e0e9dab13e74f60eead2b1ecac18176d..6b758470a4104b36d4b311cf9720bdc76cddb180 100644
--- a/src/displayapp/screens/Metronome.cpp
+++ b/src/displayapp/screens/Metronome.cpp
@@ -22,7 +22,7 @@   }
 }
 
 Metronome::Metronome(Controllers::MotorController& motorController, System::SystemTask& systemTask)
-  : motorController {motorController}, systemTask {systemTask} {
+  : motorController {motorController}, wakeLock(systemTask) {
 
   bpmArc = lv_arc_create(lv_scr_act(), nullptr);
   bpmArc->user_data = this;
@@ -72,7 +72,6 @@ }
 
 Metronome::~Metronome() {
   lv_task_del(taskRefresh);
-  systemTask.PushMessage(System::Messages::EnableSleeping);
   lv_obj_clean(lv_scr_act());
 }
 
@@ -128,12 +127,12 @@       if (obj == playPause) {
         metronomeStarted = !metronomeStarted;
         if (metronomeStarted) {
           lv_label_set_text_static(lblPlayPause, Symbols::pause);
-          systemTask.PushMessage(System::Messages::DisableSleeping);
+          wakeLock.Lock();
           startTime = xTaskGetTickCount();
           counter = 1;
         } else {
           lv_label_set_text_static(lblPlayPause, Symbols::play);
-          systemTask.PushMessage(System::Messages::EnableSleeping);
+          wakeLock.Release();
         }
       }
       break;




diff --git a/src/displayapp/screens/Metronome.h b/src/displayapp/screens/Metronome.h
index c498048ebcf3b77f0cdbad3ff38013e0facc7a0a..fab7ff872de396fd525cc6e582a15d4a5b259646 100644
--- a/src/displayapp/screens/Metronome.h
+++ b/src/displayapp/screens/Metronome.h
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "systemtask/SystemTask.h"
+#include "systemtask/WakeLock.h"
 #include "components/motor/MotorController.h"
 #include "displayapp/screens/Screen.h"
 #include "Symbols.h"
@@ -21,7 +22,7 @@       private:
         TickType_t startTime = 0;
         TickType_t tappedTime = 0;
         Controllers::MotorController& motorController;
-        System::SystemTask& systemTask;
+        System::WakeLock wakeLock;
         int16_t bpm = 120;
         uint8_t bpb = 4;
         uint8_t counter = 1;




diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp
index 3a3f5f2be5d505cb39040608db9af26055bf9be7..45f72f2e208129c67ef7ac14b4e45a322f19de2c 100644
--- a/src/displayapp/screens/Notifications.cpp
+++ b/src/displayapp/screens/Notifications.cpp
@@ -20,7 +20,7 @@   : app {app},
     notificationManager {notificationManager},
     alertNotificationService {alertNotificationService},
     motorController {motorController},
-    systemTask {systemTask},
+    wakeLock(systemTask),
     mode {mode} {
 
   notificationManager.ClearNewNotificationFlag();
@@ -40,7 +40,7 @@     currentItem = std::make_unique(alertNotificationService, motorController);
     validDisplay = false;
   }
   if (mode == Modes::Preview) {
-    systemTask.PushMessage(System::Messages::DisableSleeping);
+    wakeLock.Lock();
     if (notification.category == Controllers::NotificationManager::Categories::IncomingCall) {
       motorController.StartRinging();
     } else {
@@ -65,7 +65,6 @@ Notifications::~Notifications() {
   lv_task_del(taskRefresh);
   // make sure we stop any vibrations before exiting
   motorController.StopRinging();
-  systemTask.PushMessage(System::Messages::EnableSleeping);
   lv_obj_clean(lv_scr_act());
 }
 
@@ -120,7 +119,7 @@   running = running && currentItem->IsRunning();
 }
 
 void Notifications::OnPreviewInteraction() {
-  systemTask.PushMessage(System::Messages::EnableSleeping);
+  wakeLock.Release();
   motorController.StopRinging();
   if (timeoutLine != nullptr) {
     lv_obj_del(timeoutLine);




diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h
index 114316b35befd21c12fc7ea78d00948fd51a8b47..8488dc5bb2863b7c6d35c1f505da1194fba6f10a 100644
--- a/src/displayapp/screens/Notifications.h
+++ b/src/displayapp/screens/Notifications.h
@@ -8,6 +8,7 @@ #include "displayapp/screens/Screen.h"
 #include "components/ble/NotificationManager.h"
 #include "components/motor/MotorController.h"
 #include "systemtask/SystemTask.h"
+#include "systemtask/WakeLock.h"
 
 namespace Pinetime {
   namespace Controllers {
@@ -73,7 +74,7 @@         DisplayApp* app;
         Pinetime::Controllers::NotificationManager& notificationManager;
         Pinetime::Controllers::AlertNotificationService& alertNotificationService;
         Pinetime::Controllers::MotorController& motorController;
-        System::SystemTask& systemTask;
+        System::WakeLock wakeLock;
         Modes mode = Modes::Normal;
         std::unique_ptr<NotificationItem> currentItem;
         Pinetime::Controllers::NotificationManager::Notification::Id currentId;




diff --git a/src/displayapp/screens/StopWatch.cpp b/src/displayapp/screens/StopWatch.cpp
index f0359da4d468003dc4b072268c7674aeed7c06a6..ff852beb695e63bb91dcf9a9dec41a055db108bd 100644
--- a/src/displayapp/screens/StopWatch.cpp
+++ b/src/displayapp/screens/StopWatch.cpp
@@ -34,7 +34,7 @@
   constexpr TickType_t blinkInterval = pdMS_TO_TICKS(1000);
 }
 
-StopWatch::StopWatch(System::SystemTask& systemTask) : systemTask {systemTask} {
+StopWatch::StopWatch(System::SystemTask& systemTask) : wakeLock(systemTask) {
   static constexpr uint8_t btnWidth = 115;
   static constexpr uint8_t btnHeight = 80;
   btnPlayPause = lv_btn_create(lv_scr_act(), nullptr);
@@ -79,7 +79,6 @@ }
 
 StopWatch::~StopWatch() {
   lv_task_del(taskRefresh);
-  systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
   lv_obj_clean(lv_scr_act());
 }
 
@@ -135,7 +134,7 @@ void StopWatch::Start() {
   SetInterfaceRunning();
   startTime = xTaskGetTickCount();
   currentState = States::Running;
-  systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping);
+  wakeLock.Lock();
 }
 
 void StopWatch::Pause() {
@@ -145,7 +144,7 @@   // Store the current time elapsed in cache
   oldTimeElapsed = laps[lapsDone];
   blinkTime = xTaskGetTickCount() + blinkInterval;
   currentState = States::Halted;
-  systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
+  wakeLock.Release();
 }
 
 void StopWatch::Refresh() {




diff --git a/src/displayapp/screens/StopWatch.h b/src/displayapp/screens/StopWatch.h
index 3386d042b8b6808afbff261a9e311be3d7216517..55a178dcbe7a75593d821c2ae5061034d93c6bc3 100644
--- a/src/displayapp/screens/StopWatch.h
+++ b/src/displayapp/screens/StopWatch.h
@@ -7,6 +7,7 @@ #include 
 #include "portmacro_cmsis.h"
 
 #include "systemtask/SystemTask.h"
+#include "systemtask/WakeLock.h"
 #include "displayapp/apps/Apps.h"
 #include "displayapp/Controllers.h"
 #include "Symbols.h"
@@ -43,7 +44,7 @@         void Reset();
         void Start();
         void Pause();
 
-        Pinetime::System::SystemTask& systemTask;
+        Pinetime::System::WakeLock wakeLock;
         States currentState = States::Init;
         TickType_t startTime;
         TickType_t oldTimeElapsed = 0;




diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp
index 4c623883ee7592d6793a3fc63b393d24486b0693..e55c9ad8e5d98b1f243c4372af124c55b69af17c 100644
--- a/src/systemtask/SystemTask.cpp
+++ b/src/systemtask/SystemTask.cpp
@@ -189,15 +189,11 @@     Messages msg;
     if (xQueueReceive(systemTasksMsgQueue, &msg, 100) == pdTRUE) {
       switch (msg) {
         case Messages::EnableSleeping:
-          // Make sure that exiting an app doesn't enable sleeping,
-          // if the exiting was caused by a firmware update
-          if (!bleController.IsFirmwareUpdating()) {
-            doNotGoToSleep = false;
-          }
+          wakeLocksHeld--;
           break;
         case Messages::DisableSleeping:
           GoToRunning();
-          doNotGoToSleep = true;
+          wakeLocksHeld++;
           break;
         case Messages::GoToRunning:
           GoToRunning();
@@ -243,24 +239,24 @@           bleDiscoveryTimer = 5;
           break;
         case Messages::BleFirmwareUpdateStarted:
           GoToRunning();
-          doNotGoToSleep = true;
+          wakeLocksHeld++;
           displayApp.PushMessage(Pinetime::Applications::Display::Messages::BleFirmwareUpdateStarted);
           break;
         case Messages::BleFirmwareUpdateFinished:
           if (bleController.State() == Pinetime::Controllers::Ble::FirmwareUpdateStates::Validated) {
             NVIC_SystemReset();
           }
-          doNotGoToSleep = false;
+          wakeLocksHeld--;
           break;
         case Messages::StartFileTransfer:
           NRF_LOG_INFO("[systemtask] FS Started");
           GoToRunning();
-          doNotGoToSleep = true;
+          wakeLocksHeld++;
           // TODO add intent of fs access icon or something
           break;
         case Messages::StopFileTransfer:
           NRF_LOG_INFO("[systemtask] FS Stopped");
-          doNotGoToSleep = false;
+          wakeLocksHeld--;
           // TODO add intent of fs access icon or something
           break;
         case Messages::OnTouchEvent:




diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h
index 339587c149d883729b26a628a2f3e632125e39bc..8a4e59548690eb861f8c440e4a034dd55b41afd6 100644
--- a/src/systemtask/SystemTask.h
+++ b/src/systemtask/SystemTask.h
@@ -80,7 +80,7 @@
       void OnTouchEvent();
 
       bool IsSleepDisabled() {
-        return doNotGoToSleep;
+        return wakeLocksHeld > 0;
       }
 
       Pinetime::Controllers::NimbleController& nimble() {
@@ -124,7 +124,7 @@       void Work();
       bool isBleDiscoveryTimerRunning = false;
       uint8_t bleDiscoveryTimer = 0;
       TimerHandle_t measureBatteryTimer;
-      bool doNotGoToSleep = false;
+      uint8_t wakeLocksHeld = 0;
       SystemTaskState state = SystemTaskState::Running;
 
       void HandleButtonAction(Controllers::ButtonActions action);




diff --git a/src/systemtask/WakeLock.cpp b/src/systemtask/WakeLock.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2953f7ee2592e94e170a8181269e2fad671614a9
--- /dev/null
+++ b/src/systemtask/WakeLock.cpp
@@ -0,0 +1,27 @@
+#include "systemtask/WakeLock.h"
+
+using namespace Pinetime::System;
+
+WakeLock::WakeLock(SystemTask& systemTask) : systemTask {systemTask} {
+  lockHeld = false;
+}
+
+WakeLock::~WakeLock() {
+  Release();
+}
+
+void WakeLock::Lock() {
+  if (lockHeld) {
+    return;
+  }
+  systemTask.PushMessage(Messages::DisableSleeping);
+  lockHeld = true;
+}
+
+void WakeLock::Release() {
+  if (!lockHeld) {
+    return;
+  }
+  systemTask.PushMessage(Messages::EnableSleeping);
+  lockHeld = false;
+}




diff --git a/src/systemtask/WakeLock.h b/src/systemtask/WakeLock.h
new file mode 100644
index 0000000000000000000000000000000000000000..5424c009162e00b80787953e185d36624e5bd780
--- /dev/null
+++ b/src/systemtask/WakeLock.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "systemtask/SystemTask.h"
+
+namespace Pinetime {
+  namespace System {
+    class WakeLock {
+    public:
+      WakeLock(SystemTask& systemTask);
+      ~WakeLock();
+      void Lock();
+      void Release();
+
+    private:
+      bool lockHeld;
+      SystemTask& systemTask;
+    };
+  }
+}