This library is push button or dipSw noise cancel and on/off edge recognition
Dependents: led-sound_checker clockGenerator
Fork of DigitalSw by
sample program "DigitalSW_hello" https://developer.mbed.org/users/suupen/code/DigitalSW_hello/rev/ffa16c2a347f
DigitalSw.cpp
- Committer:
- suupen
- Date:
- 2016-10-27
- Revision:
- 3:ea853fc7172d
- Parent:
- 2:08137bac3611
File content as of revision 3:ea853fc7172d:
/** * digital Sw Library */ #include "DigitalSw.h" /** * */ DigitalSw::DigitalSw(PinName sw, PinMode pull = PullUp ) : _sw(sw), _pull(pull) { reset(); _sw.mode(_pull); _swCheckPeriod.attach_us(this, &DigitalSw::swCheck, 10000); } void DigitalSw::reset(void) { _onEdge = 0; _offEdge = 0; _levelNow = 0; _levelOld = 0; } int16_t DigitalSw::getLevel(void) { return _levelNow; } int16_t DigitalSw::getOnEdge(void) { int16_t ans = _onEdge; _onEdge = 0; return ans; } int16_t DigitalSw::getOffEdge(void) { int16_t ans = _offEdge; _offEdge = 0; return ans; } void DigitalSw::swCheck(void) { static uint8_t levelBuffer = 0; if(_pull == PullUp){ levelBuffer = (levelBuffer << 1) | !_sw; } else{ levelBuffer = (levelBuffer << 1) | _sw; } if(levelBuffer == 0x00) { _levelNow = 0; } else if(levelBuffer == 0xff) { _levelNow = 1; } if((_levelOld == 0 ) && (_levelNow == 1)) { _levelOld = _levelNow; _onEdge |= 1; } else if((_levelOld == 1 ) && (_levelNow == 0)) { _levelOld = _levelNow; _offEdge |= 1; } }