56 lines
1.5 KiB
C++
56 lines
1.5 KiB
C++
|
|
#include "MinMaxLerp.h"
|
||
|
|
|
||
|
|
#include "Arduino.h"
|
||
|
|
|
||
|
|
MinMaxLerp::MinMaxLerp(int* in_i, int base_min, int base_max, long update_interval_ms, int nbr_steps) :
|
||
|
|
_in_ptr(in_i), _base_min(base_min), _base_max(base_max), _cur_min(base_min), _cur_max(base_max),
|
||
|
|
_tick_min(0), _tick_max(0), _update_interval(update_interval_ms)
|
||
|
|
{
|
||
|
|
_tick_time = (float)update_interval_ms / (float) nbr_steps;
|
||
|
|
}
|
||
|
|
|
||
|
|
void MinMaxLerp::lerp_min_max() {
|
||
|
|
|
||
|
|
static float m_min = 1;
|
||
|
|
static float m_max = 1;
|
||
|
|
static int t_min = 0;
|
||
|
|
static int t_max = 0;
|
||
|
|
|
||
|
|
int _ema = *_in_ptr;
|
||
|
|
|
||
|
|
if(_ema < _cur_min) {
|
||
|
|
_cur_min = _ema;
|
||
|
|
_min = _ema;
|
||
|
|
_tick_min = millis();
|
||
|
|
t_min = millis();
|
||
|
|
|
||
|
|
// calculate new slope
|
||
|
|
int dy = _base_min - _min;
|
||
|
|
m_min = (float) dy / (float)_update_interval; // linear
|
||
|
|
} else {
|
||
|
|
long t = millis() - _tick_min;
|
||
|
|
if(t < _update_interval && (t_min - millis()) > _tick_time) {
|
||
|
|
t_min = millis();
|
||
|
|
_cur_min = _min + m_min * t;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if(_ema > _cur_max) {
|
||
|
|
_cur_max = _ema;
|
||
|
|
_max = _ema;
|
||
|
|
_tick_max = millis();
|
||
|
|
t_max = millis();
|
||
|
|
|
||
|
|
// calculate new slope
|
||
|
|
int dy = _base_max - _max;
|
||
|
|
m_max = (float) dy / (float)_update_interval; // linear
|
||
|
|
} else {
|
||
|
|
long t = millis() - _tick_max;
|
||
|
|
if(t < _update_interval && (t_max - millis()) > _tick_time) {
|
||
|
|
t_max = millis();
|
||
|
|
_cur_max = _max + m_max * t;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|