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.

Revision:
32:69cd1390bc21
Parent:
21:fc6c33206152
Child:
33:686a1a0c690f
--- a/pulse.cpp	Tue Nov 29 22:01:54 2016 +0000
+++ b/pulse.cpp	Tue Dec 06 20:57:56 2016 +0000
@@ -1,10 +1,78 @@
+#pragma once
+#include "mbed.h"
+#include "pulse.h"
+
 #pragma once
 #include "mbed.h"
 #include "pulse.h"
 
-pulse::pulse(){}
+pulse::pulse():
+atrialIn(A0),      // Pin A0
+ ventricleIn(A1),      // Pin A1
+ leadImpedence(A2),      // Pin A2
+ atr_rect_signal(A3),      // Pin A3
+ vent_rect_signal(A4),      // Pin A4
+
+/*=== Digital In ===*/
+atria_cmp_detect(PTC16),   // Pin D0
+vent_cmp_detect(PTC17),   // Pin D1
+
+/*=== PWM Out ===*/
+/*  is used for the REF Signal
+ * due to absence of PWM capabilities of Pins D2 and D4
+ * on the FRDM-K64F Board
+ */
+ pacing_ref_pwm(PTB9),    // Pin D2 (PTB9)
+ vent_ref_pwm(PTA1),    // Pin D3
+ atria_ref_pwm(PTB23),   // Pin D4
+
+
+/*=== Digital Out ===*/
+ pace_charge_ctrl(PTA2),    // Pin D5
+ z_atria_ctrl(PTC2),    // Pin D6
+ z_vent_ctrl(PTC3),    // Pin D7
+
+ atr_pace_ctrl(PTC12),  // Pin D8
+ vent_pace_ctrl(PTC4),    // Pin D9
+ pace_grnd_ctrl(PTD0),    // Pin D10
+ atr_grnd_ctrl(PTD2),    // Pin D11
+ vent_grnd_ctrl(PTD3),    // Pin D12
+ frontend_ctrl(PTD1)    // Pin D13
+ {}
     
-pulse::pulse(chamberData* chamber, hardware* IOpins){
+pulse::pulse(chamberData* chamber, hardware* IOpins):/*=== Analog In ===*/
+ atrialIn(A0),      // Pin A0
+ ventricleIn(A1),      // Pin A1
+ leadImpedence(A2),      // Pin A2
+ atr_rect_signal(A3),      // Pin A3
+ vent_rect_signal(A4),      // Pin A4
+
+/*=== Digital In ===*/
+atria_cmp_detect(PTC16),   // Pin D0
+vent_cmp_detect(PTC17),   // Pin D1
+
+/*=== PWM Out ===*/
+/*  is used for the REF Signal
+ * due to absence of PWM capabilities of Pins D2 and D4
+ * on the FRDM-K64F Board
+ */
+ pacing_ref_pwm(PTB9),    // Pin D2 (PTB9)
+ vent_ref_pwm(PTA1),    // Pin D3
+ atria_ref_pwm(PTB23),   // Pin D4
+
+
+/*=== Digital Out ===*/
+ pace_charge_ctrl(PTA2),    // Pin D5
+ z_atria_ctrl(PTC2),    // Pin D6
+ z_vent_ctrl(PTC3),    // Pin D7
+
+ atr_pace_ctrl(PTC12),  // Pin D8
+ vent_pace_ctrl(PTC4),    // Pin D9
+ pace_grnd_ctrl(PTD0),    // Pin D10
+ atr_grnd_ctrl(PTD2),    // Pin D11
+ vent_grnd_ctrl(PTD3),    // Pin D12
+ frontend_ctrl(PTD1)    // Pin D13
+{
     myIOpins = IOpins;
     myChamber = chamber;
 //    myPaceWidth = 0; //mSec, width of ventricular pace
@@ -27,18 +95,99 @@
 //    myChamber = c;
 //    }
       
+void pulse::pace_charge_shutdown() {
+    /* Stage 1: Switch-OFF/Ground-ON */
+    atr_pace_ctrl.write(0);
+    vent_pace_ctrl.write(0);;
+    atr_grnd_ctrl .write(1);;
+    vent_grnd_ctrl.write(myChamber->getPaceAmp());;
+    wait_ms(50);
+    
+
+    /* Stage 2: Ref PWM LOW */
+    pacing_ref_pwm.write(0);;
+    wait_ms(100);
+
+    /* Stage 3: Charge CTRL off */
+    pace_charge_ctrl.write(0);;
+    wait_ms(10);
+    
+    /* Stage 4: Ground OFF */
+    atr_grnd_ctrl .write(0);;
+    vent_grnd_ctrl.write(0);;
+}
+
+void pulse::vent_pace_prime() {
+    /* Redundant code to close ground switches, 
+     * prevents accidentally shorting the pacemaker
+     */ 
+    atr_grnd_ctrl .write(0);;
+    vent_grnd_ctrl.write(0);;
+    
+    /* Stage 1: Ref PWM On */
+    pacing_ref_pwm.write(myChamber->getPaceAmp());;
+    wait_ms(10);
+
+    /* Stage 2: Charge CTRL on */
+    pace_charge_ctrl.write(myChamber->getPaceAmp());;
+    wait_ms(10);
+}
+
+void pulse::atr_pace_prime() {
+    /* Redundant code to close ground switches, 
+     * prevents accidentally shorting the pacemaker
+     */ 
+    atr_grnd_ctrl .write(0);;
+    vent_grnd_ctrl.write(0);;
+    
+    /* Stage 4: Ref PWM On */
+    pacing_ref_pwm.write(myChamber->getPaceAmp());;
+    wait_ms(10);
+
+    /* Stage 5: Charge CTRL on */
+    pace_charge_ctrl.write(myChamber->getPaceAmp());;
+    wait_ms(10);
+}
+
+void pulse::pace_vent(double pulse_width_us) {
+    vent_pace_prime();
+
+    // Begin Pace Event Output
+    vent_pace_ctrl.write(myChamber->getPaceAmp());;
+    
+    // Pace Duration
+    wait(pulse_width_us);
+    
+    // Shut off Pace
+    vent_pace_ctrl.write(0);;
+    
+    pace_charge_shutdown (); 
+}
+
+void pulse::pace_atr(double pulse_width_us) {
+    atr_pace_prime();
+
+    // Begin Pace Event Output
+    atr_pace_ctrl.write(myChamber->getPaceAmp());;
+    
+    // Pace Duration
+    wait(pulse_width_us);
+    
+    // Shut off Pace
+    atr_pace_ctrl.write(0);;
+        
+    pace_charge_shutdown (); 
+}
+
 
 void pulse::startPulse(){
-   // while(true){
-        pc = myIOpins->getSerial();  
-        aOut = myIOpins->getChamber(myChamber->getChamberType());
-        aOut->write(myChamber->getPaceAmp());    
-        wait(myChamber->getPaceWidth());
-        aOut->write(0);
-        
-        pc->printf("\nPulsing...check your oscilloscope!");
-       // wait(myChamber->getPaceWidth());
-        
-       // }
+    pulse::pace_charge_shutdown();
+    char a = myChamber->getChamberType();
+    if(a = 'a'){
+        pulse::pace_vent(myChamber->getPaceWidth());
+    }
+    else{
+        pulse::pace_vent(myChamber->getPaceWidth());
+
 }
     
\ No newline at end of file