yay!

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541_Pacermaker by CIS541

Committer:
adamvan101
Date:
Wed Dec 02 00:10:55 2015 +0000
Revision:
1:d1c452f164d4
Parent:
0:6c085ebcb2d5
Child:
2:3d47bb081502
changes

Who changed what in which revision?

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