128 lines
1.9 KiB
C++
Raw Normal View History

2021-01-29 12:31:58 +01:00
//
// FILE: runningAngle.cpp
// AUTHOR: Rob Tillaart
2023-02-22 12:50:23 +01:00
// VERSION: 0.2.0
2021-01-29 12:31:58 +01: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 12:50:23 +01:00
_average = 0;
_weight = RA_DEFAULT_WEIGHT;
_reset = true;
2021-01-29 12:31:58 +01:00
}
2021-12-28 09:50:06 +01:00
2021-01-29 12:31:58 +01:00
float runningAngle::add(float angle)
{
if (_reset)
{
2023-02-22 12:50:23 +01:00
_average = wrap(angle);
2021-01-29 12:31:58 +01:00
_reset = false;
}
else
{
_average = wrap(_average + _weight * wrap(angle - _average));
}
2023-02-22 12:50:23 +01: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 12:31:58 +01:00
}
float runningAngle::wrap(float angle)
{
2022-05-29 11:19:11 +02:00
if (_type == DEGREES)
{
2023-02-22 12:50:23 +01:00
while (angle < -180) angle += 360;
while (angle >= +180) angle -= 360;
}
else if (_type == RADIANS)
2022-05-29 11:19:11 +02:00
{
2023-02-22 12:50:23 +01:00
while (angle < -PI) angle += TWO_PI;
while (angle >= +PI) angle -= TWO_PI;
2021-01-29 12:31:58 +01:00
}
2022-11-23 17:07:12 +01:00
else // GRADIANS
2022-05-29 11:19:11 +02:00
{
2023-02-22 12:50:23 +01:00
while (angle < -200) angle += 400;
while (angle >= +200) angle -= 400;
2022-05-29 11:19:11 +02:00
}
2021-01-29 12:31:58 +01:00
return angle;
}
2021-05-28 13:43:31 +02:00
2023-02-22 12:50:23 +01:00
// -180..180
void runningAngle::setMode0()
{
_mode = 0;
}
// 0..360
void runningAngle::setMode1()
{
_mode = 1;
}
uint8_t runningAngle::getMode()
{
return _mode;
}
2022-11-23 17:07:12 +01:00
// -- END OF FILE --
2021-12-28 09:50:06 +01:00