Priliminary
Dependencies: DS1307 MAX17048 MODSERIAL SSD1308_128x64_I2C WatchDog mbed-rpc mbed
Fork of ECGAFE_copy by
Diff: DebouncedIn.cpp
- Revision:
- 0:ee0649a9025a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DebouncedIn.cpp Wed Sep 30 11:30:56 2015 +0000 @@ -0,0 +1,96 @@ +#include "DebouncedIn.h" +#include "mbed.h" + +/* + * Constructor + */ +DebouncedIn::DebouncedIn(PinName in) + : _in(in) { + + // reset all the flags and counters + _samples = 0; + _output = 0; + _output_last = 0; + _releasing_flag = 0; + _pressing_flag = 0; + _press_counter = 0; + + // Switch is assumed to go to ground + _in.mode(PullUp); + + // Attach ticker + _ticker.attach(this, &DebouncedIn::_sample, 0.005); +} + +void DebouncedIn::_sample() { + + // take a sample + _samples = _samples >> 1; // shift left + + if (_in) { + _samples |= 0x80; + } + + // examine the sample window, look for steady state + if (_samples == 0x00) { + _output = 0; + } + else if (_samples == 0xFF) { + _output = 1; + } + + + // Release detection + if ((_output == 1) && (_output_last == 0)) { + _releasing_flag++; + } + + // Press detection + else if ((_output == 0) && (_output_last == 1)) { + _pressing_flag++; + _press_counter = 0; + } + + // pressed state + else if (_output == 0) { + _press_counter++; + } + + // update the output + _output_last = _output; + + //printf("%d %d\n", _press_counter, _releasing_flag); +} + + + +// return number of releasing events +int DebouncedIn::releasing(void) { + int return_value = _releasing_flag; + _releasing_flag = 0; + return(return_value); +} + +// return number of pressing events +int DebouncedIn::pressing(void) { + int return_value = _pressing_flag; + _pressing_flag = 0; + return(return_value); +} + +// return number of ticks we've bene steady for +int DebouncedIn::pressed(void) { +return(_press_counter); +} + +// return the debounced status +int DebouncedIn::read(void) { + return(_output); +} + +// shorthand for read() +DebouncedIn::operator int() { + return read(); +} + +