
yay!
Dependencies: TextLCD mbed-rtos mbed
Fork of 541_Pacermaker by
main.cpp@1:d1c452f164d4, 2015-12-02 (annotated)
- 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?
User | Revision | Line number | New 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 | } |