Mutila: Mouse's Utilities for Arduino
Oft-used utilities: debouncing buttons, averaging samples, and so on.
QuantizedPot.cpp
1 #include <stdlib.h>
2 #include <Arduino.h>
3 #include <Millis.h>
4 
5 #include "QuantizedPot.h"
6 
7 QuantizedPot::QuantizedPot(const uint8_t pin, int8_t maxRanges) :
8  _pin(pin),
9  _rangeMax(maxRanges),
10  _rangeCount(0)
11 {
12  // allocate ptr array for ranges
13  _ranges = new NumericRange<int>*[maxRanges];
14 
15  // set them all to NULL for now
16  for (int8_t i=0; i<_rangeMax; i++) {
17  _ranges[i] = NULL;
18  }
19 
20 }
21 
23 {
24  if (_ranges != NULL) {
25  for (int8_t i=0; i<_rangeMax; i++) {
26  if (_ranges[i] != NULL) {
27  delete _ranges[i];
28  _ranges[i] = NULL;
29  }
30  }
31  delete _ranges;
32  _ranges = NULL;
33  }
34 }
35 
36 int8_t QuantizedPot::addRange(int start, int end)
37 {
38  if (_rangeCount >= _rangeMax) {
39  return -1;
40  }
41 
42  if (_ranges[_rangeCount] != NULL) {
43  delete _ranges[_rangeCount];
44  }
45 
46  _ranges[_rangeCount] = new NumericRange<int>(start, end);
47  return _rangeCount++;
48 }
49 
50 void QuantizedPot::begin(uint8_t threshold, uint8_t delay)
51 {
52  _threshold = threshold;
53  _delay = delay;
54  _lastRaw = 0;
55  setState(0);
56 }
57 
59 {
60  if (DoEvery(_delay, _lastUpdate)) {
61  int8_t valueNow = _value();
62  if (valueNow != _state) {
63  _counter++;
64  if (_counter > _threshold) {
65  setState(valueNow);
66  }
67  } else if (_counter > 0) {
68  _counter = 0;
69  }
70  }
71 }
72 
74 {
75  return _state;
76 }
77 
79 {
80  // 0 <= raw < 1024
81  int raw = analogRead(_pin);
82  _velocity = raw - _lastRaw;
83  _lastRaw = raw;
84  for (int8_t i=0; i<_rangeCount; i++) {
85  if (_ranges[i]->contains(raw)) {
86  return i;
87  }
88  }
89  return -1;
90 }
91 
92 void QuantizedPot::setState(int8_t newState)
93 {
94  _lastStateChange = Millis();
95  _state = newState;
96  _counter = 0;
97 }
98 
int8_t _value()
int8_t addRange(int start, int end)
QuantizedPot(const uint8_t pin, int8_t maxRanges)
Definition: QuantizedPot.cpp:7
int8_t value()
void begin(uint8_t threshold=AbstractDebouncedButton::DefaultThreshold, uint8_t delay=AbstractDebouncedButton::DefaultButtonDelay)