![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Pacemaker code Implementation for SFWRENG 3K04
Dependencies: mbed Queue mbed-rtos FXOS8700Q
Fork of Pacemaker by
SWFRENG 3K04 Project to design, develop, and document a functional pacemaker.
The project uses the Freescale K64F Microcontroller and C++ mbed library.
pulse.cpp@36:b6431cd8ecd6, 2016-12-18 (annotated)
- Committer:
- noahzwiep
- Date:
- Sun Dec 18 02:29:59 2016 +0000
- Revision:
- 36:b6431cd8ecd6
- Parent:
- 34:701503855d52
All ogre.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
noahzwiep | 32:69cd1390bc21 | 1 | #pragma once |
noahzwiep | 32:69cd1390bc21 | 2 | #include "mbed.h" |
noahzwiep | 32:69cd1390bc21 | 3 | #include "pulse.h" |
noahzwiep | 36:b6431cd8ecd6 | 4 | #include "rtos.h" |
noahzwiep | 32:69cd1390bc21 | 5 | |
FiveDollar | 0:b2b3955cd77b | 6 | #pragma once |
FiveDollar | 0:b2b3955cd77b | 7 | #include "mbed.h" |
FiveDollar | 0:b2b3955cd77b | 8 | #include "pulse.h" |
FiveDollar | 0:b2b3955cd77b | 9 | |
noahzwiep | 32:69cd1390bc21 | 10 | pulse::pulse(): |
noahzwiep | 32:69cd1390bc21 | 11 | atrialIn(A0), // Pin A0 |
noahzwiep | 32:69cd1390bc21 | 12 | ventricleIn(A1), // Pin A1 |
noahzwiep | 32:69cd1390bc21 | 13 | leadImpedence(A2), // Pin A2 |
noahzwiep | 32:69cd1390bc21 | 14 | atr_rect_signal(A3), // Pin A3 |
noahzwiep | 32:69cd1390bc21 | 15 | vent_rect_signal(A4), // Pin A4 |
noahzwiep | 32:69cd1390bc21 | 16 | |
noahzwiep | 32:69cd1390bc21 | 17 | /*=== Digital In ===*/ |
noahzwiep | 32:69cd1390bc21 | 18 | atria_cmp_detect(PTC16), // Pin D0 |
noahzwiep | 32:69cd1390bc21 | 19 | vent_cmp_detect(PTC17), // Pin D1 |
noahzwiep | 32:69cd1390bc21 | 20 | |
noahzwiep | 32:69cd1390bc21 | 21 | /*=== PWM Out ===*/ |
noahzwiep | 32:69cd1390bc21 | 22 | /* is used for the REF Signal |
noahzwiep | 32:69cd1390bc21 | 23 | * due to absence of PWM capabilities of Pins D2 and D4 |
noahzwiep | 32:69cd1390bc21 | 24 | * on the FRDM-K64F Board |
noahzwiep | 32:69cd1390bc21 | 25 | */ |
noahzwiep | 36:b6431cd8ecd6 | 26 | pacing_ref_pwm(PTA1), // Pin D2 (PTB9) |
noahzwiep | 36:b6431cd8ecd6 | 27 | vent_ref_pwm(PTB9), // Pin D3 |
noahzwiep | 32:69cd1390bc21 | 28 | atria_ref_pwm(PTB23), // Pin D4 |
noahzwiep | 32:69cd1390bc21 | 29 | |
noahzwiep | 32:69cd1390bc21 | 30 | |
noahzwiep | 32:69cd1390bc21 | 31 | /*=== Digital Out ===*/ |
noahzwiep | 32:69cd1390bc21 | 32 | pace_charge_ctrl(PTA2), // Pin D5 |
noahzwiep | 32:69cd1390bc21 | 33 | z_atria_ctrl(PTC2), // Pin D6 |
noahzwiep | 32:69cd1390bc21 | 34 | z_vent_ctrl(PTC3), // Pin D7 |
noahzwiep | 32:69cd1390bc21 | 35 | |
noahzwiep | 32:69cd1390bc21 | 36 | atr_pace_ctrl(PTC12), // Pin D8 |
noahzwiep | 32:69cd1390bc21 | 37 | vent_pace_ctrl(PTC4), // Pin D9 |
noahzwiep | 32:69cd1390bc21 | 38 | pace_grnd_ctrl(PTD0), // Pin D10 |
noahzwiep | 32:69cd1390bc21 | 39 | atr_grnd_ctrl(PTD2), // Pin D11 |
noahzwiep | 32:69cd1390bc21 | 40 | vent_grnd_ctrl(PTD3), // Pin D12 |
noahzwiep | 32:69cd1390bc21 | 41 | frontend_ctrl(PTD1) // Pin D13 |
noahzwiep | 32:69cd1390bc21 | 42 | {} |
FiveDollar | 0:b2b3955cd77b | 43 | |
noahzwiep | 32:69cd1390bc21 | 44 | pulse::pulse(chamberData* chamber, hardware* IOpins):/*=== Analog In ===*/ |
noahzwiep | 32:69cd1390bc21 | 45 | atrialIn(A0), // Pin A0 |
noahzwiep | 32:69cd1390bc21 | 46 | ventricleIn(A1), // Pin A1 |
noahzwiep | 32:69cd1390bc21 | 47 | leadImpedence(A2), // Pin A2 |
noahzwiep | 32:69cd1390bc21 | 48 | atr_rect_signal(A3), // Pin A3 |
noahzwiep | 32:69cd1390bc21 | 49 | vent_rect_signal(A4), // Pin A4 |
noahzwiep | 32:69cd1390bc21 | 50 | |
noahzwiep | 32:69cd1390bc21 | 51 | /*=== Digital In ===*/ |
noahzwiep | 32:69cd1390bc21 | 52 | atria_cmp_detect(PTC16), // Pin D0 |
noahzwiep | 32:69cd1390bc21 | 53 | vent_cmp_detect(PTC17), // Pin D1 |
noahzwiep | 32:69cd1390bc21 | 54 | |
noahzwiep | 32:69cd1390bc21 | 55 | /*=== PWM Out ===*/ |
noahzwiep | 32:69cd1390bc21 | 56 | /* is used for the REF Signal |
noahzwiep | 32:69cd1390bc21 | 57 | * due to absence of PWM capabilities of Pins D2 and D4 |
noahzwiep | 32:69cd1390bc21 | 58 | * on the FRDM-K64F Board |
noahzwiep | 32:69cd1390bc21 | 59 | */ |
noahzwiep | 36:b6431cd8ecd6 | 60 | pacing_ref_pwm(PTA1), // Pin D2 (PTB9) |
noahzwiep | 36:b6431cd8ecd6 | 61 | vent_ref_pwm(PTB9), // Pin D3 |
noahzwiep | 32:69cd1390bc21 | 62 | atria_ref_pwm(PTB23), // Pin D4 |
noahzwiep | 32:69cd1390bc21 | 63 | |
noahzwiep | 32:69cd1390bc21 | 64 | |
noahzwiep | 32:69cd1390bc21 | 65 | /*=== Digital Out ===*/ |
noahzwiep | 32:69cd1390bc21 | 66 | pace_charge_ctrl(PTA2), // Pin D5 |
noahzwiep | 32:69cd1390bc21 | 67 | z_atria_ctrl(PTC2), // Pin D6 |
noahzwiep | 32:69cd1390bc21 | 68 | z_vent_ctrl(PTC3), // Pin D7 |
noahzwiep | 32:69cd1390bc21 | 69 | |
noahzwiep | 32:69cd1390bc21 | 70 | atr_pace_ctrl(PTC12), // Pin D8 |
noahzwiep | 32:69cd1390bc21 | 71 | vent_pace_ctrl(PTC4), // Pin D9 |
noahzwiep | 32:69cd1390bc21 | 72 | pace_grnd_ctrl(PTD0), // Pin D10 |
noahzwiep | 32:69cd1390bc21 | 73 | atr_grnd_ctrl(PTD2), // Pin D11 |
noahzwiep | 32:69cd1390bc21 | 74 | vent_grnd_ctrl(PTD3), // Pin D12 |
noahzwiep | 32:69cd1390bc21 | 75 | frontend_ctrl(PTD1) // Pin D13 |
noahzwiep | 32:69cd1390bc21 | 76 | { |
FiveDollar | 0:b2b3955cd77b | 77 | myIOpins = IOpins; |
FiveDollar | 0:b2b3955cd77b | 78 | myChamber = chamber; |
FiveDollar | 2:fbba2687ddfe | 79 | // myPaceWidth = 0; //mSec, width of ventricular pace |
FiveDollar | 0:b2b3955cd77b | 80 | // myPaceAmp = 0; //mV, amplitude of ventricular pace |
FiveDollar | 0:b2b3955cd77b | 81 | // myRP = 0; //mSec, duration of refractory period |
FiveDollar | 0:b2b3955cd77b | 82 | // p_hysteresisInterval = 0; |
FiveDollar | 0:b2b3955cd77b | 83 | // p_lowrateInterval = 0; |
FiveDollar | 0:b2b3955cd77b | 84 | // p_hysteresis = false; |
FiveDollar | 0:b2b3955cd77b | 85 | |
FiveDollar | 0:b2b3955cd77b | 86 | } |
FiveDollar | 0:b2b3955cd77b | 87 | |
FiveDollar | 0:b2b3955cd77b | 88 | pulse::~pulse(){ |
FiveDollar | 0:b2b3955cd77b | 89 | delete myChamber; |
FiveDollar | 0:b2b3955cd77b | 90 | delete myIOpins; |
FiveDollar | 0:b2b3955cd77b | 91 | delete pc; |
FiveDollar | 0:b2b3955cd77b | 92 | delete aOut; |
FiveDollar | 0:b2b3955cd77b | 93 | } |
FiveDollar | 0:b2b3955cd77b | 94 | |
trane3 | 21:fc6c33206152 | 95 | //void pulse::setChamber(chamberData* c){ |
trane3 | 21:fc6c33206152 | 96 | // myChamber = c; |
trane3 | 21:fc6c33206152 | 97 | // } |
trane3 | 8:75c1dd8b0d61 | 98 | |
noahzwiep | 32:69cd1390bc21 | 99 | void pulse::pace_charge_shutdown() { |
noahzwiep | 32:69cd1390bc21 | 100 | /* Stage 1: Switch-OFF/Ground-ON */ |
noahzwiep | 32:69cd1390bc21 | 101 | atr_pace_ctrl.write(0); |
noahzwiep | 33:686a1a0c690f | 102 | vent_pace_ctrl.write(0); |
noahzwiep | 33:686a1a0c690f | 103 | atr_grnd_ctrl .write(1); |
noahzwiep | 33:686a1a0c690f | 104 | vent_grnd_ctrl.write(1); |
noahzwiep | 36:b6431cd8ecd6 | 105 | Thread::wait(50); |
noahzwiep | 32:69cd1390bc21 | 106 | |
noahzwiep | 32:69cd1390bc21 | 107 | |
noahzwiep | 32:69cd1390bc21 | 108 | /* Stage 2: Ref PWM LOW */ |
noahzwiep | 33:686a1a0c690f | 109 | pacing_ref_pwm.write(0); |
noahzwiep | 36:b6431cd8ecd6 | 110 | Thread::wait(100); |
noahzwiep | 32:69cd1390bc21 | 111 | |
noahzwiep | 32:69cd1390bc21 | 112 | /* Stage 3: Charge CTRL off */ |
noahzwiep | 33:686a1a0c690f | 113 | pace_charge_ctrl.write(0); |
noahzwiep | 36:b6431cd8ecd6 | 114 | Thread::wait(10); |
noahzwiep | 32:69cd1390bc21 | 115 | |
noahzwiep | 32:69cd1390bc21 | 116 | /* Stage 4: Ground OFF */ |
noahzwiep | 34:701503855d52 | 117 | atr_grnd_ctrl.write(0); |
noahzwiep | 33:686a1a0c690f | 118 | vent_grnd_ctrl.write(0); |
noahzwiep | 32:69cd1390bc21 | 119 | } |
noahzwiep | 32:69cd1390bc21 | 120 | |
noahzwiep | 32:69cd1390bc21 | 121 | void pulse::vent_pace_prime() { |
noahzwiep | 32:69cd1390bc21 | 122 | /* Redundant code to close ground switches, |
noahzwiep | 32:69cd1390bc21 | 123 | * prevents accidentally shorting the pacemaker |
noahzwiep | 32:69cd1390bc21 | 124 | */ |
noahzwiep | 33:686a1a0c690f | 125 | atr_grnd_ctrl .write(0); |
noahzwiep | 33:686a1a0c690f | 126 | vent_grnd_ctrl.write(0); |
noahzwiep | 32:69cd1390bc21 | 127 | |
noahzwiep | 32:69cd1390bc21 | 128 | /* Stage 1: Ref PWM On */ |
noahzwiep | 33:686a1a0c690f | 129 | pacing_ref_pwm.write(myChamber->getPaceAmp()); |
noahzwiep | 36:b6431cd8ecd6 | 130 | Thread::wait(10); |
noahzwiep | 32:69cd1390bc21 | 131 | |
noahzwiep | 32:69cd1390bc21 | 132 | /* Stage 2: Charge CTRL on */ |
noahzwiep | 33:686a1a0c690f | 133 | pace_charge_ctrl.write(1); |
noahzwiep | 36:b6431cd8ecd6 | 134 | Thread::wait(10); |
noahzwiep | 32:69cd1390bc21 | 135 | } |
noahzwiep | 32:69cd1390bc21 | 136 | |
noahzwiep | 32:69cd1390bc21 | 137 | void pulse::atr_pace_prime() { |
noahzwiep | 32:69cd1390bc21 | 138 | /* Redundant code to close ground switches, |
noahzwiep | 32:69cd1390bc21 | 139 | * prevents accidentally shorting the pacemaker |
noahzwiep | 32:69cd1390bc21 | 140 | */ |
noahzwiep | 33:686a1a0c690f | 141 | atr_grnd_ctrl .write(0); |
noahzwiep | 33:686a1a0c690f | 142 | vent_grnd_ctrl.write(0); |
noahzwiep | 32:69cd1390bc21 | 143 | |
noahzwiep | 32:69cd1390bc21 | 144 | /* Stage 4: Ref PWM On */ |
noahzwiep | 33:686a1a0c690f | 145 | pacing_ref_pwm.write(myChamber->getPaceAmp()); |
noahzwiep | 36:b6431cd8ecd6 | 146 | Thread::wait(10); |
noahzwiep | 32:69cd1390bc21 | 147 | |
noahzwiep | 32:69cd1390bc21 | 148 | /* Stage 5: Charge CTRL on */ |
noahzwiep | 33:686a1a0c690f | 149 | pace_charge_ctrl.write(1); |
noahzwiep | 36:b6431cd8ecd6 | 150 | Thread::wait(10); |
noahzwiep | 32:69cd1390bc21 | 151 | } |
noahzwiep | 32:69cd1390bc21 | 152 | |
noahzwiep | 32:69cd1390bc21 | 153 | void pulse::pace_vent(double pulse_width_us) { |
noahzwiep | 32:69cd1390bc21 | 154 | vent_pace_prime(); |
noahzwiep | 32:69cd1390bc21 | 155 | |
noahzwiep | 32:69cd1390bc21 | 156 | // Begin Pace Event Output |
noahzwiep | 33:686a1a0c690f | 157 | vent_pace_ctrl.write(1); |
noahzwiep | 32:69cd1390bc21 | 158 | |
noahzwiep | 32:69cd1390bc21 | 159 | // Pace Duration |
noahzwiep | 34:701503855d52 | 160 | wait(pulse_width_us); |
noahzwiep | 32:69cd1390bc21 | 161 | |
noahzwiep | 32:69cd1390bc21 | 162 | // Shut off Pace |
noahzwiep | 33:686a1a0c690f | 163 | vent_pace_ctrl.write(0); |
noahzwiep | 32:69cd1390bc21 | 164 | |
noahzwiep | 32:69cd1390bc21 | 165 | pace_charge_shutdown (); |
noahzwiep | 32:69cd1390bc21 | 166 | } |
noahzwiep | 32:69cd1390bc21 | 167 | |
noahzwiep | 32:69cd1390bc21 | 168 | void pulse::pace_atr(double pulse_width_us) { |
noahzwiep | 32:69cd1390bc21 | 169 | atr_pace_prime(); |
noahzwiep | 32:69cd1390bc21 | 170 | |
noahzwiep | 32:69cd1390bc21 | 171 | // Begin Pace Event Output |
noahzwiep | 34:701503855d52 | 172 | atr_pace_ctrl.write(1); |
noahzwiep | 32:69cd1390bc21 | 173 | |
noahzwiep | 32:69cd1390bc21 | 174 | // Pace Duration |
noahzwiep | 34:701503855d52 | 175 | wait(pulse_width_us); |
noahzwiep | 32:69cd1390bc21 | 176 | |
noahzwiep | 32:69cd1390bc21 | 177 | // Shut off Pace |
noahzwiep | 33:686a1a0c690f | 178 | atr_pace_ctrl.write(0); |
noahzwiep | 32:69cd1390bc21 | 179 | |
noahzwiep | 32:69cd1390bc21 | 180 | pace_charge_shutdown (); |
noahzwiep | 32:69cd1390bc21 | 181 | } |
noahzwiep | 32:69cd1390bc21 | 182 | |
FiveDollar | 0:b2b3955cd77b | 183 | |
FiveDollar | 0:b2b3955cd77b | 184 | void pulse::startPulse(){ |
noahzwiep | 32:69cd1390bc21 | 185 | pulse::pace_charge_shutdown(); |
noahzwiep | 32:69cd1390bc21 | 186 | char a = myChamber->getChamberType(); |
noahzwiep | 33:686a1a0c690f | 187 | if(a == 'a'){ |
noahzwiep | 34:701503855d52 | 188 | pulse::pace_atr(myChamber->getPaceWidth()); |
noahzwiep | 32:69cd1390bc21 | 189 | } |
noahzwiep | 32:69cd1390bc21 | 190 | else{ |
noahzwiep | 32:69cd1390bc21 | 191 | pulse::pace_vent(myChamber->getPaceWidth()); |
noahzwiep | 33:686a1a0c690f | 192 | } |
FiveDollar | 0:b2b3955cd77b | 193 | } |
FiveDollar | 0:b2b3955cd77b | 194 |