The codebase to run the *spark d-fuser controller www.sparkav.co.uk/dvimixer
Dependencies: SPK-TVOne DMX DmxArtNet NetServicesMin OSC PinDetect mRotaryEncoder iniparser mbed spk_oled_ssd1305 filter
Diff: spk_utils.h
- Revision:
- 62:523de36d2f88
- Parent:
- 57:14d37904c889
--- a/spk_utils.h Fri Jul 26 12:46:58 2013 +0000 +++ b/spk_utils.h Fri Jul 26 16:15:41 2013 +0000 @@ -202,58 +202,101 @@ public: SPKMessageHold() { - holding = false; + state = notHold; currentMessage = ""; savedMessage = ""; } - void addMessage(string message, float minimumSeconds) + void addMessage(string message) + { + addMessage(message, 0, 0); + } + + void addMessage(string message, float maxSecs) { - if (holding) + addMessage(message, 0.1, maxSecs); + } + + void addMessage(string message, float minSecs, float maxSecs) + { + if (state == notHold) { - if (minimumSeconds > 0.0f) enqueuedMessages.push( make_pair(message, minimumSeconds) ); - else savedMessage = message; - } - else - { - if (minimumSeconds > 0.0f) + if (maxSecs > 0.0f) { - timeout.detach(); - timeout.attach(this, &SPKMessageHold::handleTimeout, minimumSeconds); - holding = true; + state = (minSecs > 0) ? holdWaitingForMin : holdMinPassed; savedMessage = currentMessage; currentMessage = message; + + maxTimeout.attach(this, &SPKMessageHold::handleTimeout, maxSecs); + if (minSecs > 0) minTimeout.attach(this, &SPKMessageHold::handleTimeout, minSecs); } else { currentMessage = message; } } + if (state == holdWaitingForMin) + { + if (maxSecs > 0.0f) enqueueMessage(message, minSecs, maxSecs); + else savedMessage = message; + } + if (state == holdMinPassed) + { + if (maxSecs > 0.0f) { enqueueMessage(message, minSecs, maxSecs); dequeueMessage(); } + else savedMessage = message; + } } string message() { return currentMessage; } private: + enum stateType { notHold, holdWaitingForMin, holdMinPassed }; + struct messageType { string message; float minSecs; float maxSecs; }; + + void enqueueMessage(string message, float minSecs, float maxSecs) + { + messageType messageStruct = {message, minSecs, maxSecs}; + enqueuedMessages.push(messageStruct); + } + + void dequeueMessage() + { + currentMessage = enqueuedMessages.front().message; + float minSecs = enqueuedMessages.front().minSecs; + float maxSecs = enqueuedMessages.front().maxSecs; + enqueuedMessages.pop(); + + maxTimeout.detach(); + minTimeout.detach(); + maxTimeout.attach(this, &SPKMessageHold::handleTimeout, maxSecs); + if (minSecs > 0) minTimeout.attach(this, &SPKMessageHold::handleTimeout, minSecs); + state = (minSecs > 0) ? holdWaitingForMin : holdMinPassed; + } + void handleTimeout() { if (enqueuedMessages.empty()) { - currentMessage = savedMessage; - holding = false; + if (state == holdWaitingForMin) + { + state = holdMinPassed; + } + else + { + currentMessage = savedMessage; + state = notHold; + } } else { - currentMessage = enqueuedMessages.front().first; - float secs = enqueuedMessages.front().second; - enqueuedMessages.pop(); - - timeout.attach(this, &SPKMessageHold::handleTimeout, secs); + dequeueMessage(); } } - bool holding; + stateType state; string currentMessage; string savedMessage; - queue< pair<string, float> >enqueuedMessages; - Timeout timeout; + queue< messageType >enqueuedMessages; + Timeout minTimeout; + Timeout maxTimeout; }; \ No newline at end of file