Final

Dependencies:   TextLCD UPennEMBS keypad mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
jatinsha
Date:
Thu Dec 04 10:46:07 2014 +0000
Commit message:
Final

Changed in this revision

TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
UPennEMBS.lib Show annotated file Show diff for this revision Revisions of this file
keypad.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Thu Dec 04 10:46:07 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#308d188a2d3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UPennEMBS.lib	Thu Dec 04 10:46:07 2014 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/Samarth-Shah/code/UPennEMBS/#763945466b4e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/keypad.lib	Thu Dec 04 10:46:07 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/yoonghm/code/keypad/#da060f8c03e8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Dec 04 10:46:07 2014 +0000
@@ -0,0 +1,294 @@
+/* 
+        CIS541: Embedded Systems for Life Critical Applications
+        Project: Pacemaker modelling
+*/
+
+/* Header files */
+#include "mbed.h"
+#include "rtos.h"
+#include "CardiacPacemaker.h"
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* Global variables */
+
+// Mode-Threads pointers
+Thread *threadListening;
+Thread *threadLogicTiming;
+Thread *threadPacing;
+Thread *threadKeyboard;
+
+Timer timerPrimary;
+Timer timerSecondary;
+// keypad state
+// Define your own keypad values
+
+
+void ThreadListeningPace(void const *args)
+{
+    while(1)
+    {
+        SenseMutex.lock();
+        if(Asense==1)
+        {
+            ReceivedASense();
+            flagA = 1;
+            threadLogicTiming->signal_set(0x1);
+        }
+        if(Vsense==1)
+        {
+            ReceivedVSense();
+            flagV = 1;
+            threadLogicTiming->signal_set(0x1);
+        }
+        SenseMutex.unlock();
+    }
+}
+
+void ThreadLogicTiming(void const *args)
+{
+    while(1)
+    {
+    //flagV==0 && timerPrimary.read_ms() >= LRI
+    while(timerPrimary.read_ms() < PVARP)
+    {
+        // Post Ventricular Atrium Refractory Period
+        // Ignore Asense or Vsense here
+        //pc.puts("|==----(PVARP)|-----------------------------(LRI-AVI)|\n");
+        //pc.puts("PVAB period\n");
+        
+        if(flagA == 1)
+        {
+            pc.puts("Early: Reject\n");
+            flagA = 0;
+        }
+        
+    }
+    while(timerPrimary.read_ms() >= PVARP && timerPrimary.read_ms() < (LRI-AVI))
+    {
+        // Normal Asense period
+        //pc.puts("|======(PVARP)|=====----------(tAs+AVI)|----(LRI-AVI)|\n");
+        //pc.puts("Normal Asense period\n");
+        if(flagA == 1)
+        {
+            // Acknowledge reception of Asense
+            pc.puts("Normal:Asense\n");
+            SendAPace();
+            flag1 = 1;
+            flagA = 0;
+            //pc.puts("|======(PVARP)|=====(As)=-------(tAs+AVI)|----(LRI-AVI)\n");
+            break;   
+        }
+    }
+    if(timerPrimary.read_ms() > (LRI-AVI) )
+    {
+        // Asense period exhausted pacemaker needs to Apace the heart
+        if(flag1==0)
+        {
+            SendAPace(); //Forced Atrium Pulse reffering to the below if loop
+        }
+        else
+        {
+            flag1 = 0;
+        }
+        if(flagA == 1)
+        {
+            pc.puts("Late: Rejected\n");
+            flagA = 0;  //just to cleanup for next cycle
+        }
+        //pc.puts("|======(PVARP)|================================(Ap)(LRI-AVI)|\n");
+        // look for Vsense
+        while(timerPrimary.read_ms() < (LRI-AVI)+PVAB)
+        {
+            // This is Post Atrium Ventricular Blanking period
+            // No Vsense should be here
+            // Ignore any V here
+        }
+        while(timerPrimary.read_ms() >= (LRI-AVI)+PVAB && timerPrimary.read_ms() < (LRI-AVI)+VSP)
+        {
+            // This is Ventricular _______ period
+            // Vsense here would be prematuare and needs to be sent at the end of the period as mature
+            // Receive and matuare any V here
+            if(flagV == 1)
+            {
+                pc.puts("Unmatured:Converted into matuared\n");
+                //ReceivedVSense(); //pre-mature
+                while(timerPrimary.read_ms() < (LRI-AVI)+VSP); //maturing it
+                flagV = 0;
+                SendVPace();    //matuared
+                //LEDTest = 0;
+                //pc.puts("|======(PVARP)|================================(Ap)(LRI-AVI)|===(Vsp)===(Vpm)(tVSP)\n");
+            }
+        }
+        while(timerPrimary.read_ms() >= (LRI-AVI)+VSP && timerPrimary.read_ms() < LRI)
+        {
+            // This is normal period for Vsense 
+            // Vsense here would be matuare 
+            if(flagV == 1)
+            {
+                pc.puts("Matuared:\n");
+                ReceivedVSense(); //mature
+                SendVPace();
+                flagV = 0;
+                flag2=1;
+                //pc.puts("|======(PVARP)|================================(Ap)(LRI-AVI)|============(Vsm)(tVSP)\n");
+                break;
+            }
+        }
+        if(timerPrimary.read_ms() > LRI)
+        {
+            // Waiting time for Vsense exhausted
+            // Pacemaker needs to generate Vpace now
+            // send Vpace and reset timers
+            if(flag2==0)
+            {
+                SendVPace(); //Forced ventricle Pulse reffering to the below if loop
+            }
+            else
+            {
+                flag2 = 0;
+            }
+            //pc.puts("|======(PVARP)|================================(Ap)(LRI-AVI)|=======================(Vp)(LRI)\n");
+            timerPrimary.reset();   // reset for next beat interval
+            
+        }
+        else if(timerPrimary.read_ms() >= (LRI-AVI)+VSP && timerPrimary.read_ms() < LRI)
+        {
+            // matuare Vsense was received
+            // inhibit sending any Vpace
+            // Reset timers
+            
+            timerPrimary.reset();   // reset for next beat interval
+        }
+        
+    }
+    else if(timerPrimary.read_ms() < (LRI-AVI) )
+    {
+        // Asense observed within the normal period pacemaker does nothing 
+        
+        // now look for VSense witin next AVI
+        timerSecondary.start();
+        while(timerSecondary.read_ms() < AVI)
+        {
+            if(flagV == 1)
+            {
+                pc.puts("Natural Asense, Natural Vsense:\n");
+                ReceivedVSense();
+                SendVPace();
+                flag2=1;
+                flagV = 0;
+                //pc.puts("|======(PVARP)|=====(As)==(Vs)|---(tAs+AVI)|----(LRI-AVI)\n");
+                break;
+            }
+        }
+        if(timerSecondary.read_ms() >= AVI)
+        {
+            while(timerPrimary.read_ms() < URI);    // wait till URI to send Vpace
+            if(flag2==0)
+            {
+                SendVPace(); //Forced Atrium Pulse reffering to the below if loop
+            }
+            else
+            {
+                flag2 = 0;
+            }
+            //pc.puts("|======(PVARP)|=====(As)==================(Vp)(URI)|----(LRI-AVI)\n");
+        }
+        else if(timerSecondary.read_ms() < AVI) //still less than AVI
+        {
+            // This means Vsense is already observed
+            // both A and V have been managed successfully
+            // Reset timers before reinitiating the process
+            timerPrimary.reset();
+            timerSecondary.stop();
+            timerSecondary.reset();
+        }
+        
+    }
+    
+    }//while(1) ends here
+}
+
+
+
+void SetSleepMode()
+{
+    VRP = 200;
+    AVI = 200;
+    PVARP = 500;
+    VSP = 100;
+    PVAB = 100;
+    LRI = 2000;
+    URI = 1000;
+    pc.puts("\nSleep Mode.");
+}
+
+void SetExerciseMode()
+{
+    VRP = 200;
+    AVI = 200;
+    PVARP = 500;
+    VSP = 100;
+    PVAB = 100;
+    LRI = 600;
+    URI = 343;
+    pc.puts("\nExercise Mode.");
+}
+
+void SetNormalMode()
+{
+    VRP = 200;
+    AVI = 200;
+    PVARP = 500;
+    VSP = 100;
+    PVAB = 100;
+    LRI = 1500;
+    URI = 600;
+    pc.puts("\nNormal Mode.");
+}
+
+void SetObservationMode()
+{
+    pc.puts("\nEnter new observation Time (in sec): ");
+    pc.puts("\nPress 1 for 10 sec ");
+    pc.puts("\nPress 2 for 20 sec ");
+    pc.puts("\nPress 3 for 30 sec ");
+
+}
+
+void ThreadKeyboard(void const *args)
+{
+    char key;
+    while(1)
+    {
+        if(pc.readable())
+        {
+            key = pc.getc();
+            pc.putc(key);
+            
+            switch(key){
+                case 's': SetSleepMode(); break;
+                case 'x': SetExerciseMode(); break;
+                case 'n': SetNormalMode(); break;
+                case 'o': SetObservationMode(); break;
+                case '1': obsPeriod=10000; pc.puts("\nObsPeriod set to 10sec"); break;
+                case '2': obsPeriod=20000; pc.puts("\nObsPeriod set to 20sec"); break;
+                case '3': obsPeriod=30000; pc.puts("\nObsPeriod set to 30sec"); break;
+                
+            }
+        }
+    }
+}
+        
+
+int main(void)
+{  
+    setbuf(stdout,NULL);
+    threadListening = new Thread(ThreadListeningPace);
+    threadLogicTiming = new Thread(ThreadLogicTiming);
+    threadKeyboard = new Thread(ThreadKeyboard);
+    
+    timerPrimary.start();
+}
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Thu Dec 04 10:46:07 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#631c0f1008c3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Dec 04 10:46:07 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/4fc01daae5a5
\ No newline at end of file