diff options
Diffstat (limited to 'src/SystemTask')
-rw-r--r-- | src/SystemTask/SystemTask.cpp | 53 | ||||
-rw-r--r-- | src/SystemTask/SystemTask.h | 9 |
2 files changed, 54 insertions, 8 deletions
diff --git a/src/SystemTask/SystemTask.cpp b/src/SystemTask/SystemTask.cpp index eb36c7b8..b0f58d17 100644 --- a/src/SystemTask/SystemTask.cpp +++ b/src/SystemTask/SystemTask.cpp @@ -15,6 +15,12 @@ using namespace Pinetime::System; +void IdleTimerCallback(TimerHandle_t xTimer) { + auto sysTask = static_cast<SystemTask *>(pvTimerGetTimerID(xTimer)); + sysTask->OnIdle(); +} + + SystemTask::SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, Pinetime::Drivers::SpiNorFlash& spiNorFlash, Drivers::Cst816S &touchPanel, Components::LittleVgl &lvgl, @@ -92,35 +98,55 @@ void SystemTask::Work() { nrfx_gpiote_in_init(pinTouchIrq, &pinConfig, nrfx_gpiote_evt_handler); + idleTimer = xTimerCreate ("idleTimer", idleTime, pdFALSE, this, IdleTimerCallback); + xTimerStart(idleTimer, 0); while(true) { uint8_t msg; if (xQueueReceive(systemTaksMsgQueue, &msg, isSleeping?2500 : 1000)) { Messages message = static_cast<Messages >(msg); switch(message) { - case Messages::GoToRunning: isSleeping = false; break; + case Messages::GoToRunning: + isSleeping = false; + xTimerStart(idleTimer, 0); + nimbleController.StartAdvertising(); + break; case Messages::GoToSleep: NRF_LOG_INFO("[SystemTask] Going to sleep"); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::GoToSleep); - isSleeping = true; break; + isSleeping = true; + break; case Messages::OnNewTime: + xTimerReset(idleTimer, 0); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateDateTime); break; case Messages::OnNewNotification: + xTimerReset(idleTimer, 0); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::NewNotification); break; case Messages::BleConnected: + xTimerReset(idleTimer, 0); isBleDiscoveryTimerRunning = true; bleDiscoveryTimer = 5; break; case Messages::BleFirmwareUpdateStarted: + doNotGoToSleep = true; + if(isSleeping) GoToRunning(); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::BleFirmwareUpdateStarted); break; case Messages::BleFirmwareUpdateFinished: + doNotGoToSleep = false; + xTimerStart(idleTimer, 0); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::BleFirmwareUpdateFinished); if(bleController.State() == Pinetime::Controllers::Ble::FirmwareUpdateStates::Validated) NVIC_SystemReset(); break; + case Messages::OnTouchEvent: + xTimerReset(idleTimer, 0); + break; + case Messages::OnButtonEvent: + xTimerReset(idleTimer, 0); + break; default: break; } } @@ -146,22 +172,29 @@ void SystemTask::Work() { } void SystemTask::OnButtonPushed() { - if(!isSleeping) { NRF_LOG_INFO("[SystemTask] Button pushed"); + PushMessage(Messages::OnButtonEvent); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::ButtonPushed); } else { NRF_LOG_INFO("[SystemTask] Button pushed, waking up"); - displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::GoToRunning); - isSleeping = false; - displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateBatteryLevel); + GoToRunning(); } } +void SystemTask::GoToRunning() { + PushMessage(Messages::GoToRunning); + displayApp->PushMessage(Applications::DisplayApp::Messages::GoToRunning); + displayApp->PushMessage(Applications::DisplayApp::Messages::UpdateBatteryLevel); +} + void SystemTask::OnTouchEvent() { NRF_LOG_INFO("[SystemTask] Touch event"); - displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::TouchEvent); + if(!isSleeping) { + PushMessage(Messages::OnTouchEvent); + displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::TouchEvent); + } } void SystemTask::PushMessage(SystemTask::Messages msg) { @@ -173,3 +206,9 @@ void SystemTask::PushMessage(SystemTask::Messages msg) { // TODO : should I do something here? } } + +void SystemTask::OnIdle() { + if(doNotGoToSleep) return; + NRF_LOG_INFO("Idle timeout -> Going to sleep") + PushMessage(Messages::GoToSleep); +} diff --git a/src/SystemTask/SystemTask.h b/src/SystemTask/SystemTask.h index 53e69fa7..b6ecf7c9 100644 --- a/src/SystemTask/SystemTask.h +++ b/src/SystemTask/SystemTask.h @@ -16,7 +16,7 @@ namespace Pinetime { class SystemTask { public: enum class Messages {GoToSleep, GoToRunning, OnNewTime, OnNewNotification, BleConnected, - BleFirmwareUpdateStarted, BleFirmwareUpdateFinished + BleFirmwareUpdateStarted, BleFirmwareUpdateFinished, OnTouchEvent, OnButtonEvent }; SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, @@ -32,6 +32,9 @@ namespace Pinetime { void OnButtonPushed(); void OnTouchEvent(); + + void OnIdle(); + private: TaskHandle_t taskHandle; @@ -64,7 +67,11 @@ namespace Pinetime { void Work(); bool isBleDiscoveryTimerRunning = false; uint8_t bleDiscoveryTimer = 0; + static constexpr uint32_t idleTime = 5000; + TimerHandle_t idleTimer; + bool doNotGoToSleep = false; + void GoToRunning(); }; } }
\ No newline at end of file |