here it is

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541-pacemaker by Terry Fang

Revision:
3:77efff091ef1
Parent:
2:682a3ac9d7a3
Child:
4:f887d8169f83
--- a/main.cpp	Wed Dec 07 15:10:36 2016 +0000
+++ b/main.cpp	Fri Dec 09 06:50:30 2016 +0000
@@ -2,45 +2,45 @@
 #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;
+Timer arpClock;
+
+//RtosTimer *apace_timer;
+//RtosTimer *vpace_timer;
 //RtosTimer *vpace_timer2;
- 
+
 double LRI = 1000;
 double URI = 700;
 double VRP = 200;                // V noise interval
 double ARP = 50;                // A noise interval
-double AVI = 150;          // A-V max interval
+double AVI = 500;          // A-V max interval
 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
@@ -50,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;  
+volatile int om = 0;
 int mm_flag = 0;
- 
+
 void initialize_intervals()
 {
     LRI = 1000;
@@ -69,7 +69,7 @@
 //    AVI = 150;
 //    PVARP = 300;
 }
- 
+
 void Rx_interrupt()
 {
     while(pc.readable()) {
@@ -93,235 +93,261 @@
         }
     }
 }
- 
 
-// Thread signals 1=0x5, 2=0x6, 3=0x7, 4=0x8 
-void ledThread(void const *args)
+// Function to toggle the LEDs 1,2,3,4
+void toggleLed(int led)
+{
+    switch (led) {
+        case (1):
+            asense_led = 1;
+            Thread::wait(wait_period);
+            asense_led = 0;
+            break;
+        case (2):
+            vsense_led = 1;
+            Thread::wait(wait_period);
+            vsense_led = 0;
+            break;
+        case (3):
+            apace_led = 1;
+            Thread::wait(wait_period);
+            apace_led = 0;
+            break;
+        case (4):
+            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 == 0x5)
-        {
-            asense_led = 1;
-            Thread::wait(wait_period);
-            asense_led = 0;
-        }
-        else if (evt == 0x6)
-        {
-            vsense_led = 1;
-            Thread::wait(wait_period);
-            vsense_led = 0;
-        }
-        else if (evt == 0x7)
-        {
-            apace_led = 1;
-            Thread::wait(wait_period);
-            apace_led = 0;
-        }
-        else if (evt == 0x8)
-        {
-            vpace_led = 1;
-            Thread::wait(wait_period);
-            vpace_led = 0;
-        }
-    }  
-}
- 
-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");   
-        }
-        else if (evt == 0xc) {
+
+        if (evt == 0xb) {
+            lcd.printf("%s", "\nALARM HIGH");
+        } else if (evt == 0xc) {
             lcd.printf("%s", "\nALARM LOW");
         }
     }
 }
- 
+
 void displayThread(void const *args)
 {
     while (1) {
         Thread::wait(observation_interval);
         lcd.cls();
-        
+
         hr_mutex.lock();
         int hr = (heart_beats*60) / (observation_interval / 1000);
         heart_beats = 0;
         hr_mutex.unlock();
-        
+
         lcd.printf("%s%d%s","HR: ", hr, " bpm");
-            
-        if (hr > upperBound)
-        {
+
+        if (hr > upperBound) {
             osSignalSet(alarmTid, 0xb);
-        }
-        else if (hr < lowerBound)
-        { 
+        } else if (hr < lowerBound) {
             osSignalSet(alarmTid, 0xc);
         }
     }
 }
- 
- 
- 
+
+
+
 // 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();
-    osSignalSet(ledTid, 0x7);
+//    apace_timer->stop();
     Apace = 0;
     osSignalSet(signalTid, 0x3);
+    
+    toggleLed(3);
 }
- 
+
 // 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);
-    osSignalSet(ledTid, 0x8);
+//    vpace_timer->start(LRI);
+//    apace_timer->start(LRI-AVI);
     Vpace = 0;
+
+    hr_mutex.lock();
     osSignalSet(signalTid, 0x4);
- 
-    hr_mutex.lock();
     heart_beats++;
     hr_mutex.unlock();
+
+    toggleLed(4);
 }
- 
- 
- 
+
+
+
 void PaceSignal(void const *args)
 {
     int pFlag1 = 0;
     int pFlag2 = 0;
     vClock.start();
     aClock.start();
-    if(!mm_flag) {
-        vpace_timer->start(LRI);
-        apace_timer->start(LRI-AVI);
-    }
+    arpClock.start();
+//    if(!mm_flag) {
+//        vpace_timer->start(LRI);
+//        apace_timer->start(LRI-AVI);
+//    }
 //    vpace_timer2->start(AVI);
     while(1) {
         while (!pFlag1) {
             osEvent ext_signal = osSignalWait(0, osWaitForever);
             int evt = ext_signal.value.signals;
- 
-            if (evt == 0x1 && vClock.read_ms() >= PVARP) { //aSignal
+
+            //lcd.printf("%d",evt); // 4(Vpace), 3(Apace), 2(Vsignal), 1(Asignal)
+
+            if (evt == 0x1 && vClock.read_ms() >= PVARP) { //aSense
                 osSignalSet(senseTid, 0x1);
                 aClock.reset();
-                if(!mm_flag) {
-                    apace_timer->stop();
-                    int interval = (vClock.read_ms() + AVI >= URI) ? AVI : URI - vClock.read_ms();
-                    apace_timer->start(interval);
-                }
+                arpClock.reset();
                 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);
-                }
- 
+//                if(!mm_flag) {
+//                    vpace_timer->start(LRI);
+//                    apace_timer->start(LRI-AVI);
+//                }
             } else if (evt == 0x3) { //aPace
                 pFlag1 = 1;
             }
         }
         pFlag1 = 0;
- 
+        lcd.cls();
+        lcd.printf("PS1");
         while(!pFlag2) {
- 
+
             osEvent ext_signal = osSignalWait(0, osWaitForever);
             int evt = ext_signal.value.signals;
- 
-            if (evt == 0x1 && aClock.read_ms() >= ARP) { //aSignal
+
+            //lcd.printf("%d",evt);
+
+            if (evt == 0x1 && arpClock.read_ms() >= ARP) { //aSignal
                 osSignalSet(senseTid, 0x1);
-                aClock.reset();
-            } else if(evt == 0x2) { //vSignal
+                arpClock.reset();
+//                aClock.reset();
+            } else if(evt == 0x2) { //vSense
                 hr_mutex.lock();
+                osSignalSet(senseTid, 0x2);
                 heart_beats++;
+                vClock.reset();
                 hr_mutex.unlock();
-                osSignalSet(senseTid, 0x2);
-                vClock.reset();
-                if(!mm_flag) {
-                    vpace_timer->start(LRI);
-                    apace_timer->start(LRI-AVI);
-                }
+//                if(!mm_flag) {
+//                    vpace_timer->start(LRI);
+//                    apace_timer->start(LRI-AVI);
+//                }
                 pFlag2 = 1;
             } else if (evt == 0x4) { //vPace
                 pFlag2 = 1;
             }
         }
         pFlag2 = 0;
+        lcd.cls();
+        lcd.printf("PS2");
     }
 }
- 
- 
+
+
 void PaceSense(void const *args)
 {
+    int interval;
     int pFlag1 = 0;
     int pFlag2 = 0;
     while(1) {
         while (!pFlag1) {
-            osEvent ext_signal = osSignalWait(0, osWaitForever);
+            osEvent ext_signal = osSignalWait(0, (LRI-AVI));
             int evt = ext_signal.value.signals;
- 
-            if (evt == 0x1) { //aSense
-                osSignalSet(ledTid, 0x5);
-                pFlag1 = 1;
-            } else if(evt == 0x2) { //vSense
-                osSignalSet(ledTid, 0x6);
-            } else if (evt == 0x3) { //aPace
+
+            //lcd.printf("%d",evt);
+            if (evt == 0x3) { //aPace 0x0
+                Apace = 1;
+                Thread::wait(1);
+                Apace = 0;
+                osSignalSet(signalTid, 0x3);
+                aClock.reset();
+                arpClock.reset();
+                
+                toggleLed(3);
                 pFlag1 = 1;
             }
- 
+            if (evt == 0x1) { //aSense
+                if(!mm_flag) {
+//                    vpace_timer->stop();
+                    interval = (vClock.read_ms() + AVI >= URI) ? AVI : URI - vClock.read_ms();
+                }
+//                if(mm_flag)
+                toggleLed(evt);
+                pFlag1 = 1;
+            } else if(evt == 0x2) { //vSense
+                toggleLed(evt);
+            }
+//            } else if (evt == 0x3) { //aPace
+//                aClock.reset();
+//                arpClock.reset();
+//                pFlag1 = 1;
+//            }
         }
         pFlag1 = 0;
+        lcd.cls();
+        lcd.printf("PS3");
         while(!pFlag2) {
-            osEvent ext_signal = osSignalWait(0, osWaitForever);
+            lcd.printf("%d", interval);
+            osEvent ext_signal = osSignalWait(0, interval);
+            
             int evt = ext_signal.value.signals;
- 
-            if (evt == 0x1) { //aSense
-                osSignalSet(ledTid, 0x5);
-            } else if(evt == 0x2) { //vSignal
-                osSignalSet(ledTid, 0x6);
+            
+            //lcd.printf("%d",evt); // 4096, 256, 16, 1
+            if (evt == 0x4) { //vPace 0x0
+                hr_mutex.lock();
+                Vpace = 1;
+                vClock.reset();
+                Thread::wait(1);
+                Vpace = 0;
+                osSignalSet(signalTid, 0x4);
+                heart_beats++;
+                hr_mutex.unlock();
+
+                toggleLed(4);
                 pFlag2 = 1;
-            } else if (evt == 0x4) { //vPace
+            } else if (evt == 0x1) { //aSense
+                toggleLed(evt);
+            } else if(evt == 0x2) { //vSense
+                toggleLed(evt);
                 pFlag2 = 1;
             }
         }
         pFlag2 = 0;
+        lcd.cls();
+        lcd.printf("PS4");
     }
 }
- 
+
 void normalmode(void const *args)
 {
     initialize_intervals();
@@ -333,11 +359,13 @@
     hr_mutex.lock();
     heart_beats = 0;
     hr_mutex.unlock();
- 
-    vpace_timer->start(LRI);
-    apace_timer->start(LRI-AVI);
+
+    vClock.reset();
+    aClock.reset();
+//    vpace_timer->start(LRI);
+//    apace_timer->start(LRI-AVI);
 }
- 
+
 void exercisemode(void const *args)
 {
     initialize_intervals();
@@ -352,11 +380,13 @@
     hr_mutex.lock();
     heart_beats = 0;
     hr_mutex.unlock();
- 
-    vpace_timer->start(LRI);
-    apace_timer->start(LRI-AVI);
+
+    vClock.reset();
+    aClock.reset();
+//    vpace_timer->start(LRI);
+//    apace_timer->start(LRI-AVI);
 }
- 
+
 void sleepmode(void const *args)
 {
     initialize_intervals();
@@ -371,32 +401,38 @@
     hr_mutex.lock();
     heart_beats = 0;
     hr_mutex.unlock();
- 
-    vpace_timer->start(LRI);
-    apace_timer->start(LRI-AVI);
+
+    vClock.reset();
+    aClock.reset();
+//    vpace_timer->start(LRI);
+//    apace_timer->start(LRI-AVI);
 }
- 
+
 void m_vpace()
 {
     vClock.reset();
     Vpace = 1;
-    osSignalSet(ledTid, 0x8);
+    Thread::wait(1);
     Vpace = 0;
     osSignalSet(signalTid, 0x4);
     hr_mutex.lock();
     heart_beats++;
     hr_mutex.unlock();
+    
+    toggleLed(4);
 }
- 
+
 void m_apace()
 {
     aClock.reset();
     Apace = 1;
-    osSignalSet(ledTid, 0x7);
+    Thread::wait(1);
     Apace = 0;
     osSignalSet(signalTid, 0x3);
+    
+    toggleLed(3);
 }
- 
+
 void manualmode(void const *args)
 {
     upperBound = 175; //beats per msecond
@@ -405,7 +441,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 +453,7 @@
         }
     }
 }
- 
+
 void obsinterval()
 {
     char newObsInt[8];
@@ -431,84 +467,84 @@
                 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);
- 
- 
+//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);
     displayTid = osThreadCreate(osThread(displayThread), NULL);
-    pacemodeTid = osThreadCreate(osThread(normalmode), NULL);
+//    pacemodeTid = osThreadCreate(osThread(normalmode), NULL);
+    normalmode(NULL);
     
     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);
- 
+
+//    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) {
+//        lcd.printf("test1");
         osEvent evt = mode_q.get();
         if(evt.status == osEventMessage) {
             switch((char)evt.value.p) {
                 case('n'):
                     mm_flag = 0;
+                    lcd.printf("paceN");
                     osThreadTerminate (pacemodeTid);
                     osThreadTerminate (displayTid);
-                    pacemodeTid = osThreadCreate(osThread(normalmode), NULL);
+//                    pacemodeTid = osThreadCreate(osThread(normalmode), NULL);
+                    normalmode(NULL);
                     displayTid = osThreadCreate(osThread(displayThread), NULL);
                     lcd.printf("%d", observation_interval);
                     break;
                 case('s'):
                     mm_flag = 0;
-//                    lcd.printf("testingS");
+                    lcd.printf("paceS");
                     osThreadTerminate (pacemodeTid);
                     osThreadTerminate (displayTid);
-                    pacemodeTid = osThreadCreate(osThread(sleepmode), NULL);
+//                    pacemodeTid = osThreadCreate(osThread(sleepmode), NULL);
+                    sleepmode(NULL);
                     displayTid = osThreadCreate(osThread(displayThread), NULL);
                     break;
                 case('e'):
                     mm_flag = 0;
-//                    lcd.printf("testingE");
+                    lcd.printf("paceE");
                     osThreadTerminate (pacemodeTid);
                     osThreadTerminate (displayTid);
-                    pacemodeTid = osThreadCreate(osThread(exercisemode), NULL);
+//                    pacemodeTid = osThreadCreate(osThread(exercisemode), NULL);
+                    exercisemode(NULL);
                     displayTid = osThreadCreate(osThread(displayThread), NULL);
                     lcd.printf("%d", observation_interval);
                     break;
@@ -516,19 +552,21 @@
                     mm_flag = 1;
                     osThreadTerminate (pacemodeTid);
                     //osThreadTerminate (displayTid);
-                    apace_timer->stop();
-                    vpace_timer->stop();
+//                    apace_timer->stop();
+//                    vpace_timer->stop();
                     pacemodeTid = osThreadCreate(osThread(manualmode), NULL);
 //                    displayTid = osThreadCreate(osThread(displayThread), NULL);
                     manual_mode = 1;
                     break;
                 case('o'):
                     lcd.printf("modeO");
-                    obsinterval();;
+                    hr_mutex.lock();
+                    obsinterval();
+                    hr_mutex.unlock();
                     osThreadTerminate (displayTid);
                     displayTid = osThreadCreate(osThread(displayThread), NULL);
                     break;
             }
         }
     }
-}
\ No newline at end of file
+}