here it is

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541-pacemaker by Terry Fang

Revision:
4:f887d8169f83
Parent:
3:77efff091ef1
--- a/main.cpp	Fri Dec 09 06:50:30 2016 +0000
+++ b/main.cpp	Fri Dec 09 11:05:21 2016 +0000
@@ -36,7 +36,7 @@
 double URI = 700;
 double VRP = 200;                // V noise interval
 double ARP = 50;                // A noise interval
-double AVI = 500;          // A-V max interval
+double AVI = 150;          // A-V max interval
 double PVARP = 300;      // V-A max interval
 double ratio;
 int wait_period = 10;       // 3a requirement
@@ -175,27 +175,23 @@
 void a_pace(void const*)
 {
     Apace = 1;
+    Thread::wait(1);
     aClock.reset();
-//    apace_timer->stop();
+    arpClock.reset();
     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);
-    Vpace = 0;
-
     hr_mutex.lock();
     osSignalSet(signalTid, 0x4);
     heart_beats++;
+    vClock.reset();
+    aClock.reset();
+    arpClock.reset();
     hr_mutex.unlock();
 
     toggleLed(4);
@@ -210,66 +206,57 @@
     vClock.start();
     aClock.start();
     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;
 
-            //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();
                 arpClock.reset();
                 pFlag1 = 1;
-            } else if(evt == 0x2 && vClock.read_ms() >= VRP) { //vSignal
+            } else if(evt == 0x2 && vClock.read_ms() >= VRP) { //vSense
+                pc.printf("%d VSense\n", vClock.read_ms());
+                hr_mutex.lock();
                 osSignalSet(senseTid, 0x2);
+                heart_beats++;
                 vClock.reset();
-//                if(!mm_flag) {
-//                    vpace_timer->start(LRI);
-//                    apace_timer->start(LRI-AVI);
-//                }
+                aClock.reset();
+                arpClock.reset();
+                hr_mutex.unlock();
+                pFlag1 = 1;
+
             } 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;
 
-            //lcd.printf("%d",evt);
-
-            if (evt == 0x1 && arpClock.read_ms() >= ARP) { //aSignal
+            if (evt == 0x1 && arpClock.read_ms() >= ARP) { //aSense
                 osSignalSet(senseTid, 0x1);
                 arpClock.reset();
-//                aClock.reset();
+
             } else if(evt == 0x2) { //vSense
                 hr_mutex.lock();
                 osSignalSet(senseTid, 0x2);
                 heart_beats++;
                 vClock.reset();
+                aClock.reset();
+                arpClock.reset();
                 hr_mutex.unlock();
-//                if(!mm_flag) {
-//                    vpace_timer->start(LRI);
-//                    apace_timer->start(LRI-AVI);
-//                }
                 pFlag2 = 1;
             } else if (evt == 0x4) { //vPace
+                pc.printf("%d VPace\n", vClock.read_ms());
                 pFlag2 = 1;
             }
         }
         pFlag2 = 0;
-        lcd.cls();
-        lcd.printf("PS2");
     }
 }
 
@@ -279,72 +266,88 @@
     int interval;
     int pFlag1 = 0;
     int pFlag2 = 0;
+    int time_sub = 0;
+    int evt = 0;
     while(1) {
         while (!pFlag1) {
-            osEvent ext_signal = osSignalWait(0, (LRI-AVI));
-            int evt = ext_signal.value.signals;
+
+            time_sub = LRI-AVI - vClock.read_ms();
 
-            //lcd.printf("%d",evt);
-            if (evt == 0x3) { //aPace 0x0
+            if (time_sub > 0  && !mm_flag) {
+                osEvent ext_signal = osSignalWait(0, time_sub);
+                evt = ext_signal.value.signals;
+            } else if(mm_flag) {
+                osEvent ext_signal = osSignalWait(0, osWaitForever);
+                evt = ext_signal.value.signals;
+            } else {
+                evt = 0x0;
+            }
+
+            if (evt == 0x0) { //aPace 0x0
+                aClock.reset();
+                arpClock.reset();
                 Apace = 1;
                 Thread::wait(1);
                 Apace = 0;
                 osSignalSet(signalTid, 0x3);
-                aClock.reset();
-                arpClock.reset();
-                
+
                 toggleLed(3);
+                interval = AVI;
                 pFlag1 = 1;
-            }
-            if (evt == 0x1) { //aSense
+            } else if (evt == 0x1) { //aSense
                 if(!mm_flag) {
-//                    vpace_timer->stop();
-                    interval = (vClock.read_ms() + AVI >= URI) ? AVI : URI - vClock.read_ms();
+                    interval = (vClock.read_ms() + AVI >= URI) ? AVI : URI;
+                    time_sub = interval;
                 }
-//                if(mm_flag)
-                toggleLed(evt);
+                toggleLed(1);
                 pFlag1 = 1;
             } else if(evt == 0x2) { //vSense
-                toggleLed(evt);
+                toggleLed(2);
+            } else if(evt == 0x3) { //apace
+                pFlag1 = 1;
             }
-//            } else if (evt == 0x3) { //aPace
-//                aClock.reset();
-//                arpClock.reset();
-//                pFlag1 = 1;
-//            }
         }
         pFlag1 = 0;
-        lcd.cls();
-        lcd.printf("PS3");
+
         while(!pFlag2) {
-            lcd.printf("%d", interval);
-            osEvent ext_signal = osSignalWait(0, interval);
-            
-            int evt = ext_signal.value.signals;
-            
-            //lcd.printf("%d",evt); // 4096, 256, 16, 1
-            if (evt == 0x4) { //vPace 0x0
+            time_sub = (interval == AVI) ? AVI - aClock.read_ms() : URI - vClock.read_ms();
+
+            if (time_sub > 0 && !mm_flag) {
+                osEvent ext_signal = osSignalWait(0, time_sub);
+                evt = ext_signal.value.signals;
+            } else if(mm_flag) {
+                osEvent ext_signal = osSignalWait(0, osWaitForever);
+                evt = ext_signal.value.signals;
+            } else {
+                evt = 0x0;
+            }
+
+            if (evt == 0x0) { //vPace 0x0
+
                 hr_mutex.lock();
+                heart_beats++;
+                vClock.reset();
+                aClock.reset();
+                arpClock.reset();
                 Vpace = 1;
-                vClock.reset();
                 Thread::wait(1);
                 Vpace = 0;
                 osSignalSet(signalTid, 0x4);
-                heart_beats++;
                 hr_mutex.unlock();
 
                 toggleLed(4);
                 pFlag2 = 1;
+
             } else if (evt == 0x1) { //aSense
-                toggleLed(evt);
+                toggleLed(1);
             } else if(evt == 0x2) { //vSense
-                toggleLed(evt);
+                toggleLed(2);
+                pFlag2 = 1;
+            } else if (evt == 0x4) { //vpace
                 pFlag2 = 1;
             }
         }
         pFlag2 = 0;
-        lcd.cls();
-        lcd.printf("PS4");
     }
 }
 
@@ -411,25 +414,29 @@
 void m_vpace()
 {
     vClock.reset();
+    aClock.reset();
+    arpClock.reset();
     Vpace = 1;
     Thread::wait(1);
     Vpace = 0;
     osSignalSet(signalTid, 0x4);
+    osSignalSet(senseTid, 0x4);
     hr_mutex.lock();
     heart_beats++;
     hr_mutex.unlock();
-    
+
     toggleLed(4);
 }
 
 void m_apace()
 {
     aClock.reset();
+    arpClock.reset();
     Apace = 1;
     Thread::wait(1);
     Apace = 0;
+    osSignalSet(senseTid, 0x3);
     osSignalSet(signalTid, 0x3);
-    
     toggleLed(3);
 }
 
@@ -502,7 +509,7 @@
     displayTid = osThreadCreate(osThread(displayThread), NULL);
 //    pacemodeTid = osThreadCreate(osThread(normalmode), NULL);
     normalmode(NULL);
-    
+
     vsignal.rise(&vsignal_irq); //rising edge of timer
     asignal.rise(&asignal_irq);
 
@@ -521,6 +528,7 @@
             switch((char)evt.value.p) {
                 case('n'):
                     mm_flag = 0;
+                    osSignalSet(senseTid, 0x5);
                     lcd.printf("paceN");
                     osThreadTerminate (pacemodeTid);
                     osThreadTerminate (displayTid);
@@ -531,6 +539,7 @@
                     break;
                 case('s'):
                     mm_flag = 0;
+                    osSignalSet(senseTid, 0x5);
                     lcd.printf("paceS");
                     osThreadTerminate (pacemodeTid);
                     osThreadTerminate (displayTid);
@@ -540,6 +549,7 @@
                     break;
                 case('e'):
                     mm_flag = 0;
+                    osSignalSet(senseTid, 0x5);
                     lcd.printf("paceE");
                     osThreadTerminate (pacemodeTid);
                     osThreadTerminate (displayTid);