InfiniTime.git

commit 3085bb39901cd71c4e2fe006ad0c0967a66f7a80

Author: Finlay Davidson <finlay.davidson@coderclass.nl>

motioncontroller: Store acceleration history

Store history of acceleration values for the y and z axes.

 src/components/motion/MotionController.cpp | 23 ++++++++++++-----------
 src/components/motion/MotionController.h | 12 ++++++------


diff --git a/src/components/motion/MotionController.cpp b/src/components/motion/MotionController.cpp
index 3572195b3356e11c4a2c2996f7e724839b0e36c5..b2643a7c33ca71611cf09264dcc4fff221fe4d53 100644
--- a/src/components/motion/MotionController.cpp
+++ b/src/components/motion/MotionController.cpp
@@ -9,7 +9,7 @@   if (this->nbSteps != nbSteps && service != nullptr) {
     service->OnNewStepCountValue(nbSteps);
   }
 
-  if (service != nullptr && (this->x != x || this->y != y || this->z != z)) {
+  if (service != nullptr && (this->x != x || yHistory[0] != y || zHistory[0] != z)) {
     service->OnNewMotionValues(x, y, z);
   }
 
@@ -18,10 +18,10 @@   time = xTaskGetTickCount();
 
   lastX = this->x;
   this->x = x;
-  lastY = this->y;
-  this->y = y;
-  lastZ = this->z;
-  this->z = z;
+  yHistory++;
+  yHistory[0] = y;
+  zHistory++;
+  zHistory[0] = z;
 
   int32_t deltaSteps = nbSteps - this->nbSteps;
   if (deltaSteps > 0) {
@@ -31,21 +31,21 @@   this->nbSteps = nbSteps;
 }
 
 bool MotionController::ShouldRaiseWake(bool isSleeping) {
-  if ((x + 335) <= 670 && z < 0) {
+  if ((x + 335) <= 670 && zHistory[0] < 0) {
     if (!isSleeping) {
-      if (y <= 0) {
+      if (yHistory[0] <= 0) {
         return false;
       }
       lastYForRaiseWake = 0;
       return false;
     }
 
-    if (y >= 0) {
+    if (yHistory[0] >= 0) {
       lastYForRaiseWake = 0;
       return false;
     }
-    if (y + 230 < lastYForRaiseWake) {
-      lastYForRaiseWake = y;
+    if (yHistory[0] + 230 < lastYForRaiseWake) {
+      lastYForRaiseWake = yHistory[0];
       return true;
     }
   }
@@ -54,7 +54,8 @@ }
 
 bool MotionController::ShouldShakeWake(uint16_t thresh) {
   /* Currently Polling at 10hz, If this ever goes faster scalar and EMA might need adjusting */
-  int32_t speed = std::abs(z - lastZ + (y - lastY) / 2 + (x - lastX) / 4) * 100 / (time - lastTime);
+  int32_t speed =
+    std::abs(zHistory[0] - zHistory[histSize - 1] + (yHistory[0] - yHistory[histSize - 1]) / 2 + (x - lastX) / 4) * 100 / (time - lastTime);
   // (.2 * speed) + ((1 - .2) * accumulatedSpeed);
   accumulatedSpeed = speed / 5 + accumulatedSpeed * 4 / 5;
 




diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h
index c524fef33fd4757f8316a0fa0887734802295ded..c967530b5158e93fbd3b74b818644245bf63d7fc 100644
--- a/src/components/motion/MotionController.h
+++ b/src/components/motion/MotionController.h
@@ -6,6 +6,7 @@ #include 
 
 #include "drivers/Bma421.h"
 #include "components/ble/MotionService.h"
+#include "utility/CircularBuffer.h"
 
 namespace Pinetime {
   namespace Controllers {
@@ -24,11 +25,11 @@         return x;
       }
 
       int16_t Y() const {
-        return y;
+        return yHistory[0];
       }
 
       int16_t Z() const {
-        return z;
+        return zHistory[0];
       }
 
       uint32_t NbSteps() const {
@@ -70,10 +71,9 @@
       int16_t lastX = 0;
       int16_t x = 0;
       int16_t lastYForRaiseWake = 0;
-      int16_t lastY = 0;
-      int16_t y = 0;
-      int16_t lastZ = 0;
-      int16_t z = 0;
+      static constexpr uint8_t histSize = 8;
+      Utility::CircularBuffer<int16_t, histSize> yHistory = {};
+      Utility::CircularBuffer<int16_t, histSize> zHistory = {};
       int32_t accumulatedSpeed = 0;
 
       DeviceTypes deviceType = DeviceTypes::Unknown;