here it is

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541-pacemaker by Terry Fang

Revision:
2:682a3ac9d7a3
Parent:
1:e6f6471e2c00
Child:
3:77efff091ef1
--- a/main.cpp	Mon Dec 05 03:14:51 2016 +0000
+++ b/main.cpp	Wed Dec 07 15:10:36 2016 +0000
@@ -2,35 +2,36 @@
 #include "rtos.h"
 #include "TextLCD.h"
 #include <stdio.h>
-
+ 
 InterruptIn vsignal(p7);
 InterruptIn asignal(p8);
 DigitalOut Vpace(p5);
 DigitalOut Apace(p6);
-
+ 
 DigitalOut asense_led(LED1);
 DigitalOut vsense_led(LED2);
 DigitalOut apace_led(LED3);
 DigitalOut vpace_led(LED4);
-
+ 
 Thread *pacemodeThread;
-
+ 
 osThreadId signalTid;
 osThreadId senseTid;
 osThreadId displayTid;
 osThreadId pacemodeTid;
 osThreadId alarmTid;
+osThreadId ledTid;
 
 TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
 RawSerial pc(USBTX, USBRX);
-
+ 
 Timer vClock;
 Timer aClock;               //PaceSignal model
-
+ 
 RtosTimer *apace_timer;
 RtosTimer *vpace_timer;
 //RtosTimer *vpace_timer2;
-
+ 
 double LRI = 1000;
 double URI = 700;
 double VRP = 200;                // V noise interval
@@ -39,7 +40,7 @@
 double PVARP = 300;      // V-A max interval
 double ratio;
 int wait_period = 10;       // 3a requirement
-
+ 
 int observation_interval = 10000; // In miliseconds
 int upperBound; //for mode changes
 int lowerBound; //for mode changes
@@ -49,16 +50,16 @@
 char newObsInt[8];
 int manual_mode = 0;
 Mutex hr_mutex; //hr_mutex.lock()/unlock()
-
+ 
 Queue<char,256> mode_q;
 Queue<char,256> signal_q;
 Queue<char,256> obsint_q;
-
+ 
 volatile char c;
 volatile int mm = 0;
 volatile int om = 0;  
 int mm_flag = 0;
-
+ 
 void initialize_intervals()
 {
     LRI = 1000;
@@ -68,7 +69,7 @@
 //    AVI = 150;
 //    PVARP = 300;
 }
-
+ 
 void Rx_interrupt()
 {
     while(pc.readable()) {
@@ -92,41 +93,49 @@
         }
     }
 }
+ 
 
-// Function to toggle the LEDs 1,2,3,4
-void toggleLed(int led)
+// Thread signals 1=0x5, 2=0x6, 3=0x7, 4=0x8 
+void ledThread(void const *args)
 {
-    switch (led) {
-        case (1):
+    while (1) {
+        osEvent ext_signal = osSignalWait(0, osWaitForever);
+        int evt = ext_signal.value.signals;
+ 
+        if (evt == 0x5)
+        {
             asense_led = 1;
             Thread::wait(wait_period);
             asense_led = 0;
-            break;
-        case (2):
+        }
+        else if (evt == 0x6)
+        {
             vsense_led = 1;
             Thread::wait(wait_period);
             vsense_led = 0;
-            break;
-        case (3):
+        }
+        else if (evt == 0x7)
+        {
             apace_led = 1;
             Thread::wait(wait_period);
             apace_led = 0;
-            break;
-        case (4):
+        }
+        else if (evt == 0x8)
+        {
             vpace_led = 1;
             Thread::wait(wait_period);
             vpace_led = 0;
-            break;
-    }
+        }
+    }  
 }
-
+ 
 void alarmThread(void const *args)
 {
     while (1) 
     {   
         osEvent ext_signal = osSignalWait(0, osWaitForever);
         int evt = ext_signal.value.signals;
-
+ 
         if (evt == 0xb){
             lcd.printf("%s", "\nALARM HIGH");   
         }
@@ -135,7 +144,7 @@
         }
     }
 }
-
+ 
 void displayThread(void const *args)
 {
     while (1) {
@@ -159,54 +168,53 @@
         }
     }
 }
-
-
-
+ 
+ 
+ 
 // Incoming signal from the heart
 void asignal_irq()
 {
     osSignalSet(signalTid, 0x1);
 }
-
+ 
 // Incoming signal from the heart
 void vsignal_irq()
 {
     osSignalSet(signalTid, 0x2);
 }
-
-
+ 
+ 
 // Timer-driven function to pace the Atrial
 void a_pace(void const*)
 {
     Apace = 1;
     aClock.reset();
     apace_timer->stop();
-    toggleLed(3);
+    osSignalSet(ledTid, 0x7);
     Apace = 0;
     osSignalSet(signalTid, 0x3);
 }
-
+ 
 // Timer-driven function to pace the ventrical
 void v_pace(void const*)
 {
     Vpace = 1;
-
-
+ 
+ 
     vClock.reset();
     vpace_timer->start(LRI);
     apace_timer->start(LRI-AVI);
-
-    toggleLed(4);
+    osSignalSet(ledTid, 0x8);
     Vpace = 0;
     osSignalSet(signalTid, 0x4);
-
+ 
     hr_mutex.lock();
     heart_beats++;
     hr_mutex.unlock();
 }
-
-
-
+ 
+ 
+ 
 void PaceSignal(void const *args)
 {
     int pFlag1 = 0;
@@ -222,9 +230,7 @@
         while (!pFlag1) {
             osEvent ext_signal = osSignalWait(0, osWaitForever);
             int evt = ext_signal.value.signals;
-
-            //lcd.printf("%d",evt); // 4(Vpace), 3(Apace), 2(Vsignal), 1(Asignal)
-
+ 
             if (evt == 0x1 && vClock.read_ms() >= PVARP) { //aSignal
                 osSignalSet(senseTid, 0x1);
                 aClock.reset();
@@ -235,30 +241,34 @@
                 }
                 pFlag1 = 1;
             } else if(evt == 0x2 && vClock.read_ms() >= VRP) { //vSignal
+                hr_mutex.lock();
+                heart_beats++;
+                hr_mutex.unlock();
                 osSignalSet(senseTid, 0x2);
                 vClock.reset();
                 if(!mm_flag) {
                     vpace_timer->start(LRI);
                     apace_timer->start(LRI-AVI);
                 }
-
+ 
             } else if (evt == 0x3) { //aPace
                 pFlag1 = 1;
             }
         }
         pFlag1 = 0;
-
+ 
         while(!pFlag2) {
-
+ 
             osEvent ext_signal = osSignalWait(0, osWaitForever);
             int evt = ext_signal.value.signals;
-
-            //lcd.printf("%d",evt);
-
+ 
             if (evt == 0x1 && aClock.read_ms() >= ARP) { //aSignal
                 osSignalSet(senseTid, 0x1);
                 aClock.reset();
             } else if(evt == 0x2) { //vSignal
+                hr_mutex.lock();
+                heart_beats++;
+                hr_mutex.unlock();
                 osSignalSet(senseTid, 0x2);
                 vClock.reset();
                 if(!mm_flag) {
@@ -273,8 +283,8 @@
         pFlag2 = 0;
     }
 }
-
-
+ 
+ 
 void PaceSense(void const *args)
 {
     int pFlag1 = 0;
@@ -283,36 +293,26 @@
         while (!pFlag1) {
             osEvent ext_signal = osSignalWait(0, osWaitForever);
             int evt = ext_signal.value.signals;
-
-            //lcd.printf("%d",evt);
-
+ 
             if (evt == 0x1) { //aSense
-                toggleLed(evt);
+                osSignalSet(ledTid, 0x5);
                 pFlag1 = 1;
             } else if(evt == 0x2) { //vSense
-                toggleLed(evt);
-                hr_mutex.lock();
-                heart_beats++;
-                hr_mutex.unlock();
+                osSignalSet(ledTid, 0x6);
             } else if (evt == 0x3) { //aPace
                 pFlag1 = 1;
             }
-
+ 
         }
         pFlag1 = 0;
         while(!pFlag2) {
             osEvent ext_signal = osSignalWait(0, osWaitForever);
             int evt = ext_signal.value.signals;
-
-            //lcd.printf("%d",evt); // 4096, 256, 16, 1
-
+ 
             if (evt == 0x1) { //aSense
-                toggleLed(evt);
+                osSignalSet(ledTid, 0x5);
             } else if(evt == 0x2) { //vSignal
-                toggleLed(evt);
-                hr_mutex.lock();
-                heart_beats++;
-                hr_mutex.unlock();
+                osSignalSet(ledTid, 0x6);
                 pFlag2 = 1;
             } else if (evt == 0x4) { //vPace
                 pFlag2 = 1;
@@ -321,7 +321,7 @@
         pFlag2 = 0;
     }
 }
-
+ 
 void normalmode(void const *args)
 {
     initialize_intervals();
@@ -333,11 +333,11 @@
     hr_mutex.lock();
     heart_beats = 0;
     hr_mutex.unlock();
-
+ 
     vpace_timer->start(LRI);
     apace_timer->start(LRI-AVI);
 }
-
+ 
 void exercisemode(void const *args)
 {
     initialize_intervals();
@@ -352,11 +352,11 @@
     hr_mutex.lock();
     heart_beats = 0;
     hr_mutex.unlock();
-
+ 
     vpace_timer->start(LRI);
     apace_timer->start(LRI-AVI);
 }
-
+ 
 void sleepmode(void const *args)
 {
     initialize_intervals();
@@ -371,32 +371,32 @@
     hr_mutex.lock();
     heart_beats = 0;
     hr_mutex.unlock();
-
+ 
     vpace_timer->start(LRI);
     apace_timer->start(LRI-AVI);
 }
-
+ 
 void m_vpace()
 {
     vClock.reset();
     Vpace = 1;
-    toggleLed(4);
+    osSignalSet(ledTid, 0x8);
     Vpace = 0;
     osSignalSet(signalTid, 0x4);
     hr_mutex.lock();
     heart_beats++;
     hr_mutex.unlock();
 }
-
+ 
 void m_apace()
 {
     aClock.reset();
     Apace = 1;
-    toggleLed(3);
+    osSignalSet(ledTid, 0x7);
     Apace = 0;
     osSignalSet(signalTid, 0x3);
 }
-
+ 
 void manualmode(void const *args)
 {
     upperBound = 175; //beats per msecond
@@ -405,7 +405,7 @@
     mode = 'm';
     LRI = 2125; // max V-V (LRI) based on exercise mode
     URI = 675; // min V-V (URI) based on sleep mode
-
+ 
     while(1) {
         osEvent evt = signal_q.get();
         if(evt.status == osEventMessage) {
@@ -417,7 +417,7 @@
         }
     }
 }
-
+ 
 void obsinterval()
 {
     char newObsInt[8];
@@ -431,35 +431,40 @@
                 newObsInt[i] = key;
                 i++;
             } else if((key == '\r') && (i > 0)) {
+                hr_mutex.lock();
                 heart_beats = 0;
+                hr_mutex.unlock();
                 int obsint;
                 newObsInt[i] = '\0';
                 sscanf(newObsInt, "%d", &obsint);
+                hr_mutex.lock();
                 observation_interval = (obsint > 0 ) ? obsint: 1;
+                hr_mutex.unlock();
                 isChangingObsInt = 0;
                 lcd.printf("%d", observation_interval);
             }
         }
     }
 }
-
+ 
 osThreadDef(PaceSignal, osPriorityNormal, DEFAULT_STACK_SIZE);
 osThreadDef(PaceSense, osPriorityNormal, DEFAULT_STACK_SIZE);
 osThreadDef(alarmThread, osPriorityBelowNormal, DEFAULT_STACK_SIZE); //priority BelowNormal
-
+osThreadDef(ledThread, osPriorityBelowNormal, DEFAULT_STACK_SIZE); //priority BelowNormal
 osThreadDef(displayThread, osPriorityLow, DEFAULT_STACK_SIZE); //priority Low
 osThreadDef(manualmode, osPriorityNormal, DEFAULT_STACK_SIZE);
 osThreadDef(normalmode, osPriorityNormal, DEFAULT_STACK_SIZE);
 osThreadDef(exercisemode, osPriorityNormal, DEFAULT_STACK_SIZE);
 osThreadDef(sleepmode, osPriorityNormal, DEFAULT_STACK_SIZE);
-
-
+ 
+ 
 ////////////////////////////////////////////
 ////////////////////////////////////////////
 ////////////////////////////////////////////
-
+ 
 int main()
 {
+    ledTid = osThreadCreate(osThread(ledThread), NULL);
     alarmTid = osThreadCreate(osThread(alarmThread), NULL);
     senseTid = osThreadCreate(osThread(PaceSense), NULL);
     signalTid = osThreadCreate(osThread(PaceSignal), NULL);
@@ -468,16 +473,16 @@
     
     vsignal.rise(&vsignal_irq); //rising edge of timer
     asignal.rise(&asignal_irq);
-
+ 
     Callback<void()> apaceTimerTask((void*)NULL, (void (*)(void*))&a_pace);
     Callback<void()> vpaceTimerTask((void*)NULL, (void (*)(void*))&v_pace);
     apace_timer = new RtosTimer(apaceTimerTask);
     vpace_timer = new RtosTimer(vpaceTimerTask);
-
+ 
     lcd.cls();
-
+ 
     pc.attach(&Rx_interrupt, RawSerial::RxIrq);
-
+ 
     while(true) {
         osEvent evt = mode_q.get();
         if(evt.status == osEventMessage) {
@@ -519,13 +524,11 @@
                     break;
                 case('o'):
                     lcd.printf("modeO");
-                    hr_mutex.lock();
-                    obsinterval();
-                    hr_mutex.unlock();
+                    obsinterval();;
                     osThreadTerminate (displayTid);
                     displayTid = osThreadCreate(osThread(displayThread), NULL);
                     break;
             }
         }
     }
-}
+}
\ No newline at end of file