diff options
| author | JF <jf@codingfield.com> | 2020-09-26 15:09:24 (GMT) |
|---|---|---|
| committer | Gitea <gitea@fake.local> | 2020-09-26 15:09:24 (GMT) |
| commit | b6a910e52ed98b662e6586f45cfe9c6997f8f158 (patch) | |
| tree | d74185cbf682cde40e5de5bfa2f620ae201565a9 /src/SystemTask | |
| parent | be05997272b7b1d1b25b122c8162ac6f4c1c12a2 (diff) | |
| parent | 3e612e79ba82bac69258094d468c996c41b29612 (diff) | |
Merge branch 'develop' of JF/PineTime into master
Diffstat (limited to 'src/SystemTask')
| -rw-r--r-- | src/SystemTask/SystemMonitor.h | 2 | ||||
| -rw-r--r-- | src/SystemTask/SystemTask.cpp | 56 | ||||
| -rw-r--r-- | src/SystemTask/SystemTask.h | 13 |
3 files changed, 48 insertions, 23 deletions
diff --git a/src/SystemTask/SystemMonitor.h b/src/SystemTask/SystemMonitor.h index 8fcfafb..ec1fd81 100644 --- a/src/SystemTask/SystemMonitor.h +++ b/src/SystemTask/SystemMonitor.h @@ -28,7 +28,7 @@ namespace Pinetime { if(xTaskGetTickCount() - lastTick > 10000) { NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize()); auto nb = uxTaskGetSystemState(tasksStatus, 10, NULL); - for (int i = 0; i < nb; i++) { + for (uint32_t i = 0; i < nb; i++) { NRF_LOG_INFO("Task [%s] - %d", tasksStatus[i].pcTaskName, tasksStatus[i].usStackHighWaterMark); if (tasksStatus[i].usStackHighWaterMark < 20) NRF_LOG_INFO("WARNING!!! Task %s task is nearly full, only %dB available", tasksStatus[i].pcTaskName, diff --git a/src/SystemTask/SystemTask.cpp b/src/SystemTask/SystemTask.cpp index 8f56586..a4e6356 100644 --- a/src/SystemTask/SystemTask.cpp +++ b/src/SystemTask/SystemTask.cpp @@ -12,6 +12,7 @@ #include <host/util/util.h> #include <drivers/InternalFlash.h> #include "../main.h" +#include "Components/Ble/NimbleController.h" using namespace Pinetime::System; @@ -57,14 +58,7 @@ void SystemTask::Work() { spi.Init(); spiNorFlash.Init(); - - // Write the 'image OK' flag if it's not already done - // TODO implement a better verification mecanism for the image (ask for user confirmation via UI/BLE ?) - uint32_t* imageOkPtr = reinterpret_cast<uint32_t *>(0x7BFE8); - uint32_t imageOk = *imageOkPtr; - if(imageOk != 1) - Pinetime::Drivers::InternalFlash::WriteWord(0x7BFE8, 1); - + spiNorFlash.Wakeup(); nimbleController.Init(); nimbleController.StartAdvertising(); lcd.Init(); @@ -112,22 +106,33 @@ void SystemTask::Work() { Messages message = static_cast<Messages >(msg); switch(message) { case Messages::GoToRunning: - isSleeping = false; + spi.Wakeup(); + twiMaster.Wakeup(); + + spiNorFlash.Wakeup(); + lcd.Wakeup(); + touchPanel.Wakeup(); + + displayApp->PushMessage(Applications::DisplayApp::Messages::GoToRunning); + displayApp->PushMessage(Applications::DisplayApp::Messages::UpdateBatteryLevel); + xTimerStart(idleTimer, 0); nimbleController.StartAdvertising(); + isSleeping = false; + isWakingUp = false; break; case Messages::GoToSleep: + isGoingToSleep = true; NRF_LOG_INFO("[SystemTask] Going to sleep"); xTimerStop(idleTimer, 0); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::GoToSleep); - isSleeping = true; break; case Messages::OnNewTime: ReloadIdleTimer(); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateDateTime); break; case Messages::OnNewNotification: - if(isSleeping) GoToRunning(); + if(isSleeping && !isWakingUp) GoToRunning(); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::NewNotification); break; case Messages::BleConnected: @@ -137,13 +142,12 @@ void SystemTask::Work() { break; case Messages::BleFirmwareUpdateStarted: doNotGoToSleep = true; - if(isSleeping) GoToRunning(); + if(isSleeping && !isWakingUp) 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; @@ -153,6 +157,16 @@ void SystemTask::Work() { case Messages::OnButtonEvent: ReloadIdleTimer(); break; + case Messages::OnDisplayTaskSleeping: + spiNorFlash.Sleep(); + lcd.Sleep(); + touchPanel.Sleep(); + + spi.Sleep(); + twiMaster.Sleep(); + isSleeping = true; + isGoingToSleep = false; + break; default: break; } } @@ -180,24 +194,27 @@ void SystemTask::Work() { } void SystemTask::OnButtonPushed() { + if(isGoingToSleep) return; 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"); - GoToRunning(); + if(!isWakingUp) { + NRF_LOG_INFO("[SystemTask] Button pushed, waking up"); + GoToRunning(); + } } } void SystemTask::GoToRunning() { + isWakingUp = true; PushMessage(Messages::GoToRunning); - displayApp->PushMessage(Applications::DisplayApp::Messages::GoToRunning); - displayApp->PushMessage(Applications::DisplayApp::Messages::UpdateBatteryLevel); } void SystemTask::OnTouchEvent() { + if(isGoingToSleep) return ; NRF_LOG_INFO("[SystemTask] Touch event"); if(!isSleeping) { PushMessage(Messages::OnTouchEvent); @@ -206,6 +223,9 @@ void SystemTask::OnTouchEvent() { } void SystemTask::PushMessage(SystemTask::Messages msg) { + if(msg == Messages::GoToSleep) { + isGoingToSleep = true; + } BaseType_t xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; xQueueSendFromISR(systemTaksMsgQueue, &msg, &xHigherPriorityTaskWoken); @@ -222,6 +242,6 @@ void SystemTask::OnIdle() { } void SystemTask::ReloadIdleTimer() const { - if(isSleeping) return; + if(isSleeping || isGoingToSleep) return; xTimerReset(idleTimer, 0); } diff --git a/src/SystemTask/SystemTask.h b/src/SystemTask/SystemTask.h index 8fa7e7d..40277cf 100644 --- a/src/SystemTask/SystemTask.h +++ b/src/SystemTask/SystemTask.h @@ -8,16 +8,17 @@ #include <Components/Battery/BatteryController.h> #include <DisplayApp/DisplayApp.h> #include <drivers/Watchdog.h> -#include <Components/Ble/NimbleController.h> #include <drivers/SpiNorFlash.h> #include "SystemMonitor.h" +#include "Components/Ble/NimbleController.h" +#include "timers.h" namespace Pinetime { namespace System { class SystemTask { public: enum class Messages {GoToSleep, GoToRunning, OnNewTime, OnNewNotification, BleConnected, - BleFirmwareUpdateStarted, BleFirmwareUpdateFinished, OnTouchEvent, OnButtonEvent + BleFirmwareUpdateStarted, BleFirmwareUpdateFinished, OnTouchEvent, OnButtonEvent, OnDisplayTaskSleeping }; SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, @@ -37,6 +38,8 @@ namespace Pinetime { void OnIdle(); + Pinetime::Controllers::NimbleController& nimble() {return nimbleController;}; + private: TaskHandle_t taskHandle; @@ -51,7 +54,9 @@ namespace Pinetime { Pinetime::Controllers::Ble& bleController; Pinetime::Controllers::DateTime& dateTimeController; QueueHandle_t systemTaksMsgQueue; - bool isSleeping = false; + std::atomic<bool> isSleeping{false}; + std::atomic<bool> isGoingToSleep{false}; + std::atomic<bool> isWakingUp{false}; Pinetime::Drivers::Watchdog watchdog; Pinetime::Drivers::WatchdogView watchdogView; Pinetime::Controllers::NotificationManager& notificationManager; @@ -84,4 +89,4 @@ namespace Pinetime { #endif }; } -}
\ No newline at end of file +} |
