Debaunced Input like InterruptIn.
Dependents: LcdClock idd_hw2_martincowell_bicyclehid IDD_FALL15_HW2_JMARQUIS_Keypadentry
DebouncedEdgeIn.cpp
- Committer:
- togayan
- Date:
- 2014-02-22
- Revision:
- 0:471239ea932b
File content as of revision 0:471239ea932b:
#include "DebouncedEdgeIn.h" #include "mbed.h" /* * Constructor */ DebouncedEdgeIn::DebouncedEdgeIn(PinName in) : _in(in), _ticker(), _rise(), _fall(), // reset all the flags and counters _samples(0), _output(0), _output_last(0) { // Attach ticker _ticker.attach(this, &DebouncedEdgeIn::_sample, 0.005); } DebouncedEdgeIn::~DebouncedEdgeIn() { _ticker.detach(); } void DebouncedEdgeIn::rise(void (*fptr)(void)) { _rise.attach(fptr); } void DebouncedEdgeIn::fall(void (*fptr)(void)) { _fall.attach(fptr); } void DebouncedEdgeIn::mode(PinMode pull) { _in.mode(pull); } // return the debounced status int DebouncedEdgeIn::read(void) { return(_output); } // shorthand for read() DebouncedEdgeIn::operator int() { return read(); } void DebouncedEdgeIn::_sample(void) { // 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; } // Rising edge detection if ((_output == 1) && (_output_last == 0)) { _rise.call(); } // Falling edge detection else if ((_output == 0) && (_output_last == 1)) { _fall.call(); } // update the output _output_last = _output; }