3K04 Project / Mbed 2 deprecated PacemakerSerialStuff

Dependencies:   mbed-rtos mbed

Fork of Pacemaker by 3K04 Project

Committer:
kieftea
Date:
Mon Dec 19 18:50:33 2016 +0000
Revision:
6:d71e30291a62
Parent:
2:4fb5a8d15f9c
Child:
7:4a1ec89e37cc
Final week

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kieftea 0:00669618559e 1 #include "pulsegenerator.h"
kieftea 0:00669618559e 2
kieftea 6:d71e30291a62 3 Param *INPUTS;
kieftea 0:00669618559e 4
kieftea 6:d71e30291a62 5 string none = "N";
kieftea 6:d71e30291a62 6 string transmit = "TR";
kieftea 6:d71e30291a62 7 string rec = "RE";
kieftea 6:d71e30291a62 8 string egramTog = "ET";
kieftea 0:00669618559e 9
kieftea 6:d71e30291a62 10 bool egram = true;
kieftea 0:00669618559e 11
kieftea 6:d71e30291a62 12 string AOO = "AOO";
kieftea 6:d71e30291a62 13 string VOO = "VOO";
kieftea 6:d71e30291a62 14 string VVI = "VVI";
kieftea 0:00669618559e 15
kieftea 0:00669618559e 16 uint8_t initialized = 0;
kieftea 0:00669618559e 17
kieftea 6:d71e30291a62 18 int pace_period_ms;
kieftea 6:d71e30291a62 19
kieftea 0:00669618559e 20 /******************************************
kieftea 0:00669618559e 21 *
kieftea 0:00669618559e 22 * Pacing Mode Functions
kieftea 0:00669618559e 23 *
kieftea 6:d71e30291a62 24 *******************************************
kieftea 0:00669618559e 25
kieftea 6:d71e30291a62 26 //
kieftea 6:d71e30291a62 27 //Deactivates both pacing circuits
kieftea 6:d71e30291a62 28 //Cancels any existing pace event
kieftea 6:d71e30291a62 29 */
kieftea 1:8f545f45d899 30
kieftea 0:00669618559e 31 void pace_charge_shutdown () {
kieftea 0:00669618559e 32 /* Stage 1: Switch-OFF/Ground-ON */
kieftea 0:00669618559e 33 atr_pace_ctrl = LOW;
kieftea 0:00669618559e 34 vent_pace_ctrl = LOW;
kieftea 0:00669618559e 35 atr_grnd_ctrl = HIGH;
kieftea 0:00669618559e 36 vent_grnd_ctrl = HIGH;
kieftea 0:00669618559e 37 wait_ms(50);
kieftea 0:00669618559e 38
kieftea 0:00669618559e 39
kieftea 0:00669618559e 40 /* Stage 2: Ref PWM LOW */
kieftea 0:00669618559e 41 pacing_ref_pwm = LOW;
kieftea 0:00669618559e 42 wait_ms(100);
kieftea 0:00669618559e 43
kieftea 0:00669618559e 44 /* Stage 3: Charge CTRL off */
kieftea 0:00669618559e 45 pace_charge_ctrl = LOW;
kieftea 0:00669618559e 46 wait_ms(10);
kieftea 0:00669618559e 47
kieftea 0:00669618559e 48 /* Stage 4: Ground OFF */
kieftea 0:00669618559e 49 atr_grnd_ctrl = LOW;
kieftea 0:00669618559e 50 vent_grnd_ctrl = LOW;
kieftea 0:00669618559e 51 }
kieftea 0:00669618559e 52
kieftea 0:00669618559e 53 void pulsegenerator_initialize () {
kieftea 0:00669618559e 54 if (initialized) return;
kieftea 0:00669618559e 55 pace_charge_shutdown ();
kieftea 0:00669618559e 56 initialized = 1;
kieftea 6:d71e30291a62 57 wait(1);
kieftea 0:00669618559e 58 }
kieftea 0:00669618559e 59
kieftea 0:00669618559e 60 /*
kieftea 0:00669618559e 61 Prep the circuit for Ventricle Pace Event
kieftea 0:00669618559e 62 */
kieftea 0:00669618559e 63 void vent_pace_prime () {
kieftea 0:00669618559e 64 /* Redundant code to close ground switches,
kieftea 0:00669618559e 65 * prevents accidentally shorting the pacemaker
kieftea 0:00669618559e 66 */
kieftea 0:00669618559e 67 atr_grnd_ctrl = LOW;
kieftea 0:00669618559e 68 vent_grnd_ctrl = LOW;
kieftea 0:00669618559e 69
kieftea 0:00669618559e 70 /* Stage 1: Ref PWM On */
kieftea 0:00669618559e 71 pacing_ref_pwm = HIGH;
kieftea 0:00669618559e 72 wait_ms(10);
kieftea 0:00669618559e 73
kieftea 0:00669618559e 74 /* Stage 2: Charge CTRL on */
kieftea 0:00669618559e 75 pace_charge_ctrl = HIGH;
kieftea 0:00669618559e 76 wait_ms(10);
kieftea 0:00669618559e 77 }
kieftea 0:00669618559e 78
kieftea 0:00669618559e 79 /*
kieftea 0:00669618559e 80 Prep the circuit for Atrium Pace Event
kieftea 0:00669618559e 81 */
kieftea 0:00669618559e 82 void atr_pace_prime () {
kieftea 0:00669618559e 83 /* Redundant code to close ground switches,
kieftea 0:00669618559e 84 * prevents accidentally shorting the pacemaker
kieftea 0:00669618559e 85 */
kieftea 0:00669618559e 86 atr_grnd_ctrl = LOW;
kieftea 0:00669618559e 87 vent_grnd_ctrl = LOW;
kieftea 0:00669618559e 88
kieftea 0:00669618559e 89 /* Stage 4: Ref PWM On */
kieftea 0:00669618559e 90 pacing_ref_pwm = HIGH;
kieftea 0:00669618559e 91 wait_ms(10);
kieftea 0:00669618559e 92
kieftea 0:00669618559e 93 /* Stage 5: Charge CTRL on */
kieftea 0:00669618559e 94 pace_charge_ctrl = HIGH;
kieftea 0:00669618559e 95 wait_ms(10);
kieftea 0:00669618559e 96 }
kieftea 0:00669618559e 97
kieftea 6:d71e30291a62 98 void pace_vent (int pulse_width_us) {
kieftea 6:d71e30291a62 99 green = 0;
kieftea 0:00669618559e 100 vent_pace_prime();
kieftea 0:00669618559e 101
kieftea 0:00669618559e 102 // Begin Pace Event Output
kieftea 0:00669618559e 103 vent_pace_ctrl = HIGH;
kieftea 0:00669618559e 104
kieftea 0:00669618559e 105 // Pace Duration
kieftea 0:00669618559e 106 wait_us(pulse_width_us);
kieftea 0:00669618559e 107
kieftea 0:00669618559e 108 // Shut off Pace
kieftea 0:00669618559e 109 vent_pace_ctrl = LOW;
kieftea 0:00669618559e 110
kieftea 0:00669618559e 111 pace_charge_shutdown ();
kieftea 6:d71e30291a62 112 green = 1;
kieftea 0:00669618559e 113 }
kieftea 0:00669618559e 114
kieftea 6:d71e30291a62 115 void pace_atr (int pulse_width_us) {
kieftea 6:d71e30291a62 116
kieftea 0:00669618559e 117 atr_pace_prime();
kieftea 0:00669618559e 118
kieftea 0:00669618559e 119 // Begin Pace Event Output
kieftea 0:00669618559e 120 atr_pace_ctrl = HIGH;
kieftea 0:00669618559e 121
kieftea 0:00669618559e 122 // Pace Duration
kieftea 0:00669618559e 123 wait_us(pulse_width_us);
kieftea 0:00669618559e 124
kieftea 0:00669618559e 125 // Shut off Pace
kieftea 0:00669618559e 126 atr_pace_ctrl = LOW;
kieftea 0:00669618559e 127
kieftea 0:00669618559e 128 pace_charge_shutdown ();
kieftea 0:00669618559e 129 }
kieftea 0:00669618559e 130
kieftea 0:00669618559e 131 void pace_VOO () {
kieftea 6:d71e30291a62 132 pace_vent ((*INPUTS).getVPulseWidth_us());
kieftea 0:00669618559e 133 }
kieftea 0:00669618559e 134
kieftea 0:00669618559e 135 void pace_AOO () {
kieftea 6:d71e30291a62 136 pace_atr ((*INPUTS).getAPulseWidth_us());
kieftea 0:00669618559e 137 }
kieftea 0:00669618559e 138
kieftea 6:d71e30291a62 139 void pace_VVI() {
kieftea 6:d71e30291a62 140 int i = 0;
kieftea 6:d71e30291a62 141 while (i >=60){
kieftea 6:d71e30291a62 142 if (vent_rect_signal == 0){//if there is no signal on the heart then adda counter and wait a millisecond before checking again
kieftea 6:d71e30291a62 143 i++;
kieftea 6:d71e30291a62 144 wait_ms(1); // wait one millisecond
kieftea 6:d71e30291a62 145 //blue != blue;
kieftea 6:d71e30291a62 146 egramSend();
kieftea 1:8f545f45d899 147 }
kieftea 6:d71e30291a62 148 else{//if there is a signal then there is a heart beat, and the VII will return 0 and wait to be caled on again.
kieftea 6:d71e30291a62 149 return;
kieftea 2:4fb5a8d15f9c 150 }
kieftea 6:d71e30291a62 151 }
kieftea 6:d71e30291a62 152
kieftea 6:d71e30291a62 153 pace_vent ((*INPUTS).getVPulseWidth_us());//if there is no heartbeat recordered for 60 millaseconds, then it will call on the pacemaker to pulse.
kieftea 6:d71e30291a62 154 return;
kieftea 6:d71e30291a62 155
kieftea 0:00669618559e 156 }
kieftea 0:00669618559e 157
kieftea 0:00669618559e 158 void begin_pace () {
kieftea 0:00669618559e 159 if (!initialized) pulsegenerator_initialize ();
kieftea 6:d71e30291a62 160
kieftea 6:d71e30291a62 161 green = 1;
kieftea 6:d71e30291a62 162 red = 1;
kieftea 6:d71e30291a62 163 blue = 0;
kieftea 6:d71e30291a62 164 wait(1);
kieftea 6:d71e30291a62 165
kieftea 6:d71e30291a62 166 //serialCheck(recieve());
kieftea 6:d71e30291a62 167 (*INPUTS).setParameters("$VOO,60,120,120,150,OFF,50,OFF,3.50,3.50,3.75,3.75,0.40,0.40,0.75,2.50,320,250,250,OFF,OFF,OFF,OFF,20,1,40,Med,30,8,5,*");
kieftea 6:d71e30291a62 168 blue = 1;
kieftea 0:00669618559e 169
kieftea 6:d71e30291a62 170 while(1){
kieftea 6:d71e30291a62 171 pace_period_ms = (*INPUTS).getLowerRateLimit_ms();
kieftea 6:d71e30291a62 172
kieftea 6:d71e30291a62 173 if (strcmp((*INPUTS).getMode().c_str(),VOO.c_str()) == 0){
kieftea 6:d71e30291a62 174 green = 1;
kieftea 6:d71e30291a62 175 blue = 1;
kieftea 6:d71e30291a62 176 red = !red;
kieftea 6:d71e30291a62 177 wait(1);
kieftea 6:d71e30291a62 178 time_t start = time(NULL);
kieftea 6:d71e30291a62 179
kieftea 6:d71e30291a62 180 pace_VOO();
kieftea 6:d71e30291a62 181
kieftea 6:d71e30291a62 182 time_t now = time(NULL);
kieftea 6:d71e30291a62 183 while((now - start) <= pace_period_ms){
kieftea 6:d71e30291a62 184 egramSend();
kieftea 6:d71e30291a62 185 //wait(2);
kieftea 6:d71e30291a62 186 //red = !red;
kieftea 6:d71e30291a62 187 }
kieftea 6:d71e30291a62 188 //red = !red;
kieftea 6:d71e30291a62 189 } else if (strcmp((*INPUTS).getMode().c_str(),AOO.c_str()) == 0) {
kieftea 6:d71e30291a62 190 green = 1;
kieftea 6:d71e30291a62 191 blue = !blue;
kieftea 6:d71e30291a62 192 red = 1;
kieftea 6:d71e30291a62 193 wait(1);
kieftea 6:d71e30291a62 194 time_t start = time(NULL);
kieftea 6:d71e30291a62 195
kieftea 6:d71e30291a62 196 pace_AOO();
kieftea 6:d71e30291a62 197
kieftea 6:d71e30291a62 198 time_t now = time(NULL);
kieftea 6:d71e30291a62 199 while((now - start) <= pace_period_ms){
kieftea 6:d71e30291a62 200 egramSend();
kieftea 6:d71e30291a62 201 //wait(2);
kieftea 6:d71e30291a62 202 //green = !green;
kieftea 6:d71e30291a62 203 }
kieftea 6:d71e30291a62 204 //green = !green;
kieftea 6:d71e30291a62 205 } else if (strcmp((*INPUTS).getMode().c_str(),VVI.c_str()) == 0) {
kieftea 6:d71e30291a62 206 green = !green;
kieftea 6:d71e30291a62 207 blue = 1;
kieftea 6:d71e30291a62 208 red = 1;
kieftea 6:d71e30291a62 209 wait(1);
kieftea 6:d71e30291a62 210 pace_VVI();
kieftea 6:d71e30291a62 211 //blue != blue;
kieftea 6:d71e30291a62 212 } else {
kieftea 6:d71e30291a62 213 green = 1;
kieftea 6:d71e30291a62 214 blue = !blue;
kieftea 6:d71e30291a62 215 red = !red;
kieftea 6:d71e30291a62 216 wait(1);
kieftea 6:d71e30291a62 217 time_t start = time(NULL);
kieftea 6:d71e30291a62 218
kieftea 6:d71e30291a62 219 pace_VOO();
kieftea 6:d71e30291a62 220
kieftea 6:d71e30291a62 221 time_t now = time(NULL);
kieftea 6:d71e30291a62 222 while((now - start) <= pace_period_ms){
kieftea 6:d71e30291a62 223 egramSend();
kieftea 6:d71e30291a62 224 //blue = !blue;
kieftea 6:d71e30291a62 225 //wait(1);
kieftea 6:d71e30291a62 226 //reen = !green;
kieftea 6:d71e30291a62 227 //wait(1);
kieftea 6:d71e30291a62 228 }
kieftea 6:d71e30291a62 229 //blue = 0;
kieftea 6:d71e30291a62 230 //green = 0;
kieftea 6:d71e30291a62 231 }
kieftea 6:d71e30291a62 232
kieftea 6:d71e30291a62 233 //serialCheck(recieve());
kieftea 6:d71e30291a62 234
kieftea 6:d71e30291a62 235 }
kieftea 6:d71e30291a62 236
kieftea 0:00669618559e 237 }
kieftea 0:00669618559e 238
kieftea 6:d71e30291a62 239 /*
kieftea 0:00669618559e 240 void timer_thread () {
kieftea 0:00669618559e 241 while (true) {
kieftea 0:00669618559e 242 paceThread.signal_set(0x4);
kieftea 0:00669618559e 243
kieftea 2:4fb5a8d15f9c 244 wait_ms(pace_period_ms - 180); //delay for every pace call
kieftea 0:00669618559e 245 }
kieftea 0:00669618559e 246 }
kieftea 0:00669618559e 247
kieftea 0:00669618559e 248 void pace_controller () {
kieftea 0:00669618559e 249 while(true) {
kieftea 0:00669618559e 250 Thread::signal_wait(0x0, osWaitForever); //Sleep until next cycle
kieftea 0:00669618559e 251
kieftea 0:00669618559e 252 switch (currentMode) {
kieftea 0:00669618559e 253 case VOO : pace_VOO(); break;
kieftea 0:00669618559e 254 case VOOR : pace_VOOR(); break;
kieftea 0:00669618559e 255 case AOO : pace_AOO(); break;
kieftea 0:00669618559e 256 default : pace_VOO(); break;
kieftea 0:00669618559e 257 }
kieftea 0:00669618559e 258 }
kieftea 6:d71e30291a62 259 }
kieftea 6:d71e30291a62 260 */
kieftea 6:d71e30291a62 261
kieftea 6:d71e30291a62 262 void egramSend(void){
kieftea 6:d71e30291a62 263 red = 0;
kieftea 6:d71e30291a62 264 green = 0;
kieftea 6:d71e30291a62 265 blue = 0;
kieftea 6:d71e30291a62 266 if (egram) {
kieftea 6:d71e30291a62 267 send("HelloWorld!\r\n");//send data
kieftea 6:d71e30291a62 268 send((*INPUTS).getMode());
kieftea 6:d71e30291a62 269 } else {
kieftea 6:d71e30291a62 270 return;
kieftea 6:d71e30291a62 271 }
kieftea 6:d71e30291a62 272 wait(1);
kieftea 6:d71e30291a62 273 red = 1;
kieftea 6:d71e30291a62 274 green = 1;
kieftea 6:d71e30291a62 275 blue = 1;
kieftea 6:d71e30291a62 276 }
kieftea 6:d71e30291a62 277
kieftea 6:d71e30291a62 278 void serialCheck(string check){
kieftea 6:d71e30291a62 279 if (strcmp(check.c_str(),none.c_str()) == 0){
kieftea 6:d71e30291a62 280 return;//continue
kieftea 6:d71e30291a62 281 } else if (strcmp(check.c_str(),rec.c_str()) == 0){
kieftea 6:d71e30291a62 282 wait_ms(5);
kieftea 6:d71e30291a62 283 send("R");//send "RE\n" for recieved
kieftea 6:d71e30291a62 284 red = 0;
kieftea 6:d71e30291a62 285 blue = 1;
kieftea 6:d71e30291a62 286 green = 1;
kieftea 6:d71e30291a62 287 send((*INPUTS).getParameters());//send data to DCM
kieftea 6:d71e30291a62 288 } else if (strcmp(check.c_str(),egramTog.c_str()) == 0){
kieftea 6:d71e30291a62 289 wait_ms(5);
kieftea 6:d71e30291a62 290 send("R");//send "RE\n" for recieved
kieftea 6:d71e30291a62 291 red = 1;
kieftea 6:d71e30291a62 292 blue = 0;
kieftea 6:d71e30291a62 293 green = 1;
kieftea 6:d71e30291a62 294 //toggle egram variable to start or stop sending
kieftea 6:d71e30291a62 295 } else if (strcmp(check.c_str(),transmit.c_str()) == 0){
kieftea 6:d71e30291a62 296 wait_ms(5);
kieftea 6:d71e30291a62 297 send("R");//send "RE\n" for recieved
kieftea 6:d71e30291a62 298 red = 1;
kieftea 6:d71e30291a62 299 blue = 1;
kieftea 6:d71e30291a62 300 green = 0;
kieftea 6:d71e30291a62 301 (*INPUTS).setParameters(recieve());//recieve data from DCM
kieftea 6:d71e30291a62 302 } else {
kieftea 6:d71e30291a62 303 wait_ms(5);
kieftea 6:d71e30291a62 304 send("N");//send "NR\n" for not recieved
kieftea 6:d71e30291a62 305 red = 0;
kieftea 6:d71e30291a62 306 blue = 0;
kieftea 6:d71e30291a62 307 green = 0;
kieftea 6:d71e30291a62 308 }
kieftea 6:d71e30291a62 309 }