summaryrefslogtreecommitdiff
path: root/src/systemtask
diff options
context:
space:
mode:
authorRiku Isokoski <riksu9000@gmail.com>2021-08-01 11:47:26 +0300
committerRiku Isokoski <riksu9000@gmail.com>2021-08-01 11:47:26 +0300
commit5bdef365f2b8f8e0ba06d04216749205a5bba50d (patch)
treeb0260cd863c37ca1cee57fd813647706e2d07f77 /src/systemtask
parent9e8dd9a1e63523f4e3ed322978e5b5e079c50375 (diff)
parent514481ef7f9c71ad816b31d979c6ab39ce9380dd (diff)
Merge branch 'develop' into HEAD
Diffstat (limited to 'src/systemtask')
-rw-r--r--src/systemtask/Messages.h26
-rw-r--r--src/systemtask/SystemTask.cpp212
-rw-r--r--src/systemtask/SystemTask.h69
3 files changed, 208 insertions, 99 deletions
diff --git a/src/systemtask/Messages.h b/src/systemtask/Messages.h
new file mode 100644
index 00000000..3a195e2d
--- /dev/null
+++ b/src/systemtask/Messages.h
@@ -0,0 +1,26 @@
+#pragma once
+
+namespace Pinetime {
+ namespace System {
+ enum class Messages {
+ GoToSleep,
+ GoToRunning,
+ TouchWakeUp,
+ OnNewTime,
+ OnNewNotification,
+ OnTimerDone,
+ OnNewCall,
+ BleConnected,
+ UpdateTimeOut,
+ BleFirmwareUpdateStarted,
+ BleFirmwareUpdateFinished,
+ OnTouchEvent,
+ OnButtonEvent,
+ OnDisplayTaskSleeping,
+ EnableSleeping,
+ DisableSleeping,
+ OnNewDay,
+ OnChargingEvent
+ };
+ }
+}
diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp
index 24fe4f4c..f05ade65 100644
--- a/src/systemtask/SystemTask.cpp
+++ b/src/systemtask/SystemTask.cpp
@@ -27,6 +27,19 @@
using namespace Pinetime::System;
+namespace {
+ static inline bool in_isr(void) {
+ return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;
+ }
+}
+
+void DimTimerCallback(TimerHandle_t xTimer) {
+
+ NRF_LOG_INFO("DimTimerCallback");
+ auto sysTask = static_cast<SystemTask*>(pvTimerGetTimerID(xTimer));
+ sysTask->OnDim();
+}
+
void IdleTimerCallback(TimerHandle_t xTimer) {
NRF_LOG_INFO("IdleTimerCallback");
@@ -42,10 +55,19 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi,
Components::LittleVgl& lvgl,
Controllers::Battery& batteryController,
Controllers::Ble& bleController,
+ Controllers::DateTime& dateTimeController,
+ Controllers::TimerController& timerController,
+ Drivers::Watchdog& watchdog,
+ Pinetime::Controllers::NotificationManager& notificationManager,
Pinetime::Controllers::MotorController& motorController,
Pinetime::Drivers::Hrs3300& heartRateSensor,
+ Pinetime::Controllers::MotionController& motionController,
Pinetime::Drivers::Bma421& motionSensor,
- Controllers::Settings& settingsController)
+ Controllers::Settings& settingsController,
+ Pinetime::Controllers::HeartRateController& heartRateController,
+ Pinetime::Applications::DisplayApp& displayApp,
+ Pinetime::Applications::HeartRateTask& heartRateApp,
+ Pinetime::Controllers::FS& fs)
: spi {spi},
lcd {lcd},
spiNorFlash {spiNorFlash},
@@ -53,20 +75,26 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi,
touchPanel {touchPanel},
lvgl {lvgl},
batteryController {batteryController},
- heartRateController {*this},
bleController {bleController},
- dateTimeController {*this},
- watchdog {},
- watchdogView {watchdog},
+ dateTimeController {dateTimeController},
+ timerController {timerController},
+ watchdog {watchdog},
+ notificationManager{notificationManager},
motorController {motorController},
heartRateSensor {heartRateSensor},
motionSensor {motionSensor},
settingsController {settingsController},
+ heartRateController{heartRateController},
+ motionController{motionController},
+ displayApp{displayApp},
+ heartRateApp(heartRateApp),
+ fs{fs},
nimbleController(*this, bleController, dateTimeController, notificationManager, batteryController, spiNorFlash, heartRateController) {
- systemTasksMsgQueue = xQueueCreate(10, 1);
+
}
void SystemTask::Start() {
+ systemTasksMsgQueue = xQueueCreate(10, 1);
if (pdPASS != xTaskCreate(SystemTask::Process, "MAIN", 350, this, 0, &taskHandle))
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
}
@@ -83,48 +111,43 @@ void SystemTask::Work() {
NRF_LOG_INFO("Last reset reason : %s", Pinetime::Drivers::Watchdog::ResetReasonToString(watchdog.ResetReason()));
APP_GPIOTE_INIT(2);
+ app_timer_init();
+
spi.Init();
spiNorFlash.Init();
spiNorFlash.Wakeup();
+
+ fs.Init();
+
nimbleController.Init();
nimbleController.StartAdvertising();
- brightnessController.Init();
lcd.Init();
twiMaster.Init();
touchPanel.Init();
+ dateTimeController.Register(this);
batteryController.Init();
motorController.Init();
motionSensor.SoftReset();
+ timerController.Register(this);
+ timerController.Init();
// Reset the TWI device because the motion sensor chip most probably crashed it...
twiMaster.Sleep();
twiMaster.Init();
motionSensor.Init();
+ motionController.Init(motionSensor.DeviceType());
settingsController.Init();
- displayApp = std::make_unique<Pinetime::Applications::DisplayApp>(lcd,
- lvgl,
- touchPanel,
- batteryController,
- bleController,
- dateTimeController,
- watchdogView,
- *this,
- notificationManager,
- heartRateController,
- settingsController,
- motorController,
- motionController);
- displayApp->Start();
-
- displayApp->PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
+ displayApp.Register(this);
+ displayApp.Start();
+
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
heartRateSensor.Init();
heartRateSensor.Disable();
- heartRateApp = std::make_unique<Pinetime::Applications::HeartRateTask>(heartRateSensor, heartRateController);
- heartRateApp->Start();
+ heartRateApp.Start();
nrf_gpio_cfg_sense_input(pinButton, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pulldown, (nrf_gpio_pin_sense_t) GPIO_PIN_CNF_SENSE_High);
nrf_gpio_cfg_output(15);
@@ -149,8 +172,22 @@ void SystemTask::Work() {
nrfx_gpiote_in_init(pinTouchIrq, &pinConfig, nrfx_gpiote_evt_handler);
- idleTimer = xTimerCreate("idleTimer", pdMS_TO_TICKS(settingsController.GetScreenTimeOut()), pdFALSE, this, IdleTimerCallback);
- xTimerStart(idleTimer, 0);
+ pinConfig.sense = NRF_GPIOTE_POLARITY_TOGGLE;
+ pinConfig.pull = NRF_GPIO_PIN_NOPULL;
+ pinConfig.is_watcher = false;
+ pinConfig.hi_accuracy = false;
+ pinConfig.skip_gpio_setup = true;
+ nrfx_gpiote_in_init(pinPowerPresentIrq, &pinConfig, nrfx_gpiote_evt_handler);
+
+ if (nrf_gpio_pin_read(pinPowerPresentIrq)) {
+ nrf_gpio_cfg_sense_input(pinPowerPresentIrq, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_LOW);
+ } else {
+ nrf_gpio_cfg_sense_input(pinPowerPresentIrq, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_HIGH);
+ }
+
+ idleTimer = xTimerCreate("idleTimer", pdMS_TO_TICKS(2000), pdFALSE, this, IdleTimerCallback);
+ dimTimer = xTimerCreate("dimTimer", pdMS_TO_TICKS(settingsController.GetScreenTimeOut() - 2000), pdFALSE, this, DimTimerCallback);
+ xTimerStart(dimTimer, 0);
// Suppress endless loop diagnostic
#pragma clang diagnostic push
@@ -161,53 +198,55 @@ void SystemTask::Work() {
uint8_t msg;
if (xQueueReceive(systemTasksMsgQueue, &msg, 100)) {
- // call the battery controller or use the MSG in DisplayApp to get the battery status ???
- // it is necessary to validate which is the most efficient
batteryController.Update();
- // displayApp->PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
- // analyze a more efficient way to do this refreshment
- // this and the UpdateMotion(); can be called on a timer to be independent of the main process ???
+ // the battery does not emit events when changing charge levels, so we piggyback
+ // on any system event to read and update the current values
Messages message = static_cast<Messages>(msg);
switch (message) {
case Messages::EnableSleeping:
- doNotGoToSleep = false;
+ // Make sure that exiting an app doesn't enable sleeping,
+ // if the exiting was caused by a firmware update
+ if (!bleController.IsFirmwareUpdating()) {
+ doNotGoToSleep = false;
+ }
break;
case Messages::DisableSleeping:
doNotGoToSleep = true;
break;
case Messages::UpdateTimeOut:
- xTimerChangePeriod(idleTimer, pdMS_TO_TICKS(settingsController.GetScreenTimeOut()), 0);
+ xTimerChangePeriod(dimTimer, pdMS_TO_TICKS(settingsController.GetScreenTimeOut() - 2000), 0);
break;
case Messages::GoToRunning:
spi.Wakeup();
twiMaster.Wakeup();
// Double Tap needs the touch screen to be in normal mode
- if (settingsController.getWakeUpMode() != Pinetime::Controllers::Settings::WakeUpMode::DoubleTap) {
+ if (!settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
touchPanel.Wakeup();
}
nimbleController.StartAdvertising();
- xTimerStart(idleTimer, 0);
+ xTimerStart(dimTimer, 0);
spiNorFlash.Wakeup();
lcd.Wakeup();
- displayApp->PushMessage(Pinetime::Applications::Display::Messages::GoToRunning);
- displayApp->PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
- heartRateApp->PushMessage(Pinetime::Applications::HeartRateTask::Messages::WakeUp);
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToRunning);
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
+ heartRateApp.PushMessage(Pinetime::Applications::HeartRateTask::Messages::WakeUp);
isSleeping = false;
isWakingUp = false;
+ isDimmed = false;
break;
case Messages::TouchWakeUp: {
twiMaster.Wakeup();
auto touchInfo = touchPanel.GetTouchInfo();
twiMaster.Sleep();
if (touchInfo.isTouch and ((touchInfo.gesture == Pinetime::Drivers::Cst816S::Gestures::DoubleTap and
- settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::DoubleTap) or
+ settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) or
(touchInfo.gesture == Pinetime::Drivers::Cst816S::Gestures::SingleTap and
- settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::SingleTap))) {
+ settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap)))) {
GoToRunning();
}
} break;
@@ -215,22 +254,30 @@ void SystemTask::Work() {
isGoingToSleep = true;
NRF_LOG_INFO("[systemtask] Going to sleep");
xTimerStop(idleTimer, 0);
- displayApp->PushMessage(Pinetime::Applications::Display::Messages::GoToSleep);
- heartRateApp->PushMessage(Pinetime::Applications::HeartRateTask::Messages::GoToSleep);
+ xTimerStop(dimTimer, 0);
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToSleep);
+ heartRateApp.PushMessage(Pinetime::Applications::HeartRateTask::Messages::GoToSleep);
break;
case Messages::OnNewTime:
ReloadIdleTimer();
- displayApp->PushMessage(Pinetime::Applications::Display::Messages::UpdateDateTime);
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::UpdateDateTime);
break;
case Messages::OnNewNotification:
- if (isSleeping && !isWakingUp)
+ if (isSleeping && !isWakingUp) {
GoToRunning();
+ }
if (notificationManager.GetLastNotification().category == Controllers::NotificationManager::Categories::IncomingCall) {
motorController.startRunning(500);
} else {
motorController.runForDuration(35);
}
- displayApp->PushMessage(Pinetime::Applications::Display::Messages::NewNotification);
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::NewNotification);
+ case Messages::OnTimerDone:
+ if (isSleeping && !isWakingUp) {
+ GoToRunning();
+ }
+ motorController.runForDuration(35);
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::TimerDone);
break;
case Messages::BleConnected:
ReloadIdleTimer();
@@ -241,19 +288,22 @@ void SystemTask::Work() {
doNotGoToSleep = true;
if (isSleeping && !isWakingUp)
GoToRunning();
- displayApp->PushMessage(Pinetime::Applications::Display::Messages::BleFirmwareUpdateStarted);
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::BleFirmwareUpdateStarted);
break;
case Messages::BleFirmwareUpdateFinished:
- doNotGoToSleep = false;
- xTimerStart(idleTimer, 0);
- if (bleController.State() == Pinetime::Controllers::Ble::FirmwareUpdateStates::Validated)
+ if (bleController.State() == Pinetime::Controllers::Ble::FirmwareUpdateStates::Validated) {
NVIC_SystemReset();
+ }
+ doNotGoToSleep = false;
+ xTimerStart(dimTimer, 0);
break;
case Messages::OnTouchEvent:
ReloadIdleTimer();
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::TouchEvent);
break;
case Messages::OnButtonEvent:
ReloadIdleTimer();
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::ButtonPushed);
break;
case Messages::OnDisplayTaskSleeping:
if (BootloaderVersion::IsValid()) {
@@ -265,7 +315,7 @@ void SystemTask::Work() {
spi.Sleep();
// Double Tap needs the touch screen to be in normal mode
- if (settingsController.getWakeUpMode() != Pinetime::Controllers::Settings::WakeUpMode::DoubleTap) {
+ if (!settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
touchPanel.Sleep();
}
twiMaster.Sleep();
@@ -278,6 +328,11 @@ void SystemTask::Work() {
// Remember we'll have to reset the counter next time we're awake
stepCounterMustBeReset = true;
break;
+ case Messages::OnChargingEvent:
+ motorController.SetDuration(15);
+ // Battery level is updated on every message - there's no need to do anything
+ break;
+
default:
break;
}
@@ -294,6 +349,11 @@ void SystemTask::Work() {
}
}
+ if (xTaskGetTickCount() - batteryNotificationTick > batteryNotificationPeriod) {
+ nimbleController.NotifyBatteryLevel(batteryController.PercentRemaining());
+ batteryNotificationTick = xTaskGetTickCount();
+ }
+
monitor.Process();
uint32_t systick_counter = nrf_rtc_counter_get(portNRF_RTC_REG);
dateTimeController.UpdateTime(systick_counter);
@@ -307,7 +367,7 @@ void SystemTask::UpdateMotion() {
if (isGoingToSleep or isWakingUp)
return;
- if (isSleeping && settingsController.getWakeUpMode() != Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist)
+ if (isSleeping && !settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist))
return;
if (isSleeping)
@@ -335,7 +395,6 @@ void SystemTask::OnButtonPushed() {
if (!isSleeping) {
NRF_LOG_INFO("[systemtask] Button pushed");
PushMessage(Messages::OnButtonEvent);
- displayApp->PushMessage(Pinetime::Applications::Display::Messages::ButtonPushed);
} else {
if (!isWakingUp) {
NRF_LOG_INFO("[systemtask] Button pushed, waking up");
@@ -356,28 +415,42 @@ void SystemTask::OnTouchEvent() {
return;
if (!isSleeping) {
PushMessage(Messages::OnTouchEvent);
- displayApp->PushMessage(Pinetime::Applications::Display::Messages::TouchEvent);
} else if (!isWakingUp) {
- if (settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::None or
- settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist)
- return;
- PushMessage(Messages::TouchWakeUp);
+ if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap) or
+ settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
+ PushMessage(Messages::TouchWakeUp);
+ }
}
}
-void SystemTask::PushMessage(SystemTask::Messages msg) {
+void SystemTask::PushMessage(System::Messages msg) {
if (msg == Messages::GoToSleep) {
isGoingToSleep = true;
}
- BaseType_t xHigherPriorityTaskWoken;
- xHigherPriorityTaskWoken = pdFALSE;
- xQueueSendFromISR(systemTasksMsgQueue, &msg, &xHigherPriorityTaskWoken);
- if (xHigherPriorityTaskWoken) {
- /* Actual macro used here is port specific. */
- // TODO: should I do something here?
+
+ if(in_isr()) {
+ BaseType_t xHigherPriorityTaskWoken;
+ xHigherPriorityTaskWoken = pdFALSE;
+ xQueueSendFromISR(systemTasksMsgQueue, &msg, &xHigherPriorityTaskWoken);
+ if (xHigherPriorityTaskWoken) {
+ /* Actual macro used here is port specific. */
+ portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
+
+ }
+ } else {
+ xQueueSend(systemTasksMsgQueue, &msg, portMAX_DELAY);
}
}
+void SystemTask::OnDim() {
+ if (doNotGoToSleep)
+ return;
+ NRF_LOG_INFO("Dim timeout -> Dim screen")
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::DimScreen);
+ xTimerStart(idleTimer, 0);
+ isDimmed = true;
+}
+
void SystemTask::OnIdle() {
if (doNotGoToSleep)
return;
@@ -385,8 +458,13 @@ void SystemTask::OnIdle() {
PushMessage(Messages::GoToSleep);
}
-void SystemTask::ReloadIdleTimer() const {
+void SystemTask::ReloadIdleTimer() {
if (isSleeping || isGoingToSleep)
return;
- xTimerReset(idleTimer, 0);
+ if (isDimmed) {
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::RestoreBrightness);
+ isDimmed = false;
+ }
+ xTimerReset(dimTimer, 0);
+ xTimerStop(idleTimer, 0);
}
diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h
index e65fbea0..ba434298 100644
--- a/src/systemtask/SystemTask.h
+++ b/src/systemtask/SystemTask.h
@@ -6,7 +6,6 @@
#include <task.h>
#include <timers.h>
#include <heartratetask/HeartRateTask.h>
-#include <components/heartrate/HeartRateController.h>
#include <components/settings/Settings.h>
#include <drivers/Bma421.h>
#include <components/motion/MotionController.h>
@@ -16,16 +15,20 @@
#include "components/ble/NimbleController.h"
#include "components/ble/NotificationManager.h"
#include "components/motor/MotorController.h"
+#include "components/timer/TimerController.h"
+#include "components/fs/FS.h"
+
#ifdef PINETIME_IS_RECOVERY
#include "displayapp/DisplayAppRecovery.h"
#include "displayapp/DummyLittleVgl.h"
#else
#include "components/settings/Settings.h"
#include "displayapp/DisplayApp.h"
- #include "displayapp/LittleVgl.h"
+ #include "displayapp/LittleVgl.h"
#endif
#include "drivers/Watchdog.h"
+#include "Messages.h"
namespace Pinetime {
namespace Drivers {
@@ -39,25 +42,6 @@ namespace Pinetime {
namespace System {
class SystemTask {
public:
- enum class Messages {
- GoToSleep,
- GoToRunning,
- TouchWakeUp,
- OnNewTime,
- OnNewNotification,
- OnNewCall,
- BleConnected,
- UpdateTimeOut,
- BleFirmwareUpdateStarted,
- BleFirmwareUpdateFinished,
- OnTouchEvent,
- OnButtonEvent,
- OnDisplayTaskSleeping,
- EnableSleeping,
- DisableSleeping,
- OnNewDay
- };
-
SystemTask(Drivers::SpiMaster& spi,
Drivers::St7789& lcd,
Pinetime::Drivers::SpiNorFlash& spiNorFlash,
@@ -66,10 +50,19 @@ namespace Pinetime {
Components::LittleVgl& lvgl,
Controllers::Battery& batteryController,
Controllers::Ble& bleController,
+ Controllers::DateTime& dateTimeController,
+ Controllers::TimerController& timerController,
+ Drivers::Watchdog& watchdog,
+ Pinetime::Controllers::NotificationManager& notificationManager,
Pinetime::Controllers::MotorController& motorController,
Pinetime::Drivers::Hrs3300& heartRateSensor,
+ Pinetime::Controllers::MotionController& motionController,
Pinetime::Drivers::Bma421& motionSensor,
- Controllers::Settings& settingsController);
+ Controllers::Settings& settingsController,
+ Pinetime::Controllers::HeartRateController& heartRateController,
+ Pinetime::Applications::DisplayApp& displayApp,
+ Pinetime::Applications::HeartRateTask& heartRateApp,
+ Pinetime::Controllers::FS& fs);
void Start();
void PushMessage(Messages msg);
@@ -78,11 +71,16 @@ namespace Pinetime {
void OnTouchEvent();
void OnIdle();
+ void OnDim();
Pinetime::Controllers::NimbleController& nimble() {
return nimbleController;
};
+ bool IsSleeping() const {
+ return isSleeping;
+ }
+
private:
TaskHandle_t taskHandle;
@@ -93,26 +91,29 @@ namespace Pinetime {
Pinetime::Drivers::Cst816S& touchPanel;
Pinetime::Components::LittleVgl& lvgl;
Pinetime::Controllers::Battery& batteryController;
- std::unique_ptr<Pinetime::Applications::DisplayApp> displayApp;
- Pinetime::Controllers::HeartRateController heartRateController;
- std::unique_ptr<Pinetime::Applications::HeartRateTask> heartRateApp;
+
Pinetime::Controllers::Ble& bleController;
- Pinetime::Controllers::DateTime dateTimeController;
+ Pinetime::Controllers::DateTime& dateTimeController;
+ Pinetime::Controllers::TimerController& timerController;
QueueHandle_t systemTasksMsgQueue;
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;
+ std::atomic<bool> isDimmed {false};
+ Pinetime::Drivers::Watchdog& watchdog;
+ Pinetime::Controllers::NotificationManager& notificationManager;
Pinetime::Controllers::MotorController& motorController;
Pinetime::Drivers::Hrs3300& heartRateSensor;
Pinetime::Drivers::Bma421& motionSensor;
Pinetime::Controllers::Settings& settingsController;
+ Pinetime::Controllers::HeartRateController& heartRateController;
+ Pinetime::Controllers::MotionController& motionController;
+
+ Pinetime::Applications::DisplayApp& displayApp;
+ Pinetime::Applications::HeartRateTask& heartRateApp;
+ Pinetime::Controllers::FS& fs;
Pinetime::Controllers::NimbleController nimbleController;
- Controllers::BrightnessController brightnessController;
- Pinetime::Controllers::MotionController motionController;
static constexpr uint8_t pinSpiSck = 2;
static constexpr uint8_t pinSpiMosi = 3;
@@ -121,18 +122,22 @@ namespace Pinetime {
static constexpr uint8_t pinLcdDataCommand = 18;
static constexpr uint8_t pinButton = 13;
static constexpr uint8_t pinTouchIrq = 28;
+ static constexpr uint8_t pinPowerPresentIrq = 19;
static void Process(void* instance);
void Work();
- void ReloadIdleTimer() const;
+ void ReloadIdleTimer();
bool isBleDiscoveryTimerRunning = false;
uint8_t bleDiscoveryTimer = 0;
+ TimerHandle_t dimTimer;
TimerHandle_t idleTimer;
bool doNotGoToSleep = false;
void GoToRunning();
void UpdateMotion();
bool stepCounterMustBeReset = false;
+ static constexpr TickType_t batteryNotificationPeriod = 1000 * 60 * 10; // 1 tick ~= 1ms. 1ms * 60 * 10 = 10 minutes
+ TickType_t batteryNotificationTick = 0;
#if configUSE_TRACE_FACILITY == 1
SystemMonitor<FreeRtosMonitor> monitor;