yay!

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541_Pacermaker by CIS541

Committer:
adamvan101
Date:
Wed Dec 02 04:13:44 2015 +0000
Revision:
4:8e3dc7e73627
Parent:
3:2ed03f9e0042
Child:
6:a1a3e73d90f3
Done?

Who changed what in which revision?

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