diff --git a/src/components/motion/MotionController.cpp b/src/components/motion/MotionController.cpp index 69e418ce..feb9ead0 100644 --- a/src/components/motion/MotionController.cpp +++ b/src/components/motion/MotionController.cpp @@ -87,26 +87,22 @@ MotionController::AccelStats MotionController::GetAccelStats() const { return stats; } -bool MotionController::ShouldRaiseWake(bool isSleeping) { - if ((x + 335) <= 670 && zHistory[0] < 0) { - if (!isSleeping) { - if (yHistory[0] <= 0) { - return false; - } - lastYForRaiseWake = 0; - return false; - } +bool MotionController::ShouldRaiseWake() const { + constexpr uint32_t varianceThresh = 56 * 56; + constexpr int16_t xThresh = 384; + constexpr int16_t yThresh = -64; + constexpr int16_t rollDegreesThresh = -45; - if (yHistory[0] >= 0) { - lastYForRaiseWake = 0; - return false; - } - if (yHistory[0] + 230 < lastYForRaiseWake) { - lastYForRaiseWake = yHistory[0]; - return true; - } + if (x < -xThresh || x > xThresh) { + return false; } - return false; + + // if the variance is below the threshold, the accelerometer values can be considered to be from acceleration due to gravity + if (stats.yVariance > varianceThresh || (stats.yMean < -724 && stats.zVariance > varianceThresh) || stats.yMean > yThresh) { + return false; + } + + return DegreesRolled(stats.yMean, stats.zMean, stats.prevYMean, stats.prevZMean) < rollDegreesThresh; } bool MotionController::ShouldShakeWake(uint16_t thresh) { diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h index de86d44c..1ad032b8 100644 --- a/src/components/motion/MotionController.h +++ b/src/components/motion/MotionController.h @@ -45,7 +45,7 @@ namespace Pinetime { } bool ShouldShakeWake(uint16_t thresh); - bool ShouldRaiseWake(bool isSleeping); + bool ShouldRaiseWake() const; int32_t CurrentShakeSpeed() const { return accumulatedSpeed; @@ -86,7 +86,6 @@ namespace Pinetime { int16_t lastX = 0; int16_t x = 0; - int16_t lastYForRaiseWake = 0; static constexpr uint8_t histSize = 8; Utility::CircularBuffer yHistory = {}; Utility::CircularBuffer zHistory = {}; diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index b199d53f..4719bb50 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -430,7 +430,7 @@ void SystemTask::UpdateMotion() { if (settingsController.GetNotificationStatus() != Controllers::Settings::Notification::Sleep) { if ((settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) && - motionController.ShouldRaiseWake(state == SystemTaskState::Sleeping)) || + motionController.ShouldRaiseWake()) || (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake) && motionController.ShouldShakeWake(settingsController.GetShakeThreshold()))) { GoToRunning();