Pacemaker code Implementation for SFWRENG 3K04

Dependencies:   mbed Queue mbed-rtos FXOS8700Q

Fork of Pacemaker by Eric dollar

SWFRENG 3K04 Project to design, develop, and document a functional pacemaker.

The project uses the Freescale K64F Microcontroller and C++ mbed library.

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?

UserRevisionLine numberNew 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