Library for debouncing inputs, originally by Andres Mora Bedoya. Updated to include PinMode capability and class documentation.
Fork of DebouncedIn by
DebouncedIn.cpp@1:7b8a80c09b8c, 2014-10-08 (annotated)
- Committer:
- faucherb94
- Date:
- Wed Oct 08 14:44:47 2014 +0000
- Revision:
- 1:7b8a80c09b8c
- Parent:
- 0:dc1131de43e8
- Child:
- 2:261228f701a1
Added PinMode capability, added documentation tags into header file
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cmorab | 0:dc1131de43e8 | 1 | #include "DebouncedIn.h" |
cmorab | 0:dc1131de43e8 | 2 | #include "mbed.h" |
cmorab | 0:dc1131de43e8 | 3 | |
faucherb94 | 1:7b8a80c09b8c | 4 | /** |
cmorab | 0:dc1131de43e8 | 5 | * Constructor |
cmorab | 0:dc1131de43e8 | 6 | */ |
cmorab | 0:dc1131de43e8 | 7 | DebouncedIn::DebouncedIn(PinName in) |
cmorab | 0:dc1131de43e8 | 8 | : _in(in) { |
cmorab | 0:dc1131de43e8 | 9 | |
cmorab | 0:dc1131de43e8 | 10 | // reset all the flags and counters |
cmorab | 0:dc1131de43e8 | 11 | _samples = 0; |
cmorab | 0:dc1131de43e8 | 12 | _output = 0; |
cmorab | 0:dc1131de43e8 | 13 | _output_last = 0; |
cmorab | 0:dc1131de43e8 | 14 | _rising_flag = 0; |
cmorab | 0:dc1131de43e8 | 15 | _falling_flag = 0; |
cmorab | 0:dc1131de43e8 | 16 | _state_counter = 0; |
cmorab | 0:dc1131de43e8 | 17 | |
cmorab | 0:dc1131de43e8 | 18 | // Attach ticker |
cmorab | 0:dc1131de43e8 | 19 | _ticker.attach(this, &DebouncedIn::_sample, 0.005); |
cmorab | 0:dc1131de43e8 | 20 | } |
faucherb94 | 1:7b8a80c09b8c | 21 | |
faucherb94 | 1:7b8a80c09b8c | 22 | DebouncedIn::DebouncedIn(PinName in, PinMode mode) |
faucherb94 | 1:7b8a80c09b8c | 23 | : _in(in, mode) { |
faucherb94 | 1:7b8a80c09b8c | 24 | |
faucherb94 | 1:7b8a80c09b8c | 25 | // reset all the flags and counters |
faucherb94 | 1:7b8a80c09b8c | 26 | _samples = 0; |
faucherb94 | 1:7b8a80c09b8c | 27 | _output = 0; |
faucherb94 | 1:7b8a80c09b8c | 28 | _output_last = 0; |
faucherb94 | 1:7b8a80c09b8c | 29 | _rising_flag = 0; |
faucherb94 | 1:7b8a80c09b8c | 30 | _falling_flag = 0; |
faucherb94 | 1:7b8a80c09b8c | 31 | _state_counter = 0; |
faucherb94 | 1:7b8a80c09b8c | 32 | |
faucherb94 | 1:7b8a80c09b8c | 33 | // Attach ticker |
faucherb94 | 1:7b8a80c09b8c | 34 | _ticker.attach(this, &DebouncedIn::_sample, 0.005); |
faucherb94 | 1:7b8a80c09b8c | 35 | } |
cmorab | 0:dc1131de43e8 | 36 | |
cmorab | 0:dc1131de43e8 | 37 | void DebouncedIn::_sample() { |
cmorab | 0:dc1131de43e8 | 38 | |
cmorab | 0:dc1131de43e8 | 39 | // take a sample |
cmorab | 0:dc1131de43e8 | 40 | _samples = _samples >> 1; // shift left |
cmorab | 0:dc1131de43e8 | 41 | |
cmorab | 0:dc1131de43e8 | 42 | if (_in) { |
cmorab | 0:dc1131de43e8 | 43 | _samples |= 0x80; |
cmorab | 0:dc1131de43e8 | 44 | } |
cmorab | 0:dc1131de43e8 | 45 | |
cmorab | 0:dc1131de43e8 | 46 | // examine the sample window, look for steady state |
cmorab | 0:dc1131de43e8 | 47 | if (_samples == 0x00) { |
cmorab | 0:dc1131de43e8 | 48 | _output = 0; |
cmorab | 0:dc1131de43e8 | 49 | } |
cmorab | 0:dc1131de43e8 | 50 | else if (_samples == 0xFF) { |
cmorab | 0:dc1131de43e8 | 51 | _output = 1; |
cmorab | 0:dc1131de43e8 | 52 | } |
cmorab | 0:dc1131de43e8 | 53 | |
cmorab | 0:dc1131de43e8 | 54 | |
cmorab | 0:dc1131de43e8 | 55 | // Rising edge detection |
cmorab | 0:dc1131de43e8 | 56 | if ((_output == 1) && (_output_last == 0)) { |
cmorab | 0:dc1131de43e8 | 57 | _rising_flag++; |
cmorab | 0:dc1131de43e8 | 58 | _state_counter = 0; |
cmorab | 0:dc1131de43e8 | 59 | } |
cmorab | 0:dc1131de43e8 | 60 | |
cmorab | 0:dc1131de43e8 | 61 | // Falling edge detection |
cmorab | 0:dc1131de43e8 | 62 | else if ((_output == 0) && (_output_last == 1)) { |
cmorab | 0:dc1131de43e8 | 63 | _falling_flag++; |
cmorab | 0:dc1131de43e8 | 64 | _state_counter = 0; |
cmorab | 0:dc1131de43e8 | 65 | } |
cmorab | 0:dc1131de43e8 | 66 | |
cmorab | 0:dc1131de43e8 | 67 | // steady state |
cmorab | 0:dc1131de43e8 | 68 | else { |
cmorab | 0:dc1131de43e8 | 69 | _state_counter++; |
cmorab | 0:dc1131de43e8 | 70 | } |
cmorab | 0:dc1131de43e8 | 71 | |
cmorab | 0:dc1131de43e8 | 72 | // update the output |
cmorab | 0:dc1131de43e8 | 73 | _output_last = _output; |
cmorab | 0:dc1131de43e8 | 74 | |
cmorab | 0:dc1131de43e8 | 75 | } |
cmorab | 0:dc1131de43e8 | 76 | |
cmorab | 0:dc1131de43e8 | 77 | |
cmorab | 0:dc1131de43e8 | 78 | |
cmorab | 0:dc1131de43e8 | 79 | // return number of rising edges |
cmorab | 0:dc1131de43e8 | 80 | int DebouncedIn::rising(void) { |
cmorab | 0:dc1131de43e8 | 81 | int return_value = _rising_flag; |
cmorab | 0:dc1131de43e8 | 82 | _rising_flag = 0; |
cmorab | 0:dc1131de43e8 | 83 | return(return_value); |
cmorab | 0:dc1131de43e8 | 84 | } |
cmorab | 0:dc1131de43e8 | 85 | |
cmorab | 0:dc1131de43e8 | 86 | // return number of falling edges |
cmorab | 0:dc1131de43e8 | 87 | int DebouncedIn::falling(void) { |
cmorab | 0:dc1131de43e8 | 88 | int return_value = _falling_flag; |
cmorab | 0:dc1131de43e8 | 89 | _falling_flag = 0; |
cmorab | 0:dc1131de43e8 | 90 | return(return_value); |
cmorab | 0:dc1131de43e8 | 91 | } |
cmorab | 0:dc1131de43e8 | 92 | |
cmorab | 0:dc1131de43e8 | 93 | // return number of ticsk we've bene steady for |
cmorab | 0:dc1131de43e8 | 94 | int DebouncedIn::steady(void) { |
cmorab | 0:dc1131de43e8 | 95 | return(_state_counter); |
cmorab | 0:dc1131de43e8 | 96 | } |
cmorab | 0:dc1131de43e8 | 97 | |
cmorab | 0:dc1131de43e8 | 98 | // return the debounced status |
cmorab | 0:dc1131de43e8 | 99 | int DebouncedIn::read(void) { |
cmorab | 0:dc1131de43e8 | 100 | return(_output); |
cmorab | 0:dc1131de43e8 | 101 | } |
cmorab | 0:dc1131de43e8 | 102 | |
cmorab | 0:dc1131de43e8 | 103 | // shorthand for read() |
cmorab | 0:dc1131de43e8 | 104 | DebouncedIn::operator int() { |
cmorab | 0:dc1131de43e8 | 105 | return read(); |
cmorab | 0:dc1131de43e8 | 106 | } |