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:
1:3a050d26d4f6
Parent:
0:8dbd6bd9167f
--- a/hardwareInterface.cpp	Tue May 19 15:45:42 2015 +0000
+++ b/hardwareInterface.cpp	Wed Jun 03 22:54:25 2015 +0000
@@ -24,7 +24,7 @@
 __attribute((section("AHBSRAM0"),aligned)) outputStream textDisplay(512);
 
 #else
-outputStream textDisplay(256);
+outputStream textDisplay(4096);
 
 #endif
 
@@ -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,37 @@
     //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 ((newState == 0) && (!lastDownEvent.triggered)){
-        lastDownEvent.timeStamp = timeStamp;
-        lastDownEvent.triggered = true;
-    } else if ((newState == 1) && (!lastUpEvent.triggered)) {
-        lastUpEvent.timeStamp = timeStamp;
-        lastUpEvent.triggered = true;
+    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;
+        }
+    }
+}
+
+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;
     }
 }
 
@@ -180,6 +208,7 @@
         //We don't have enough space in the buffer, so flush it
         flush();
     }
+
     if (!(totalWriteHead+strLen > (totalReadHead + bufferSize))) {
         while (strLen - total > 0) {
             chunk = min((bufferSize - writeHead), strLen - total);