State machine

Dependencies:   mbed Adafruit_GFX BioroboticsMotorControl MODSERIAL BioroboticsEMGFilter

Revision:
1:cfa5abca6d43
Child:
2:141cfcafe72b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Button.h	Tue Oct 30 11:01:00 2018 +0000
@@ -0,0 +1,58 @@
+#pragma once
+
+#include "mbed.h"
+
+// seconds that a button should be stable to be considered "pressed".
+// 50 ms.
+const float debounce_time = 0.05;
+
+class Button {
+private:
+    InterruptIn pin;
+    
+    Timeout debounce_timeout;
+    
+    volatile bool pressed;
+    
+    volatile bool just_switched_to_pressed;
+    volatile bool just_got_pressed;
+    
+public:
+    Button(PinName pin_name):
+        pin(pin_name)
+    {
+        pin.rise(this, &Button::rise);
+        pin.fall(this, &Button::fall);
+        
+        pressed = false;
+    }
+    
+    void update() {
+        if (just_got_pressed) {
+            just_got_pressed = false;
+        }
+        if (just_switched_to_pressed) {
+            just_got_pressed = true;
+            just_switched_to_pressed = false;
+        }
+    }
+    
+    bool is_pressed() { return pressed; };
+    // Only active just after a state change from not pressed to pressed.
+    // Get's reset after `update()` is called.
+    bool has_just_been_pressed() { return just_got_pressed; };
+private:
+    void rise() {
+        debounce_timeout.attach(this, &Button::debounce_callback, debounce_time);
+    }
+    
+    void fall() {
+        debounce_timeout.detach();
+        pressed = false;
+    }
+    
+    void debounce_callback() {
+        pressed = true;
+        just_switched_to_pressed = true;
+    }
+};
\ No newline at end of file