56 lines
1.5 KiB
C++
Raw Normal View History

2018-11-13 08:10:15 +01:00
#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;
}
}
}