3K04 Project / Mbed 2 deprecated PacemakerSerialStuff

Dependencies:   mbed-rtos mbed

Fork of Pacemaker by 3K04 Project

Committer:
kieftea
Date:
Fri Nov 25 03:44:54 2016 +0000
Revision:
1:8f545f45d899
Parent:
0:00669618559e
Child:
2:4fb5a8d15f9c
for SHANE

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