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.
Fork of Pacemaker by
pulsegenerator.cpp@1:8f545f45d899, 2016-11-25 (annotated)
- 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?
| 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 | 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 | } | 
