motioncontroller: Add functions for analysis
These are functions for converting acceleration due to gravity to angles in degrees, and some statistical analysis including the mean and variance.main
parent
3085bb3990
commit
cfe21103ea
@ -0,0 +1,49 @@
|
|||||||
|
#include "utility/Math.h"
|
||||||
|
|
||||||
|
#include <lvgl/src/lv_misc/lv_math.h>
|
||||||
|
|
||||||
|
using namespace Pinetime::Utility;
|
||||||
|
|
||||||
|
#ifndef PINETIME_IS_RECOVERY
|
||||||
|
|
||||||
|
int16_t Pinetime::Utility::Asin(int16_t arg) {
|
||||||
|
int16_t a = arg < 0 ? -arg : arg;
|
||||||
|
|
||||||
|
int16_t angle = 45;
|
||||||
|
int16_t low = 0;
|
||||||
|
int16_t high = 90;
|
||||||
|
while (low <= high) {
|
||||||
|
int16_t sinAngle = _lv_trigo_sin(angle);
|
||||||
|
int16_t sinAngleSub = _lv_trigo_sin(angle - 1);
|
||||||
|
int16_t sinAngleAdd = _lv_trigo_sin(angle + 1);
|
||||||
|
|
||||||
|
if (a >= sinAngleSub && a <= sinAngleAdd) {
|
||||||
|
if (a <= (sinAngleSub + sinAngle) / 2) {
|
||||||
|
angle--;
|
||||||
|
} else if (a > (sinAngle + sinAngleAdd) / 2) {
|
||||||
|
angle++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a < sinAngle) {
|
||||||
|
high = angle - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
low = angle + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
angle = (low + high) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return arg < 0 ? -angle : angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
int16_t Pinetime::Utility::Asin(int16_t /*arg*/) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace Pinetime {
|
||||||
|
namespace Utility {
|
||||||
|
// returns the arcsin of `arg`. asin(-32767) = -90, asin(32767) = 90
|
||||||
|
int16_t Asin(int16_t arg);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue