yay!

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541_Pacermaker by CIS541

Committer:
adamvan101
Date:
Tue Dec 01 22:27:40 2015 +0000
Revision:
0:6c085ebcb2d5
Child:
1:d1c452f164d4
Working?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adamvan101 0:6c085ebcb2d5 1 #include "mbed.h"
adamvan101 0:6c085ebcb2d5 2 #include "rtos.h"
adamvan101 0:6c085ebcb2d5 3 //#include "TextLCD.h"
adamvan101 0:6c085ebcb2d5 4
adamvan101 0:6c085ebcb2d5 5 #define LRI 0
adamvan101 0:6c085ebcb2d5 6 #define AVI 1
adamvan101 0:6c085ebcb2d5 7 #define VRP 2
adamvan101 0:6c085ebcb2d5 8 #define PVARP 3
adamvan101 0:6c085ebcb2d5 9 #define URI 4
adamvan101 0:6c085ebcb2d5 10 #define PAVB 5
adamvan101 0:6c085ebcb2d5 11 #define VSP 6
adamvan101 0:6c085ebcb2d5 12 #define NR -1 //not running
adamvan101 0:6c085ebcb2d5 13
adamvan101 0:6c085ebcb2d5 14 DigitalOut led1(LED1);
adamvan101 0:6c085ebcb2d5 15 DigitalOut led2(LED2);
adamvan101 0:6c085ebcb2d5 16 DigitalOut led3(LED3);
adamvan101 0:6c085ebcb2d5 17 DigitalOut led4(LED4);
adamvan101 0:6c085ebcb2d5 18 DigitalOut buzzer(p9);
adamvan101 0:6c085ebcb2d5 19 DigitalOut aPace(p7);
adamvan101 0:6c085ebcb2d5 20 DigitalOut vPace(p8);
adamvan101 0:6c085ebcb2d5 21 InterruptIn ASignal(p5);
adamvan101 0:6c085ebcb2d5 22 InterruptIn VSignal(p6);
adamvan101 0:6c085ebcb2d5 23 Serial pc(USBTX, USBRX);
adamvan101 0:6c085ebcb2d5 24
adamvan101 0:6c085ebcb2d5 25 bool expectingASignal, expectingVSignal, paceA, observationChange, digitOneReceived, modeChanged, canPaceV, paceVPending, ringAlarm, ringingAlarm, timerRunning, aSenseOccurred, digitTwoReceived;
adamvan101 0:6c085ebcb2d5 26 int timeOutValue[7]; //timeout array that holds values for LRI, VRP, PVARP, AVI, URI, PAVB, VSP; PVARP >VRP
adamvan101 0:6c085ebcb2d5 27 int heartRate, observationInterval, observationRate, timeOutStatus, waitCount, avgHeartRate, rateCoefficient, heartRateHeart, sec, avgHeartRateHeart;
adamvan101 0:6c085ebcb2d5 28 int paceMakerMode=1; //1 - Normal, 2 - Exercise, 3 - Sleep, 4 - Manual
adamvan101 0:6c085ebcb2d5 29 int uriTimeOutStatus=URI;
adamvan101 0:6c085ebcb2d5 30 char ch;
adamvan101 0:6c085ebcb2d5 31 char modeString[20];
adamvan101 0:6c085ebcb2d5 32 const int nLRI=1500, nAVI = 60, nPVARP = 150, nURI = 600, nVRP = 100, nVSP = 0, nPAVB = 20;
adamvan101 0:6c085ebcb2d5 33 const int sLRI=2000, sAVI = 60, sPVARP = 150, sURI = 1000, sVRP = 100, sVSP = 0, sPAVB = 20;
adamvan101 0:6c085ebcb2d5 34 const int eLRI=1000, eAVI = 60, ePVARP = 150, eURI = 400, eVRP = 100, eVSP = 0, ePAVB = 20;
adamvan101 0:6c085ebcb2d5 35
adamvan101 0:6c085ebcb2d5 36 Mutex displayMutex;
adamvan101 0:6c085ebcb2d5 37 Mutex observationChangeMutex;
adamvan101 0:6c085ebcb2d5 38 Mutex expectAMutex;
adamvan101 0:6c085ebcb2d5 39 Mutex expectVMutex;
adamvan101 0:6c085ebcb2d5 40 Mutex timeOutStatusMutex;
adamvan101 0:6c085ebcb2d5 41 Mutex heartRateMutex;
adamvan101 0:6c085ebcb2d5 42
adamvan101 0:6c085ebcb2d5 43 Thread *SerialThreadPTR;
adamvan101 0:6c085ebcb2d5 44 Thread *PacePTR;
adamvan101 0:6c085ebcb2d5 45 Thread *ModeChangePTR;
adamvan101 0:6c085ebcb2d5 46 Thread *PMSensePTR;
adamvan101 0:6c085ebcb2d5 47
adamvan101 0:6c085ebcb2d5 48 RtosTimer *TimeOutTimer;
adamvan101 0:6c085ebcb2d5 49 RtosTimer *URITimeOutTimer;
adamvan101 0:6c085ebcb2d5 50 RtosTimer *KeyTimeOutTimer;
adamvan101 0:6c085ebcb2d5 51 RtosTimer *SecondsTimer;
adamvan101 0:6c085ebcb2d5 52
adamvan101 0:6c085ebcb2d5 53 void setTimeOutValues(int tLRI, int tAVI, int tPVARP, int tURI, int tVRP, int tVSP, int tPAVB)
adamvan101 0:6c085ebcb2d5 54 {
adamvan101 0:6c085ebcb2d5 55 timeOutValue[LRI]=tLRI;
adamvan101 0:6c085ebcb2d5 56 timeOutValue[AVI]=tAVI;
adamvan101 0:6c085ebcb2d5 57 timeOutValue[PVARP]=tPVARP;
adamvan101 0:6c085ebcb2d5 58 timeOutValue[URI]=tURI;
adamvan101 0:6c085ebcb2d5 59 timeOutValue[VRP]=tVRP;
adamvan101 0:6c085ebcb2d5 60 timeOutValue[VSP]=tVSP;
adamvan101 0:6c085ebcb2d5 61 timeOutValue[PAVB]=tPAVB;
adamvan101 0:6c085ebcb2d5 62 }
adamvan101 0:6c085ebcb2d5 63
adamvan101 0:6c085ebcb2d5 64 void resetDisplay()
adamvan101 0:6c085ebcb2d5 65 {
adamvan101 0:6c085ebcb2d5 66 displayMutex.lock();
adamvan101 0:6c085ebcb2d5 67 pc.printf("Pace Maker Display\r\n");
adamvan101 0:6c085ebcb2d5 68 pc.printf("Heart Rate : %04d bpm\r\n", avgHeartRate);
adamvan101 0:6c085ebcb2d5 69 pc.printf("Observation Interval : %02d seconds\r\n", observationInterval/1000);
adamvan101 0:6c085ebcb2d5 70 pc.printf("Mode : %s\r\n", modeString);
adamvan101 0:6c085ebcb2d5 71 pc.printf("Heart Beat Rate : %04d bpm\r\n", (heartRateHeart*(60/sec)));
adamvan101 0:6c085ebcb2d5 72 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 73 ringingAlarm=false;
adamvan101 0:6c085ebcb2d5 74 }
adamvan101 0:6c085ebcb2d5 75
adamvan101 0:6c085ebcb2d5 76 void updateDisplay()
adamvan101 0:6c085ebcb2d5 77 {
adamvan101 0:6c085ebcb2d5 78 displayMutex.lock();
adamvan101 0:6c085ebcb2d5 79 pc.printf("%04d", avgHeartRate);
adamvan101 0:6c085ebcb2d5 80 pc.printf("%02d", observationInterval/1000);
adamvan101 0:6c085ebcb2d5 81 pc.printf("%04d", (heartRateHeart*(60/sec)));
adamvan101 0:6c085ebcb2d5 82 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 83 }
adamvan101 0:6c085ebcb2d5 84
adamvan101 0:6c085ebcb2d5 85 void changeMode()
adamvan101 0:6c085ebcb2d5 86 {
adamvan101 0:6c085ebcb2d5 87 switch(paceMakerMode)
adamvan101 0:6c085ebcb2d5 88 {
adamvan101 0:6c085ebcb2d5 89 case 1: //Normal Mode
adamvan101 0:6c085ebcb2d5 90 {
adamvan101 0:6c085ebcb2d5 91 setTimeOutValues(nLRI, nAVI, nPVARP, nURI, nVRP, nVSP, nPAVB);
adamvan101 0:6c085ebcb2d5 92 strcpy(modeString, "Normal");
adamvan101 0:6c085ebcb2d5 93 break;
adamvan101 0:6c085ebcb2d5 94 }
adamvan101 0:6c085ebcb2d5 95 case 2: //Exercise Mode
adamvan101 0:6c085ebcb2d5 96 {
adamvan101 0:6c085ebcb2d5 97 setTimeOutValues(eLRI, eAVI, ePVARP, eURI, eVRP, eVSP, ePAVB);
adamvan101 0:6c085ebcb2d5 98 strcpy(modeString, "Exercise");
adamvan101 0:6c085ebcb2d5 99 break;
adamvan101 0:6c085ebcb2d5 100 }
adamvan101 0:6c085ebcb2d5 101 case 3: //Sleep Mode
adamvan101 0:6c085ebcb2d5 102 {
adamvan101 0:6c085ebcb2d5 103 setTimeOutValues(sLRI, sAVI, sPVARP, sURI, sVRP, sVSP, sPAVB);
adamvan101 0:6c085ebcb2d5 104 strcpy(modeString, "Sleep");
adamvan101 0:6c085ebcb2d5 105 break;
adamvan101 0:6c085ebcb2d5 106 }
adamvan101 0:6c085ebcb2d5 107 case 4: //Manual Mode; do not chnage the time out values
adamvan101 0:6c085ebcb2d5 108 {
adamvan101 0:6c085ebcb2d5 109 strcat(modeString, " + Manual");
adamvan101 0:6c085ebcb2d5 110 break;
adamvan101 0:6c085ebcb2d5 111 }
adamvan101 0:6c085ebcb2d5 112 default: //Normal mode is any error occurs
adamvan101 0:6c085ebcb2d5 113 {
adamvan101 0:6c085ebcb2d5 114 setTimeOutValues(nLRI, nAVI, nPVARP, nURI, nVRP, nVSP, nPAVB);
adamvan101 0:6c085ebcb2d5 115 strcpy(modeString, "Normal");
adamvan101 0:6c085ebcb2d5 116 }
adamvan101 0:6c085ebcb2d5 117 }
adamvan101 0:6c085ebcb2d5 118 modeChanged=false;
adamvan101 0:6c085ebcb2d5 119 resetDisplay();
adamvan101 0:6c085ebcb2d5 120 }
adamvan101 0:6c085ebcb2d5 121
adamvan101 0:6c085ebcb2d5 122 void modeChange(const void *args)
adamvan101 0:6c085ebcb2d5 123 {
adamvan101 0:6c085ebcb2d5 124 while(1)
adamvan101 0:6c085ebcb2d5 125 {
adamvan101 0:6c085ebcb2d5 126 Thread::signal_wait(0x03);
adamvan101 0:6c085ebcb2d5 127 if(modeChanged)
adamvan101 0:6c085ebcb2d5 128 {
adamvan101 0:6c085ebcb2d5 129 changeMode();
adamvan101 0:6c085ebcb2d5 130 }
adamvan101 0:6c085ebcb2d5 131 }
adamvan101 0:6c085ebcb2d5 132 }
adamvan101 0:6c085ebcb2d5 133
adamvan101 0:6c085ebcb2d5 134
adamvan101 0:6c085ebcb2d5 135 void aSense()
adamvan101 0:6c085ebcb2d5 136 {
adamvan101 0:6c085ebcb2d5 137 //ASignal received from heart
adamvan101 0:6c085ebcb2d5 138 if(expectingASignal)
adamvan101 0:6c085ebcb2d5 139 {
adamvan101 0:6c085ebcb2d5 140 led4=1;
adamvan101 0:6c085ebcb2d5 141 wait(0.001);
adamvan101 0:6c085ebcb2d5 142 pc.printf("ASense Received\r\n");
adamvan101 0:6c085ebcb2d5 143 led4=0;
adamvan101 0:6c085ebcb2d5 144 if(modeChanged)
adamvan101 0:6c085ebcb2d5 145 {
adamvan101 0:6c085ebcb2d5 146 (*ModeChangePTR).signal_set(0x03);
adamvan101 0:6c085ebcb2d5 147 }
adamvan101 0:6c085ebcb2d5 148 aSenseOccurred=true;
adamvan101 0:6c085ebcb2d5 149 (*PMSensePTR).signal_set(0x04);
adamvan101 0:6c085ebcb2d5 150 }
adamvan101 0:6c085ebcb2d5 151 }
adamvan101 0:6c085ebcb2d5 152
adamvan101 0:6c085ebcb2d5 153 void vSense()
adamvan101 0:6c085ebcb2d5 154 {
adamvan101 0:6c085ebcb2d5 155 //VSignal received from heart
adamvan101 0:6c085ebcb2d5 156 //reset timeout
adamvan101 0:6c085ebcb2d5 157 //increment heart rate
adamvan101 0:6c085ebcb2d5 158 heartRateHeart++;
adamvan101 0:6c085ebcb2d5 159 if(expectingVSignal)
adamvan101 0:6c085ebcb2d5 160 {
adamvan101 0:6c085ebcb2d5 161 led3=1;
adamvan101 0:6c085ebcb2d5 162 pc.printf("VSense Received\r\n");
adamvan101 0:6c085ebcb2d5 163 wait(0.001);
adamvan101 0:6c085ebcb2d5 164 led3=0;
adamvan101 0:6c085ebcb2d5 165 if(modeChanged)
adamvan101 0:6c085ebcb2d5 166 {
adamvan101 0:6c085ebcb2d5 167 (*ModeChangePTR).signal_set(0x03);
adamvan101 0:6c085ebcb2d5 168 }
adamvan101 0:6c085ebcb2d5 169 canPaceV=false;
adamvan101 0:6c085ebcb2d5 170 aSenseOccurred=false;
adamvan101 0:6c085ebcb2d5 171 (*PMSensePTR).signal_set(0x04);
adamvan101 0:6c085ebcb2d5 172 }
adamvan101 0:6c085ebcb2d5 173
adamvan101 0:6c085ebcb2d5 174 }
adamvan101 0:6c085ebcb2d5 175
adamvan101 0:6c085ebcb2d5 176 void seconds(const void *args)
adamvan101 0:6c085ebcb2d5 177 {
adamvan101 0:6c085ebcb2d5 178 sec++;
adamvan101 0:6c085ebcb2d5 179 if(sec>=60)
adamvan101 0:6c085ebcb2d5 180 {
adamvan101 0:6c085ebcb2d5 181 avgHeartRateHeart=heartRateHeart;
adamvan101 0:6c085ebcb2d5 182 heartRateHeart=0;
adamvan101 0:6c085ebcb2d5 183 sec=0;
adamvan101 0:6c085ebcb2d5 184 }
adamvan101 0:6c085ebcb2d5 185 }
adamvan101 0:6c085ebcb2d5 186
adamvan101 0:6c085ebcb2d5 187 void timeOut(const void *args)
adamvan101 0:6c085ebcb2d5 188 {
adamvan101 0:6c085ebcb2d5 189 // check which time out has occurred
adamvan101 0:6c085ebcb2d5 190 // generate appropriate pace signal
adamvan101 0:6c085ebcb2d5 191 // reset timer to new value
adamvan101 0:6c085ebcb2d5 192 //led2=1;
adamvan101 0:6c085ebcb2d5 193 if(timeOutStatus==AVI)
adamvan101 0:6c085ebcb2d5 194 {
adamvan101 0:6c085ebcb2d5 195 //generate VPace
adamvan101 0:6c085ebcb2d5 196 if(canPaceV)
adamvan101 0:6c085ebcb2d5 197 {
adamvan101 0:6c085ebcb2d5 198 paceA=false;
adamvan101 0:6c085ebcb2d5 199 (*PacePTR).signal_set(0x01);
adamvan101 0:6c085ebcb2d5 200 }
adamvan101 0:6c085ebcb2d5 201 else
adamvan101 0:6c085ebcb2d5 202 {
adamvan101 0:6c085ebcb2d5 203 canPaceV=true;
adamvan101 0:6c085ebcb2d5 204 }
adamvan101 0:6c085ebcb2d5 205 }
adamvan101 0:6c085ebcb2d5 206 else if(timeOutStatus==PAVB)
adamvan101 0:6c085ebcb2d5 207 {
adamvan101 0:6c085ebcb2d5 208 expectVMutex.lock();
adamvan101 0:6c085ebcb2d5 209 expectingVSignal=true;
adamvan101 0:6c085ebcb2d5 210 expectVMutex.unlock();
adamvan101 0:6c085ebcb2d5 211 timeOutStatusMutex.lock();
adamvan101 0:6c085ebcb2d5 212 timeOutStatus=AVI;
adamvan101 0:6c085ebcb2d5 213 timeOutStatusMutex.unlock();
adamvan101 0:6c085ebcb2d5 214 timerRunning=true;
adamvan101 0:6c085ebcb2d5 215 TimeOutTimer->start(timeOutValue[AVI]-timeOutValue[PAVB]);
adamvan101 0:6c085ebcb2d5 216 }
adamvan101 0:6c085ebcb2d5 217 else if(timeOutStatus==VRP)
adamvan101 0:6c085ebcb2d5 218 {
adamvan101 0:6c085ebcb2d5 219 //now we can sense a Ventrival event, but not an atrial event as PVARP is not over
adamvan101 0:6c085ebcb2d5 220 //restart timer for PVARP
adamvan101 0:6c085ebcb2d5 221 expectVMutex.lock();
adamvan101 0:6c085ebcb2d5 222 expectingVSignal=true;
adamvan101 0:6c085ebcb2d5 223 expectVMutex.unlock();
adamvan101 0:6c085ebcb2d5 224 timeOutStatusMutex.lock();
adamvan101 0:6c085ebcb2d5 225 timeOutStatus=PVARP;
adamvan101 0:6c085ebcb2d5 226 timeOutStatusMutex.unlock();
adamvan101 0:6c085ebcb2d5 227 timerRunning=true;
adamvan101 0:6c085ebcb2d5 228 TimeOutTimer->start(timeOutValue[PVARP]-timeOutValue[VRP]);
adamvan101 0:6c085ebcb2d5 229 }
adamvan101 0:6c085ebcb2d5 230 else if(timeOutStatus==PVARP)
adamvan101 0:6c085ebcb2d5 231 {
adamvan101 0:6c085ebcb2d5 232 //now we can sense Atrial events as well
adamvan101 0:6c085ebcb2d5 233 expectAMutex.lock();
adamvan101 0:6c085ebcb2d5 234 expectingASignal=true;
adamvan101 0:6c085ebcb2d5 235 expectAMutex.unlock();
adamvan101 0:6c085ebcb2d5 236 timeOutStatusMutex.lock();
adamvan101 0:6c085ebcb2d5 237 timeOutStatus=LRI;
adamvan101 0:6c085ebcb2d5 238 timeOutStatusMutex.unlock();
adamvan101 0:6c085ebcb2d5 239 timerRunning=true;
adamvan101 0:6c085ebcb2d5 240 TimeOutTimer->start(timeOutValue[LRI]-timeOutValue[PVARP]-timeOutValue[AVI]);
adamvan101 0:6c085ebcb2d5 241 }
adamvan101 0:6c085ebcb2d5 242 else if(timeOutStatus==LRI)
adamvan101 0:6c085ebcb2d5 243 {
adamvan101 0:6c085ebcb2d5 244 //generate APace
adamvan101 0:6c085ebcb2d5 245 paceA=true;
adamvan101 0:6c085ebcb2d5 246 (*PacePTR).signal_set(0x01);
adamvan101 0:6c085ebcb2d5 247 }
adamvan101 0:6c085ebcb2d5 248 }
adamvan101 0:6c085ebcb2d5 249
adamvan101 0:6c085ebcb2d5 250 void uriTimeOut(const void *args)
adamvan101 0:6c085ebcb2d5 251 {
adamvan101 0:6c085ebcb2d5 252 // uri is over
adamvan101 0:6c085ebcb2d5 253 //check is a vpace has to be generated; If yes then generate the pace; else enable a flag that lets the thread generate the pace
adamvan101 0:6c085ebcb2d5 254 if(paceVPending || canPaceV)
adamvan101 0:6c085ebcb2d5 255 {
adamvan101 0:6c085ebcb2d5 256 //pace V as a pace occurred during URI
adamvan101 0:6c085ebcb2d5 257 paceA=false;
adamvan101 0:6c085ebcb2d5 258 paceVPending=false;
adamvan101 0:6c085ebcb2d5 259 (*PacePTR).signal_set(0x01);
adamvan101 0:6c085ebcb2d5 260 }
adamvan101 0:6c085ebcb2d5 261 else
adamvan101 0:6c085ebcb2d5 262 {
adamvan101 0:6c085ebcb2d5 263 canPaceV=true; //allow the PM to pace V as URI is now over
adamvan101 0:6c085ebcb2d5 264 }
adamvan101 0:6c085ebcb2d5 265
adamvan101 0:6c085ebcb2d5 266 }
adamvan101 0:6c085ebcb2d5 267
adamvan101 0:6c085ebcb2d5 268 void keyTimeOut(const void *args)
adamvan101 0:6c085ebcb2d5 269 {
adamvan101 0:6c085ebcb2d5 270 if(digitOneReceived)
adamvan101 0:6c085ebcb2d5 271 {
adamvan101 0:6c085ebcb2d5 272 observationChange=false;
adamvan101 0:6c085ebcb2d5 273 }
adamvan101 0:6c085ebcb2d5 274 else
adamvan101 0:6c085ebcb2d5 275 {
adamvan101 0:6c085ebcb2d5 276 observationChange=false;
adamvan101 0:6c085ebcb2d5 277 }
adamvan101 0:6c085ebcb2d5 278 resetDisplay();
adamvan101 0:6c085ebcb2d5 279 }
adamvan101 0:6c085ebcb2d5 280
adamvan101 0:6c085ebcb2d5 281 void pmSense(const void *args)
adamvan101 0:6c085ebcb2d5 282 {
adamvan101 0:6c085ebcb2d5 283 while(1)
adamvan101 0:6c085ebcb2d5 284 {
adamvan101 0:6c085ebcb2d5 285 Thread::signal_wait(0x04);
adamvan101 0:6c085ebcb2d5 286 if(timerRunning)
adamvan101 0:6c085ebcb2d5 287 {
adamvan101 0:6c085ebcb2d5 288 TimeOutTimer->stop();
adamvan101 0:6c085ebcb2d5 289 timerRunning=false;
adamvan101 0:6c085ebcb2d5 290 }
adamvan101 0:6c085ebcb2d5 291 if(aSenseOccurred)
adamvan101 0:6c085ebcb2d5 292 {
adamvan101 0:6c085ebcb2d5 293 expectAMutex.lock();
adamvan101 0:6c085ebcb2d5 294 expectingASignal=false;
adamvan101 0:6c085ebcb2d5 295 expectAMutex.unlock();
adamvan101 0:6c085ebcb2d5 296 expectVMutex.lock();
adamvan101 0:6c085ebcb2d5 297 expectingVSignal=true;
adamvan101 0:6c085ebcb2d5 298 expectVMutex.unlock();
adamvan101 0:6c085ebcb2d5 299 timerRunning=true;
adamvan101 0:6c085ebcb2d5 300 timeOutStatusMutex.lock();
adamvan101 0:6c085ebcb2d5 301 timeOutStatus=AVI;
adamvan101 0:6c085ebcb2d5 302 timeOutStatusMutex.unlock();
adamvan101 0:6c085ebcb2d5 303 TimeOutTimer->start(timeOutValue[AVI]);//500);
adamvan101 0:6c085ebcb2d5 304 }
adamvan101 0:6c085ebcb2d5 305 else
adamvan101 0:6c085ebcb2d5 306 {
adamvan101 0:6c085ebcb2d5 307 heartRateMutex.lock();
adamvan101 0:6c085ebcb2d5 308 heartRate++;
adamvan101 0:6c085ebcb2d5 309 heartRateMutex.unlock();
adamvan101 0:6c085ebcb2d5 310 expectVMutex.lock();
adamvan101 0:6c085ebcb2d5 311 expectingVSignal=false;
adamvan101 0:6c085ebcb2d5 312 expectVMutex.unlock();
adamvan101 0:6c085ebcb2d5 313 expectAMutex.lock();
adamvan101 0:6c085ebcb2d5 314 expectingASignal=false;
adamvan101 0:6c085ebcb2d5 315 expectAMutex.unlock();
adamvan101 0:6c085ebcb2d5 316 canPaceV=false;
adamvan101 0:6c085ebcb2d5 317 URITimeOutTimer->start(timeOutValue[URI]);
adamvan101 0:6c085ebcb2d5 318 timerRunning=true;
adamvan101 0:6c085ebcb2d5 319 timeOutStatusMutex.lock();
adamvan101 0:6c085ebcb2d5 320 timeOutStatus=VRP;
adamvan101 0:6c085ebcb2d5 321 timeOutStatusMutex.unlock();
adamvan101 0:6c085ebcb2d5 322 TimeOutTimer->start(timeOutValue[VRP]);
adamvan101 0:6c085ebcb2d5 323 }
adamvan101 0:6c085ebcb2d5 324 }
adamvan101 0:6c085ebcb2d5 325 }
adamvan101 0:6c085ebcb2d5 326
adamvan101 0:6c085ebcb2d5 327
adamvan101 0:6c085ebcb2d5 328 void pace(const void *args)
adamvan101 0:6c085ebcb2d5 329 {
adamvan101 0:6c085ebcb2d5 330 while(1)
adamvan101 0:6c085ebcb2d5 331 {
adamvan101 0:6c085ebcb2d5 332 Thread::signal_wait(0x01);
adamvan101 0:6c085ebcb2d5 333 if(paceA)
adamvan101 0:6c085ebcb2d5 334 {
adamvan101 0:6c085ebcb2d5 335 pc.printf("APace Sent\r\n");
adamvan101 0:6c085ebcb2d5 336 led2=1;
adamvan101 0:6c085ebcb2d5 337 aPace=1;
adamvan101 0:6c085ebcb2d5 338 Thread::wait(1);
adamvan101 0:6c085ebcb2d5 339 aPace=0;
adamvan101 0:6c085ebcb2d5 340 led2=0;
adamvan101 0:6c085ebcb2d5 341 if(modeChanged)
adamvan101 0:6c085ebcb2d5 342 {
adamvan101 0:6c085ebcb2d5 343 changeMode();
adamvan101 0:6c085ebcb2d5 344 }
adamvan101 0:6c085ebcb2d5 345 // start AVI Timer
adamvan101 0:6c085ebcb2d5 346 expectAMutex.lock();
adamvan101 0:6c085ebcb2d5 347 expectingASignal=false;
adamvan101 0:6c085ebcb2d5 348 expectAMutex.unlock();
adamvan101 0:6c085ebcb2d5 349 expectVMutex.lock();
adamvan101 0:6c085ebcb2d5 350 expectingVSignal=false;
adamvan101 0:6c085ebcb2d5 351 expectVMutex.unlock();
adamvan101 0:6c085ebcb2d5 352 timeOutStatusMutex.lock();
adamvan101 0:6c085ebcb2d5 353 timeOutStatus=PAVB;
adamvan101 0:6c085ebcb2d5 354 timeOutStatusMutex.unlock();
adamvan101 0:6c085ebcb2d5 355 timerRunning=true;
adamvan101 0:6c085ebcb2d5 356 TimeOutTimer->start(timeOutValue[PAVB]);
adamvan101 0:6c085ebcb2d5 357 //generate the APace pulse
adamvan101 0:6c085ebcb2d5 358 }
adamvan101 0:6c085ebcb2d5 359 else
adamvan101 0:6c085ebcb2d5 360 {
adamvan101 0:6c085ebcb2d5 361 pc.printf("VPace Sent\r\n");
adamvan101 0:6c085ebcb2d5 362 led1=1;
adamvan101 0:6c085ebcb2d5 363 vPace=1;
adamvan101 0:6c085ebcb2d5 364 Thread::wait(1);
adamvan101 0:6c085ebcb2d5 365 vPace=0;
adamvan101 0:6c085ebcb2d5 366 led1=0;
adamvan101 0:6c085ebcb2d5 367 if(modeChanged)
adamvan101 0:6c085ebcb2d5 368 {
adamvan101 0:6c085ebcb2d5 369 changeMode();
adamvan101 0:6c085ebcb2d5 370 }
adamvan101 0:6c085ebcb2d5 371 // start VRP and URI timers
adamvan101 0:6c085ebcb2d5 372 expectVMutex.lock();
adamvan101 0:6c085ebcb2d5 373 expectingVSignal=false;
adamvan101 0:6c085ebcb2d5 374 expectVMutex.unlock();
adamvan101 0:6c085ebcb2d5 375 expectAMutex.lock();
adamvan101 0:6c085ebcb2d5 376 expectingASignal=false;
adamvan101 0:6c085ebcb2d5 377 expectAMutex.unlock();
adamvan101 0:6c085ebcb2d5 378 heartRateMutex.lock();
adamvan101 0:6c085ebcb2d5 379 heartRate++;
adamvan101 0:6c085ebcb2d5 380 heartRateMutex.unlock();
adamvan101 0:6c085ebcb2d5 381 canPaceV=false;
adamvan101 0:6c085ebcb2d5 382 URITimeOutTimer->start(timeOutValue[URI]);
adamvan101 0:6c085ebcb2d5 383 timeOutStatusMutex.lock();
adamvan101 0:6c085ebcb2d5 384 timeOutStatus=VRP;
adamvan101 0:6c085ebcb2d5 385 timeOutStatusMutex.unlock();
adamvan101 0:6c085ebcb2d5 386 timerRunning=true;
adamvan101 0:6c085ebcb2d5 387 TimeOutTimer->start(timeOutValue[VRP]);
adamvan101 0:6c085ebcb2d5 388 //generate the VPace pulse
adamvan101 0:6c085ebcb2d5 389 }
adamvan101 0:6c085ebcb2d5 390 }
adamvan101 0:6c085ebcb2d5 391 }
adamvan101 0:6c085ebcb2d5 392
adamvan101 0:6c085ebcb2d5 393 void serialThread(const void *args)
adamvan101 0:6c085ebcb2d5 394 {
adamvan101 0:6c085ebcb2d5 395 while(1)
adamvan101 0:6c085ebcb2d5 396 {
adamvan101 0:6c085ebcb2d5 397 Thread::signal_wait(0x02);
adamvan101 0:6c085ebcb2d5 398 if((((ch=='a')||(ch=='A')) && paceMakerMode==4) && !observationChange)
adamvan101 0:6c085ebcb2d5 399 {
adamvan101 0:6c085ebcb2d5 400 //fire A Pace
adamvan101 0:6c085ebcb2d5 401 paceA=true;
adamvan101 0:6c085ebcb2d5 402 (*PacePTR).signal_set(0x01);
adamvan101 0:6c085ebcb2d5 403 }
adamvan101 0:6c085ebcb2d5 404 else if((((ch=='v')||(ch=='V')) && paceMakerMode==4) && !observationChange)
adamvan101 0:6c085ebcb2d5 405 {
adamvan101 0:6c085ebcb2d5 406 //fire V Pace
adamvan101 0:6c085ebcb2d5 407 if(canPaceV)
adamvan101 0:6c085ebcb2d5 408 {
adamvan101 0:6c085ebcb2d5 409 paceA=false;
adamvan101 0:6c085ebcb2d5 410 paceVPending=false;
adamvan101 0:6c085ebcb2d5 411 (*PacePTR).signal_set(0x01);
adamvan101 0:6c085ebcb2d5 412 }
adamvan101 0:6c085ebcb2d5 413 else
adamvan101 0:6c085ebcb2d5 414 {
adamvan101 0:6c085ebcb2d5 415 paceVPending=true;
adamvan101 0:6c085ebcb2d5 416 }
adamvan101 0:6c085ebcb2d5 417 }
adamvan101 0:6c085ebcb2d5 418 else if(((((ch=='n')||(ch=='N'))&& paceMakerMode!=1) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 419 {
adamvan101 0:6c085ebcb2d5 420 paceMakerMode=1; //change Mode to Normal
adamvan101 0:6c085ebcb2d5 421 modeChanged=true;
adamvan101 0:6c085ebcb2d5 422 }
adamvan101 0:6c085ebcb2d5 423 else if(((((ch=='e')||(ch=='E')) && paceMakerMode!=2) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 424 {
adamvan101 0:6c085ebcb2d5 425 paceMakerMode=2; //chnage mode to Exercise
adamvan101 0:6c085ebcb2d5 426 modeChanged=true;
adamvan101 0:6c085ebcb2d5 427 }
adamvan101 0:6c085ebcb2d5 428 else if(((((ch=='s')||(ch=='S')) && paceMakerMode!=3) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 429 {
adamvan101 0:6c085ebcb2d5 430 paceMakerMode=3; //change mode to Sleep
adamvan101 0:6c085ebcb2d5 431 modeChanged=true;
adamvan101 0:6c085ebcb2d5 432 }
adamvan101 0:6c085ebcb2d5 433 else if(((((ch=='b')||(ch=='B')) ) && !observationChange) )
adamvan101 0:6c085ebcb2d5 434 {
adamvan101 0:6c085ebcb2d5 435 ringAlarm=!ringAlarm;
adamvan101 0:6c085ebcb2d5 436 }
adamvan101 0:6c085ebcb2d5 437 else if(((((ch=='m')||(ch=='M')) && paceMakerMode!=4) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 438 {
adamvan101 0:6c085ebcb2d5 439 paceMakerMode=4; //change mode to Sleep
adamvan101 0:6c085ebcb2d5 440 modeChanged=true;
adamvan101 0:6c085ebcb2d5 441 }
adamvan101 0:6c085ebcb2d5 442 else if(((((ch=='o')||(ch=='O')) && !observationChange) && !modeChanged))
adamvan101 0:6c085ebcb2d5 443 {
adamvan101 0:6c085ebcb2d5 444 observationChange=true;
adamvan101 0:6c085ebcb2d5 445 digitOneReceived=false;
adamvan101 0:6c085ebcb2d5 446 digitTwoReceived=false;
adamvan101 0:6c085ebcb2d5 447 //spawn a timer for 3 seconds
adamvan101 0:6c085ebcb2d5 448 displayMutex.lock();
adamvan101 0:6c085ebcb2d5 449 ////////pc.locate(30, 18);
adamvan101 0:6c085ebcb2d5 450 pc.printf("Observation Interval change : -- seconds");
adamvan101 0:6c085ebcb2d5 451 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 452 KeyTimeOutTimer=new RtosTimer(keyTimeOut, osTimerOnce, (void *)0);
adamvan101 0:6c085ebcb2d5 453 KeyTimeOutTimer->start(3000);
adamvan101 0:6c085ebcb2d5 454 }
adamvan101 0:6c085ebcb2d5 455 else if((observationChange) && ((ch>=48) && (ch<=57)))
adamvan101 0:6c085ebcb2d5 456 {
adamvan101 0:6c085ebcb2d5 457 if(!digitOneReceived)
adamvan101 0:6c085ebcb2d5 458 {
adamvan101 0:6c085ebcb2d5 459 KeyTimeOutTimer->start(3000);
adamvan101 0:6c085ebcb2d5 460 observationChangeMutex.lock();
adamvan101 0:6c085ebcb2d5 461 observationRate=ch-'0';
adamvan101 0:6c085ebcb2d5 462 observationChangeMutex.unlock();
adamvan101 0:6c085ebcb2d5 463 digitOneReceived=true;
adamvan101 0:6c085ebcb2d5 464 displayMutex.lock();
adamvan101 0:6c085ebcb2d5 465 ////pc.locate(60, 18);
adamvan101 0:6c085ebcb2d5 466 pc.printf("%02d", observationRate);
adamvan101 0:6c085ebcb2d5 467 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 468 }
adamvan101 0:6c085ebcb2d5 469 else
adamvan101 0:6c085ebcb2d5 470 {
adamvan101 0:6c085ebcb2d5 471 KeyTimeOutTimer->stop();
adamvan101 0:6c085ebcb2d5 472 digitTwoReceived=true;
adamvan101 0:6c085ebcb2d5 473 observationChangeMutex.lock();
adamvan101 0:6c085ebcb2d5 474 observationRate=(observationRate*10)+(ch-'0');
adamvan101 0:6c085ebcb2d5 475 observationChangeMutex.unlock();
adamvan101 0:6c085ebcb2d5 476 observationChange=false;
adamvan101 0:6c085ebcb2d5 477 displayMutex.lock();
adamvan101 0:6c085ebcb2d5 478 ////pc.locate(60, 18);
adamvan101 0:6c085ebcb2d5 479 pc.printf("%02d", observationRate);
adamvan101 0:6c085ebcb2d5 480 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 481 }
adamvan101 0:6c085ebcb2d5 482 }
adamvan101 0:6c085ebcb2d5 483 }
adamvan101 0:6c085ebcb2d5 484 }
adamvan101 0:6c085ebcb2d5 485
adamvan101 0:6c085ebcb2d5 486 void alarm(const void *args)
adamvan101 0:6c085ebcb2d5 487 {
adamvan101 0:6c085ebcb2d5 488 while(1)
adamvan101 0:6c085ebcb2d5 489 {
adamvan101 0:6c085ebcb2d5 490 Thread::wait(1000);
adamvan101 0:6c085ebcb2d5 491 while(((heartRateHeart*(60/sec))>(60000/timeOutValue[URI])) && ringAlarm)
adamvan101 0:6c085ebcb2d5 492 {
adamvan101 0:6c085ebcb2d5 493 buzzer=1;
adamvan101 0:6c085ebcb2d5 494 Thread::wait(5);
adamvan101 0:6c085ebcb2d5 495 buzzer=0;
adamvan101 0:6c085ebcb2d5 496 Thread::wait(5);
adamvan101 0:6c085ebcb2d5 497 if(!ringingAlarm)
adamvan101 0:6c085ebcb2d5 498 {
adamvan101 0:6c085ebcb2d5 499 displayMutex.lock();
adamvan101 0:6c085ebcb2d5 500 ////pc.locate(30, 16);
adamvan101 0:6c085ebcb2d5 501 pc.printf("Alarm : HeartRate too high");
adamvan101 0:6c085ebcb2d5 502 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 503 ringingAlarm=true;
adamvan101 0:6c085ebcb2d5 504 }
adamvan101 0:6c085ebcb2d5 505 }
adamvan101 0:6c085ebcb2d5 506 while(((heartRateHeart*(60/sec))<(60000/timeOutValue[LRI])) && ringAlarm)
adamvan101 0:6c085ebcb2d5 507 {
adamvan101 0:6c085ebcb2d5 508 buzzer=1;
adamvan101 0:6c085ebcb2d5 509 Thread::wait(10);
adamvan101 0:6c085ebcb2d5 510 buzzer=0;
adamvan101 0:6c085ebcb2d5 511 Thread::wait(10);
adamvan101 0:6c085ebcb2d5 512 if(!ringingAlarm)
adamvan101 0:6c085ebcb2d5 513 {
adamvan101 0:6c085ebcb2d5 514 displayMutex.lock();
adamvan101 0:6c085ebcb2d5 515 ////pc.locate(30, 16);
adamvan101 0:6c085ebcb2d5 516 pc.printf("Alarm : HeartRate too Low");
adamvan101 0:6c085ebcb2d5 517 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 518 ringingAlarm=true;
adamvan101 0:6c085ebcb2d5 519 }
adamvan101 0:6c085ebcb2d5 520 }
adamvan101 0:6c085ebcb2d5 521 if(ringingAlarm)
adamvan101 0:6c085ebcb2d5 522 {
adamvan101 0:6c085ebcb2d5 523 ringingAlarm=false;
adamvan101 0:6c085ebcb2d5 524 resetDisplay();
adamvan101 0:6c085ebcb2d5 525 }
adamvan101 0:6c085ebcb2d5 526 }
adamvan101 0:6c085ebcb2d5 527 }
adamvan101 0:6c085ebcb2d5 528
adamvan101 0:6c085ebcb2d5 529 void display(const void *args)
adamvan101 0:6c085ebcb2d5 530 {
adamvan101 0:6c085ebcb2d5 531 while(1)
adamvan101 0:6c085ebcb2d5 532 {
adamvan101 0:6c085ebcb2d5 533 Thread::wait(observationInterval);
adamvan101 0:6c085ebcb2d5 534 waitCount++;
adamvan101 0:6c085ebcb2d5 535 if(!observationChange)
adamvan101 0:6c085ebcb2d5 536 {
adamvan101 0:6c085ebcb2d5 537 avgHeartRate=heartRate*rateCoefficient/waitCount;
adamvan101 0:6c085ebcb2d5 538 heartRateMutex.lock();
adamvan101 0:6c085ebcb2d5 539 heartRate=0;
adamvan101 0:6c085ebcb2d5 540 heartRateMutex.unlock();
adamvan101 0:6c085ebcb2d5 541 if(observationRate!=(observationInterval/1000))
adamvan101 0:6c085ebcb2d5 542 {
adamvan101 0:6c085ebcb2d5 543 resetDisplay();
adamvan101 0:6c085ebcb2d5 544 observationInterval=observationRate*1000;
adamvan101 0:6c085ebcb2d5 545 rateCoefficient=(60000/observationInterval);
adamvan101 0:6c085ebcb2d5 546 }
adamvan101 0:6c085ebcb2d5 547 else
adamvan101 0:6c085ebcb2d5 548 {
adamvan101 0:6c085ebcb2d5 549 // updateDisplay();
adamvan101 0:6c085ebcb2d5 550 resetDisplay();
adamvan101 0:6c085ebcb2d5 551 }
adamvan101 0:6c085ebcb2d5 552 waitCount=0;
adamvan101 0:6c085ebcb2d5 553 }
adamvan101 0:6c085ebcb2d5 554 }
adamvan101 0:6c085ebcb2d5 555 }
adamvan101 0:6c085ebcb2d5 556
adamvan101 0:6c085ebcb2d5 557 int main()
adamvan101 0:6c085ebcb2d5 558 {
adamvan101 0:6c085ebcb2d5 559 pc.printf("Pace Maker Display\r\n");
adamvan101 0:6c085ebcb2d5 560 pc.printf("Heart Rate : --- bpm\r\n");
adamvan101 0:6c085ebcb2d5 561 pc.printf("Observation Interval : -- seconds\r\n");
adamvan101 0:6c085ebcb2d5 562 pc.printf("Mode : Normal\r\n");
adamvan101 0:6c085ebcb2d5 563 pc.printf("Heart Beat Rate : ---- bpm\r\n");
adamvan101 0:6c085ebcb2d5 564
adamvan101 0:6c085ebcb2d5 565 //initialize variables
adamvan101 0:6c085ebcb2d5 566 expectAMutex.lock();
adamvan101 0:6c085ebcb2d5 567 expectingASignal=true;
adamvan101 0:6c085ebcb2d5 568 expectAMutex.unlock();
adamvan101 0:6c085ebcb2d5 569 expectVMutex.lock();
adamvan101 0:6c085ebcb2d5 570 expectingVSignal=true;
adamvan101 0:6c085ebcb2d5 571 expectVMutex.unlock();
adamvan101 0:6c085ebcb2d5 572 setTimeOutValues(nLRI, nAVI, nPVARP, nURI, nVRP, nVSP, nPAVB);
adamvan101 0:6c085ebcb2d5 573 heartRate=0;
adamvan101 0:6c085ebcb2d5 574 avgHeartRate=0;
adamvan101 0:6c085ebcb2d5 575 paceMakerMode=1;
adamvan101 0:6c085ebcb2d5 576 observationInterval=5000;
adamvan101 0:6c085ebcb2d5 577 observationRate=5;
adamvan101 0:6c085ebcb2d5 578 waitCount=0;
adamvan101 0:6c085ebcb2d5 579 rateCoefficient=12;
adamvan101 0:6c085ebcb2d5 580 paceA=false;
adamvan101 0:6c085ebcb2d5 581 observationChange=false;
adamvan101 0:6c085ebcb2d5 582 digitOneReceived=false;
adamvan101 0:6c085ebcb2d5 583 digitTwoReceived=false;
adamvan101 0:6c085ebcb2d5 584 modeChanged=false;
adamvan101 0:6c085ebcb2d5 585 canPaceV=true; //assume at begining that URI has lapsed and start with an atrial event
adamvan101 0:6c085ebcb2d5 586 paceVPending=false; //assume that a VPace request has not happened already
adamvan101 0:6c085ebcb2d5 587 strcpy(modeString, "Normal");
adamvan101 0:6c085ebcb2d5 588 buzzer=0;
adamvan101 0:6c085ebcb2d5 589 ringAlarm=true;
adamvan101 0:6c085ebcb2d5 590 heartRateHeart=0;
adamvan101 0:6c085ebcb2d5 591 sec=0;
adamvan101 0:6c085ebcb2d5 592 avgHeartRateHeart=0;
adamvan101 0:6c085ebcb2d5 593 ringingAlarm=false;
adamvan101 0:6c085ebcb2d5 594 timerRunning=false;
adamvan101 0:6c085ebcb2d5 595 aSenseOccurred=true;
adamvan101 0:6c085ebcb2d5 596
adamvan101 0:6c085ebcb2d5 597 ASignal.fall(&aSense);
adamvan101 0:6c085ebcb2d5 598 VSignal.fall(&vSense);
adamvan101 0:6c085ebcb2d5 599 TimeOutTimer=new RtosTimer(timeOut, osTimerOnce, (void*)0);
adamvan101 0:6c085ebcb2d5 600 URITimeOutTimer=new RtosTimer(uriTimeOut, osTimerOnce, (void *)0);
adamvan101 0:6c085ebcb2d5 601 SecondsTimer=new RtosTimer(seconds, osTimerPeriodic, (void *)0); //timer that over runs every 1 second and is used to reset the heart rate count coming from the heart
adamvan101 0:6c085ebcb2d5 602 SecondsTimer->start(1000); //start the timer to run for every 1 second
adamvan101 0:6c085ebcb2d5 603
adamvan101 0:6c085ebcb2d5 604 Thread Pace(pace);
adamvan101 0:6c085ebcb2d5 605 PacePTR=&Pace;
adamvan101 0:6c085ebcb2d5 606 Pace.set_priority(osPriorityHigh);
adamvan101 0:6c085ebcb2d5 607 Thread PMSense(pmSense);
adamvan101 0:6c085ebcb2d5 608 PMSensePTR=&PMSense;
adamvan101 0:6c085ebcb2d5 609 PMSense.set_priority(osPriorityAboveNormal);
adamvan101 0:6c085ebcb2d5 610 Thread Alarm(alarm);
adamvan101 0:6c085ebcb2d5 611 Alarm.set_priority(osPriorityAboveNormal);
adamvan101 0:6c085ebcb2d5 612 Thread ModeChange(modeChange);
adamvan101 0:6c085ebcb2d5 613 ModeChangePTR=&ModeChange;
adamvan101 0:6c085ebcb2d5 614 ModeChange.set_priority(osPriorityAboveNormal);
adamvan101 0:6c085ebcb2d5 615 Thread Display(display);
adamvan101 0:6c085ebcb2d5 616 Thread SerialThread(serialThread);
adamvan101 0:6c085ebcb2d5 617 SerialThreadPTR=&SerialThread;
adamvan101 0:6c085ebcb2d5 618 SerialThread.set_priority(osPriorityRealtime);
adamvan101 0:6c085ebcb2d5 619 Display.set_priority(osPriorityAboveNormal);
adamvan101 0:6c085ebcb2d5 620
adamvan101 0:6c085ebcb2d5 621 timeOutStatusMutex.lock();
adamvan101 0:6c085ebcb2d5 622 timeOutStatus=VRP;
adamvan101 0:6c085ebcb2d5 623 timeOutStatusMutex.unlock();
adamvan101 0:6c085ebcb2d5 624 //test lines to start pacing without heart; heart starts immediately after an Atrial event
adamvan101 0:6c085ebcb2d5 625 //timeOutStatus=AVI;
adamvan101 0:6c085ebcb2d5 626 TimeOutTimer->start(timeOutValue[VRP]);
adamvan101 0:6c085ebcb2d5 627 while(1) {
adamvan101 0:6c085ebcb2d5 628 if(pc.readable())
adamvan101 0:6c085ebcb2d5 629 {
adamvan101 0:6c085ebcb2d5 630 ch=pc.getc();
adamvan101 0:6c085ebcb2d5 631 (*SerialThreadPTR).signal_set(0x02); //initiate the serial thread to change the state of the timer
adamvan101 0:6c085ebcb2d5 632 }
adamvan101 0:6c085ebcb2d5 633 }
adamvan101 0:6c085ebcb2d5 634 }