summaryrefslogtreecommitdiff
path: root/src/systemtask
diff options
context:
space:
mode:
authorJean-François Milants <jf@codingfield.com>2021-04-09 21:17:03 +0200
committerJean-François Milants <jf@codingfield.com>2021-04-09 21:17:03 +0200
commiteb769fb60ecb8f96ecf6901082ec3f0610842af8 (patch)
treec26870103f8baaa933399cfb86cca25aa7e60d8b /src/systemtask
parent57b4c3f0edc6acfa31bd2160abdcd6091920ba63 (diff)
parent15b3b8e282dd5b2132b0095716cd9d88740d4579 (diff)
Merge branch 'motion-sensor' into develop
Diffstat (limited to 'src/systemtask')
-rw-r--r--src/systemtask/SystemTask.cpp55
-rw-r--r--src/systemtask/SystemTask.h13
2 files changed, 57 insertions, 11 deletions
diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp
index 57d7fb17..42a4e844 100644
--- a/src/systemtask/SystemTask.cpp
+++ b/src/systemtask/SystemTask.cpp
@@ -40,16 +40,16 @@ SystemTask::SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd,
Drivers::TwiMaster& twiMaster, Drivers::Cst816S &touchPanel,
Components::LittleVgl &lvgl,
Controllers::Battery &batteryController, Controllers::Ble &bleController,
- Controllers::DateTime &dateTimeController,
Pinetime::Controllers::MotorController& motorController,
Pinetime::Drivers::Hrs3300& heartRateSensor,
+ Pinetime::Drivers::Bma421& motionSensor,
Controllers::Settings &settingsController) :
spi{spi}, lcd{lcd}, spiNorFlash{spiNorFlash},
twiMaster{twiMaster}, touchPanel{touchPanel}, lvgl{lvgl}, batteryController{batteryController},
heartRateController{*this},
- bleController{bleController}, dateTimeController{dateTimeController},
+ bleController{bleController}, dateTimeController{*this},
watchdog{}, watchdogView{watchdog},
- motorController{motorController}, heartRateSensor{heartRateSensor},
+ motorController{motorController}, heartRateSensor{heartRateSensor}, motionSensor{motionSensor},
settingsController{settingsController},
nimbleController(*this, bleController,dateTimeController, notificationManager, batteryController, spiNorFlash, heartRateController) {
systemTasksMsgQueue = xQueueCreate(10, 1);
@@ -84,13 +84,18 @@ void SystemTask::Work() {
touchPanel.Init();
batteryController.Init();
motorController.Init();
+ motionSensor.SoftReset();
- settingsController.Init();
+ // Reset the TWI device because the motion sensor chip most probably crashed it...
+ twiMaster.Sleep();
+ twiMaster.Init();
+ motionSensor.Init();
+ settingsController.Init();
displayApp = std::make_unique<Pinetime::Applications::DisplayApp>(lcd, lvgl, touchPanel, batteryController, bleController,
dateTimeController, watchdogView, *this, notificationManager,
- heartRateController, settingsController);
+ heartRateController, settingsController, motionController);
displayApp->Start();
batteryController.Update();
@@ -132,8 +137,10 @@ void SystemTask::Work() {
#pragma clang diagnostic push
#pragma ide diagnostic ignored "EndlessLoop"
while(true) {
+ UpdateMotion();
+
uint8_t msg;
- if (xQueueReceive(systemTasksMsgQueue, &msg, isSleeping ? 2500 : 1000)) {
+ if (xQueueReceive(systemTasksMsgQueue, &msg, 100)) {
batteryController.Update();
Messages message = static_cast<Messages >(msg);
switch(message) {
@@ -148,10 +155,10 @@ void SystemTask::Work() {
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 ) {
- twiMaster.Wakeup();
touchPanel.Wakeup();
}
@@ -168,7 +175,9 @@ void SystemTask::Work() {
isWakingUp = 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
@@ -232,12 +241,17 @@ void SystemTask::Work() {
// Double Tap needs the touch screen to be in normal mode
if ( settingsController.getWakeUpMode() != Pinetime::Controllers::Settings::WakeUpMode::DoubleTap ) {
touchPanel.Sleep();
- twiMaster.Sleep();
}
+ twiMaster.Sleep();
isSleeping = true;
isGoingToSleep = false;
break;
+ case Messages::OnNewDay:
+ // We might be sleeping (with TWI device disabled.
+ // Remember we'll have to reset the counter next time we're awake
+ stepCounterMustBeReset = true;
+ break;
default: break;
}
}
@@ -262,6 +276,30 @@ void SystemTask::Work() {
// Clear diagnostic suppression
#pragma clang diagnostic pop
}
+void SystemTask::UpdateMotion() {
+ if(isGoingToSleep or isWakingUp) return;
+
+ if(isSleeping)
+ twiMaster.Wakeup();
+
+ if(stepCounterMustBeReset) {
+ motionSensor.ResetStepCounter();
+ stepCounterMustBeReset = false;
+ }
+
+ auto motionValues = motionSensor.Process();
+ if(isSleeping)
+ twiMaster.Sleep();
+
+ motionController.IsSensorOk(motionSensor.IsOk());
+ motionController.Update(motionValues.x,
+ motionValues.y,
+ motionValues.z,
+ motionValues.steps);
+ if (motionController.ShouldWakeUp(isSleeping)) {
+ GoToRunning();
+ }
+}
void SystemTask::OnButtonPushed() {
if(isGoingToSleep) return;
@@ -279,6 +317,7 @@ void SystemTask::OnButtonPushed() {
}
void SystemTask::GoToRunning() {
+ if(isGoingToSleep or (not isSleeping) or isWakingUp) return;
isWakingUp = true;
PushMessage(Messages::GoToRunning);
}
diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h
index 9d0b41ad..a3868375 100644
--- a/src/systemtask/SystemTask.h
+++ b/src/systemtask/SystemTask.h
@@ -8,6 +8,8 @@
#include <heartratetask/HeartRateTask.h>
#include <components/heartrate/HeartRateController.h>
#include <components/settings/Settings.h>
+#include <drivers/Bma421.h>
+#include <components/motion/MotionController.h>
#include "SystemMonitor.h"
#include "components/battery/BatteryController.h"
@@ -38,7 +40,8 @@ namespace Pinetime {
class SystemTask {
public:
enum class Messages {GoToSleep, GoToRunning, TouchWakeUp, OnNewTime, OnNewNotification, OnNewCall, BleConnected, UpdateTimeOut,
- BleFirmwareUpdateStarted, BleFirmwareUpdateFinished, OnTouchEvent, OnButtonEvent, OnDisplayTaskSleeping, EnableSleeping, DisableSleeping
+ BleFirmwareUpdateStarted, BleFirmwareUpdateFinished, OnTouchEvent, OnButtonEvent, OnDisplayTaskSleeping, EnableSleeping, DisableSleeping,
+ OnNewDay
};
SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd,
@@ -46,9 +49,9 @@ namespace Pinetime {
Drivers::TwiMaster& twiMaster, Drivers::Cst816S &touchPanel,
Components::LittleVgl &lvgl,
Controllers::Battery &batteryController, Controllers::Ble &bleController,
- Controllers::DateTime &dateTimeController,
Pinetime::Controllers::MotorController& motorController,
Pinetime::Drivers::Hrs3300& heartRateSensor,
+ Pinetime::Drivers::Bma421& motionSensor,
Controllers::Settings &settingsController);
@@ -77,7 +80,7 @@ namespace Pinetime {
std::unique_ptr<Pinetime::Applications::HeartRateTask> heartRateApp;
Pinetime::Controllers::Ble& bleController;
- Pinetime::Controllers::DateTime& dateTimeController;
+ Pinetime::Controllers::DateTime dateTimeController;
QueueHandle_t systemTasksMsgQueue;
std::atomic<bool> isSleeping{false};
std::atomic<bool> isGoingToSleep{false};
@@ -87,9 +90,11 @@ namespace Pinetime {
Pinetime::Controllers::NotificationManager notificationManager;
Pinetime::Controllers::MotorController& motorController;
Pinetime::Drivers::Hrs3300& heartRateSensor;
+ Pinetime::Drivers::Bma421& motionSensor;
Pinetime::Controllers::Settings& settingsController;
Pinetime::Controllers::NimbleController nimbleController;
Controllers::BrightnessController brightnessController;
+ Pinetime::Controllers::MotionController motionController;
static constexpr uint8_t pinSpiSck = 2;
static constexpr uint8_t pinSpiMosi = 3;
@@ -108,6 +113,8 @@ namespace Pinetime {
bool doNotGoToSleep = false;
void GoToRunning();
+ void UpdateMotion();
+ bool stepCounterMustBeReset = false;
#if configUSE_TRACE_FACILITY == 1
SystemMonitor<FreeRtosMonitor> monitor;