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:
- 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);