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