Lab 2 Button Testing.

Fork of digitalInPolling_sample by William Marsh

Revision:
0:a66a8cb0012c
Child:
1:4709af498799
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 23 13:53:49 2017 +0000
@@ -0,0 +1,65 @@
+#include "mbed.h"
+#include "rtos.h"
+
+// Labs 2: Example program for polling an input
+// --------------------------------------------
+// The program uses a thread to poll a digital input
+//   - The thread monitors the position of the button
+//   - When the button transitions up and down, a press event is signaled 
+//   - Button bounce is guarded against
+// A second thread checks for the press event and toggles the LED
+
+DigitalIn button(PTD0, PullUp);
+DigitalOut led(LED_RED);
+
+Thread pollT ; // thread to poll
+Thread flashT ; // thread to flash light
+volatile int pressEvent = 0 ;  // Variabe set by the polling thread
+
+enum buttonPos { up, down, bounce }; // Button positions
+void polling() {
+    buttonPos pos = up ;
+    int bcounter = 0 ;
+    while (true) {
+        switch (pos) {
+            case up :
+                if (button == 1) {    // now down 
+                    pressEvent = 1 ;  // transition occurred
+                    pos = down ;
+                }
+                break ;
+            case down : 
+                if (button == 0) { // no longer down
+                    bcounter = 3 ; // wait four cycles
+                    pos = bounce ;
+                }
+                break ;
+            case bounce :
+                if (button == 1) { // down again - button has bounced
+                    pos = down ;   // no event
+                } else if (bcounter == 0) {
+                    pos = up ;     // delay passed - reset to up
+                } else {
+                    bcounter-- ;   // continue waiting
+                }
+                break ;
+        }
+        Thread::wait(30);
+    }
+}
+
+// Toggle the LED every time the button is pressed
+void flash() {
+    while(true) {
+        if (pressEvent) {
+            pressEvent = 0 ; // clear the event variable
+            led = !led ;
+        }
+        Thread::wait(100) ;
+    }
+}
+
+int main() {
+    pollT.start(&polling) ; // start the polling thread running 
+    flashT.start(&flash) ; // start the flashing thread running 
+}
\ No newline at end of file