Wetterstation v2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
1.5 KiB

#include "SensorHistory.h"
#include <Arduino.h>
//static const char *TAG = "SensorHistory";
SensorHistory::SensorHistory(const int size) {
_size = size;
_values = (float*) malloc(_size * sizeof(float));
clear();
}
SensorHistory::~SensorHistory()
{
if (_values != NULL) free(_values);
}
void SensorHistory::clear(void) {
_index = 0;
_cnt = 0;
for (int i = 0; i < _size; i++)
{
_values[i] = 0.0; // keeps addValue simpler
}
}
void SensorHistory::addValue(const float value) {
if (_values == NULL) return;
_values[_index] = value;
_index = (_index+1) % _size;
if (_cnt < _size) _cnt++;
}
float SensorHistory::getAverage(void) const {
if (_cnt == 0) return NAN;
float sum = 0;
for (int i = 0; i < _cnt; i++) {
sum += _values[i];
}
return sum / _cnt;
}
float SensorHistory::getMin(void) const {
if (_cnt == 0) return NAN;
float min = _values[0];
for (int i = 0; i < _cnt; i++) {
if (_values[i] < min) min = _values[i];
}
return min;
}
float SensorHistory::getMax(void) const {
if (_cnt == 0) return NAN;
float max = _values[0];
for (int i = 0; i < _cnt; i++) {
if (_values[i] > max) max = _values[i];
}
return max;
}
float SensorHistory::getElement(int index) const {
if (_cnt == 0) return NAN;
index = (_index-1 - index) % _size;
if (index < 0) index = _size+index;
if (index >= _cnt) return NAN;
return _values[index];
}
float SensorHistory::getFirst(void) const {
if (_cnt < _size) return _values[0];
return getElement(-1);
}