This library is togle sw on/off edge and level decision. input sw level noise and chatting cancel. MDX-20 controler用
Fork of DigitalSw by
DigitalSw.cpp
- Committer:
- suupen
- Date:
- 2016-10-23
- Revision:
- 0:45e3ec3004a6
- Child:
- 2:08137bac3611
- Child:
- 5:9198c5c0afcb
File content as of revision 0:45e3ec3004a6:
/** * digital Sw Library */ #include "DigitalSw.h" /** * */ DigitalSw::DigitalSw(PinName sw ) : _sw(sw) { _onEdge = 0; _offEdge = 0; _levelNow = 1; _levelOld = 1; _sw.mode(PullUp); _sw.rise(this, &DigitalSw::swLevelUp); _sw.fall(this, &DigitalSw::swLevelDown); } void DigitalSw::reset(void) { _onEdge = 0; _offEdge = 0; _levelNow = 1; _levelOld = 1; } 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::swLevelUp(void) { uint8_t levelCheck = 0xaa; while((levelCheck != 0x00) && (levelCheck != 0xff)) { levelCheck = (levelCheck << 1) | _sw.read(); } if(levelCheck == 0xff) { _levelOld = _levelNow; _levelNow = 1; if(_levelOld == 0) { _offEdge |= 1; } } } void DigitalSw::swLevelDown(void) { uint8_t levelCheck = 0xaa; while((levelCheck != 0x00) && (levelCheck != 0xff)) { levelCheck = (levelCheck << 1) | _sw.read(); } if(levelCheck == 0x00) { _levelOld = _levelNow; _levelNow = 0; if(_levelOld == 1) { _onEdge |= 1; } } }