Terry Fang / Mbed 2 deprecated 541-pacemaker

Dependencies:   TextLCD mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
terryfan
Date:
Sun Dec 11 21:11:54 2016 +0000
Parent:
3:77efff091ef1
Commit message:
final pacemaker 12/11

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 77efff091ef1 -r a9c37c60425c main.cpp
--- a/main.cpp	Fri Dec 09 06:50:30 2016 +0000
+++ b/main.cpp	Sun Dec 11 21:11:54 2016 +0000
@@ -20,6 +20,7 @@
 osThreadId displayTid;
 osThreadId pacemodeTid;
 osThreadId alarmTid;
+osThreadId ledTid;
 
 TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
 RawSerial pc(USBTX, USBRX);
@@ -28,23 +29,19 @@
 Timer aClock;               //PaceSignal model
 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 = 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
 
-int observation_interval = 10000; // In miliseconds
+double observation_interval = 10000; // In miliseconds
 int upperBound; //for mode changes
 int lowerBound; //for mode changes
-int heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval
+double heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval
 char mode = 'n';
 char key = 'n';
 char newObsInt[8];
@@ -64,10 +61,6 @@
 {
     LRI = 1000;
     URI = 700;
-//    VRP = 200;
-//    ARP = 50;
-//    AVI = 150;
-//    PVARP = 300;
 }
 
 void Rx_interrupt()
@@ -95,29 +88,30 @@
 }
 
 // Function to toggle the LEDs 1,2,3,4
-void toggleLed(int led)
+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 == 0xA) {
             asense_led = 1;
             Thread::wait(wait_period);
             asense_led = 0;
-            break;
-        case (2):
+        } else if (evt == 0xB) {
             vsense_led = 1;
             Thread::wait(wait_period);
             vsense_led = 0;
-            break;
-        case (3):
+        } else if (evt == 0xC) {
             apace_led = 1;
             Thread::wait(wait_period);
             apace_led = 0;
-            break;
-        case (4):
+        } else if (evt == 0xD) {
             vpace_led = 1;
             Thread::wait(wait_period);
             vpace_led = 0;
-            break;
+        }
     }
 }
 
@@ -142,11 +136,11 @@
         lcd.cls();
 
         hr_mutex.lock();
-        int hr = (heart_beats*60) / (observation_interval / 1000);
+        double hr = (heart_beats*60) / (observation_interval / 1000);
         heart_beats = 0;
         hr_mutex.unlock();
 
-        lcd.printf("%s%d%s","HR: ", hr, " bpm");
+        lcd.printf("%s%d%s","HR: ", (int)hr, " bpm");
 
         if (hr > upperBound) {
             osSignalSet(alarmTid, 0xb);
@@ -171,38 +165,6 @@
 }
 
 
-// Timer-driven function to pace the Atrial
-void a_pace(void const*)
-{
-    Apace = 1;
-    aClock.reset();
-//    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);
-    Vpace = 0;
-
-    hr_mutex.lock();
-    osSignalSet(signalTid, 0x4);
-    heart_beats++;
-    hr_mutex.unlock();
-
-    toggleLed(4);
-}
-
-
-
 void PaceSignal(void const *args)
 {
     int pFlag1 = 0;
@@ -210,141 +172,145 @@
     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
+                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
                 pFlag2 = 1;
             }
         }
         pFlag2 = 0;
-        lcd.cls();
-        lcd.printf("PS2");
     }
 }
 
-
 void PaceSense(void const *args)
 {
     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);
+                osSignalSet(ledTid, 0xC);
+
+                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);
+                osSignalSet(ledTid, 0xA);
                 pFlag1 = 1;
             } else if(evt == 0x2) { //vSense
-                toggleLed(evt);
+                osSignalSet(ledTid, 0xB);
+            } 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);
+                osSignalSet(ledTid, 0xD);
                 pFlag2 = 1;
+
             } else if (evt == 0x1) { //aSense
-                toggleLed(evt);
+                osSignalSet(ledTid, 0xA);
             } else if(evt == 0x2) { //vSense
-                toggleLed(evt);
+                osSignalSet(ledTid, 0xB);
+                pFlag2 = 1;
+            } else if (evt == 0x4) { //vpace
                 pFlag2 = 1;
             }
         }
         pFlag2 = 0;
-        lcd.cls();
-        lcd.printf("PS4");
     }
 }
 
@@ -352,25 +318,20 @@
 {
     initialize_intervals();
     mode = 'n';
-    lcd.printf("N");
     upperBound = 100; //beats per msecond
     lowerBound = 40; //beats per msecond
-    //reset obs interval
     hr_mutex.lock();
     heart_beats = 0;
     hr_mutex.unlock();
 
     vClock.reset();
     aClock.reset();
-//    vpace_timer->start(LRI);
-//    apace_timer->start(LRI-AVI);
 }
 
 void exercisemode(void const *args)
 {
     initialize_intervals();
     mode = 'e';
-    lcd.printf("E");
     upperBound = 175; //beats per msecond
     lowerBound = 100; //beats per msecond
     ratio = (175.00/100.00 + 100.00/40.00) / 2.00;
@@ -383,61 +344,58 @@
 
     vClock.reset();
     aClock.reset();
-//    vpace_timer->start(LRI);
-//    apace_timer->start(LRI-AVI);
 }
 
 void sleepmode(void const *args)
 {
     initialize_intervals();
     mode = 's';
-    lcd.printf("S");
     upperBound = 60; //beats per msecond
     lowerBound = 30; //beats per msecond v-v 0.5s
     ratio = (60.00/100.00 + 30.00/40.00) / 2.00;
     LRI /= ratio;
     URI /= ratio;
-    //reset obs interval
     hr_mutex.lock();
     heart_beats = 0;
     hr_mutex.unlock();
 
     vClock.reset();
     aClock.reset();
-//    vpace_timer->start(LRI);
-//    apace_timer->start(LRI-AVI);
 }
 
 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);
+
+    osSignalSet(ledTid, 0xD);
 }
 
 void m_apace()
 {
     aClock.reset();
+    arpClock.reset();
     Apace = 1;
     Thread::wait(1);
     Apace = 0;
+    osSignalSet(senseTid, 0x3);
     osSignalSet(signalTid, 0x3);
-    
-    toggleLed(3);
+    osSignalSet(ledTid, 0xC);
 }
 
 void manualmode(void const *args)
 {
     upperBound = 175; //beats per msecond
     lowerBound = 30; //beats per msecond
-    lcd.printf("M");
     mode = 'm';
     LRI = 2125; // max V-V (LRI) based on exercise mode
     URI = 675; // min V-V (URI) based on sleep mode
@@ -471,9 +429,16 @@
                 int obsint;
                 newObsInt[i] = '\0';
                 sscanf(newObsInt, "%d", &obsint);
-                observation_interval = (obsint > 0 ) ? obsint: 1;
+
+                if(obsint < 300) {
+                    observation_interval = 300.0;
+                } else if (obsint > 10000) {
+                    observation_interval = 10000.0;
+                } else {
+                    observation_interval = (double)obsint;
+                }
                 isChangingObsInt = 0;
-                lcd.printf("%d", observation_interval);
+
             }
         }
     }
@@ -482,17 +447,10 @@
 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);
 
 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()
 {
@@ -500,73 +458,56 @@
     senseTid = osThreadCreate(osThread(PaceSense), NULL);
     signalTid = osThreadCreate(osThread(PaceSignal), NULL);
     displayTid = osThreadCreate(osThread(displayThread), NULL);
-//    pacemodeTid = osThreadCreate(osThread(normalmode), NULL);
+    ledTid = osThreadCreate(osThread(ledThread), 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);
-
     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");
+                    osSignalSet(senseTid, 0x5);
                     osThreadTerminate (pacemodeTid);
                     osThreadTerminate (displayTid);
-//                    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("paceS");
+                    osSignalSet(senseTid, 0x5);
                     osThreadTerminate (pacemodeTid);
                     osThreadTerminate (displayTid);
-//                    pacemodeTid = osThreadCreate(osThread(sleepmode), NULL);
                     sleepmode(NULL);
                     displayTid = osThreadCreate(osThread(displayThread), NULL);
                     break;
                 case('e'):
                     mm_flag = 0;
-                    lcd.printf("paceE");
+                    osSignalSet(senseTid, 0x5);
                     osThreadTerminate (pacemodeTid);
                     osThreadTerminate (displayTid);
-//                    pacemodeTid = osThreadCreate(osThread(exercisemode), NULL);
                     exercisemode(NULL);
                     displayTid = osThreadCreate(osThread(displayThread), NULL);
-                    lcd.printf("%d", observation_interval);
                     break;
                 case('m'):
                     mm_flag = 1;
                     osThreadTerminate (pacemodeTid);
-                    //osThreadTerminate (displayTid);
-//                    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");
-                    hr_mutex.lock();
                     obsinterval();
-                    hr_mutex.unlock();
                     osThreadTerminate (displayTid);
                     displayTid = osThreadCreate(osThread(displayThread), NULL);
                     break;
             }
         }
     }
-}
+}
\ No newline at end of file