#ifndef RunningAverage_h #define RunningAverage_h // RunningAverage class // based on RunningAverage library for Arduino // source: http://playground.arduino.cc/Main/RunningAverage template class RunningAverage { public: RunningAverage(void); RunningAverage(int); ~RunningAverage(); void clear(); void addValue(T); T getAverage() const; void fillValue(T, int); protected: int _size; int _cnt; int _idx; T _sum; T * _ar; static T zero; }; // RunningAverage class // based on RunningAverage library for Arduino // source: http://playground.arduino.cc/Main/RunningAverage // author: Rob.Tillart@gmail.com // Released to the public domain template T RunningAverage::zero = static_cast(0); template RunningAverage::RunningAverage(int n) { _size = n; _ar = (T*) malloc(_size * sizeof(T)); clear(); } template RunningAverage::~RunningAverage() { free(_ar); } // resets all counters template void RunningAverage::clear() { _cnt = 0; _idx = 0; _sum = zero; for (int i = 0; i< _size; i++) _ar[i] = zero; // needed to keep addValue simple } // adds a new value to the data-set template void RunningAverage::addValue(T f) { _sum -= _ar[_idx]; _ar[_idx] = f; _sum += _ar[_idx]; _idx++; if (_idx == _size) _idx = 0; // faster than % if (_cnt < _size) _cnt++; } // returns the average of the data-set added so far template T RunningAverage::getAverage() const { if (_cnt == 0) return zero; // NaN ? math.h return _sum / _cnt; } // fill the average with a value // the param number determines how often value is added (weight) // number should preferably be between 1 and size template void RunningAverage::fillValue(T value, int number) { clear(); for (int i = 0; i < number; i++) { addValue(value); } } #endif