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:
- 2:08137bac3611
- Parent:
- 0:45e3ec3004a6
- Child:
- 3:ea853fc7172d
diff -r cd8bb4f0b08d -r 08137bac3611 DigitalSw.cpp --- a/DigitalSw.cpp Sun Oct 23 09:46:01 2016 +0000 +++ b/DigitalSw.cpp Thu Oct 27 02:03:28 2016 +0000 @@ -11,15 +11,12 @@ ) : _sw(sw) { - _onEdge = 0; - _offEdge = 0; - _levelNow = 1; - _levelOld = 1; - + reset(); _sw.mode(PullUp); - _sw.rise(this, &DigitalSw::swLevelUp); - _sw.fall(this, &DigitalSw::swLevelDown); + _swCheckPeriod.attach_us(this, &DigitalSw::swCheck, 10000); + + } @@ -28,13 +25,13 @@ { _onEdge = 0; _offEdge = 0; - _levelNow = 1; - _levelOld = 1; + _levelNow = 0; + _levelOld = 0; } int16_t DigitalSw::getLevel(void) { - return !_levelNow; + return _levelNow; } int16_t DigitalSw::getOnEdge(void) @@ -53,43 +50,25 @@ return ans; } - - -void DigitalSw::swLevelUp(void) +void DigitalSw::swCheck(void) { - uint8_t levelCheck = 0xaa; + static uint8_t levelBuffer = 0; + + levelBuffer = (levelBuffer << 1) | !_sw; - while((levelCheck != 0x00) && (levelCheck != 0xff)) { - levelCheck = (levelCheck << 1) | _sw.read(); + if(levelBuffer == 0x00) { + _levelNow = 0; + } else if(levelBuffer == 0xff) { + _levelNow = 1; } - if(levelCheck == 0xff) { + if((_levelOld == 0 ) && (_levelNow == 1)) { _levelOld = _levelNow; - _levelNow = 1; - + _onEdge |= 1; + } else if((_levelOld == 1 ) && (_levelNow == 0)) { + _levelOld = _levelNow; + _offEdge |= 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; - } - } -} -