This library is push button or dipSw noise cancel and on/off edge recognition

Dependents:   led-sound_checker clockGenerator

Fork of DigitalSw by suu pen

sample program "DigitalSW_hello" https://developer.mbed.org/users/suupen/code/DigitalSW_hello/rev/ffa16c2a347f

Revision:
2:08137bac3611
Parent:
0:45e3ec3004a6
Child:
3:ea853fc7172d
--- 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;
-        }
-    }
-}
-