3K04 Project / Mbed 2 deprecated Pacemaker

Dependencies:   mbed-rtos mbed

Committer:
kieftea
Date:
Fri Dec 02 19:15:25 2016 +0000
Revision:
2:4fb5a8d15f9c
Parent:
1:8f545f45d899
Update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kieftea 0:00669618559e 1 #include "pinmap.h"
kieftea 0:00669618559e 2 #include "parameters.h"
kieftea 0:00669618559e 3 #include "pulsegenerator.h"
kieftea 0:00669618559e 4 #include "rtos.h"
kieftea 2:4fb5a8d15f9c 5 #include "motion.h"
kieftea 0:00669618559e 6
kieftea 0:00669618559e 7
kieftea 0:00669618559e 8
kieftea 0:00669618559e 9 modes currentMode=VOO;
kieftea 0:00669618559e 10 modes nextMode=VOO;
kieftea 0:00669618559e 11
kieftea 0:00669618559e 12 void timer_thread ();
kieftea 0:00669618559e 13 void pace_controller ();
kieftea 0:00669618559e 14
kieftea 0:00669618559e 15 /*=== RTOS Required Components ===*/
kieftea 0:00669618559e 16 Thread paceThread(osPriorityNormal);
kieftea 0:00669618559e 17 Thread timerThread(osPriorityNormal);
kieftea 0:00669618559e 18
kieftea 0:00669618559e 19 uint32_t pace_period_ms;
kieftea 1:8f545f45d899 20 uint32_t next_pace_period_ms;
kieftea 0:00669618559e 21
kieftea 0:00669618559e 22
kieftea 0:00669618559e 23 uint8_t initialized = 0;
kieftea 0:00669618559e 24
kieftea 0:00669618559e 25 /******************************************
kieftea 0:00669618559e 26 *
kieftea 0:00669618559e 27 * Pacing Mode Functions
kieftea 0:00669618559e 28 *
kieftea 0:00669618559e 29 ******************************************/
kieftea 0:00669618559e 30
kieftea 0:00669618559e 31 modes set_pacing_mode (modes newMode) {
kieftea 0:00669618559e 32 nextMode = newMode;
kieftea 0:00669618559e 33 return currentMode;
kieftea 0:00669618559e 34 }
kieftea 0:00669618559e 35
kieftea 2:4fb5a8d15f9c 36 uint32_t set_pace_period_ms(uint32_t new_pace_period_ms){
kieftea 1:8f545f45d899 37 next_pace_period_ms = new_pace_period_ms;
kieftea 1:8f545f45d899 38 return pace_period_ms;
kieftea 1:8f545f45d899 39 }
kieftea 1:8f545f45d899 40
kieftea 0:00669618559e 41 /*
kieftea 0:00669618559e 42 Deactivates both pacing circuits
kieftea 0:00669618559e 43 Cancels any existing pace event
kieftea 0:00669618559e 44 */
kieftea 0:00669618559e 45 void pace_charge_shutdown () {
kieftea 0:00669618559e 46 /* Stage 1: Switch-OFF/Ground-ON */
kieftea 0:00669618559e 47 atr_pace_ctrl = LOW;
kieftea 0:00669618559e 48 vent_pace_ctrl = LOW;
kieftea 0:00669618559e 49 atr_grnd_ctrl = HIGH;
kieftea 0:00669618559e 50 vent_grnd_ctrl = HIGH;
kieftea 0:00669618559e 51 wait_ms(50);
kieftea 0:00669618559e 52
kieftea 0:00669618559e 53
kieftea 0:00669618559e 54 /* Stage 2: Ref PWM LOW */
kieftea 0:00669618559e 55 pacing_ref_pwm = LOW;
kieftea 0:00669618559e 56 wait_ms(100);
kieftea 0:00669618559e 57
kieftea 0:00669618559e 58 /* Stage 3: Charge CTRL off */
kieftea 0:00669618559e 59 pace_charge_ctrl = LOW;
kieftea 0:00669618559e 60 wait_ms(10);
kieftea 0:00669618559e 61
kieftea 0:00669618559e 62 /* Stage 4: Ground OFF */
kieftea 0:00669618559e 63 atr_grnd_ctrl = LOW;
kieftea 0:00669618559e 64 vent_grnd_ctrl = LOW;
kieftea 0:00669618559e 65 }
kieftea 0:00669618559e 66
kieftea 0:00669618559e 67 void pulsegenerator_initialize () {
kieftea 0:00669618559e 68 if (initialized) return;
kieftea 0:00669618559e 69 pace_charge_shutdown ();
kieftea 0:00669618559e 70 initialized = 1;
kieftea 0:00669618559e 71 }
kieftea 0:00669618559e 72
kieftea 0:00669618559e 73 /*
kieftea 0:00669618559e 74 Prep the circuit for Ventricle Pace Event
kieftea 0:00669618559e 75 */
kieftea 0:00669618559e 76 void vent_pace_prime () {
kieftea 0:00669618559e 77 /* Redundant code to close ground switches,
kieftea 0:00669618559e 78 * prevents accidentally shorting the pacemaker
kieftea 0:00669618559e 79 */
kieftea 0:00669618559e 80 atr_grnd_ctrl = LOW;
kieftea 0:00669618559e 81 vent_grnd_ctrl = LOW;
kieftea 0:00669618559e 82
kieftea 0:00669618559e 83 /* Stage 1: Ref PWM On */
kieftea 0:00669618559e 84 pacing_ref_pwm = HIGH;
kieftea 0:00669618559e 85 wait_ms(10);
kieftea 0:00669618559e 86
kieftea 0:00669618559e 87 /* Stage 2: Charge CTRL on */
kieftea 0:00669618559e 88 pace_charge_ctrl = HIGH;
kieftea 0:00669618559e 89 wait_ms(10);
kieftea 0:00669618559e 90 }
kieftea 0:00669618559e 91
kieftea 0:00669618559e 92 /*
kieftea 0:00669618559e 93 Prep the circuit for Atrium Pace Event
kieftea 0:00669618559e 94 */
kieftea 0:00669618559e 95 void atr_pace_prime () {
kieftea 0:00669618559e 96 /* Redundant code to close ground switches,
kieftea 0:00669618559e 97 * prevents accidentally shorting the pacemaker
kieftea 0:00669618559e 98 */
kieftea 0:00669618559e 99 atr_grnd_ctrl = LOW;
kieftea 0:00669618559e 100 vent_grnd_ctrl = LOW;
kieftea 0:00669618559e 101
kieftea 0:00669618559e 102 /* Stage 4: Ref PWM On */
kieftea 0:00669618559e 103 pacing_ref_pwm = HIGH;
kieftea 0:00669618559e 104 wait_ms(10);
kieftea 0:00669618559e 105
kieftea 0:00669618559e 106 /* Stage 5: Charge CTRL on */
kieftea 0:00669618559e 107 pace_charge_ctrl = HIGH;
kieftea 0:00669618559e 108 wait_ms(10);
kieftea 0:00669618559e 109 }
kieftea 0:00669618559e 110
kieftea 0:00669618559e 111 void pace_vent (uint16_t pulse_width_us) {
kieftea 0:00669618559e 112 vent_pace_prime();
kieftea 0:00669618559e 113
kieftea 0:00669618559e 114 // Begin Pace Event Output
kieftea 0:00669618559e 115 vent_pace_ctrl = HIGH;
kieftea 0:00669618559e 116
kieftea 0:00669618559e 117 // Pace Duration
kieftea 0:00669618559e 118 wait_us(pulse_width_us);
kieftea 0:00669618559e 119
kieftea 0:00669618559e 120 // Shut off Pace
kieftea 0:00669618559e 121 vent_pace_ctrl = LOW;
kieftea 0:00669618559e 122
kieftea 0:00669618559e 123 pace_charge_shutdown ();
kieftea 0:00669618559e 124 }
kieftea 0:00669618559e 125
kieftea 0:00669618559e 126 void pace_atr (uint16_t pulse_width_us) {
kieftea 0:00669618559e 127 atr_pace_prime();
kieftea 0:00669618559e 128
kieftea 0:00669618559e 129 // Begin Pace Event Output
kieftea 0:00669618559e 130 atr_pace_ctrl = HIGH;
kieftea 0:00669618559e 131
kieftea 0:00669618559e 132 // Pace Duration
kieftea 0:00669618559e 133 wait_us(pulse_width_us);
kieftea 0:00669618559e 134
kieftea 0:00669618559e 135 // Shut off Pace
kieftea 0:00669618559e 136 atr_pace_ctrl = LOW;
kieftea 0:00669618559e 137
kieftea 0:00669618559e 138 pace_charge_shutdown ();
kieftea 0:00669618559e 139 }
kieftea 0:00669618559e 140
kieftea 0:00669618559e 141 void pace_VOO () {
kieftea 0:00669618559e 142 pace_vent (get_vent_pulse_width_us());
kieftea 0:00669618559e 143 }
kieftea 0:00669618559e 144
kieftea 0:00669618559e 145 void pace_AOO () {
kieftea 0:00669618559e 146 pace_atr (get_atr_pulse_width_us());
kieftea 0:00669618559e 147 }
kieftea 0:00669618559e 148
kieftea 0:00669618559e 149 void pace_VOOR() {
kieftea 1:8f545f45d899 150 if(isMotionThresholdExceeded()){
kieftea 2:4fb5a8d15f9c 151 //set_vent_pulse_width_us();//pace faster
kieftea 1:8f545f45d899 152 pace_VOO();
kieftea 1:8f545f45d899 153 resetMotionDetection();
kieftea 1:8f545f45d899 154 }
kieftea 1:8f545f45d899 155 else {
kieftea 2:4fb5a8d15f9c 156 //set_vent_pulse_width_us();//pace with previous value
kieftea 2:4fb5a8d15f9c 157 }
kieftea 0:00669618559e 158 }
kieftea 0:00669618559e 159
kieftea 0:00669618559e 160 void begin_pace () {
kieftea 0:00669618559e 161 if (!initialized) pulsegenerator_initialize ();
kieftea 0:00669618559e 162 pace_period_ms = get_lower_rate_limit_period_ms();
kieftea 0:00669618559e 163
kieftea 0:00669618559e 164 paceThread.start(pace_controller);
kieftea 0:00669618559e 165 timerThread.start(timer_thread);
kieftea 0:00669618559e 166 }
kieftea 0:00669618559e 167
kieftea 0:00669618559e 168 void timer_thread () {
kieftea 0:00669618559e 169 while (true) {
kieftea 0:00669618559e 170 paceThread.signal_set(0x4);
kieftea 0:00669618559e 171
kieftea 2:4fb5a8d15f9c 172 wait_ms(pace_period_ms - 180); //delay for every pace call
kieftea 0:00669618559e 173 }
kieftea 0:00669618559e 174 }
kieftea 0:00669618559e 175
kieftea 0:00669618559e 176 void pace_controller () {
kieftea 0:00669618559e 177 while(true) {
kieftea 0:00669618559e 178 Thread::signal_wait(0x0, osWaitForever); //Sleep until next cycle
kieftea 0:00669618559e 179
kieftea 0:00669618559e 180 switch (currentMode) {
kieftea 0:00669618559e 181 case VOO : pace_VOO(); break;
kieftea 0:00669618559e 182 case VOOR : pace_VOOR(); break;
kieftea 0:00669618559e 183 case AOO : pace_AOO(); break;
kieftea 0:00669618559e 184 default : pace_VOO(); break;
kieftea 0:00669618559e 185 }
kieftea 0:00669618559e 186 }
kieftea 0:00669618559e 187 }