diff options
author | Jean-François Milants <jf@codingfield.com> | 2021-04-09 21:17:03 +0200 |
---|---|---|
committer | Jean-François Milants <jf@codingfield.com> | 2021-04-09 21:17:03 +0200 |
commit | eb769fb60ecb8f96ecf6901082ec3f0610842af8 (patch) | |
tree | c26870103f8baaa933399cfb86cca25aa7e60d8b /src/systemtask/SystemTask.cpp | |
parent | 57b4c3f0edc6acfa31bd2160abdcd6091920ba63 (diff) | |
parent | 15b3b8e282dd5b2132b0095716cd9d88740d4579 (diff) |
Merge branch 'motion-sensor' into develop
Diffstat (limited to 'src/systemtask/SystemTask.cpp')
-rw-r--r-- | src/systemtask/SystemTask.cpp | 55 |
1 files changed, 47 insertions, 8 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); } |