
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
Revision 2:35266b266eaa, committed 2015-06-03
- 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
--- 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); };