yay!

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541_Pacermaker by CIS541

Committer:
adamvan101
Date:
Wed Dec 02 01:30:36 2015 +0000
Revision:
2:3d47bb081502
Parent:
1:d1c452f164d4
Child:
3:2ed03f9e0042
obs int

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 2:3d47bb081502 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 0:6c085ebcb2d5 127 heartRateHeart++;
adamvan101 1:d1c452f164d4 128 if(waitVSignal)
adamvan101 0:6c085ebcb2d5 129 {
adamvan101 1:d1c452f164d4 130 vsenseLED=1;
adamvan101 1:d1c452f164d4 131 println("VSense Received");
adamvan101 0:6c085ebcb2d5 132 wait(0.001);
adamvan101 1:d1c452f164d4 133 vsenseLED=0;
adamvan101 0:6c085ebcb2d5 134 if(modeChanged)
adamvan101 0:6c085ebcb2d5 135 {
adamvan101 2:3d47bb081502 136 (*P_PacemakerModeSwitch).signal_set(signal3);
adamvan101 0:6c085ebcb2d5 137 }
adamvan101 0:6c085ebcb2d5 138 canPaceV=false;
adamvan101 0:6c085ebcb2d5 139 aSenseOccurred=false;
adamvan101 2:3d47bb081502 140 (*P_PacemakerReceive).signal_set(signal4);
adamvan101 0:6c085ebcb2d5 141 }
adamvan101 0:6c085ebcb2d5 142 }
adamvan101 0:6c085ebcb2d5 143
adamvan101 0:6c085ebcb2d5 144 void seconds(const void *args)
adamvan101 0:6c085ebcb2d5 145 {
adamvan101 0:6c085ebcb2d5 146 sec++;
adamvan101 0:6c085ebcb2d5 147 if(sec>=60)
adamvan101 0:6c085ebcb2d5 148 {
adamvan101 0:6c085ebcb2d5 149 avgHeartRateHeart=heartRateHeart;
adamvan101 0:6c085ebcb2d5 150 heartRateHeart=0;
adamvan101 0:6c085ebcb2d5 151 sec=0;
adamvan101 0:6c085ebcb2d5 152 }
adamvan101 0:6c085ebcb2d5 153 }
adamvan101 0:6c085ebcb2d5 154
adamvan101 0:6c085ebcb2d5 155 void timeOut(const void *args)
adamvan101 0:6c085ebcb2d5 156 {
adamvan101 0:6c085ebcb2d5 157 // check which time out has occurred
adamvan101 0:6c085ebcb2d5 158 // generate appropriate pace signal
adamvan101 0:6c085ebcb2d5 159 // reset timer to new value
adamvan101 1:d1c452f164d4 160 //apaceLED=1;
adamvan101 1:d1c452f164d4 161 if(timeConstraint==AVI_const)
adamvan101 0:6c085ebcb2d5 162 {
adamvan101 0:6c085ebcb2d5 163 //generate VPace
adamvan101 0:6c085ebcb2d5 164 if(canPaceV)
adamvan101 0:6c085ebcb2d5 165 {
adamvan101 0:6c085ebcb2d5 166 paceA=false;
adamvan101 2:3d47bb081502 167 (*P_PacemakerSend).signal_set(signal1);
adamvan101 0:6c085ebcb2d5 168 }
adamvan101 0:6c085ebcb2d5 169 else
adamvan101 0:6c085ebcb2d5 170 {
adamvan101 0:6c085ebcb2d5 171 canPaceV=true;
adamvan101 0:6c085ebcb2d5 172 }
adamvan101 0:6c085ebcb2d5 173 }
adamvan101 1:d1c452f164d4 174 else if(timeConstraint==PVAB_const)
adamvan101 0:6c085ebcb2d5 175 {
adamvan101 2:3d47bb081502 176 setVSignal(true);
adamvan101 2:3d47bb081502 177 setTimeConstraint(AVI_const);
adamvan101 0:6c085ebcb2d5 178 timerRunning=true;
adamvan101 1:d1c452f164d4 179 TimeOutTimer->start(AVI-PVAB);
adamvan101 0:6c085ebcb2d5 180 }
adamvan101 1:d1c452f164d4 181 else if(timeConstraint==VRP_const)
adamvan101 0:6c085ebcb2d5 182 {
adamvan101 0:6c085ebcb2d5 183 //now we can sense a Ventrival event, but not an atrial event as PVARP is not over
adamvan101 0:6c085ebcb2d5 184 //restart timer for PVARP
adamvan101 2:3d47bb081502 185 setVSignal(true);
adamvan101 2:3d47bb081502 186 setTimeConstraint(PVARP_const);;
adamvan101 0:6c085ebcb2d5 187 timerRunning=true;
adamvan101 1:d1c452f164d4 188 TimeOutTimer->start(PVARP-VRP);
adamvan101 0:6c085ebcb2d5 189 }
adamvan101 1:d1c452f164d4 190 else if(timeConstraint==PVARP_const)
adamvan101 0:6c085ebcb2d5 191 {
adamvan101 0:6c085ebcb2d5 192 //now we can sense Atrial events as well
adamvan101 2:3d47bb081502 193 setASignal(true);
adamvan101 2:3d47bb081502 194 setTimeConstraint(LRI_const);
adamvan101 0:6c085ebcb2d5 195 timerRunning=true;
adamvan101 1:d1c452f164d4 196 TimeOutTimer->start(LRI-PVARP-AVI);
adamvan101 0:6c085ebcb2d5 197 }
adamvan101 1:d1c452f164d4 198 else if(timeConstraint==LRI_const)
adamvan101 0:6c085ebcb2d5 199 {
adamvan101 0:6c085ebcb2d5 200 //generate APace
adamvan101 0:6c085ebcb2d5 201 paceA=true;
adamvan101 2:3d47bb081502 202 (*P_PacemakerSend).signal_set(signal1);
adamvan101 0:6c085ebcb2d5 203 }
adamvan101 0:6c085ebcb2d5 204 }
adamvan101 0:6c085ebcb2d5 205
adamvan101 0:6c085ebcb2d5 206 void uriTimeOut(const void *args)
adamvan101 0:6c085ebcb2d5 207 {
adamvan101 0:6c085ebcb2d5 208 // uri is over
adamvan101 0:6c085ebcb2d5 209 //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 210 if(paceVPending || canPaceV)
adamvan101 0:6c085ebcb2d5 211 {
adamvan101 0:6c085ebcb2d5 212 //pace V as a pace occurred during URI
adamvan101 0:6c085ebcb2d5 213 paceA=false;
adamvan101 0:6c085ebcb2d5 214 paceVPending=false;
adamvan101 2:3d47bb081502 215 (*P_PacemakerSend).signal_set(signal1);
adamvan101 0:6c085ebcb2d5 216 }
adamvan101 0:6c085ebcb2d5 217 else
adamvan101 0:6c085ebcb2d5 218 {
adamvan101 0:6c085ebcb2d5 219 canPaceV=true; //allow the PM to pace V as URI is now over
adamvan101 0:6c085ebcb2d5 220 }
adamvan101 0:6c085ebcb2d5 221
adamvan101 0:6c085ebcb2d5 222 }
adamvan101 0:6c085ebcb2d5 223
adamvan101 0:6c085ebcb2d5 224 void keyTimeOut(const void *args)
adamvan101 0:6c085ebcb2d5 225 {
adamvan101 0:6c085ebcb2d5 226 if(digitOneReceived)
adamvan101 0:6c085ebcb2d5 227 {
adamvan101 0:6c085ebcb2d5 228 observationChange=false;
adamvan101 0:6c085ebcb2d5 229 }
adamvan101 0:6c085ebcb2d5 230 else
adamvan101 0:6c085ebcb2d5 231 {
adamvan101 0:6c085ebcb2d5 232 observationChange=false;
adamvan101 0:6c085ebcb2d5 233 }
adamvan101 0:6c085ebcb2d5 234 }
adamvan101 0:6c085ebcb2d5 235
adamvan101 2:3d47bb081502 236 void pacemakerReceive(const void *args)
adamvan101 0:6c085ebcb2d5 237 {
adamvan101 0:6c085ebcb2d5 238 while(1)
adamvan101 0:6c085ebcb2d5 239 {
adamvan101 1:d1c452f164d4 240 Thread::signal_wait(signal4);
adamvan101 0:6c085ebcb2d5 241 if(timerRunning)
adamvan101 0:6c085ebcb2d5 242 {
adamvan101 0:6c085ebcb2d5 243 TimeOutTimer->stop();
adamvan101 0:6c085ebcb2d5 244 timerRunning=false;
adamvan101 0:6c085ebcb2d5 245 }
adamvan101 0:6c085ebcb2d5 246 if(aSenseOccurred)
adamvan101 0:6c085ebcb2d5 247 {
adamvan101 2:3d47bb081502 248 setASignal(false);
adamvan101 2:3d47bb081502 249 setVSignal(true);
adamvan101 0:6c085ebcb2d5 250 timerRunning=true;
adamvan101 2:3d47bb081502 251 setTimeConstraint(AVI_const);
adamvan101 1:d1c452f164d4 252 TimeOutTimer->start(AVI);//500);
adamvan101 0:6c085ebcb2d5 253 }
adamvan101 0:6c085ebcb2d5 254 else
adamvan101 0:6c085ebcb2d5 255 {
adamvan101 2:3d47bb081502 256 incrementHeartRate();
adamvan101 2:3d47bb081502 257 setVSignal(false);
adamvan101 2:3d47bb081502 258 setASignal(false);
adamvan101 0:6c085ebcb2d5 259 canPaceV=false;
adamvan101 1:d1c452f164d4 260 URITimeOutTimer->start(URI);
adamvan101 0:6c085ebcb2d5 261 timerRunning=true;
adamvan101 2:3d47bb081502 262 setTimeConstraint(VRP_const);
adamvan101 1:d1c452f164d4 263 TimeOutTimer->start(VRP);
adamvan101 0:6c085ebcb2d5 264 }
adamvan101 0:6c085ebcb2d5 265 }
adamvan101 0:6c085ebcb2d5 266 }
adamvan101 0:6c085ebcb2d5 267
adamvan101 2:3d47bb081502 268 void pacemakerSend(const void *args)
adamvan101 0:6c085ebcb2d5 269 {
adamvan101 0:6c085ebcb2d5 270 while(1)
adamvan101 0:6c085ebcb2d5 271 {
adamvan101 1:d1c452f164d4 272 Thread::signal_wait(signal1);
adamvan101 0:6c085ebcb2d5 273 if(paceA)
adamvan101 0:6c085ebcb2d5 274 {
adamvan101 1:d1c452f164d4 275 println("APace Sent");
adamvan101 1:d1c452f164d4 276 apaceLED=1;
adamvan101 0:6c085ebcb2d5 277 aPace=1;
adamvan101 0:6c085ebcb2d5 278 Thread::wait(1);
adamvan101 0:6c085ebcb2d5 279 aPace=0;
adamvan101 1:d1c452f164d4 280 apaceLED=0;
adamvan101 0:6c085ebcb2d5 281 if(modeChanged)
adamvan101 0:6c085ebcb2d5 282 {
adamvan101 0:6c085ebcb2d5 283 changeMode();
adamvan101 0:6c085ebcb2d5 284 }
adamvan101 0:6c085ebcb2d5 285 // start AVI Timer
adamvan101 2:3d47bb081502 286 setASignal(false);
adamvan101 2:3d47bb081502 287 setVSignal(false);
adamvan101 2:3d47bb081502 288 setTimeConstraint(PVAB_const);
adamvan101 0:6c085ebcb2d5 289 timerRunning=true;
adamvan101 1:d1c452f164d4 290 TimeOutTimer->start(PVAB);
adamvan101 0:6c085ebcb2d5 291 //generate the APace pulse
adamvan101 0:6c085ebcb2d5 292 }
adamvan101 0:6c085ebcb2d5 293 else
adamvan101 0:6c085ebcb2d5 294 {
adamvan101 1:d1c452f164d4 295 println("VPace Sent");
adamvan101 1:d1c452f164d4 296 vpaceLED=1;
adamvan101 0:6c085ebcb2d5 297 vPace=1;
adamvan101 0:6c085ebcb2d5 298 Thread::wait(1);
adamvan101 0:6c085ebcb2d5 299 vPace=0;
adamvan101 1:d1c452f164d4 300 vpaceLED=0;
adamvan101 0:6c085ebcb2d5 301 if(modeChanged)
adamvan101 0:6c085ebcb2d5 302 {
adamvan101 0:6c085ebcb2d5 303 changeMode();
adamvan101 0:6c085ebcb2d5 304 }
adamvan101 0:6c085ebcb2d5 305 // start VRP and URI timers
adamvan101 2:3d47bb081502 306 setVSignal(false);
adamvan101 2:3d47bb081502 307 setASignal(false);
adamvan101 2:3d47bb081502 308 incrementHeartRate();
adamvan101 0:6c085ebcb2d5 309 canPaceV=false;
adamvan101 1:d1c452f164d4 310 URITimeOutTimer->start(URI);
adamvan101 2:3d47bb081502 311 setTimeConstraint(VRP_const);
adamvan101 0:6c085ebcb2d5 312 timerRunning=true;
adamvan101 1:d1c452f164d4 313 TimeOutTimer->start(VRP);
adamvan101 0:6c085ebcb2d5 314 //generate the VPace pulse
adamvan101 0:6c085ebcb2d5 315 }
adamvan101 0:6c085ebcb2d5 316 }
adamvan101 0:6c085ebcb2d5 317 }
adamvan101 0:6c085ebcb2d5 318
adamvan101 2:3d47bb081502 319 void readInt() {
adamvan101 2:3d47bb081502 320 char c = pc.getc();
adamvan101 2:3d47bb081502 321 int input = c-48;
adamvan101 2:3d47bb081502 322 c = pc.getc();
adamvan101 2:3d47bb081502 323 while (c != '\r') {
adamvan101 2:3d47bb081502 324 input *= 10;
adamvan101 2:3d47bb081502 325 input += c-48;
adamvan101 2:3d47bb081502 326 c = pc.getc();
adamvan101 2:3d47bb081502 327 }
adamvan101 2:3d47bb081502 328
adamvan101 2:3d47bb081502 329 if (input >= 10 && input <= 90) {
adamvan101 2:3d47bb081502 330 pacemakerInterval=input;
adamvan101 2:3d47bb081502 331 pc.printf("Obs Int Changed: %d\r\n", pacemakerInterval);
adamvan101 2:3d47bb081502 332 } else {
adamvan101 2:3d47bb081502 333 pc.printf("Bad Obs Int: %d\r\n", input);
adamvan101 2:3d47bb081502 334 }
adamvan101 2:3d47bb081502 335 }
adamvan101 2:3d47bb081502 336
adamvan101 2:3d47bb081502 337 void pacemakerKeyboard(const void *args)
adamvan101 0:6c085ebcb2d5 338 {
adamvan101 0:6c085ebcb2d5 339 while(1)
adamvan101 0:6c085ebcb2d5 340 {
adamvan101 1:d1c452f164d4 341 Thread::signal_wait(signal2);
adamvan101 1:d1c452f164d4 342 if((((ch=='a')||(ch=='A')) && paceMakerMode==MANUAL) && !observationChange)
adamvan101 0:6c085ebcb2d5 343 {
adamvan101 0:6c085ebcb2d5 344 //fire A Pace
adamvan101 0:6c085ebcb2d5 345 paceA=true;
adamvan101 2:3d47bb081502 346 (*P_PacemakerSend).signal_set(signal1);
adamvan101 0:6c085ebcb2d5 347 }
adamvan101 1:d1c452f164d4 348 else if((((ch=='v')||(ch=='V')) && paceMakerMode==MANUAL) && !observationChange)
adamvan101 0:6c085ebcb2d5 349 {
adamvan101 0:6c085ebcb2d5 350 //fire V Pace
adamvan101 0:6c085ebcb2d5 351 if(canPaceV)
adamvan101 0:6c085ebcb2d5 352 {
adamvan101 0:6c085ebcb2d5 353 paceA=false;
adamvan101 0:6c085ebcb2d5 354 paceVPending=false;
adamvan101 2:3d47bb081502 355 (*P_PacemakerSend).signal_set(signal1);
adamvan101 0:6c085ebcb2d5 356 }
adamvan101 0:6c085ebcb2d5 357 else
adamvan101 0:6c085ebcb2d5 358 {
adamvan101 0:6c085ebcb2d5 359 paceVPending=true;
adamvan101 0:6c085ebcb2d5 360 }
adamvan101 0:6c085ebcb2d5 361 }
adamvan101 1:d1c452f164d4 362 else if(((((ch=='n')||(ch=='N'))&& paceMakerMode!=NORMAL) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 363 {
adamvan101 1:d1c452f164d4 364 paceMakerMode=NORMAL;
adamvan101 0:6c085ebcb2d5 365 modeChanged=true;
adamvan101 0:6c085ebcb2d5 366 }
adamvan101 1:d1c452f164d4 367 else if(((((ch=='e')||(ch=='E')) && paceMakerMode!=EXERCISE) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 368 {
adamvan101 1:d1c452f164d4 369 paceMakerMode=EXERCISE;
adamvan101 0:6c085ebcb2d5 370 modeChanged=true;
adamvan101 0:6c085ebcb2d5 371 }
adamvan101 1:d1c452f164d4 372 else if(((((ch=='s')||(ch=='S')) && paceMakerMode!=SLEEP) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 373 {
adamvan101 1:d1c452f164d4 374 paceMakerMode=SLEEP;
adamvan101 0:6c085ebcb2d5 375 modeChanged=true;
adamvan101 0:6c085ebcb2d5 376 }
adamvan101 0:6c085ebcb2d5 377 else if(((((ch=='b')||(ch=='B')) ) && !observationChange) )
adamvan101 0:6c085ebcb2d5 378 {
adamvan101 0:6c085ebcb2d5 379 ringAlarm=!ringAlarm;
adamvan101 0:6c085ebcb2d5 380 }
adamvan101 1:d1c452f164d4 381 else if(((((ch=='m')||(ch=='M')) && paceMakerMode!=MANUAL) && !observationChange) && !modeChanged)
adamvan101 0:6c085ebcb2d5 382 {
adamvan101 1:d1c452f164d4 383 paceMakerMode=MANUAL;
adamvan101 0:6c085ebcb2d5 384 modeChanged=true;
adamvan101 0:6c085ebcb2d5 385 }
adamvan101 0:6c085ebcb2d5 386 else if(((((ch=='o')||(ch=='O')) && !observationChange) && !modeChanged))
adamvan101 0:6c085ebcb2d5 387 {
adamvan101 2:3d47bb081502 388 // blocks, reading characters, until "return" is pressed
adamvan101 2:3d47bb081502 389 readInt();
adamvan101 0:6c085ebcb2d5 390 }
adamvan101 0:6c085ebcb2d5 391 }
adamvan101 0:6c085ebcb2d5 392 }
adamvan101 0:6c085ebcb2d5 393
adamvan101 0:6c085ebcb2d5 394 void alarm(const void *args)
adamvan101 0:6c085ebcb2d5 395 {
adamvan101 0:6c085ebcb2d5 396 while(1)
adamvan101 0:6c085ebcb2d5 397 {
adamvan101 0:6c085ebcb2d5 398 Thread::wait(1000);
adamvan101 1:d1c452f164d4 399 while(((heartRateHeart*(60/sec))>(60000/URI)) && ringAlarm)
adamvan101 0:6c085ebcb2d5 400 {
adamvan101 0:6c085ebcb2d5 401 buzzer=1;
adamvan101 0:6c085ebcb2d5 402 Thread::wait(5);
adamvan101 0:6c085ebcb2d5 403 buzzer=0;
adamvan101 0:6c085ebcb2d5 404 Thread::wait(5);
adamvan101 0:6c085ebcb2d5 405 if(!ringingAlarm)
adamvan101 0:6c085ebcb2d5 406 {
adamvan101 0:6c085ebcb2d5 407 displayMutex.lock();
adamvan101 1:d1c452f164d4 408 println("Alarm : HeartRate too high");
adamvan101 0:6c085ebcb2d5 409 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 410 ringingAlarm=true;
adamvan101 0:6c085ebcb2d5 411 }
adamvan101 0:6c085ebcb2d5 412 }
adamvan101 1:d1c452f164d4 413 while(((heartRateHeart*(60/sec))<(60000/LRI)) && ringAlarm)
adamvan101 0:6c085ebcb2d5 414 {
adamvan101 0:6c085ebcb2d5 415 buzzer=1;
adamvan101 0:6c085ebcb2d5 416 Thread::wait(10);
adamvan101 0:6c085ebcb2d5 417 buzzer=0;
adamvan101 0:6c085ebcb2d5 418 Thread::wait(10);
adamvan101 0:6c085ebcb2d5 419 if(!ringingAlarm)
adamvan101 0:6c085ebcb2d5 420 {
adamvan101 0:6c085ebcb2d5 421 displayMutex.lock();
adamvan101 1:d1c452f164d4 422 println("Alarm : HeartRate too Low");
adamvan101 0:6c085ebcb2d5 423 displayMutex.unlock();
adamvan101 0:6c085ebcb2d5 424 ringingAlarm=true;
adamvan101 0:6c085ebcb2d5 425 }
adamvan101 0:6c085ebcb2d5 426 }
adamvan101 0:6c085ebcb2d5 427 if(ringingAlarm)
adamvan101 0:6c085ebcb2d5 428 {
adamvan101 0:6c085ebcb2d5 429 ringingAlarm=false;
adamvan101 2:3d47bb081502 430 // resetDisplay();
adamvan101 0:6c085ebcb2d5 431 }
adamvan101 0:6c085ebcb2d5 432 }
adamvan101 0:6c085ebcb2d5 433 }
adamvan101 0:6c085ebcb2d5 434
adamvan101 0:6c085ebcb2d5 435 void display(const void *args)
adamvan101 0:6c085ebcb2d5 436 {
adamvan101 2:3d47bb081502 437 displayTimer.start();
adamvan101 2:3d47bb081502 438
adamvan101 0:6c085ebcb2d5 439 while(1)
adamvan101 0:6c085ebcb2d5 440 {
adamvan101 2:3d47bb081502 441 if (displayTimer.read_ms() >= observationInterval) {
adamvan101 2:3d47bb081502 442 displayTimer.reset();
adamvan101 2:3d47bb081502 443 printToLCD();
adamvan101 2:3d47bb081502 444 waitCount++;
adamvan101 2:3d47bb081502 445 if(!observationChange)
adamvan101 0:6c085ebcb2d5 446 {
adamvan101 2:3d47bb081502 447 avgHeartRate=heartRate*rateCoefficient/waitCount;
adamvan101 2:3d47bb081502 448 heartRateMutex.lock();
adamvan101 2:3d47bb081502 449 heartRate=0;
adamvan101 2:3d47bb081502 450 heartRateMutex.unlock();
adamvan101 2:3d47bb081502 451 if(pacemakerInterval!=(observationInterval/1000))
adamvan101 2:3d47bb081502 452 {
adamvan101 2:3d47bb081502 453 //resetDisplay();
adamvan101 2:3d47bb081502 454 printToLCD();
adamvan101 2:3d47bb081502 455 observationInterval=pacemakerInterval*1000;
adamvan101 2:3d47bb081502 456 rateCoefficient=(60000/observationInterval);
adamvan101 2:3d47bb081502 457 }
adamvan101 2:3d47bb081502 458 waitCount=0;
adamvan101 2:3d47bb081502 459 }
adamvan101 2:3d47bb081502 460 } else {
adamvan101 2:3d47bb081502 461 printToLCD();
adamvan101 2:3d47bb081502 462 Thread::wait(100);
adamvan101 2:3d47bb081502 463 }
adamvan101 0:6c085ebcb2d5 464 }
adamvan101 0:6c085ebcb2d5 465 }
adamvan101 0:6c085ebcb2d5 466
adamvan101 0:6c085ebcb2d5 467 int main()
adamvan101 1:d1c452f164d4 468 {
adamvan101 2:3d47bb081502 469 setVSignal(true);
adamvan101 2:3d47bb081502 470 setVSignal(true);
adamvan101 1:d1c452f164d4 471 switchToNormal();
adamvan101 0:6c085ebcb2d5 472
adamvan101 0:6c085ebcb2d5 473 ASignal.fall(&aSense);
adamvan101 0:6c085ebcb2d5 474 VSignal.fall(&vSense);
adamvan101 0:6c085ebcb2d5 475 TimeOutTimer=new RtosTimer(timeOut, osTimerOnce, (void*)0);
adamvan101 0:6c085ebcb2d5 476 URITimeOutTimer=new RtosTimer(uriTimeOut, osTimerOnce, (void *)0);
adamvan101 0:6c085ebcb2d5 477 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 478 SecondsTimer->start(1000); //start the timer to run for every 1 second
adamvan101 0:6c085ebcb2d5 479
adamvan101 2:3d47bb081502 480 Thread PacemakerSend(pacemakerSend);
adamvan101 2:3d47bb081502 481 P_PacemakerSend=&PacemakerSend;
adamvan101 2:3d47bb081502 482 PacemakerSend.set_priority(osPriorityHigh);
adamvan101 2:3d47bb081502 483
adamvan101 2:3d47bb081502 484 Thread PacemakerReceive(pacemakerReceive);
adamvan101 2:3d47bb081502 485 P_PacemakerReceive=&PacemakerReceive;
adamvan101 2:3d47bb081502 486 PacemakerReceive.set_priority(osPriorityAboveNormal);
adamvan101 2:3d47bb081502 487
adamvan101 2:3d47bb081502 488 Thread PacemakerModeSwitch(pacemakerModeSwitch);
adamvan101 2:3d47bb081502 489 P_PacemakerModeSwitch=&PacemakerModeSwitch;
adamvan101 2:3d47bb081502 490 PacemakerModeSwitch.set_priority(osPriorityAboveNormal);
adamvan101 2:3d47bb081502 491
adamvan101 2:3d47bb081502 492 Thread PacemakerKeyboard(pacemakerKeyboard);
adamvan101 2:3d47bb081502 493 P_PacemakerKeyboard=&PacemakerKeyboard;
adamvan101 2:3d47bb081502 494 PacemakerKeyboard.set_priority(osPriorityRealtime);
adamvan101 2:3d47bb081502 495
adamvan101 2:3d47bb081502 496 Thread Display(display);
adamvan101 2:3d47bb081502 497 Display.set_priority(osPriorityAboveNormal);
adamvan101 0:6c085ebcb2d5 498 Thread Alarm(alarm);
adamvan101 0:6c085ebcb2d5 499 Alarm.set_priority(osPriorityAboveNormal);
adamvan101 0:6c085ebcb2d5 500
adamvan101 2:3d47bb081502 501 setTimeConstraint(VRP_const);
adamvan101 1:d1c452f164d4 502 TimeOutTimer->start(VRP);
adamvan101 2:3d47bb081502 503
adamvan101 0:6c085ebcb2d5 504 while(1) {
adamvan101 0:6c085ebcb2d5 505 if(pc.readable())
adamvan101 0:6c085ebcb2d5 506 {
adamvan101 0:6c085ebcb2d5 507 ch=pc.getc();
adamvan101 2:3d47bb081502 508 (*P_PacemakerKeyboard).signal_set(signal2);
adamvan101 0:6c085ebcb2d5 509 }
adamvan101 0:6c085ebcb2d5 510 }
adamvan101 0:6c085ebcb2d5 511 }