Debouncing library (not mine)

Dependents:   ElecPneuShifter_4 tarea1 tarea_miercoles Rampa ... more

Committer:
WarwickRacing
Date:
Sun Nov 28 14:19:52 2010 +0000
Revision:
0:8992c13bbb9b

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WarwickRacing 0:8992c13bbb9b 1 #include "DebouncedIn.h"
WarwickRacing 0:8992c13bbb9b 2 #include "mbed.h"
WarwickRacing 0:8992c13bbb9b 3
WarwickRacing 0:8992c13bbb9b 4 /*
WarwickRacing 0:8992c13bbb9b 5 * Constructor
WarwickRacing 0:8992c13bbb9b 6 */
WarwickRacing 0:8992c13bbb9b 7 DebouncedIn::DebouncedIn(PinName in)
WarwickRacing 0:8992c13bbb9b 8 : _in(in) {
WarwickRacing 0:8992c13bbb9b 9
WarwickRacing 0:8992c13bbb9b 10 // reset all the flags and counters
WarwickRacing 0:8992c13bbb9b 11 _samples = 0;
WarwickRacing 0:8992c13bbb9b 12 _output = 0;
WarwickRacing 0:8992c13bbb9b 13 _output_last = 0;
WarwickRacing 0:8992c13bbb9b 14 _rising_flag = 0;
WarwickRacing 0:8992c13bbb9b 15 _falling_flag = 0;
WarwickRacing 0:8992c13bbb9b 16 _state_counter = 0;
WarwickRacing 0:8992c13bbb9b 17
WarwickRacing 0:8992c13bbb9b 18 // Attach ticker
WarwickRacing 0:8992c13bbb9b 19 _ticker.attach(this, &DebouncedIn::_sample, 0.005);
WarwickRacing 0:8992c13bbb9b 20 }
WarwickRacing 0:8992c13bbb9b 21
WarwickRacing 0:8992c13bbb9b 22 void DebouncedIn::_sample() {
WarwickRacing 0:8992c13bbb9b 23
WarwickRacing 0:8992c13bbb9b 24 // take a sample
WarwickRacing 0:8992c13bbb9b 25 _samples = _samples >> 1; // shift left
WarwickRacing 0:8992c13bbb9b 26
WarwickRacing 0:8992c13bbb9b 27 if (_in) {
WarwickRacing 0:8992c13bbb9b 28 _samples |= 0x80;
WarwickRacing 0:8992c13bbb9b 29 }
WarwickRacing 0:8992c13bbb9b 30
WarwickRacing 0:8992c13bbb9b 31 // examine the sample window, look for steady state
WarwickRacing 0:8992c13bbb9b 32 if (_samples == 0x00) {
WarwickRacing 0:8992c13bbb9b 33 _output = 0;
WarwickRacing 0:8992c13bbb9b 34 }
WarwickRacing 0:8992c13bbb9b 35 else if (_samples == 0xFF) {
WarwickRacing 0:8992c13bbb9b 36 _output = 1;
WarwickRacing 0:8992c13bbb9b 37 }
WarwickRacing 0:8992c13bbb9b 38
WarwickRacing 0:8992c13bbb9b 39
WarwickRacing 0:8992c13bbb9b 40 // Rising edge detection
WarwickRacing 0:8992c13bbb9b 41 if ((_output == 1) && (_output_last == 0)) {
WarwickRacing 0:8992c13bbb9b 42 _rising_flag++;
WarwickRacing 0:8992c13bbb9b 43 _state_counter = 0;
WarwickRacing 0:8992c13bbb9b 44 }
WarwickRacing 0:8992c13bbb9b 45
WarwickRacing 0:8992c13bbb9b 46 // Falling edge detection
WarwickRacing 0:8992c13bbb9b 47 else if ((_output == 0) && (_output_last == 1)) {
WarwickRacing 0:8992c13bbb9b 48 _falling_flag++;
WarwickRacing 0:8992c13bbb9b 49 _state_counter = 0;
WarwickRacing 0:8992c13bbb9b 50 }
WarwickRacing 0:8992c13bbb9b 51
WarwickRacing 0:8992c13bbb9b 52 // steady state
WarwickRacing 0:8992c13bbb9b 53 else {
WarwickRacing 0:8992c13bbb9b 54 _state_counter++;
WarwickRacing 0:8992c13bbb9b 55 }
WarwickRacing 0:8992c13bbb9b 56
WarwickRacing 0:8992c13bbb9b 57 // update the output
WarwickRacing 0:8992c13bbb9b 58 _output_last = _output;
WarwickRacing 0:8992c13bbb9b 59
WarwickRacing 0:8992c13bbb9b 60 }
WarwickRacing 0:8992c13bbb9b 61
WarwickRacing 0:8992c13bbb9b 62
WarwickRacing 0:8992c13bbb9b 63
WarwickRacing 0:8992c13bbb9b 64 // return number of rising edges
WarwickRacing 0:8992c13bbb9b 65 int DebouncedIn::rising(void) {
WarwickRacing 0:8992c13bbb9b 66 int return_value = _rising_flag;
WarwickRacing 0:8992c13bbb9b 67 _rising_flag = 0;
WarwickRacing 0:8992c13bbb9b 68 return(return_value);
WarwickRacing 0:8992c13bbb9b 69 }
WarwickRacing 0:8992c13bbb9b 70
WarwickRacing 0:8992c13bbb9b 71 // return number of falling edges
WarwickRacing 0:8992c13bbb9b 72 int DebouncedIn::falling(void) {
WarwickRacing 0:8992c13bbb9b 73 int return_value = _falling_flag;
WarwickRacing 0:8992c13bbb9b 74 _falling_flag = 0;
WarwickRacing 0:8992c13bbb9b 75 return(return_value);
WarwickRacing 0:8992c13bbb9b 76 }
WarwickRacing 0:8992c13bbb9b 77
WarwickRacing 0:8992c13bbb9b 78 // return number of ticsk we've bene steady for
WarwickRacing 0:8992c13bbb9b 79 int DebouncedIn::steady(void) {
WarwickRacing 0:8992c13bbb9b 80 return(_state_counter);
WarwickRacing 0:8992c13bbb9b 81 }
WarwickRacing 0:8992c13bbb9b 82
WarwickRacing 0:8992c13bbb9b 83 // return the debounced status
WarwickRacing 0:8992c13bbb9b 84 int DebouncedIn::read(void) {
WarwickRacing 0:8992c13bbb9b 85 return(_output);
WarwickRacing 0:8992c13bbb9b 86 }
WarwickRacing 0:8992c13bbb9b 87
WarwickRacing 0:8992c13bbb9b 88 // shorthand for read()
WarwickRacing 0:8992c13bbb9b 89 DebouncedIn::operator int() {
WarwickRacing 0:8992c13bbb9b 90 return read();
WarwickRacing 0:8992c13bbb9b 91 }