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.
pulsegenerator.cpp@0:00669618559e, 2016-11-24 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |