GY-63_MS5611/libraries/runningAngle/runningAngle.cpp

128 lines
1.9 KiB
C++
Raw Normal View History

2021-01-29 06:31:58 -05:00
//
// FILE: runningAngle.cpp
// AUTHOR: Rob Tillaart
2023-11-21 10:07:14 -05:00
// VERSION: 0.2.1
2021-01-29 06:31:58 -05:00
// PURPOSE: Library to average angles by means of low pass filtering with wrapping.
// URL: https://github.com/RobTillaart/runningAngle
// RELATED: https://github.com/RobTillaart/AverageAngle
#include "runningAngle.h"
runningAngle::runningAngle(const enum AngleType type)
{
_type = type;
reset();
}
void runningAngle::reset()
{
2023-02-22 06:50:23 -05:00
_average = 0;
_weight = RA_DEFAULT_WEIGHT;
_reset = true;
2021-01-29 06:31:58 -05:00
}
2021-12-28 03:50:06 -05:00
2021-01-29 06:31:58 -05:00
float runningAngle::add(float angle)
{
if (_reset)
{
2023-02-22 06:50:23 -05:00
_average = wrap(angle);
2021-01-29 06:31:58 -05:00
_reset = false;
}
else
{
_average = wrap(_average + _weight * wrap(angle - _average));
}
2023-02-22 06:50:23 -05:00
if (_mode == 0) return _average;
return getAverage();
}
float runningAngle::getAverage()
{
if (_mode == 0) return _average;
if (_average >= 0) return _average;
if (_type == DEGREES) return _average + 360;
if (_type == RADIANS) return _average + TWO_PI;
// GRADIANS
return _average + 200;
}
bool runningAngle::setWeight(float w)
{
if (w < RA_MIN_WEIGHT)
{
_weight = RA_MIN_WEIGHT;
return false;
}
if (w > RA_MAX_WEIGHT)
{
_weight = RA_MAX_WEIGHT;
return false;
}
_weight = w;
return true;
}
float runningAngle::getWeight()
{
return _weight;
}
enum runningAngle::AngleType runningAngle::type()
{
return _type;
2021-01-29 06:31:58 -05:00
}
float runningAngle::wrap(float angle)
{
2022-05-29 05:19:11 -04:00
if (_type == DEGREES)
{
2023-02-22 06:50:23 -05:00
while (angle < -180) angle += 360;
while (angle >= +180) angle -= 360;
}
else if (_type == RADIANS)
2022-05-29 05:19:11 -04:00
{
2023-02-22 06:50:23 -05:00
while (angle < -PI) angle += TWO_PI;
while (angle >= +PI) angle -= TWO_PI;
2021-01-29 06:31:58 -05:00
}
2022-11-23 11:07:12 -05:00
else // GRADIANS
2022-05-29 05:19:11 -04:00
{
2023-02-22 06:50:23 -05:00
while (angle < -200) angle += 400;
while (angle >= +200) angle -= 400;
2022-05-29 05:19:11 -04:00
}
2021-01-29 06:31:58 -05:00
return angle;
}
2021-05-28 07:43:31 -04:00
2023-02-22 06:50:23 -05:00
// -180..180
void runningAngle::setMode0()
{
_mode = 0;
}
// 0..360
void runningAngle::setMode1()
{
_mode = 1;
}
uint8_t runningAngle::getMode()
{
return _mode;
}
2022-11-23 11:07:12 -05:00
// -- END OF FILE --
2021-12-28 03:50:06 -05:00