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

Files at this revision

API Documentation at this revision

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;