summaryrefslogtreecommitdiff
path: root/src/SystemTask
diff options
context:
space:
mode:
authorJF <jf@codingfield.com>2020-09-26 15:09:24 (GMT)
committerGitea <gitea@fake.local>2020-09-26 15:09:24 (GMT)
commitb6a910e52ed98b662e6586f45cfe9c6997f8f158 (patch)
treed74185cbf682cde40e5de5bfa2f620ae201565a9 /src/SystemTask
parentbe05997272b7b1d1b25b122c8162ac6f4c1c12a2 (diff)
parent3e612e79ba82bac69258094d468c996c41b29612 (diff)
Merge branch 'develop' of JF/PineTime into master
Diffstat (limited to 'src/SystemTask')
-rw-r--r--src/SystemTask/SystemMonitor.h2
-rw-r--r--src/SystemTask/SystemTask.cpp56
-rw-r--r--src/SystemTask/SystemTask.h13
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
+}