Microcontroller firmware that uses a simple, yet powerful scripting language to control the timing of input and output events with high temporal resolution. Written by Mattias Karlsson

Dependencies:   SMARTWAV mbed

Revision:
2:35266b266eaa
Parent:
0:8dbd6bd9167f
Child:
3:d7b0a0890d96
--- a/hardwareInterface.cpp	Tue May 19 15:45:42 2015 +0000
+++ b/hardwareInterface.cpp	Wed Jun 03 23:41:16 2015 +0000
@@ -74,6 +74,9 @@
 sDigitalIn::sDigitalIn() {
     lastDownEvent.triggered = false;
     lastUpEvent.triggered = false;
+    bufferedDownEvent.triggered = false;
+    bufferedUpEvent.triggered = false;
+    updating = false;
 }
 
 void sDigitalIn::addStateChange(int newState, uint32_t timeStamp) {
@@ -81,12 +84,45 @@
     //With levers and beam breaks, there will be flutter when triggers happen.
     //The goal is to capture the initial event time, so we ignore extra triggers
     //until it has been processed
+    if (!updating) {
+        if ((newState == 0) && (!lastDownEvent.triggered)){
+            lastDownEvent.timeStamp = timeStamp;
+            lastDownEvent.triggered = true;
+        } else if ((newState == 1) && (!lastUpEvent.triggered)) {
+            lastUpEvent.timeStamp = timeStamp;
+            lastUpEvent.triggered = true;
+        }
+    } else {
+        //If we are currently checking this input, then we buffer the trigger and deal with it after
+        if (newState == 0){
+            bufferedDownEvent.timeStamp = timeStamp;
+            bufferedDownEvent.triggered = true;
+        } else if (newState == 1) {
+            bufferedUpEvent.timeStamp = timeStamp;
+            bufferedUpEvent.triggered = true;
+        }
+    }
+    /*
     if ((newState == 0) && (!lastDownEvent.triggered)){
         lastDownEvent.timeStamp = timeStamp;
         lastDownEvent.triggered = true;
     } else if ((newState == 1) && (!lastUpEvent.triggered)) {
         lastUpEvent.timeStamp = timeStamp;
         lastUpEvent.triggered = true;
+    }*/
+}
+
+void sDigitalIn::setUpdate(bool state) {
+    updating = state; //If true, then we buffer any trigger events until the update check is done.
+    if (!updating) {
+        if (bufferedUpEvent.triggered) {
+            lastUpEvent = bufferedUpEvent;
+        }
+        if (bufferedDownEvent.triggered) {
+            lastDownEvent = bufferedDownEvent;
+        }
+        bufferedDownEvent.triggered = false;
+        bufferedUpEvent.triggered = false;
     }
 }