#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; } } }