3K04 Project / Mbed 2 deprecated Pacemaker

Dependencies:   mbed-rtos mbed

Committer:
kieftea
Date:
Thu Nov 24 16:37:00 2016 +0000
Revision:
0:00669618559e
Child:
1:8f545f45d899
From Avenue

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