+ update version 0.2.04

+ added getElement() (not released 0.2.03 version)
+ added getSize()    (not released 0.2.03 version)
+ added getCount()   (not released 0.2.03 version)
+ updated keywords.txt
+ added memory protection if there is not enough memory to allocate.
+ added return NAN instead of 0  for getAverage()
+ reduced _size, _cnt, _idx to uint8_t
+ changed extensions of example code to .ino
This commit is contained in:
rob tillaart 2014-07-03 22:00:45 +02:00
parent 9c13789f2d
commit 9cbe3bf5f9
8 changed files with 143 additions and 99 deletions

View File

@ -1,19 +1,21 @@
//
//
// FILE: RunningAverage.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.2.02
// VERSION: 0.2.04
// PURPOSE: RunningAverage library for Arduino
//
// The library stores the last N individual values in a circular buffer,
// to calculate the running average.
// The library stores the last N individual values in a circular buffer,
// to calculate the running average.
//
// HISTORY:
// HISTORY:
// 0.1.00 - 2011-01-30 initial version
// 0.1.01 - 2011-02-28 fixed missing destructor in .h
// 0.2.00 - 2012-??-?? Yuval Naveh added trimValue (found on web)
// http://stromputer.googlecode.com/svn-history/r74/trunk/Arduino/Libraries/RunningAverage/RunningAverage.cpp
// 0.2.01 - 2012-11-21 refactored
// 0.2.02 - 2012-12-30 refactored trimValue -> fillValue
// 0.2.03 - 2013-11-31 getElement
// 0.2.04 - 2014-07-03 added memory protection
//
// Released to the public domain
//
@ -23,41 +25,50 @@
RunningAverage::RunningAverage(int n)
{
_size = n;
_ar = (float*) malloc(_size * sizeof(float));
clear();
_size = n;
_ar = (float*) malloc(_size * sizeof(float));
if (_ar == NULL) _size = 0;
clear();
}
RunningAverage::~RunningAverage()
{
free(_ar);
if (_ar != NULL) free(_ar);
}
// resets all counters
void RunningAverage::clear()
{
_cnt = 0;
_idx = 0;
_sum = 0.0;
for (int i = 0; i< _size; i++) _ar[i] = 0.0; // needed to keep addValue simple
void RunningAverage::clear()
{
_cnt = 0;
_idx = 0;
_sum = 0.0;
for (int i = 0; i< _size; i++) _ar[i] = 0.0; // needed to keep addValue simple
}
// adds a new value to the data-set
void RunningAverage::addValue(float f)
{
_sum -= _ar[_idx];
_ar[_idx] = f;
_sum += _ar[_idx];
_idx++;
if (_idx == _size) _idx = 0; // faster than %
if (_cnt < _size) _cnt++;
if (_ar == NULL) return;
_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 sofar
float RunningAverage::getAverage()
{
if (_cnt == 0) return 0; // NaN ? math.h
return _sum / _cnt;
if (_cnt == 0) return NAN;
return _sum / _cnt;
}
// returns the value of an element if exist, 0 otherwise
float RunningAverage::getElement(uint8_t idx)
{
if (idx >=_cnt ) return NAN;
return _ar[idx];
}
// fill the average with a value
@ -65,10 +76,10 @@ float RunningAverage::getAverage()
// number should preferably be between 1 and size
void RunningAverage::fillValue(float value, int number)
{
clear();
for (int i = 0; i < number; i++)
{
addValue(value);
}
clear();
for (int i = 0; i < number; i++)
{
addValue(value);
}
}
// END OF FILE

View File

@ -1,6 +1,6 @@
#ifndef RunningAverage_h
#define RunningAverage_h
//
//
// FILE: RunningAverage.h
// AUTHOR: Rob dot Tillaart at gmail dot com
// PURPOSE: RunningAverage library for Arduino
@ -15,25 +15,33 @@
// add(x) addValue(x)
// avg() getAverage()
#define RUNNINGAVERAGE_LIB_VERSION "0.2.02"
#define RUNNINGAVERAGE_LIB_VERSION "0.2.04"
class RunningAverage
#include "Arduino.h"
class RunningAverage
{
public:
RunningAverage(void);
RunningAverage(int);
~RunningAverage();
void clear();
void addValue(float);
float getAverage();
void fillValue(float, int);
public:
RunningAverage(void);
RunningAverage(int);
~RunningAverage();
void clear();
void addValue(float);
void fillValue(float, int);
float getAverage();
float getElement(uint8_t idx);
uint8_t getSize() { return _size; }
uint8_t getCount() { return _cnt; }
protected:
int _size;
int _cnt;
int _idx;
float _sum;
float * _ar;
uint8_t _size;
uint8_t _cnt;
uint8_t _idx;
float _sum;
float * _ar;
};
#endif

View File

@ -0,0 +1,40 @@
//
// FILE: runningAverageHour.pde
// AUTHOR: Rob Tillaart
// DATE: 2012-12-30
//
// PUPROSE: show working of runningAverage per hour
// in 2 steps - last minute + last hour
// 3 or more steps also possible
//
#include "RunningAverage.h"
RunningAverage raMinute(60);
RunningAverage raHour(60);
int samples = 0;
void setup(void)
{
Serial.begin(115200);
Serial.println("Demo RunningAverage lib - average per minute & hour");
Serial.print("Version: ");
Serial.println(RUNNINGAVERAGE_LIB_VERSION);
raHour.clear();
raMinute.clear();
}
void loop(void)
{
long rn = random(0, 100);
raMinute.addValue(rn);
samples++;
if (samples % 60 == 0) raHour.addValue(raMinute.getAverage());
Serial.print(" raMinute: ");
Serial.print(raMinute.getAverage(), 4);
Serial.print(" raHour: ");
Serial.println(raHour.getAverage(), 4);
}

View File

@ -1,28 +0,0 @@
#include "RunningAverage.h"
RunningAverage raMinute(60);
RunningAverage raHour(60);
int samples = 0;
void setup(void)
{
Serial.begin(115200);
Serial.println("Demo RunningAverage lib - average per minute & hour");
raHour.clr();
raMinute.clr();
}
void loop(void)
{
long rn = random(0, 100);
raMinute.add(rn);
samples++;
if (samples % 60 == 0) raHour.add(raMinute.avg());
Serial.print(" raMinute: ");
Serial.print(raMinute.avg(), 4);
Serial.print(" raHour: ");
Serial.println(raHour.avg(), 4);
}

View File

@ -0,0 +1,37 @@
//
// FILE: runningAverageTest.pde
// AUTHOR: Rob Tillaart
// DATE: 2012-12-30
//
// PUPROSE: show working of runningAverage
//
#include "RunningAverage.h"
RunningAverage myRA(10);
int samples = 0;
void setup(void)
{
Serial.begin(115200);
Serial.println("Demo RunningAverage lib");
Serial.print("Version: ");
Serial.println(RUNNINGAVERAGE_LIB_VERSION);
myRA.clear(); // explicitly start clean
}
void loop(void)
{
long rn = random(0, 1000);
myRA.addValue(rn * 0.001);
samples++;
Serial.print("Running Average: ");
Serial.println(myRA.getAverage(), 3);
if (samples == 300)
{
samples = 0;
myRA.clear();
}
delay(100);
}

View File

@ -1,27 +0,0 @@
#include "RunningAverage.h"
RunningAverage myRA(10); // use default size
int samples = 0;
void setup(void)
{
Serial.begin(115200);
Serial.println("Demo RunningAverage lib");
myRA.clr(); // explicitly start clean
}
void loop(void)
{
long rn = random(0, 100);
myRA.add(rn/100.0);
samples++;
Serial.print("Running Average: ");
Serial.println(myRA.avg(), 4);
if (samples == 300)
{
samples = 0;
myRA.clr();
}
delay(100);
}

View File

@ -16,6 +16,9 @@ clear KEYWORD2
addValue KEYWORD2
getAverage KEYWORD2
fillValue KEYWORD2
getElement KEYWORD2
getSize KEYWORD2
getCount KEYWORD2
#######################################
# Instances (KEYWORD2)