yay!

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541_Pacermaker by CIS541

Committer:
adamvan101
Date:
Wed Dec 02 02:27:30 2015 +0000
Revision:
3:2ed03f9e0042
Parent:
2:3d47bb081502
Child:
4:8e3dc7e73627
Alarms!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adamvan101 2:3d47bb081502 1 #include "main.h"
adamvan101 0:6c085ebcb2d5 2 //#include "TextLCD.h"
adamvan101 0:6c085ebcb2d5 3
adamvan101 2:3d47bb081502 4 void incrementHeartRate() {
adamvan101 2:3d47bb081502 5 heartRateMutex.lock();
adamvan101 2:3d47bb081502 6 heartRate++;
adamvan101 3:2ed03f9e0042 7 heartRateMutex.unlock();
adamvan101 2:3d47bb081502 8 }
adamvan101 1:d1c452f164d4 9
adamvan101 2:3d47bb081502 10 void setVSignal(bool state) {
adamvan101 2:3d47bb081502 11 expectVMutex.lock();
adamvan101 2:3d47bb081502 12 waitVSignal = state;
adamvan101 2:3d47bb081502 13 expectVMutex.unlock();
adamvan101 2:3d47bb081502 14 }
adamvan101 1:d1c452f164d4 15
adamvan101 2:3d47bb081502 16 void setASignal(bool state) {
adamvan101 2:3d47bb081502 17 expectAMutex.lock();
adamvan101 2:3d47bb081502 18 waitASignal = state;
adamvan101 2:3d47bb081502 19 expectAMutex.unlock();
adamvan101 2:3d47bb081502 20 }
adamvan101 1:d1c452f164d4 21
adamvan101 2:3d47bb081502 22 void setTimeConstraint(int i) {
adamvan101 2:3d47bb081502 23 timeConstraintMutex.lock();
adamvan101 2:3d47bb081502 24 timeConstraint = i;
adamvan101 2:3d47bb081502 25 timeConstraintMutex.unlock();
adamvan101 2:3d47bb081502 26 }
adamvan101 0:6c085ebcb2d5 27
adamvan101 2:3d47bb081502 28 void printToLCD() {
adamvan101 2:3d47bb081502 29 displayMutex.lock();
adamvan101 2:3d47bb081502 30 // pc.printf("%04d\r\n", avgHeartRate);
adamvan101 2:3d47bb081502 31 // pc.printf("%02d\r\n", observationInterval/1000);
adamvan101 2:3d47bb081502 32 // pc.printf("%04d\r\n", (heartRateHeart*(60/sec)));
adamvan101 2:3d47bb081502 33 displayMutex.unlock();
adamvan101 2:3d47bb081502 34 }
adamvan101 0:6c085ebcb2d5 35
adamvan101 1:d1c452f164d4 36 void println(const char *c) {
adamvan101 1:d1c452f164d4 37 pc.printf(c);
adamvan101 1:d1c452f164d4 38 pc.printf("\r\n");
adamvan101 1:d1c452f164d4 39 }
adamvan101 1:d1c452f164d4 40
adamvan101 1:d1c452f164d4 41 void switchToNormal() {
adamvan101 1:d1c452f164d4 42 LRI = normalModeLRI;
adamvan101 1:d1c452f164d4 43 AVI = normalModeAVI;
adamvan101 1:d1c452f164d4 44 PVARP = normalModePVARP;
adamvan101 1:d1c452f164d4 45 URI = normalModeURI;
adamvan101 1:d1c452f164d4 46 VRP = normalModeVRP;
adamvan101 1:d1c452f164d4 47 PVAB = normalModePVAB;
adamvan101 1:d1c452f164d4 48 }
adamvan101 1:d1c452f164d4 49
adamvan101 1:d1c452f164d4 50 void switchToExercise() {
adamvan101 1:d1c452f164d4 51 LRI = exerciseModeLRI;
adamvan101 1:d1c452f164d4 52 AVI = exerciseModeAVI;
adamvan101 1:d1c452f164d4 53 PVARP = exerciseModePVARP;
adamvan101 1:d1c452f164d4 54 URI = exerciseModeURI;
adamvan101 1:d1c452f164d4 55 VRP = exerciseModeVRP;
adamvan101 1:d1c452f164d4 56 PVAB = exerciseModePVAB;
adamvan101 1:d1c452f164d4 57 }
adamvan101 1:d1c452f164d4 58
adamvan101 1:d1c452f164d4 59 void switchToSleep() {
adamvan101 1:d1c452f164d4 60 LRI = sleepModeLRI;
adamvan101 1:d1c452f164d4 61 AVI = sleepModeAVI;
adamvan101 1:d1c452f164d4 62 PVARP = sleepModePVARP;
adamvan101 1:d1c452f164d4 63 URI = sleepModeURI;
adamvan101 1:d1c452f164d4 64 VRP = sleepModeVRP;
adamvan101 1:d1c452f164d4 65 PVAB = sleepModePVAB;
adamvan101 0:6c085ebcb2d5 66 }
adamvan101 0:6c085ebcb2d5 67
adamvan101 0:6c085ebcb2d5 68 void changeMode()
adamvan101 0:6c085ebcb2d5 69 {
adamvan101 0:6c085ebcb2d5 70 switch(paceMakerMode)
adamvan101 0:6c085ebcb2d5 71 {
adamvan101 1:d1c452f164d4 72 default:
adamvan101 1:d1c452f164d4 73 case NORMAL:
adamvan101 0:6c085ebcb2d5 74 {
adamvan101 1:d1c452f164d4 75 switchToNormal();
adamvan101 0:6c085ebcb2d5 76 break;
adamvan101 0:6c085ebcb2d5 77 }
adamvan101 1:d1c452f164d4 78 case EXERCISE:
adamvan101 0:6c085ebcb2d5 79 {
adamvan101 1:d1c452f164d4 80 switchToExercise();
adamvan101 0:6c085ebcb2d5 81 break;
adamvan101 0:6c085ebcb2d5 82 }
adamvan101 1:d1c452f164d4 83 case SLEEP:
adamvan101 0:6c085ebcb2d5 84 {
adamvan101 1:d1c452f164d4 85 switchToSleep();
adamvan101 0:6c085ebcb2d5 86 break;
adamvan101 0:6c085ebcb2d5 87 }
adamvan101 1:d1c452f164d4 88 case MANUAL:
adamvan101 0:6c085ebcb2d5 89 {
adamvan101 1:d1c452f164d4 90 break;
adamvan101 0:6c085ebcb2d5 91 }
adamvan101 0:6c085ebcb2d5 92 }
adamvan101 0:6c085ebcb2d5 93 modeChanged=false;
adamvan101 0:6c085ebcb2d5 94 }
adamvan101 0:6c085ebcb2d5 95
adamvan101 2:3d47bb081502 96 void pacemakerModeSwitch(const void *args)
adamvan101 0:6c085ebcb2d5 97 {
adamvan101 0:6c085ebcb2d5 98 while(1)
adamvan101 0:6c085ebcb2d5 99 {
adamvan101 1:d1c452f164d4 100 Thread::signal_wait(signal3);
adamvan101 0:6c085ebcb2d5 101 if(modeChanged)
adamvan101 0:6c085ebcb2d5 102 {
adamvan101 0:6c085ebcb2d5 103 changeMode();
adamvan101 0:6c085ebcb2d5 104 }
adamvan101 0:6c085ebcb2d5 105 }
adamvan101 0:6c085ebcb2d5 106 }
adamvan101 0:6c085ebcb2d5 107
adamvan101 0:6c085ebcb2d5 108 void aSense()
adamvan101 0:6c085ebcb2d5 109 {
adamvan101 1:d1c452f164d4 110 if(waitASignal)
adamvan101 0:6c085ebcb2d5 111 {
adamvan101 1:d1c452f164d4 112 asenseLED=1;
adamvan101 0:6c085ebcb2d5 113 wait(0.001);
adamvan101 1:d1c452f164d4 114 println("ASense Received");
adamvan101 1:d1c452f164d4 115 asenseLED=0;
adamvan101 0:6c085ebcb2d5 116 if(modeChanged)
adamvan101 0:6c085ebcb2d5 117 {
adamvan101 2:3d47bb081502 118 (*P_PacemakerModeSwitch).signal_set(signal3);
adamvan101 0:6c085ebcb2d5 119 }
adamvan101 0:6c085ebcb2d5 120 aSenseOccurred=true;
adamvan101 2:3d47bb081502 121 (*P_PacemakerReceive).signal_set(signal4);
adamvan101 0:6c085ebcb2d5 122 }
adamvan101 0:6c085ebcb2d5 123 }
adamvan101 0:6c085ebcb2d5 124
adamvan101 0:6c085ebcb2d5 125 void vSense()
adamvan101 0:6c085ebcb2d5 126 {
adamvan101 1:d1c452f164d4 127 if(waitVSignal)
adamvan101 0:6c085ebcb2d5 128 {
adamvan101 1:d1c452f164d4 129 vsenseLED=1;
adamvan101 1:d1c452f164d4 130 println("VSense Received");
adamvan101 0:6c085ebcb2d5 131 wait(0.001);
adamvan101 1:d1c452f164d4 132 vsenseLED=0;
adamvan101 0:6c085ebcb2d5 133 if(modeChanged)
adamvan101 0:6c085ebcb2d5 134 {
adamvan101 2:3d47bb081502 135 (*P_PacemakerModeSwitch).signal_set(signal3);
adamvan101 0:6c085ebcb2d5 136 }
adamvan101 0:6c085ebcb2d5 137 canPaceV=false;
adamvan101 0:6c085ebcb2d5 138 aSenseOccurred=false;
adamvan101 2:3d47bb081502 139 (*P_PacemakerReceive).signal_set(signal4);
adamvan101 0:6c085ebcb2d5 140 }
adamvan101 0:6c085ebcb2d5 141 }
adamvan101 0:6c085ebcb2d5 142
adamvan101 0:6c085ebcb2d5 143 void timeOut(const void *args)
adamvan101 0:6c085ebcb2d5 144 {
adamvan101 0:6c085ebcb2d5 145 // check which time out has occurred
adamvan101 0:6c085ebcb2d5 146 // generate appropriate pace signal
adamvan101 0:6c085ebcb2d5 147 // reset timer to new value
adamvan101 1:d1c452f164d4 148 //apaceLED=1;
adamvan101 1:d1c452f164d4 149 if(timeConstraint==AVI_const)
adamvan101 0:6c085ebcb2d5 150 {
adamvan101 0:6c085ebcb2d5 151 //generate VPace
adamvan101 0:6c085ebcb2d5 152 if(canPaceV)
adamvan101 0:6c085ebcb2d5 153 {
adamvan101 0:6c085ebcb2d5 154 paceA=false;
adamvan101 2:3d47bb081502 155 (*P_PacemakerSend).signal_set(signal1);
adamvan101 0:6c085ebcb2d5 156 }
adamvan101 0:6c085ebcb2d5 157 else
adamvan101 0:6c085ebcb2d5 158 {
adamvan101 0:6c085ebcb2d5 159 canPaceV=true;
adamvan101 0:6c085ebcb2d5 160 }
adamvan101 0:6c085ebcb2d5 161 }
adamvan101 1:d1c452f164d4 162 else if(timeConstraint==PVAB_const)
adamvan101 0:6c085ebcb2d5 163 {
adamvan101 2:3d47bb081502 164 setVSignal(true);
adamvan101 2:3d47bb081502 165 setTimeConstraint(AVI_const);
adamvan101 0:6c085ebcb2d5 166 timerRunning=true;
adamvan101 1:d1c452f164d4 167 TimeOutTimer->start(AVI-PVAB);
adamvan101 0:6c085ebcb2d5 168 }
adamvan101 1:d1c452f164d4 169 else if(timeConstraint==VRP_const)
adamvan101 0:6c085ebcb2d5 170 {
adamvan101 0:6c085ebcb2d5 171 //now we can sense a Ventrival event, but not an atrial event as PVARP is not over
adamvan101 0:6c085ebcb2d5 172 //restart timer for PVARP
adamvan101 2:3d47bb081502 173 setVSignal(true);
adamvan101 2:3d47bb081502 174 setTimeConstraint(PVARP_const);;
adamvan101 0:6c085ebcb2d5 175 timerRunning=true;
adamvan101 1:d1c452f164d4 176 TimeOutTimer->start(PVARP-VRP);
adamvan101 0:6c085ebcb2d5 177 }
adamvan101 1:d1c452f164d4 178 else if(timeConstraint==PVARP_const)
adamvan101 0:6c085ebcb2d5 179 {
adamvan101 0:6c085ebcb2d5 180 //now we can sense Atrial events as well
adamvan101 2:3d47bb081502 181 setASignal(true);
adamvan101 2:3d47bb081502 182 setTimeConstraint(LRI_const);
adamvan101 0:6c085ebcb2d5 183 timerRunning=true;
adamvan101 1:d1c452f164d4 184 TimeOutTimer->start(LRI-PVARP-AVI);
adamvan101 0:6c085ebcb2d5 185 }
adamvan101 1:d1c452f164d4 186 else if(timeConstraint==LRI_const)
adamvan101 0:6c085ebcb2d5 187 {
adamvan101 0:6c085ebcb2d5 188 //generate APace
adamvan101 0:6c085ebcb2d5 189 paceA=true;
adamvan101 2:3d47bb081502 190 (*P_PacemakerSend).signal_set(signal1);
adamvan101 0:6c085ebcb2d5 191 }
adamvan101 0:6c085ebcb2d5 192 }
adamvan101 0:6c085ebcb2d5 193
adamvan101 0:6c085ebcb2d5 194 void uriTimeOut(const void *args)
adamvan101 0:6c085ebcb2d5 195 {
adamvan101 0:6c085ebcb2d5 196 // uri is over
adamvan101 0:6c085ebcb2d5 197 //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 198 if(paceVPending || canPaceV)
adamvan101 0:6c085ebcb2d5 199 {
adamvan101 0:6c085ebcb2d5 200 //pace V as a pace occurred during URI
adamvan101 0:6c085ebcb2d5 201 paceA=false;
adamvan101 0:6c085ebcb2d5 202 paceVPending=false;
adamvan101 2:3d47bb081502 203 (*P_PacemakerSend).signal_set(signal1);
adamvan101 0:6c085ebcb2d5 204 }
adamvan101 0:6c085ebcb2d5 205 else
adamvan101 0:6c085ebcb2d5 206 {
adamvan101 0:6c085ebcb2d5 207 canPaceV=true; //allow the PM to pace V as URI is now over
adamvan101 0:6c085ebcb2d5 208 }
adamvan101 0:6c085ebcb2d5 209
adamvan101 0:6c085ebcb2d5 210 }
adamvan101 0:6c085ebcb2d5 211
adamvan101 2:3d47bb081502 212 void pacemakerReceive(const void *args)
adamvan101 0:6c085ebcb2d5 213 {
adamvan101 0:6c085ebcb2d5 214 while(1)
adamvan101 0:6c085ebcb2d5 215 {
adamvan101 1:d1c452f164d4 216 Thread::signal_wait(signal4);
adamvan101 0:6c085ebcb2d5 217 if(timerRunning)
adamvan101 0:6c085ebcb2d5 218 {
adamvan101 0:6c085ebcb2d5 219 TimeOutTimer->stop();
adamvan101 0:6c085ebcb2d5 220 timerRunning=false;
adamvan101 0:6c085ebcb2d5 221 }
adamvan101 0:6c085ebcb2d5 222 if(aSenseOccurred)
adamvan101 0:6c085ebcb2d5 223 {
adamvan101 2:3d47bb081502 224 setASignal(false);
adamvan101 2:3d47bb081502 225 setVSignal(true);
adamvan101 0:6c085ebcb2d5 226 timerRunning=true;
adamvan101 2:3d47bb081502 227 setTimeConstraint(AVI_const);
adamvan101 1:d1c452f164d4 228 TimeOutTimer->start(AVI);//500);
adamvan101 0:6c085ebcb2d5 229 }
adamvan101 0:6c085ebcb2d5 230 else
adamvan101 0:6c085ebcb2d5 231 {
adamvan101 2:3d47bb081502 232 incrementHeartRate();
adamvan101 2:3d47bb081502 233 setVSignal(false);
adamvan101 2:3d47bb081502 234 setASignal(false);
adamvan101 0:6c085ebcb2d5 235 canPaceV=false;
adamvan101 1:d1c452f164d4 236 URITimeOutTimer->start(URI);
adamvan101 0:6c085ebcb2d5 237 timerRunning=true;
adamvan101 2:3d47bb081502 238 setTimeConstraint(VRP_const);
adamvan101 1:d1c452f164d4 239 TimeOutTimer->start(VRP);
adamvan101 0:6c085ebcb2d5 240 }
adamvan101 0:6c085ebcb2d5 241 }
adamvan101 0:6c085ebcb2d5 242 }
adamvan101 0:6c085ebcb2d5 243
adamvan101 2:3d47bb081502 244 void pacemakerSend(const void *args)
adamvan101 0:6c085ebcb2d5 245 {
adamvan101 0:6c085ebcb2d5 246 while(1)
adamvan101 0:6c085ebcb2d5 247 {
adamvan101 1:d1c452f164d4 248 Thread::signal_wait(signal1);
adamvan101 0:6c085ebcb2d5 249 if(paceA)
adamvan101 0:6c085ebcb2d5 250 {
adamvan101 1:d1c452f164d4 251 println("APace Sent");
adamvan101 1:d1c452f164d4 252 apaceLED=1;
adamvan101 0:6c085ebcb2d5 253 aPace=1;
adamvan101 0:6c085ebcb2d5 254 Thread::wait(1);
adamvan101 0:6c085ebcb2d5 255 aPace=0;
adamvan101 1:d1c452f164d4 256 apaceLED=0;
adamvan101 0:6c085ebcb2d5 257 if(modeChanged)
adamvan101 0:6c085ebcb2d5 258 {
adamvan101 0:6c085ebcb2d5 259 changeMode();
adamvan101 0:6c085ebcb2d5 260 }
adamvan101 0:6c085ebcb2d5 261 // start AVI Timer
adamvan101 2:3d47bb081502 262 setASignal(false);
adamvan101 2:3d47bb081502 263 setVSignal(false);
adamvan101 2:3d47bb081502 264 setTimeConstraint(PVAB_const);
adamvan101 0:6c085ebcb2d5 265 timerRunning=true;
adamvan101 3:2ed03f9e0042 266 if (paceMakerMode != MANUAL) {
adamvan101 3:2ed03f9e0042 267 TimeOutTimer->start(PVAB);
adamvan101 3:2ed03f9e0042 268 }
adamvan101 0:6c085ebcb2d5 269 }
adamvan101 0:6c085ebcb2d5 270 else
adamvan101 0:6c085ebcb2d5 271 {
adamvan101 1:d1c452f164d4 272 println("VPace Sent");
adamvan101 1:d1c452f164d4 273 vpaceLED=1;
adamvan101 0:6c085ebcb2d5 274 vPace=1;
adamvan101 0:6c085ebcb2d5 275 Thread::wait(1);
adamvan101 0:6c085ebcb2d5 276 vPace=0;
adamvan101 1:d1c452f164d4 277 vpaceLED=0;
adamvan101 0:6c085ebcb2d5 278 if(modeChanged)
adamvan101 0:6c085ebcb2d5 279 {
adamvan101 0:6c085ebcb2d5 280 changeMode();
adamvan101 0:6c085ebcb2d5 281 }
adamvan101 0:6c085ebcb2d5 282 // start VRP and URI timers
adamvan101 2:3d47bb081502 283 setVSignal(false);
adamvan101 2:3d47bb081502 284 setASignal(false);
adamvan101 2:3d47bb081502 285 incrementHeartRate();
adamvan101 0:6c085ebcb2d5 286 canPaceV=false;
adamvan101 1:d1c452f164d4 287 URITimeOutTimer->start(URI);
adamvan101 2:3d47bb081502 288 setTimeConstraint(VRP_const);
adamvan101 0:6c085ebcb2d5 289 timerRunning=true;
adamvan101 3:2ed03f9e0042 290 if (paceMakerMode != MANUAL) {
adamvan101 3:2ed03f9e0042 291 TimeOutTimer->start(VRP);
adamvan101 3:2ed03f9e0042 292 }
adamvan101 0:6c085ebcb2d5 293 }
adamvan101 0:6c085ebcb2d5 294 }
adamvan101 0:6c085ebcb2d5 295 }
adamvan101 0:6c085ebcb2d5 296
adamvan101 2:3d47bb081502 297 void readInt() {
adamvan101 2:3d47bb081502 298 char c = pc.getc();
adamvan101 2:3d47bb081502 299 int input = c-48;
adamvan101 2:3d47bb081502 300 c = pc.getc();
adamvan101 2:3d47bb081502 301 while (c != '\r') {
adamvan101 2:3d47bb081502 302 input *= 10;
adamvan101 2:3d47bb081502 303 input += c-48;
adamvan101 2:3d47bb081502 304 c = pc.getc();
adamvan101 2:3d47bb081502 305 }
adamvan101 2:3d47bb081502 306
adamvan101 2:3d47bb081502 307 if (input >= 10 && input <= 90) {
adamvan101 2:3d47bb081502 308 pacemakerInterval=input;
adamvan101 3:2ed03f9e0042 309 observationInterval=pacemakerInterval*1000;
adamvan101 3:2ed03f9e0042 310 displayTimer.reset();
adamvan101 3:2ed03f9e0042 311 heartRateMutex.lock();
adamvan101 3:2ed03f9e0042 312 heartRate=0;
adamvan101 3:2ed03f9e0042 313 heartRateMutex.unlock();
adamvan101 2:3d47bb081502 314 pc.printf("Obs Int Changed: %d\r\n", pacemakerInterval);
adamvan101 2:3d47bb081502 315 } else {
adamvan101 2:3d47bb081502 316 pc.printf("Bad Obs Int: %d\r\n", input);
adamvan101 2:3d47bb081502 317 }
adamvan101 2:3d47bb081502 318 }
adamvan101 2:3d47bb081502 319
adamvan101 2:3d47bb081502 320 void pacemakerKeyboard(const void *args)
adamvan101 0:6c085ebcb2d5 321 {
adamvan101 0:6c085ebcb2d5 322 while(1)
adamvan101 0:6c085ebcb2d5 323 {
adamvan101 1:d1c452f164d4 324 Thread::signal_wait(signal2);
adamvan101 1:d1c452f164d4 325 if((((ch=='a')||(ch=='A')) && paceMakerMode==MANUAL) && !observationChange)
adamvan101 0:6c085ebcb2d5 326 {
adamvan101 0:6c085ebcb2d5 327 //fire A Pace
adamvan101 0:6c085ebcb2d5 328 paceA=true;
adamvan101 2:3d47bb081502 329 (*P_PacemakerSend).signal_set(signal1);
adamvan101 0:6c085ebcb2d5 330 }
adamvan101 1:d1c452f164d4 331 else if((((ch=='v')||(ch=='V')) && paceMakerMode==MANUAL) && !observationChange)
adamvan101 0:6c085ebcb2d5 332 {
adamvan101 0:6c085ebcb2d5 333 //fire V Pace
adamvan101 0:6c085ebcb2d5 334 if(canPaceV)
adamvan101 0:6c085ebcb2d5 335 {
adamvan101 0:6c085ebcb2d5 336 paceA=false;
adamvan101 0:6c085ebcb2d5 337 paceVPending=false;
adamvan101 2:3d47bb081502 338 (*P_PacemakerSend).signal_set(signal1);
adamvan101 0:6c085ebcb2d5 339 }
adamvan101 0:6c085ebcb2d5 340 else
adamvan101 0:6c085ebcb2d5 341 {
adamvan101 0:6c085ebcb2d5 342 paceVPending=true;
adamvan101 0:6c085ebcb2d5 343 }
adamvan101 0:6c085ebcb2d5 344 }
adamvan101 1:d1c452f164d4 345 else if(((((ch=='n')||(ch=='N'))&& paceMakerMode!=NORMAL) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 346 {
adamvan101 1:d1c452f164d4 347 paceMakerMode=NORMAL;
adamvan101 0:6c085ebcb2d5 348 modeChanged=true;
adamvan101 0:6c085ebcb2d5 349 }
adamvan101 1:d1c452f164d4 350 else if(((((ch=='e')||(ch=='E')) && paceMakerMode!=EXERCISE) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 351 {
adamvan101 1:d1c452f164d4 352 paceMakerMode=EXERCISE;
adamvan101 0:6c085ebcb2d5 353 modeChanged=true;
adamvan101 0:6c085ebcb2d5 354 }
adamvan101 1:d1c452f164d4 355 else if(((((ch=='s')||(ch=='S')) && paceMakerMode!=SLEEP) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 356 {
adamvan101 1:d1c452f164d4 357 paceMakerMode=SLEEP;
adamvan101 0:6c085ebcb2d5 358 modeChanged=true;
adamvan101 0:6c085ebcb2d5 359 }
adamvan101 1:d1c452f164d4 360 else if(((((ch=='m')||(ch=='M')) && paceMakerMode!=MANUAL) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 361 {
adamvan101 1:d1c452f164d4 362 paceMakerMode=MANUAL;
adamvan101 0:6c085ebcb2d5 363 modeChanged=true;
adamvan101 0:6c085ebcb2d5 364 }
adamvan101 0:6c085ebcb2d5 365 else if(((((ch=='o')||(ch=='O')) && !observationChange) && !modeChanged))
adamvan101 0:6c085ebcb2d5 366 {
adamvan101 2:3d47bb081502 367 // blocks, reading characters, until "return" is pressed
adamvan101 3:2ed03f9e0042 368 observationMutex.lock();
adamvan101 2:3d47bb081502 369 readInt();
adamvan101 3:2ed03f9e0042 370 observationMutex.unlock();
adamvan101 0:6c085ebcb2d5 371 }
adamvan101 0:6c085ebcb2d5 372 }
adamvan101 0:6c085ebcb2d5 373 }
adamvan101 0:6c085ebcb2d5 374
adamvan101 3:2ed03f9e0042 375 void pacemakerAlarm(const void *args)
adamvan101 0:6c085ebcb2d5 376 {
adamvan101 0:6c085ebcb2d5 377 while(1)
adamvan101 0:6c085ebcb2d5 378 {
adamvan101 3:2ed03f9e0042 379 Thread::signal_wait(signal5);
adamvan101 3:2ed03f9e0042 380 while(avgHeartRate > (60000/URI))
adamvan101 0:6c085ebcb2d5 381 {
adamvan101 0:6c085ebcb2d5 382 buzzer=1;
adamvan101 0:6c085ebcb2d5 383 Thread::wait(5);
adamvan101 0:6c085ebcb2d5 384 buzzer=0;
adamvan101 0:6c085ebcb2d5 385 Thread::wait(5);
adamvan101 0:6c085ebcb2d5 386 if(!ringingAlarm)
adamvan101 0:6c085ebcb2d5 387 {
adamvan101 0:6c085ebcb2d5 388 displayMutex.lock();
adamvan101 3:2ed03f9e0042 389 println("!!!***Alarm High***!!!");
adamvan101 0:6c085ebcb2d5 390 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 391 ringingAlarm=true;
adamvan101 0:6c085ebcb2d5 392 }
adamvan101 0:6c085ebcb2d5 393 }
adamvan101 3:2ed03f9e0042 394 while(avgHeartRate < (60000/LRI))
adamvan101 0:6c085ebcb2d5 395 {
adamvan101 0:6c085ebcb2d5 396 buzzer=1;
adamvan101 0:6c085ebcb2d5 397 Thread::wait(10);
adamvan101 0:6c085ebcb2d5 398 buzzer=0;
adamvan101 0:6c085ebcb2d5 399 Thread::wait(10);
adamvan101 0:6c085ebcb2d5 400 if(!ringingAlarm)
adamvan101 0:6c085ebcb2d5 401 {
adamvan101 0:6c085ebcb2d5 402 displayMutex.lock();
adamvan101 3:2ed03f9e0042 403 println("!!!***Alarm Low***!!!");
adamvan101 0:6c085ebcb2d5 404 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 405 ringingAlarm=true;
adamvan101 0:6c085ebcb2d5 406 }
adamvan101 0:6c085ebcb2d5 407 }
adamvan101 0:6c085ebcb2d5 408 if(ringingAlarm)
adamvan101 0:6c085ebcb2d5 409 {
adamvan101 0:6c085ebcb2d5 410 ringingAlarm=false;
adamvan101 2:3d47bb081502 411 // resetDisplay();
adamvan101 0:6c085ebcb2d5 412 }
adamvan101 0:6c085ebcb2d5 413 }
adamvan101 0:6c085ebcb2d5 414 }
adamvan101 0:6c085ebcb2d5 415
adamvan101 0:6c085ebcb2d5 416 void display(const void *args)
adamvan101 0:6c085ebcb2d5 417 {
adamvan101 2:3d47bb081502 418 displayTimer.start();
adamvan101 2:3d47bb081502 419
adamvan101 0:6c085ebcb2d5 420 while(1)
adamvan101 0:6c085ebcb2d5 421 {
adamvan101 3:2ed03f9e0042 422 observationMutex.lock();
adamvan101 2:3d47bb081502 423 if (displayTimer.read_ms() >= observationInterval) {
adamvan101 2:3d47bb081502 424 displayTimer.reset();
adamvan101 2:3d47bb081502 425 printToLCD();
adamvan101 3:2ed03f9e0042 426 avgHeartRate=heartRate*(60/pacemakerInterval);
adamvan101 3:2ed03f9e0042 427 heartRateMutex.lock();
adamvan101 3:2ed03f9e0042 428 heartRate=0;
adamvan101 3:2ed03f9e0042 429 heartRateMutex.unlock();
adamvan101 3:2ed03f9e0042 430 observationMutex.unlock();
adamvan101 3:2ed03f9e0042 431 (*P_PacemakerAlarm).signal_set(signal5);
adamvan101 2:3d47bb081502 432 } else {
adamvan101 2:3d47bb081502 433 printToLCD();
adamvan101 3:2ed03f9e0042 434 observationMutex.unlock();
adamvan101 2:3d47bb081502 435 Thread::wait(100);
adamvan101 2:3d47bb081502 436 }
adamvan101 0:6c085ebcb2d5 437 }
adamvan101 0:6c085ebcb2d5 438 }
adamvan101 0:6c085ebcb2d5 439
adamvan101 0:6c085ebcb2d5 440 int main()
adamvan101 1:d1c452f164d4 441 {
adamvan101 2:3d47bb081502 442 setVSignal(true);
adamvan101 2:3d47bb081502 443 setVSignal(true);
adamvan101 1:d1c452f164d4 444 switchToNormal();
adamvan101 0:6c085ebcb2d5 445
adamvan101 3:2ed03f9e0042 446 ASignal.rise(&aSense);
adamvan101 3:2ed03f9e0042 447 VSignal.rise(&vSense);
adamvan101 0:6c085ebcb2d5 448 TimeOutTimer=new RtosTimer(timeOut, osTimerOnce, (void*)0);
adamvan101 0:6c085ebcb2d5 449 URITimeOutTimer=new RtosTimer(uriTimeOut, osTimerOnce, (void *)0);
adamvan101 0:6c085ebcb2d5 450
adamvan101 2:3d47bb081502 451 Thread PacemakerSend(pacemakerSend);
adamvan101 2:3d47bb081502 452 P_PacemakerSend=&PacemakerSend;
adamvan101 2:3d47bb081502 453 PacemakerSend.set_priority(osPriorityHigh);
adamvan101 2:3d47bb081502 454
adamvan101 2:3d47bb081502 455 Thread PacemakerReceive(pacemakerReceive);
adamvan101 2:3d47bb081502 456 P_PacemakerReceive=&PacemakerReceive;
adamvan101 2:3d47bb081502 457 PacemakerReceive.set_priority(osPriorityAboveNormal);
adamvan101 2:3d47bb081502 458
adamvan101 2:3d47bb081502 459 Thread PacemakerModeSwitch(pacemakerModeSwitch);
adamvan101 2:3d47bb081502 460 P_PacemakerModeSwitch=&PacemakerModeSwitch;
adamvan101 2:3d47bb081502 461 PacemakerModeSwitch.set_priority(osPriorityAboveNormal);
adamvan101 2:3d47bb081502 462
adamvan101 2:3d47bb081502 463 Thread PacemakerKeyboard(pacemakerKeyboard);
adamvan101 2:3d47bb081502 464 P_PacemakerKeyboard=&PacemakerKeyboard;
adamvan101 2:3d47bb081502 465 PacemakerKeyboard.set_priority(osPriorityRealtime);
adamvan101 2:3d47bb081502 466
adamvan101 2:3d47bb081502 467 Thread Display(display);
adamvan101 2:3d47bb081502 468 Display.set_priority(osPriorityAboveNormal);
adamvan101 3:2ed03f9e0042 469
adamvan101 3:2ed03f9e0042 470 Thread PacemakerAlarm(pacemakerAlarm);
adamvan101 3:2ed03f9e0042 471 P_PacemakerAlarm = &PacemakerAlarm;
adamvan101 3:2ed03f9e0042 472 PacemakerAlarm.set_priority(osPriorityAboveNormal);
adamvan101 0:6c085ebcb2d5 473
adamvan101 2:3d47bb081502 474 setTimeConstraint(VRP_const);
adamvan101 1:d1c452f164d4 475 TimeOutTimer->start(VRP);
adamvan101 2:3d47bb081502 476
adamvan101 0:6c085ebcb2d5 477 while(1) {
adamvan101 0:6c085ebcb2d5 478 if(pc.readable())
adamvan101 0:6c085ebcb2d5 479 {
adamvan101 0:6c085ebcb2d5 480 ch=pc.getc();
adamvan101 2:3d47bb081502 481 (*P_PacemakerKeyboard).signal_set(signal2);
adamvan101 0:6c085ebcb2d5 482 }
adamvan101 0:6c085ebcb2d5 483 }
adamvan101 0:6c085ebcb2d5 484 }