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