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

Files at this revision

API Documentation at this revision

Comitter:
mkarlsso
Date:
Wed Jun 03 23:41:16 2015 +0000
Parent:
0:8dbd6bd9167f
Child:
3:d7b0a0890d96
Commit message:
Working version with proper interrupt pausing during dIn update

Changed in this revision

behave.cpp Show annotated file Show diff for this revision Revisions of this file
hardwareInterface.cpp Show annotated file Show diff for this revision Revisions of this file
hardwareInterface.h Show annotated file Show diff for this revision Revisions of this file
--- a/behave.cpp	Tue May 19 15:45:42 2015 +0000
+++ b/behave.cpp	Wed Jun 03 23:41:16 2015 +0000
@@ -441,12 +441,16 @@
 bool digitalPort::update() {
 
     bool changed = false;
+    bool execUp = false;
+    bool execDown = false;
     if ((timeKeeper - lastChangeTime) > 1) { //prevents flutter triggers when button is pressed
 
         //changed = (lastInState != inState);
 
         changed = (inPin->lastUpEvent.triggered || inPin->lastDownEvent.triggered);
         if (changed) {
+            inPin->setUpdate(true); //Once we get the state of the pin, we buffer any pin changes until we are done checking
+
             inState = getDigitalIn();
 
             //We need to ignore flutter when levers/beam breaks are triggered. So
@@ -506,12 +510,16 @@
                     if (triggerDownEventPtr != NULL) {triggerDownEventPtr->execute();}
                 }
             }
+            
+            lastInState = inState;
+            inPin->lastUpEvent.triggered = false;
+            inPin->lastDownEvent.triggered = false;
+            
+            inPin->setUpdate(false); //This also checks if there were any buffered changes that occured
 
         }
 
-        lastInState = inState;
-        inPin->lastUpEvent.triggered = false;
-        inPin->lastDownEvent.triggered = false;
+        
 
     }
 
--- 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;
     }
 }
 
--- a/hardwareInterface.h	Tue May 19 15:45:42 2015 +0000
+++ b/hardwareInterface.h	Wed Jun 03 23:41:16 2015 +0000
@@ -40,13 +40,16 @@
     virtual int read() = 0;
     virtual void interrupt_up_callback() = 0;
     virtual void interrupt_down_callback() = 0;
+    void setUpdate(bool);
 
     changeEvent lastUpEvent;
     changeEvent lastDownEvent;
 
 protected:
 
-
+    bool updating;
+    changeEvent bufferedUpEvent;
+    changeEvent bufferedDownEvent;
     void addStateChange(int newState, uint32_t timeStamp);
 
 };