Refactor into defined states

This commit is contained in:
mark9064 2024-08-25 22:57:24 +01:00 committed by JF
parent 97ba39988b
commit f032847ae1
6 changed files with 52 additions and 38 deletions

View file

@ -17,6 +17,7 @@ namespace Pinetime {
HandleButtonEvent,
HandleButtonTimerEvent,
OnDisplayTaskSleeping,
OnDisplayTaskAOD,
EnableSleeping,
DisableSleeping,
OnNewDay,

View file

@ -284,9 +284,10 @@ void SystemTask::Work() {
HandleButtonAction(action);
} break;
case Messages::OnDisplayTaskSleeping:
case Messages::OnDisplayTaskAOD:
// The state was set to GoingToSleep when GoToSleep() was called
// If the state is no longer GoingToSleep, we have since transitioned back to Running
// In this case absorb the OnDisplayTaskSleeping
// In this case absorb the OnDisplayTaskSleeping/AOD
// as DisplayApp is about to receive GoToRunning
if (state != SystemTaskState::GoingToSleep) {
break;
@ -298,7 +299,7 @@ void SystemTask::Work() {
}
// Must keep SPI awake when still updating the display for always on
if (!settingsController.GetAlwaysOnDisplay()) {
if (msg == Messages::OnDisplayTaskSleeping) {
spi.Sleep();
}
@ -307,7 +308,11 @@ void SystemTask::Work() {
touchPanel.Sleep();
}
state = SystemTaskState::Sleeping;
if (msg == Messages::OnDisplayTaskSleeping) {
state = SystemTaskState::Sleeping;
} else {
state = SystemTaskState::AODSleeping;
}
break;
case Messages::OnNewDay:
// We might be sleeping (with TWI device disabled.
@ -381,8 +386,8 @@ void SystemTask::GoToRunning() {
if (state == SystemTaskState::Running) {
return;
}
// SPI doesn't go to sleep for always on mode
if (!settingsController.GetAlwaysOnDisplay()) {
// SPI only switched off when entering Sleeping, not AOD or GoingToSleep
if (state == SystemTaskState::Sleeping) {
spi.Wakeup();
}
@ -411,16 +416,22 @@ void SystemTask::GoToSleep() {
return;
}
NRF_LOG_INFO("[systemtask] Going to sleep");
displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToSleep);
if (settingsController.GetAlwaysOnDisplay()) {
displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToAOD);
} else {
displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToSleep);
}
heartRateApp.PushMessage(Pinetime::Applications::HeartRateTask::Messages::GoToSleep);
state = SystemTaskState::GoingToSleep;
};
void SystemTask::UpdateMotion() {
if (IsSleeping() && !(settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) ||
settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake) ||
motionController.GetService()->IsMotionNotificationSubscribed())) {
// Only consider disabling motion updates specifically in the Sleeping state
// AOD needs motion on to show up to date step counts
if (state == SystemTaskState::Sleeping && !(settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) ||
settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake) ||
motionController.GetService()->IsMotionNotificationSubscribed())) {
return;
}

View file

@ -52,7 +52,7 @@ namespace Pinetime {
namespace System {
class SystemTask {
public:
enum class SystemTaskState { Sleeping, Running, GoingToSleep };
enum class SystemTaskState { Sleeping, Running, GoingToSleep, AODSleeping };
SystemTask(Drivers::SpiMaster& spi,
Pinetime::Drivers::SpiNorFlash& spiNorFlash,
Drivers::TwiMaster& twiMaster,