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
Revision 2:08137bac3611, committed 2016-10-27
- Comitter:
- suupen
- Date:
- Thu Oct 27 02:03:28 2016 +0000
- Parent:
- 1:cd8bb4f0b08d
- Child:
- 3:ea853fc7172d
- Commit message:
- sw level capture is ticker(10ms) before DigitalInterrupt
Changed in this revision
DigitalSw.cpp | Show annotated file Show diff for this revision Revisions of this file |
DigitalSw.h | Show annotated file Show diff for this revision Revisions of this file |
--- 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; - } - } -} -
--- a/DigitalSw.h Sun Oct 23 09:46:01 2016 +0000 +++ b/DigitalSw.h Thu Oct 27 02:03:28 2016 +0000 @@ -108,11 +108,11 @@ private: - void swLevelUp(void); - void swLevelDown(void); + void swCheck(void); - - InterruptIn _sw; + Ticker _swCheckPeriod; + + DigitalIn _sw; volatile int16_t _onEdge; volatile int16_t _offEdge;