HAHAHAHHA

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541-pacemaker-heart by Terry Fang

Revision:
3:1498846197ee
Parent:
2:18b496a20413
Child:
4:cf40000fdac1
--- a/main.cpp	Mon Dec 05 03:11:53 2016 +0000
+++ b/main.cpp	Wed Dec 07 15:09:32 2016 +0000
@@ -2,79 +2,95 @@
 #include "rtos.h"
 #include "TextLCD.h"
 
- 
 LocalFileSystem local("local");
 
- 
 InterruptIn vpace(p5);
 InterruptIn apace(p6);
 DigitalOut vsignal(p7);
 DigitalOut asignal(p8);
 
- 
 DigitalOut asignal_led(LED1);
 DigitalOut vsignal_led(LED2);
 DigitalOut apace_led(LED3);
 DigitalOut vpace_led(LED4);
 
- 
 Thread *heartmodeThread;
 osThreadId heartmodeTid;
+osThreadId beats;
+osThreadId displayTid;
+osThreadId HeartSenseTid;
+Timer vClock;
 
- 
 Queue<char,256> mode_q;
 Queue<char,256> signal_q;
-
+Queue<char,256> obsint_q;
 
-Queue<char,256> obsint_q;
- 
 FILE * testresults;
 
- 
-/////////////////
 TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
 RawSerial pc(USBTX, USBRX);
 char key = 'n';
 int manual_mode;
 
- 
-int observation_interval = 10;
-/////////////////
 volatile char c;
 volatile int mm = 0;
 
-volatile int om = 0;    
+volatile int om = 0;
 int lri = 1000;
 int uri = 700;
 int avi = 150;
 int pvarp = 300;
-int vrp = 200;
+int vrp = 100;
 int arp = 50;
 
- 
+
 int twait = 10;
 int thrsh = 1000;
 int heartmode = 0;
+int v_flag = 0;
+int observation_interval = 10000; // In miliseconds
 
 int heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval
 Mutex hr_mutex; //hr_mutex.lock()/unlock()
 
- 
- 
+void HeartSense(void const *args)
+{
+    while(1) {
+        osEvent ext_signal = osSignalWait(0, osWaitForever);
+        int evt2 = ext_signal.value.signals;
+
+        switch(evt2) {
+            case(0x1):
+                vpace_led = 1;
+                v_flag = 1;
+                Thread::wait(twait);
+                vpace_led = 0;
+                v_flag = 0;
+                break;
+
+            case(0x10):
+                apace_led = 1;
+                Thread::wait(twait);
+                apace_led = 0;
+                break;
+        }
+    }
+}
+
 void vpace_irq()
 {
     //heartmodeThread->signal_set(0x1);
-    osSignalSet(heartmodeTid, 0x1);
+    osSignalSet(HeartSenseTid, 0x1);
 }
 
- 
+
 void apace_irq()
 {
     //heartmodeThread->signal_set(0x10);
-    osSignalSet(heartmodeTid, 0x10);
+    osSignalSet(HeartSenseTid, 0x10);
 }
 
- 
+
 void Rx_interrupt()
 {
     while(pc.readable()) {
@@ -101,24 +117,38 @@
 
 void displayThread(void const *args)
 {
-    ///////////////////////////////////////////////////////////////////////////
-    ///////////////////////////////////////////////////////////////////////////
-    //////////////////////////////need to implement heart_beats counts in code
-    ///////////////////////////////////////////////////////////////////////////
-    ///////////////////////////////////////////////////////////////////////////
+
     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");
     }
 }
- 
+
+void h_beats(void const *args)
+{
+    vClock.start();
+    while(1) {
+        if(vsignal == 1 && vClock.read_ms() >= vrp) {
+            v_flag = 1;
+        }
+
+        if(v_flag == 1) { //osSignalWait(0x1, osWaitForever); when vpace happens, v_flag is set and beats++
+            hr_mutex.lock();
+            heart_beats++;
+            hr_mutex.unlock();
+            vClock.reset();
+            v_flag = 0;
+        }
+    }
+}
+
 void test_vrp_vv(FILE * results, Timer * ti)
 {
     int vrpwait = vrp/2;
@@ -130,11 +160,13 @@
     apace_led = 0;
     osSignalWait(0x1, osWaitForever);
     ti->reset();
+    v_flag = 1;
     vpace_led = 1;
     Thread::wait(twait);
+    v_flag = 0;
     vpace_led = 0;
 
- 
+
     Thread::wait(vrpwait);
     vsignal = 1;
     vsignal_led = 1;
@@ -143,7 +175,7 @@
     vsignal_led = 0;
     vsignal = 0;
 
- 
+
     Thread::wait(vrpwait);
     vsignal = 1;
     difl = ti->read_us();
@@ -153,7 +185,7 @@
     vsignal = 0;
     vsignal_led = 0;
 
- 
+
     osSignalWait(0x10, osWaitForever);
     adifu = ti->read_us();
     apace_led = 1;
@@ -161,15 +193,17 @@
     Thread::wait(twait);
     apace_led = 0;
 
- 
+
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
+    v_flag = 1;
     fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     int adif = adifu-difl;
     int vdif = vdifu-difl;
     const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -177,10 +211,10 @@
                         (vdif >= (lri*1000 - thrsh)) &&
                         (vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
 
- 
+
     fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
 
- 
+
 }
 void test_pvarp_aa(FILE * results, Timer * ti)
 {
@@ -194,10 +228,12 @@
     osSignalWait(0x1, osWaitForever);
     ti->reset();
     vpace_led = 1;
+    v_flag = 1;
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     Thread::wait(pvarpwait);
     asignal = 1;
     asignal_led = 1;
@@ -206,7 +242,7 @@
     asignal_led = 0;
     asignal = 0;
 
- 
+
     Thread::wait(pvarpwait);
     asignal = 1;
     //difl = ti->read_us();
@@ -216,24 +252,26 @@
     asignal_led = 0;
     asignal = 0;
 
- 
+
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
+    v_flag = 1;
     fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     int vdif = vdifu;
     const char * res = ((vdif >= (uri*1000 - thrsh)) &&
                         (vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
 
- 
+
     fprintf(results, "\nResult: %s %d\n\n", res, vdif);
 }
 
- 
+
 void test_pvarp_arp_aaa(FILE * results, Timer * ti)
 {
     int arpwait = arp/2;
@@ -246,10 +284,12 @@
     osSignalWait(0x1, osWaitForever);
     ti->reset();
     vpace_led = 1;
+    v_flag = 1;
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     Thread::wait(pvarp);
     asignal = 1;
     asignal_led = 1;
@@ -258,7 +298,7 @@
     asignal_led = 0;
     asignal = 0;
 
- 
+
     Thread::wait(arpwait);
     asignal = 1;
     asignal_led = 1;
@@ -267,7 +307,7 @@
     asignal_led = 0;
     asignal = 0;
 
- 
+
     Thread::wait(arpwait);
     asignal = 1;
     asignal_led = 1;
@@ -276,24 +316,26 @@
     asignal_led = 0;
     asignal = 0;
 
- 
+
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
+    v_flag = 1;
     fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     int vdif = vdifu;
     const char * res = ((vdif >= (uri*1000 - thrsh)) &&
                         (vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
 
- 
+
     fprintf(results, "\nResult: %s %d\n\n", res, vdif);
 }
 
- 
+
 void test_pvarp_arp_aav(FILE * results, Timer * ti)
 {
     int adifu,vdifu,difl = 0;
@@ -305,10 +347,12 @@
     osSignalWait(0x1, osWaitForever);
     ti->reset();
     vpace_led = 1;
+    v_flag = 1;
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     Thread::wait(pvarp);
     asignal = 1;
     asignal_led = 1;
@@ -317,7 +361,7 @@
     asignal_led = 0;
     asignal = 0;
 
- 
+
     Thread::wait(arp);
     asignal = 1;
     asignal_led = 1;
@@ -326,7 +370,7 @@
     asignal_led = 0;
     asignal = 0;
 
- 
+
     Thread::wait(20);
     vsignal = 1;
     difl = ti->read_us();
@@ -336,7 +380,7 @@
     vsignal = 0;
     vsignal_led = 0;
 
- 
+
     osSignalWait(0x10, osWaitForever);
     adifu = ti->read_us();
     apace_led = 1;
@@ -344,15 +388,17 @@
     Thread::wait(twait);
     apace_led = 0;
 
- 
+
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
+    v_flag = 1;
     fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     int adif = adifu-difl;
     int vdif = vdifu-difl;
     const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -360,13 +406,13 @@
                         (vdif >= (lri*1000 - thrsh)) &&
                         (vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
 
- 
+
     fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
 
- 
+
 }
 
- 
+
 void test_vpace_after_a(FILE * results, Timer * ti)
 {
     int vdifu = 0;
@@ -378,10 +424,12 @@
     osSignalWait(0x1, osWaitForever);
     ti->reset();
     vpace_led = 1;
+    v_flag = 1;
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     Thread::wait(pvarp);
     asignal = 1;
     asignal_led = 1;
@@ -390,24 +438,26 @@
     asignal_led = 0;
     asignal = 0;
 
- 
+
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
+    v_flag = 1;
     fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     int vdif = vdifu;
     const char * res = ((vdif >= (uri*1000 - thrsh)) &&
                         (vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
 
- 
+
     fprintf(results, "\nResult: %s %d\n\n", res, vdif);
 }
 
- 
+
 void test_apace_vpace_av(FILE * results, Timer * ti)
 {
     fprintf(results, "Test APACE After V\n\n  Time    Action\n");
@@ -419,10 +469,11 @@
     osSignalWait(0x1, osWaitForever);
     ti->reset();
     vpace_led = 1;
+    v_flag = 1;
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
     osSignalWait(0x10, osWaitForever);
     adifu = ti->read_us();
     apace_led = 1;
@@ -430,15 +481,17 @@
     Thread::wait(twait);
     apace_led = 0;
 
- 
+
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
+    v_flag = 1;
     fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     int adif = adifu;
     int vdif = vdifu;
     const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -446,11 +499,11 @@
                         (vdif >= (lri*1000 - thrsh)) &&
                         (vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
 
- 
+
     fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
 }
 
- 
+
 void test_avi_a(FILE * results, Timer * ti)
 {
     int vdifu,difl = 0;
@@ -462,10 +515,12 @@
     osSignalWait(0x1, osWaitForever);
     ti->reset();
     vpace_led = 1;
+    v_flag = 1;
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     Thread::wait(uri);
     asignal = 1;
     difl = ti->read_us();
@@ -475,26 +530,28 @@
     asignal_led = 0;
     asignal = 0;
 
- 
+
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
+    v_flag = 1;
     fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     int vpc = (avi*1000) + difl;
     const char * res = ((vpc >= (vdifu - thrsh)) &&
                         (vpc < (vdifu + thrsh))) ? "Passed": "Failed";
 
- 
+
     fprintf(results, "\nResult: %s %d\n\n", res, vpc);
 
- 
+
 }
 
- 
+
 void test_uri_a(FILE * results, Timer * ti)
 {
     int vdifu = 0;
@@ -506,10 +563,12 @@
     osSignalWait(0x1, osWaitForever);
     ti->reset();
     vpace_led = 1;
+    v_flag = 1;
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     Thread::wait(pvarp);
     asignal = 1;
     asignal_led = 1;
@@ -518,26 +577,28 @@
     asignal_led = 0;
     asignal = 0;
 
- 
+
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
+    v_flag = 1;
     fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     int vdif = vdifu;
     const char * res = ((vdif >= (uri*1000 - thrsh)) &&
                         (vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
 
- 
+
     fprintf(results, "\nResult: %s %d\n\n", res, vdif);
 
- 
+
 }
 
- 
+
 void test_normal_10(FILE * results, Timer * ti)
 {
     fprintf(results, "  Test Normal x10\n\n  Time    Action\n");
@@ -549,10 +610,12 @@
     osSignalWait(0x1, osWaitForever);
     ti->reset();
     vpace_led = 1;
+    v_flag = 1;
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     while(i < 10) {
         Thread::wait(pvarp);
         asignal = 1;
@@ -562,7 +625,7 @@
         asignal_led = 0;
         asignal = 0;
 
- 
+
         Thread::wait(75);
         vsignal = 1;
         difl = ti->read_us();
@@ -574,7 +637,7 @@
         i = i+1;
     }
 
- 
+
     osSignalWait(0x10, osWaitForever);
     adifu = ti->read_us();
     apace_led = 1;
@@ -582,15 +645,17 @@
     Thread::wait(twait);
     apace_led = 0;
 
- 
+
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
+    v_flag = 1;
     fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
     Thread::wait(twait);
     vpace_led = 0;
+    v_flag = 0;
 
- 
+
     int adif = adifu - difl;
     int vdif = vdifu - difl;
     const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -598,19 +663,19 @@
                         (vdif >= (lri*1000 - thrsh)) &&
                         (vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
 
- 
+
     fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
 }
 
- 
+
 void testmode(void const *args)
 {
     Timer *t;
-    testresults = fopen("/local/testreport.txt", "w");  // Open "out.txt" on the local file system for writing
+    testresults = fopen("/local/test.txt", "w");  // Open "out.txt" on the local file system for writing
     t = new Timer();
     t->start();
 
- 
+
     test_vrp_vv(testresults, t);
     test_pvarp_aa(testresults, t);
     test_pvarp_arp_aaa(testresults, t);
@@ -624,31 +689,27 @@
 }
 
 
- 
- 
+
+
 void randommode(void const *args)
 {
     int aorv,sig = 0;
     Timer at,vt;
 
- 
     at.start();
     vt.start();
 
- 
     //osEvent ext_signal = osSignalWait(0, 1);
     //int evt = ext_signal.value.signals;
     //osSignalSet(heartmodeTid, 0x1);
     //osSignalWait(0, osWaitForever);
     while(heartmode == 0) {
         aorv = (float)(rand()%2);
-        sig = aorv ? rand()%(lri - avi - at.read_ms()) : rand()%(lri - vt.read_ms());
+        sig = aorv ? rand()%(lri - avi) : rand()%(lri);
 
- 
         osEvent ext_signal = osSignalWait(0, sig);
         int evt = ext_signal.value.signals;
 
- 
         switch(evt) {
             case(0x0):
                 if(aorv) {
@@ -668,29 +729,31 @@
                     vsignal = 0;
                     break;
                 }
-            case(0x1):
-                at.reset();
-                vt.reset();
-                vpace_led = 1;
-                Thread::wait(twait);
-                vpace_led = 0;
-                break;
+//            case(0x1):
+//                at.reset();
+//                vt.reset();
+//                vpace_led = 1;
+//                v_flag = 1;
+//                Thread::wait(twait);
+//                vpace_led = 0;
+//                v_flag = 0;
+//                break;
+//
+//
+//            case(0x10):
+//                apace_led = 1;
+//                Thread::wait(twait);
+//                apace_led = 0;
+//                break;
 
- 
-            case(0x10):
-                apace_led = 1;
-                Thread::wait(twait);
-                apace_led = 0;
-                break;
 
- 
 //            case(0x100):
 //
         }
     }
 }
 
- 
+
 void manualmode(void const *args)
 {
     while(1) {
@@ -713,7 +776,6 @@
     }
 }
 
-
 void obsinterval()
 {
     char newObsInt[8];
@@ -723,55 +785,59 @@
         osEvent evt = obsint_q.get();
         if(evt.status == osEventMessage) {
             key = (char)evt.value.p;
-            if(key != '\r' && i < 7 ){
+            if(key != '\r' && i < 7 ) {
                 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(randommode, osPriorityNormal, DEFAULT_STACK_SIZE);
 osThreadDef(testmode, osPriorityNormal, DEFAULT_STACK_SIZE);
 osThreadDef(manualmode, osPriorityNormal, DEFAULT_STACK_SIZE);
+osThreadDef(h_beats, osPriorityNormal, DEFAULT_STACK_SIZE);
+osThreadDef(displayThread, osPriorityNormal, DEFAULT_STACK_SIZE);
+osThreadDef(HeartSense, osPriorityNormal, DEFAULT_STACK_SIZE);
 
- 
 int main()
 {
     vpace.rise(&vpace_irq);
     apace.rise(&apace_irq);
 
- 
     pc.attach(&Rx_interrupt, RawSerial::RxIrq);
 
-
     //heartmodeThread = new Thread();
- 
+
     //Callback<void()> testmodeTask((void*)NULL,(void (*)(void *))&testmode);
 
- 
+    HeartSenseTid = osThreadCreate(osThread(HeartSense), NULL);
     heartmodeTid = osThreadCreate(osThread(randommode), NULL);
+    beats = osThreadCreate(osThread(h_beats), NULL);
+    displayTid = osThreadCreate(osThread(displayThread), NULL);
 //    heartmodeTid = osThreadCreate(osThread(testmode), NULL);
 //    heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
 
-//    lcd.printf();
     while(true) {
-//        while(pc.readable()) {
-//            key = pc.getc();
         osEvent evt = mode_q.get();
         if(evt.status == osEventMessage) {
             switch((char)evt.value.p) {
                     //pvarp = 0.3s
                 case('r'):
                     lcd.printf("R");
-//                    randommode.terminate();
                     osThreadTerminate (heartmodeTid);
+                    osThreadTerminate (displayTid);
                     if (testresults != NULL) {
                         fclose(testresults);
                     }
@@ -780,13 +846,14 @@
                     apace_led = 0;
                     vpace_led = 0;
 
- 
+                    displayTid = osThreadCreate(osThread(displayThread), NULL);
                     heartmodeTid = osThreadCreate(osThread(randommode), NULL);
 //                    Thread::wait(100);
                     break;
                 case('t'):
                     lcd.printf("T");
                     osThreadTerminate (heartmodeTid);
+                    osThreadTerminate (displayTid);
                     if (testresults != NULL) {
                         fclose(testresults);
                     }
@@ -795,12 +862,13 @@
                     apace_led = 0;
                     vpace_led = 0;
 
- 
+                    displayTid = osThreadCreate(osThread(displayThread), NULL);
                     heartmodeTid = osThreadCreate(osThread(testmode), NULL);
                     break;
                 case('m'):
                     lcd.printf("M");
                     osThreadTerminate (heartmodeTid);
+                    osThreadTerminate (displayTid);
                     if (testresults != NULL) {
                         fclose(testresults);
                     }
@@ -809,15 +877,17 @@
                     apace_led = 0;
                     vpace_led = 0;
 
- 
+                    displayTid = osThreadCreate(osThread(displayThread), NULL);
                     heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
                     manual_mode = 1;
 
- 
+
                     break;
                 case('o'):
                     lcd.printf("modeO");
                     obsinterval();
+                    osThreadTerminate (displayTid);
+                    displayTid = osThreadCreate(osThread(displayThread), NULL);
                     break;
             }
         }