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
Diff: hardwareInterface.cpp
- 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; } }