Karpova Lab fork of stateScript

Dependencies:   SMARTWAV mbed

Fork of stateScript_v2 by Mattias Karlsson

Committer:
mkarlsso
Date:
Wed Jun 03 23:41:16 2015 +0000
Revision:
2:35266b266eaa
Parent:
0:8dbd6bd9167f
Child:
3:d7b0a0890d96
Working version with proper interrupt pausing during dIn update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mkarlsso 0:8dbd6bd9167f 1 #include "hardwareInterface.h"
mkarlsso 0:8dbd6bd9167f 2 //#include <ostream>
mkarlsso 0:8dbd6bd9167f 3 #include <sstream>
mkarlsso 0:8dbd6bd9167f 4
mkarlsso 0:8dbd6bd9167f 5 using namespace std;
mkarlsso 0:8dbd6bd9167f 6
mkarlsso 0:8dbd6bd9167f 7 //In debug mode, debug messages output to the screen
mkarlsso 0:8dbd6bd9167f 8 #ifdef DEBUGOUTPUT
mkarlsso 0:8dbd6bd9167f 9 bool debugOut = true;
mkarlsso 0:8dbd6bd9167f 10 #else
mkarlsso 0:8dbd6bd9167f 11 bool debugOut = false;
mkarlsso 0:8dbd6bd9167f 12 #endif
mkarlsso 0:8dbd6bd9167f 13
mkarlsso 0:8dbd6bd9167f 14 uint32_t timeKeeper; //the main clock (updated every ms)
mkarlsso 0:8dbd6bd9167f 15 bool resetTimer;
mkarlsso 0:8dbd6bd9167f 16 bool clockSlave;
mkarlsso 0:8dbd6bd9167f 17 bool changeToSlave;
mkarlsso 0:8dbd6bd9167f 18 bool changeToStandAlone;
mkarlsso 0:8dbd6bd9167f 19
mkarlsso 0:8dbd6bd9167f 20
mkarlsso 0:8dbd6bd9167f 21 #ifdef MBEDHARDWARE
mkarlsso 0:8dbd6bd9167f 22
mkarlsso 0:8dbd6bd9167f 23 //On the MBED, this needs to be put on a defined bank of memory, or else we run out of memory
mkarlsso 0:8dbd6bd9167f 24 __attribute((section("AHBSRAM0"),aligned)) outputStream textDisplay(512);
mkarlsso 0:8dbd6bd9167f 25
mkarlsso 0:8dbd6bd9167f 26 #else
mkarlsso 0:8dbd6bd9167f 27 outputStream textDisplay(256);
mkarlsso 0:8dbd6bd9167f 28
mkarlsso 0:8dbd6bd9167f 29 #endif
mkarlsso 0:8dbd6bd9167f 30
mkarlsso 0:8dbd6bd9167f 31
mkarlsso 0:8dbd6bd9167f 32 //---------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 33
mkarlsso 0:8dbd6bd9167f 34 sSystem::sSystem() {
mkarlsso 0:8dbd6bd9167f 35
mkarlsso 0:8dbd6bd9167f 36 }
mkarlsso 0:8dbd6bd9167f 37
mkarlsso 0:8dbd6bd9167f 38 void sSystem::immediateClockReset() {
mkarlsso 0:8dbd6bd9167f 39 //For external clock reset
mkarlsso 0:8dbd6bd9167f 40 timeKeeper = 0;
mkarlsso 0:8dbd6bd9167f 41 textDisplay << timeKeeper << " Clock reset\r\n";
mkarlsso 0:8dbd6bd9167f 42 }
mkarlsso 0:8dbd6bd9167f 43
mkarlsso 0:8dbd6bd9167f 44 void sSystem::mainLoopToDo() {
mkarlsso 0:8dbd6bd9167f 45
mkarlsso 0:8dbd6bd9167f 46 }
mkarlsso 0:8dbd6bd9167f 47
mkarlsso 0:8dbd6bd9167f 48 void sSystem::pauseInterrupts() {
mkarlsso 0:8dbd6bd9167f 49
mkarlsso 0:8dbd6bd9167f 50 }
mkarlsso 0:8dbd6bd9167f 51
mkarlsso 0:8dbd6bd9167f 52 void sSystem::resumeInterrupts() {
mkarlsso 0:8dbd6bd9167f 53
mkarlsso 0:8dbd6bd9167f 54 }
mkarlsso 0:8dbd6bd9167f 55
mkarlsso 0:8dbd6bd9167f 56 int sSystem::getPendingFunctionTriggers(uint16_t *bufferPtr) {
mkarlsso 0:8dbd6bd9167f 57 return 0;
mkarlsso 0:8dbd6bd9167f 58 }
mkarlsso 0:8dbd6bd9167f 59
mkarlsso 0:8dbd6bd9167f 60 uint32_t sSystem::getDigitalOutputChangeFlags() {
mkarlsso 0:8dbd6bd9167f 61
mkarlsso 0:8dbd6bd9167f 62 }
mkarlsso 0:8dbd6bd9167f 63
mkarlsso 0:8dbd6bd9167f 64 uint32_t sSystem::getDigitalInputChangeFlags() {
mkarlsso 0:8dbd6bd9167f 65
mkarlsso 0:8dbd6bd9167f 66 }
mkarlsso 0:8dbd6bd9167f 67
mkarlsso 0:8dbd6bd9167f 68 //------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 69 sDigitalOut::sDigitalOut() {
mkarlsso 0:8dbd6bd9167f 70
mkarlsso 0:8dbd6bd9167f 71 }
mkarlsso 0:8dbd6bd9167f 72
mkarlsso 0:8dbd6bd9167f 73 //----------------------------------------------------
mkarlsso 0:8dbd6bd9167f 74 sDigitalIn::sDigitalIn() {
mkarlsso 0:8dbd6bd9167f 75 lastDownEvent.triggered = false;
mkarlsso 0:8dbd6bd9167f 76 lastUpEvent.triggered = false;
mkarlsso 2:35266b266eaa 77 bufferedDownEvent.triggered = false;
mkarlsso 2:35266b266eaa 78 bufferedUpEvent.triggered = false;
mkarlsso 2:35266b266eaa 79 updating = false;
mkarlsso 0:8dbd6bd9167f 80 }
mkarlsso 0:8dbd6bd9167f 81
mkarlsso 0:8dbd6bd9167f 82 void sDigitalIn::addStateChange(int newState, uint32_t timeStamp) {
mkarlsso 0:8dbd6bd9167f 83
mkarlsso 0:8dbd6bd9167f 84 //With levers and beam breaks, there will be flutter when triggers happen.
mkarlsso 0:8dbd6bd9167f 85 //The goal is to capture the initial event time, so we ignore extra triggers
mkarlsso 0:8dbd6bd9167f 86 //until it has been processed
mkarlsso 2:35266b266eaa 87 if (!updating) {
mkarlsso 2:35266b266eaa 88 if ((newState == 0) && (!lastDownEvent.triggered)){
mkarlsso 2:35266b266eaa 89 lastDownEvent.timeStamp = timeStamp;
mkarlsso 2:35266b266eaa 90 lastDownEvent.triggered = true;
mkarlsso 2:35266b266eaa 91 } else if ((newState == 1) && (!lastUpEvent.triggered)) {
mkarlsso 2:35266b266eaa 92 lastUpEvent.timeStamp = timeStamp;
mkarlsso 2:35266b266eaa 93 lastUpEvent.triggered = true;
mkarlsso 2:35266b266eaa 94 }
mkarlsso 2:35266b266eaa 95 } else {
mkarlsso 2:35266b266eaa 96 //If we are currently checking this input, then we buffer the trigger and deal with it after
mkarlsso 2:35266b266eaa 97 if (newState == 0){
mkarlsso 2:35266b266eaa 98 bufferedDownEvent.timeStamp = timeStamp;
mkarlsso 2:35266b266eaa 99 bufferedDownEvent.triggered = true;
mkarlsso 2:35266b266eaa 100 } else if (newState == 1) {
mkarlsso 2:35266b266eaa 101 bufferedUpEvent.timeStamp = timeStamp;
mkarlsso 2:35266b266eaa 102 bufferedUpEvent.triggered = true;
mkarlsso 2:35266b266eaa 103 }
mkarlsso 2:35266b266eaa 104 }
mkarlsso 2:35266b266eaa 105 /*
mkarlsso 0:8dbd6bd9167f 106 if ((newState == 0) && (!lastDownEvent.triggered)){
mkarlsso 0:8dbd6bd9167f 107 lastDownEvent.timeStamp = timeStamp;
mkarlsso 0:8dbd6bd9167f 108 lastDownEvent.triggered = true;
mkarlsso 0:8dbd6bd9167f 109 } else if ((newState == 1) && (!lastUpEvent.triggered)) {
mkarlsso 0:8dbd6bd9167f 110 lastUpEvent.timeStamp = timeStamp;
mkarlsso 0:8dbd6bd9167f 111 lastUpEvent.triggered = true;
mkarlsso 2:35266b266eaa 112 }*/
mkarlsso 2:35266b266eaa 113 }
mkarlsso 2:35266b266eaa 114
mkarlsso 2:35266b266eaa 115 void sDigitalIn::setUpdate(bool state) {
mkarlsso 2:35266b266eaa 116 updating = state; //If true, then we buffer any trigger events until the update check is done.
mkarlsso 2:35266b266eaa 117 if (!updating) {
mkarlsso 2:35266b266eaa 118 if (bufferedUpEvent.triggered) {
mkarlsso 2:35266b266eaa 119 lastUpEvent = bufferedUpEvent;
mkarlsso 2:35266b266eaa 120 }
mkarlsso 2:35266b266eaa 121 if (bufferedDownEvent.triggered) {
mkarlsso 2:35266b266eaa 122 lastDownEvent = bufferedDownEvent;
mkarlsso 2:35266b266eaa 123 }
mkarlsso 2:35266b266eaa 124 bufferedDownEvent.triggered = false;
mkarlsso 2:35266b266eaa 125 bufferedUpEvent.triggered = false;
mkarlsso 0:8dbd6bd9167f 126 }
mkarlsso 0:8dbd6bd9167f 127 }
mkarlsso 0:8dbd6bd9167f 128
mkarlsso 0:8dbd6bd9167f 129 //-----------------------------------------------------
mkarlsso 0:8dbd6bd9167f 130 sSerialPort::sSerialPort() {
mkarlsso 0:8dbd6bd9167f 131
mkarlsso 0:8dbd6bd9167f 132 }
mkarlsso 0:8dbd6bd9167f 133
mkarlsso 0:8dbd6bd9167f 134 //------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 135
mkarlsso 0:8dbd6bd9167f 136 sSound::sSound(void):
mkarlsso 0:8dbd6bd9167f 137 fileNameExists(false),
mkarlsso 0:8dbd6bd9167f 138 volumePtr(NULL),
mkarlsso 0:8dbd6bd9167f 139 volume(-1),
mkarlsso 0:8dbd6bd9167f 140 play(true),
mkarlsso 0:8dbd6bd9167f 141 reset(false) {
mkarlsso 0:8dbd6bd9167f 142 }
mkarlsso 0:8dbd6bd9167f 143
mkarlsso 0:8dbd6bd9167f 144 void sSound::setFile(string fileNameIn) {
mkarlsso 0:8dbd6bd9167f 145 for (int i = 0; i < 20; i++) {
mkarlsso 0:8dbd6bd9167f 146 fileName[i] = NULL;
mkarlsso 0:8dbd6bd9167f 147 }
mkarlsso 0:8dbd6bd9167f 148 size_t length = fileNameIn.size();
mkarlsso 0:8dbd6bd9167f 149 if (length <= 20) {
mkarlsso 0:8dbd6bd9167f 150 fileNameIn.copy(fileName, length, 0);
mkarlsso 0:8dbd6bd9167f 151 fileNameExists = true;
mkarlsso 0:8dbd6bd9167f 152 }
mkarlsso 0:8dbd6bd9167f 153 }
mkarlsso 0:8dbd6bd9167f 154 void sSound::setVolume(int volumeIn) {
mkarlsso 0:8dbd6bd9167f 155
mkarlsso 0:8dbd6bd9167f 156 if ((volumeIn >= 0) && (volumeIn < 256)) {
mkarlsso 0:8dbd6bd9167f 157 volume = volumeIn;
mkarlsso 0:8dbd6bd9167f 158 volumePtr = NULL;
mkarlsso 0:8dbd6bd9167f 159 }
mkarlsso 0:8dbd6bd9167f 160 }
mkarlsso 0:8dbd6bd9167f 161
mkarlsso 0:8dbd6bd9167f 162 void sSound::setVolume(int* volumeIn) {
mkarlsso 0:8dbd6bd9167f 163
mkarlsso 0:8dbd6bd9167f 164 volume = -1;
mkarlsso 0:8dbd6bd9167f 165 volumePtr = volumeIn;
mkarlsso 0:8dbd6bd9167f 166
mkarlsso 0:8dbd6bd9167f 167 }
mkarlsso 0:8dbd6bd9167f 168
mkarlsso 0:8dbd6bd9167f 169 void sSound::setPlayback(bool playIn) {
mkarlsso 0:8dbd6bd9167f 170 play = playIn;
mkarlsso 0:8dbd6bd9167f 171 }
mkarlsso 0:8dbd6bd9167f 172
mkarlsso 0:8dbd6bd9167f 173 void sSound::setReset() {
mkarlsso 0:8dbd6bd9167f 174 reset = true;
mkarlsso 0:8dbd6bd9167f 175 }
mkarlsso 0:8dbd6bd9167f 176
mkarlsso 0:8dbd6bd9167f 177
mkarlsso 0:8dbd6bd9167f 178 //-----------------------------------------------------
mkarlsso 0:8dbd6bd9167f 179 outputStream::outputStream(int bufferSizeIn):
mkarlsso 0:8dbd6bd9167f 180 readHead(0),
mkarlsso 0:8dbd6bd9167f 181 writeHead(0),
mkarlsso 0:8dbd6bd9167f 182 totalWriteHead(0),
mkarlsso 0:8dbd6bd9167f 183 totalReadHead(0),
mkarlsso 0:8dbd6bd9167f 184 bufferSize(bufferSizeIn),
mkarlsso 0:8dbd6bd9167f 185 unsentData(false),
mkarlsso 0:8dbd6bd9167f 186 serialPtr(NULL) {
mkarlsso 0:8dbd6bd9167f 187
mkarlsso 0:8dbd6bd9167f 188 outputBuffer = new char[bufferSize];
mkarlsso 0:8dbd6bd9167f 189
mkarlsso 0:8dbd6bd9167f 190 }
mkarlsso 0:8dbd6bd9167f 191
mkarlsso 0:8dbd6bd9167f 192 outputStream::~outputStream() {
mkarlsso 0:8dbd6bd9167f 193 delete[] outputBuffer;
mkarlsso 0:8dbd6bd9167f 194 }
mkarlsso 0:8dbd6bd9167f 195
mkarlsso 0:8dbd6bd9167f 196 void outputStream::setSerial(sSerialPort *s) {
mkarlsso 0:8dbd6bd9167f 197 serialPtr = s;
mkarlsso 0:8dbd6bd9167f 198 }
mkarlsso 0:8dbd6bd9167f 199
mkarlsso 0:8dbd6bd9167f 200 //used to immediately write to serial port
mkarlsso 0:8dbd6bd9167f 201 void outputStream::flush() {
mkarlsso 0:8dbd6bd9167f 202 if (serialPtr != NULL) {
mkarlsso 0:8dbd6bd9167f 203 while(unsentData) {
mkarlsso 0:8dbd6bd9167f 204 serialPtr->writeChar(getNextChar());
mkarlsso 0:8dbd6bd9167f 205 }
mkarlsso 0:8dbd6bd9167f 206 }
mkarlsso 0:8dbd6bd9167f 207 }
mkarlsso 0:8dbd6bd9167f 208
mkarlsso 0:8dbd6bd9167f 209 //adds text to the buffer
mkarlsso 0:8dbd6bd9167f 210 void outputStream::send(string outputString) {
mkarlsso 0:8dbd6bd9167f 211 int strLen = outputString.size();
mkarlsso 0:8dbd6bd9167f 212
mkarlsso 0:8dbd6bd9167f 213 int total = 0;
mkarlsso 0:8dbd6bd9167f 214 int chunk = 0;
mkarlsso 0:8dbd6bd9167f 215 if (totalWriteHead+strLen > (totalReadHead + bufferSize)) {
mkarlsso 0:8dbd6bd9167f 216 //We don't have enough space in the buffer, so flush it
mkarlsso 0:8dbd6bd9167f 217 flush();
mkarlsso 0:8dbd6bd9167f 218 }
mkarlsso 0:8dbd6bd9167f 219 if (!(totalWriteHead+strLen > (totalReadHead + bufferSize))) {
mkarlsso 0:8dbd6bd9167f 220 while (strLen - total > 0) {
mkarlsso 0:8dbd6bd9167f 221 chunk = min((bufferSize - writeHead), strLen - total);
mkarlsso 0:8dbd6bd9167f 222 outputString.copy(outputBuffer + writeHead, chunk, total);
mkarlsso 0:8dbd6bd9167f 223 writeHead = (writeHead + chunk) % bufferSize;
mkarlsso 0:8dbd6bd9167f 224 totalWriteHead += chunk;
mkarlsso 0:8dbd6bd9167f 225 total += chunk;
mkarlsso 0:8dbd6bd9167f 226 }
mkarlsso 0:8dbd6bd9167f 227 if (total > 0) {
mkarlsso 0:8dbd6bd9167f 228 unsentData = true;
mkarlsso 0:8dbd6bd9167f 229 }
mkarlsso 0:8dbd6bd9167f 230 }
mkarlsso 0:8dbd6bd9167f 231 }
mkarlsso 0:8dbd6bd9167f 232
mkarlsso 0:8dbd6bd9167f 233 void outputStream::debug(const char *s) {
mkarlsso 0:8dbd6bd9167f 234 //send to serial immediately, but only if debugOut is true
mkarlsso 0:8dbd6bd9167f 235 if (debugOut) {
mkarlsso 0:8dbd6bd9167f 236 string tmpString = string(s);
mkarlsso 0:8dbd6bd9167f 237 send(tmpString);
mkarlsso 0:8dbd6bd9167f 238 flush();
mkarlsso 0:8dbd6bd9167f 239 }
mkarlsso 0:8dbd6bd9167f 240 }
mkarlsso 0:8dbd6bd9167f 241
mkarlsso 0:8dbd6bd9167f 242 //Overloaded << operator to for debugging output. This eliminates the
mkarlsso 0:8dbd6bd9167f 243 //need for printf statements
mkarlsso 0:8dbd6bd9167f 244 outputStream& outputStream::operator<<(string outputString) {
mkarlsso 0:8dbd6bd9167f 245 send(outputString);
mkarlsso 0:8dbd6bd9167f 246 return *this;
mkarlsso 0:8dbd6bd9167f 247 }
mkarlsso 0:8dbd6bd9167f 248
mkarlsso 0:8dbd6bd9167f 249 outputStream& outputStream::operator<<(const char* s) {
mkarlsso 0:8dbd6bd9167f 250 string tmpString = string(s);
mkarlsso 0:8dbd6bd9167f 251 send(tmpString);
mkarlsso 0:8dbd6bd9167f 252 return *this;
mkarlsso 0:8dbd6bd9167f 253 }
mkarlsso 0:8dbd6bd9167f 254
mkarlsso 0:8dbd6bd9167f 255 outputStream& outputStream::operator<<(int outputNum) {
mkarlsso 0:8dbd6bd9167f 256 ostringstream varConvert;
mkarlsso 0:8dbd6bd9167f 257 varConvert << outputNum;
mkarlsso 0:8dbd6bd9167f 258 send(varConvert.str());
mkarlsso 0:8dbd6bd9167f 259 return *this;
mkarlsso 0:8dbd6bd9167f 260 }
mkarlsso 0:8dbd6bd9167f 261
mkarlsso 0:8dbd6bd9167f 262 outputStream& outputStream::operator<<(uint32_t outputNum) {
mkarlsso 0:8dbd6bd9167f 263 ostringstream varConvert;
mkarlsso 0:8dbd6bd9167f 264 varConvert << outputNum;
mkarlsso 0:8dbd6bd9167f 265 send(varConvert.str());
mkarlsso 0:8dbd6bd9167f 266 return *this;
mkarlsso 0:8dbd6bd9167f 267 }
mkarlsso 0:8dbd6bd9167f 268 //the main loop gets one character per loop and write it to the serial port
mkarlsso 0:8dbd6bd9167f 269 char outputStream::getNextChar() {
mkarlsso 0:8dbd6bd9167f 270
mkarlsso 0:8dbd6bd9167f 271
mkarlsso 0:8dbd6bd9167f 272 if (totalReadHead < totalWriteHead) {
mkarlsso 0:8dbd6bd9167f 273 tmpOut = *(outputBuffer+readHead);
mkarlsso 0:8dbd6bd9167f 274 readHead = (readHead+1) % bufferSize;
mkarlsso 0:8dbd6bd9167f 275 totalReadHead++;
mkarlsso 0:8dbd6bd9167f 276 if (totalReadHead >= totalWriteHead) {
mkarlsso 0:8dbd6bd9167f 277 unsentData = false;
mkarlsso 0:8dbd6bd9167f 278 }
mkarlsso 0:8dbd6bd9167f 279 }
mkarlsso 0:8dbd6bd9167f 280 return tmpOut;
mkarlsso 0:8dbd6bd9167f 281
mkarlsso 0:8dbd6bd9167f 282 }
mkarlsso 0:8dbd6bd9167f 283
mkarlsso 0:8dbd6bd9167f 284