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
Diff: DigitalSw.cpp
- Revision:
- 0:45e3ec3004a6
- Child:
- 2:08137bac3611
- Child:
- 5:9198c5c0afcb
diff -r 000000000000 -r 45e3ec3004a6 DigitalSw.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DigitalSw.cpp Sun Oct 23 09:36:27 2016 +0000 @@ -0,0 +1,95 @@ +/** + * 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; + } + } +} +