Mutila: Mouse's Utilities for Arduino
Oft-used utilities: debouncing buttons, averaging samples, and so on.
BufferedSampler.cpp
1 #include <Arduino.h>
2 #include "MutilaDebug.h"
3 #include "Millis.h"
4 #include "BufferedSampler.h"
5 
6 BufferedSampler::BufferedSampler(const uint8_t pin, const uint16_t periodMs, const uint8_t samples) :
7  AbstractSampler(pin, periodMs),
8  _samples(samples),
9  _idx(0),
10  _count(0),
11  _lastUpdated(0),
12  _updated(false),
13  _minimum(0),
14  _maximum(0),
15  _mean(0)
16 {
17  // Allocate ring buffer for sample data
18  _sampleData = new int16_t [samples];
19 }
20 
22 {
23  if (_sampleData != NULL) {
24  delete _sampleData;
25  _sampleData = NULL;
26  }
27 }
28 
30 {
31  _DBLN(F("BufferedSampler::begin"));
32  // Note: no need to set pinMode for analog inputs
33  _count = 0;
34  _minimum = 0;
35  _maximum = 0;
36  _mean = 0;
37  _lastUpdated = 0;
38  _updated = false;
39 }
40 
42 {
43  if (_periodMs == 0 || MillisSince(_lastUpdated) >= _periodMs || _count == 0) {
44  _sampleData[_idx] = analogRead(_pin);
45  _DB(F("BufferedSampler::update sample="));
46  _DBLN(_sampleData[_idx]);
48  _idx = (_idx + 1) % _samples;
49  _lastUpdated = Millis();
50  _updated = true;
51  }
52 }
53 
55 {
56  return _count == 0 ? 0 : _sampleData[_idx == 0 ? _samples-1 : _idx-1];
57 }
58 
60 {
61  if (_updated) {
62  int32_t sum = _sampleData[0];
63  _minimum = _sampleData[0];
64  _maximum = _sampleData[0];
65  for (uint8_t i=1; i<_count; i++) {
66  sum += _sampleData[i];
69  }
70  _mean = (float)sum/_count;
71  _updated = false;
72  }
73 }
74 
virtual int16_t last()
Get the most recent sample value.
uint32_t _lastUpdated
when last sample taken
const uint8_t _pin
pin to read data from
int16_t * _sampleData
ring buffer for data
virtual void begin()
uint8_t _samples
max number of samples to keep in buffer
const uint16_t _periodMs
minimum ms
uint8_t _count
number of samples in buffer
float _mean
most recently calculated mean value
virtual void update()
int16_t _minimum
most recently calculated minimum value
BufferedSampler(const uint8_t pin, const uint16_t periodMs=10, const uint8_t samples=10)
bool _updated
flag to re-calulate avg or not
Base class for analog pin sampling classes.
int16_t _maximum
most recently calculated maximum value
virtual void calculate()
calculate avg, min, max if required
uint8_t _idx
index ptr (ring buffer)