yay!

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541_Pacermaker by CIS541

Revision:
4:8e3dc7e73627
Parent:
3:2ed03f9e0042
Child:
6:a1a3e73d90f3
--- a/main.cpp	Wed Dec 02 02:27:30 2015 +0000
+++ b/main.cpp	Wed Dec 02 04:13:44 2015 +0000
@@ -1,5 +1,7 @@
-#include "main.h"
-//#include "TextLCD.h"
+#include "PacemakerLibrary.h"
+#include "TextLCD.h"
+
+TextLCD lcd(p15,p16,p17,p18,p19,p20);
 
 void incrementHeartRate() {
     heartRateMutex.lock();
@@ -8,15 +10,15 @@
 }
 
 void setVSignal(bool state) {
-    expectVMutex.lock();        
+    VMutex.lock();        
     waitVSignal = state;
-    expectVMutex.unlock();
+    VMutex.unlock();
 }
 
 void setASignal(bool state) {
-    expectAMutex.lock();        
+    AMutex.lock();        
     waitASignal = state;
-    expectAMutex.unlock();   
+    AMutex.unlock();   
 }
 
 void setTimeConstraint(int i) {
@@ -28,8 +30,36 @@
 void printToLCD() {
     displayMutex.lock();
 //    pc.printf("%04d\r\n", avgHeartRate);
-//    pc.printf("%02d\r\n", observationInterval/1000);
-//    pc.printf("%04d\r\n", (heartRateHeart*(60/sec))); 
+//    pc.printf("%02d\r\n", pacemakerIntervalInMs/1000);
+//    pc.printf("%04d\r\n", (heartRateHeart*(60/sec)));
+    lcd.cls(); 
+    lcd.locate(0,0);
+    lcd.printf("Rate: %.2f BPM", avgHeartRate);
+    lcd.locate(0,1);
+    switch(pacemakerMode)
+    {
+        default:
+        case NORMAL:
+        {
+            lcd.printf("NORMAL");
+            break;
+        }
+        case EXERCISE:
+        {
+            lcd.printf("EXERCISE");
+            break;
+        }
+        case SLEEP:
+        {
+            lcd.printf("SLEEP (ZZZ)");
+            break;
+        }
+        case MANUAL:
+        {
+            lcd.printf("MANUAL");
+            break;
+        }
+    }    
     displayMutex.unlock();
 }
 
@@ -67,7 +97,7 @@
 
 void changeMode()
 {
-    switch(paceMakerMode)
+    switch(pacemakerMode)
     {
         default:
         case NORMAL:
@@ -90,7 +120,7 @@
             break;
         }
     }    
-    modeChanged=false;
+    changePacemakerMode=false;
 }
 
 void pacemakerModeSwitch(const void *args)
@@ -98,7 +128,7 @@
     while(1)
     {
         Thread::signal_wait(signal3);
-        if(modeChanged)
+        if(changePacemakerMode)
         {
             changeMode();
         }
@@ -111,13 +141,13 @@
     {
         asenseLED=1;
         wait(0.001);
-        println("ASense Received");
+//        pc.printf("ASense Received at %d ms\r\n", globalTimer.read_ms());
         asenseLED=0; 
-        if(modeChanged)
+        if(changePacemakerMode)
         {
             (*P_PacemakerModeSwitch).signal_set(signal3);
         }
-        aSenseOccurred=true;
+        ASenseReceived=true;
         (*P_PacemakerReceive).signal_set(signal4);
     }    
 }
@@ -127,86 +157,75 @@
     if(waitVSignal)
     {
         vsenseLED=1;
-        println("VSense Received");
+//        pc.printf("VSense Received at %d ms\r\n", globalTimer.read_ms());
         wait(0.001);
         vsenseLED=0;
-        if(modeChanged)
+        if(changePacemakerMode)
         {
             (*P_PacemakerModeSwitch).signal_set(signal3);
         }
-        canPaceV=false;
-        aSenseOccurred=false;
+        waitVPace=false;
+        ASenseReceived=false;
         (*P_PacemakerReceive).signal_set(signal4);
     }
 }
 
-void timeOut(const void *args)
+void timeConstraintTimeout(const void *args)
 {
-    // check which time out has occurred
-    // generate appropriate pace signal
-    // reset timer to new value  
-    //apaceLED=1; 
     if(timeConstraint==AVI_const)
     {
-        //generate VPace
-        if(canPaceV)
+        //trigger vpace
+        if(waitVPace)
         {
-            paceA=false;
+            APace=false;
             (*P_PacemakerSend).signal_set(signal1);
         }
         else
         {
-            canPaceV=true;
+            waitVPace=true;
         }
     }
     else if(timeConstraint==PVAB_const)
     {
         setVSignal(true);
         setTimeConstraint(AVI_const);
-        timerRunning=true;
-        TimeOutTimer->start(AVI-PVAB);
+        TimeConstTimerOn=true;
+        TimeConstTimer->start(AVI-PVAB);
     }
     else if(timeConstraint==VRP_const)
     {
-        //now we can sense a Ventrival event, but not an atrial event as PVARP is not over 
-        //restart timer for PVARP
         setVSignal(true);
         setTimeConstraint(PVARP_const);;
-        timerRunning=true;
-        TimeOutTimer->start(PVARP-VRP);
+        TimeConstTimerOn=true;
+        TimeConstTimer->start(PVARP-VRP);
     }
     else if(timeConstraint==PVARP_const)
     {
-        //now we can sense Atrial events as well
         setASignal(true);
         setTimeConstraint(LRI_const);
-        timerRunning=true;
-        TimeOutTimer->start(LRI-PVARP-AVI);
+        TimeConstTimerOn=true;
+        TimeConstTimer->start(LRI-PVARP-AVI);
     }
     else if(timeConstraint==LRI_const)
     {
-        //generate APace
-        paceA=true;
+        //trigger apace
+        APace=true;
         (*P_PacemakerSend).signal_set(signal1);
     }
 }
 
-void uriTimeOut(const void *args)
+void atrialEventTimeout(const void *args)
 {
-    // uri is over 
-    //check is a vpace has to be generated; If yes then generate the pace; else enable a flag that lets the thread generate the pace
-    if(paceVPending || canPaceV)
+    if(VPaceNotReceived || waitVPace)
     {
-        //pace V as a pace occurred during URI
-        paceA=false;
-        paceVPending=false;
+        APace=false;
+        VPaceNotReceived=false;
         (*P_PacemakerSend).signal_set(signal1);
     }
     else
     {
-        canPaceV=true;              //allow the PM to pace V as URI is now over
+        waitVPace=true;
     }
-    
 }   
 
 void pacemakerReceive(const void *args)
@@ -214,29 +233,29 @@
     while(1)
     {
         Thread::signal_wait(signal4);
-        if(timerRunning)
+        if(TimeConstTimerOn)
         {
-            TimeOutTimer->stop();
-            timerRunning=false;
+            TimeConstTimer->stop();
+            TimeConstTimerOn=false;
         }
-        if(aSenseOccurred)
+        if(ASenseReceived)
         {
             setASignal(false);
             setVSignal(true);
-            timerRunning=true;
+            TimeConstTimerOn=true;
             setTimeConstraint(AVI_const);
-            TimeOutTimer->start(AVI);//500);            
+            TimeConstTimer->start(AVI);
         }
         else
         {
             incrementHeartRate();
             setVSignal(false);
             setASignal(false);
-            canPaceV=false;
-            URITimeOutTimer->start(URI);
-            timerRunning=true;
+            waitVPace=false;
+            AtrialEventTimer->start(URI);
+            TimeConstTimerOn=true;
             setTimeConstraint(VRP_const);
-            TimeOutTimer->start(VRP);
+            TimeConstTimer->start(VRP);
         }
     }
 }
@@ -246,49 +265,50 @@
     while(1)
     {
         Thread::signal_wait(signal1);
-        if(paceA)
+        if(APace)
         {
-            println("APace Sent");
+            pc.printf("APace Sent at %d ms\r\n", globalTimer.read_ms());
             apaceLED=1;
             aPace=1;
             Thread::wait(1);
             aPace=0;
             apaceLED=0;
-            if(modeChanged)
+            if(changePacemakerMode)
             {
                 changeMode();
             }
-            // start AVI Timer
+
             setASignal(false);
             setVSignal(false);
             setTimeConstraint(PVAB_const);
-            timerRunning=true;
-            if (paceMakerMode != MANUAL) {
-                TimeOutTimer->start(PVAB);
+            if (pacemakerMode != MANUAL) {
+                TimeConstTimerOn=true;
+                TimeConstTimer->start(PVAB);
             }
         }
         else
         {
-            println("VPace Sent");
+            pc.printf("VPace Sent at %d ms\r\n", globalTimer.read_ms());
             vpaceLED=1;
             vPace=1;
             Thread::wait(1);
             vPace=0;
             vpaceLED=0;
-            if(modeChanged)
+            if(changePacemakerMode)
             {
                 changeMode();
             }
-            // start VRP and URI timers
+
             setVSignal(false);
             setASignal(false);
             incrementHeartRate();
-            canPaceV=false;
-            URITimeOutTimer->start(URI);
+            waitVPace=false;
+            AtrialEventTimer->start(URI);
             setTimeConstraint(VRP_const);
-            timerRunning=true;
-            if (paceMakerMode != MANUAL) {
-                TimeOutTimer->start(VRP);
+            TimeConstTimerOn=true;
+            if (pacemakerMode != MANUAL) {
+                TimeConstTimerOn=true;
+                TimeConstTimer->start(VRP);
             }
         }
     }
@@ -306,7 +326,7 @@
 
     if (input >= 10 && input <= 90) {
         pacemakerInterval=input;
-        observationInterval=pacemakerInterval*1000;
+        pacemakerIntervalInMs = pacemakerInterval*1000;
         displayTimer.reset();
         heartRateMutex.lock();
         heartRate=0;
@@ -322,47 +342,58 @@
     while(1)
     {
         Thread::signal_wait(signal2);
-        if((((ch=='a')||(ch=='A')) && paceMakerMode==MANUAL) && !observationChange)
+        if (char_read == 'a' && pacemakerMode == MANUAL)
         {
-            //fire A Pace
-            paceA=true;
+            APace=true;
             (*P_PacemakerSend).signal_set(signal1);
         }
-        else if((((ch=='v')||(ch=='V')) && paceMakerMode==MANUAL) && !observationChange)
+        else if (char_read == 'v' && pacemakerMode == MANUAL)
         {
-            //fire V Pace
-            if(canPaceV)
+            if(waitVPace)
             {
-                paceA=false;
-                paceVPending=false;
+                APace=false;
+                VPaceNotReceived=false;
                 (*P_PacemakerSend).signal_set(signal1);
             }
             else
             {
-                paceVPending=true;
+                VPaceNotReceived=true;
             }
         }
-        else if(((((ch=='n')||(ch=='N'))&& paceMakerMode!=NORMAL) && !observationChange) && !modeChanged)
+        else if (char_read == 'n' && pacemakerMode != NORMAL && !changePacemakerMode)
         {
-            paceMakerMode=NORMAL;
-            modeChanged=true;
-        }
-        else if(((((ch=='e')||(ch=='E')) && paceMakerMode!=EXERCISE) && !observationChange) && !modeChanged)
-        {
-            paceMakerMode=EXERCISE;
-            modeChanged=true;
+            if (pacemakerMode == MANUAL) {
+                // restart A/V timers
+                TimeConstTimerOn=true;
+                TimeConstTimer->start(VRP);    
+            }
+            pacemakerMode=NORMAL;
+            changePacemakerMode=true;
         }
-        else if(((((ch=='s')||(ch=='S')) && paceMakerMode!=SLEEP) && !observationChange) && !modeChanged)
+        else if (char_read == 'e' && pacemakerMode != EXERCISE && !changePacemakerMode)
         {
-            paceMakerMode=SLEEP;
-            modeChanged=true;
+            if (pacemakerMode == MANUAL) {
+                // restart A/V timers
+                TimeConstTimer->start(VRP);    
+            }
+            pacemakerMode=EXERCISE;
+            changePacemakerMode=true;
         }
-        else if(((((ch=='m')||(ch=='M')) && paceMakerMode!=MANUAL) && !observationChange) && !modeChanged)
+        else if (char_read == 's' && pacemakerMode != SLEEP && !changePacemakerMode)
         {
-            paceMakerMode=MANUAL;
-            modeChanged=true;
+            if (pacemakerMode == MANUAL) {
+                // restart A/V timers
+                TimeConstTimer->start(VRP);    
+            }
+            pacemakerMode=SLEEP;
+            changePacemakerMode=true;
         }
-        else if(((((ch=='o')||(ch=='O')) && !observationChange) && !modeChanged))
+        else if (char_read == 'm' && pacemakerMode != MANUAL && !changePacemakerMode)
+        {
+            pacemakerMode=MANUAL;
+            changePacemakerMode=true;
+        }
+        else if (char_read == 'o' && !changePacemakerMode)
         {
             // blocks, reading characters, until "return" is pressed
             observationMutex.lock();
@@ -383,12 +414,12 @@
             Thread::wait(5);
             buzzer=0;
             Thread::wait(5);
-            if(!ringingAlarm)
+            if(!alarmPrinted)
             {
                 displayMutex.lock();
                 println("!!!***Alarm High***!!!");
                 displayMutex.unlock();
-                ringingAlarm=true;
+                alarmPrinted=true;
             }
         }
         while(avgHeartRate < (60000/LRI))
@@ -397,17 +428,17 @@
             Thread::wait(10);
             buzzer=0;
             Thread::wait(10);
-            if(!ringingAlarm)
+            if(!alarmPrinted)
             {
                 displayMutex.lock();
                 println("!!!***Alarm Low***!!!");
                 displayMutex.unlock();
-                ringingAlarm=true;
+                alarmPrinted=true;
             }
         }
-        if(ringingAlarm)
+        if(alarmPrinted)
         {
-            ringingAlarm=false;
+            alarmPrinted=false;
 //            resetDisplay();
         }
     }
@@ -420,10 +451,10 @@
     while(1)
     {
         observationMutex.lock();
-        if (displayTimer.read_ms() >= observationInterval) {
+        if (displayTimer.read_ms() >= pacemakerIntervalInMs) {
             displayTimer.reset();
             printToLCD();
-            avgHeartRate=heartRate*(60/pacemakerInterval);
+            avgHeartRate=heartRate*(60.0/pacemakerInterval);
             heartRateMutex.lock();
             heartRate=0;
             heartRateMutex.unlock();
@@ -445,8 +476,9 @@
     
     ASignal.rise(&aSense);
     VSignal.rise(&vSense);
-    TimeOutTimer=new RtosTimer(timeOut, osTimerOnce, (void*)0);
-    URITimeOutTimer=new RtosTimer(uriTimeOut, osTimerOnce, (void *)0);
+    
+    TimeConstTimer = new RtosTimer(timeConstraintTimeout, osTimerOnce, (void*)0);
+    AtrialEventTimer = new RtosTimer(atrialEventTimeout, osTimerOnce, (void *)0);
     
     Thread PacemakerSend(pacemakerSend);
     P_PacemakerSend=&PacemakerSend;
@@ -472,12 +504,14 @@
     PacemakerAlarm.set_priority(osPriorityAboveNormal);
     
     setTimeConstraint(VRP_const);
-    TimeOutTimer->start(VRP);
+    TimeConstTimer->start(VRP);
+    
+    globalTimer.start();
     
     while(1) {
         if(pc.readable())
         {
-            ch=pc.getc();
+            char_read = pc.getc();
             (*P_PacemakerKeyboard).signal_set(signal2);
         }
     }