yay!

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541_Pacermaker by CIS541

Committer:
sanjeet25
Date:
Wed Dec 02 09:42:45 2015 +0000
Revision:
6:a1a3e73d90f3
Parent:
4:8e3dc7e73627
pacemaker_dynamicAVI

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