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:
0:45e3ec3004a6
Child:
2:08137bac3611
Child:
5:9198c5c0afcb
--- /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;
+        }
+    }
+}
+