Library for debouncing inputs, originally by Andres Mora Bedoya. Updated to include PinMode capability and class documentation.

Fork of DebouncedIn by Andrés Mora Bedoya

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?

UserRevisionLine numberNew 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 }