HAHAHAHHA

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541-pacemaker-heart by Terry Fang

Revision:
2:18b496a20413
Parent:
1:57cd3ae5f44a
Child:
3:1498846197ee
--- a/main.cpp	Fri Dec 02 21:39:47 2016 +0000
+++ b/main.cpp	Mon Dec 05 03:11:53 2016 +0000
@@ -2,37 +2,48 @@
 #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;
 
+ 
 Queue<char,256> mode_q;
 Queue<char,256> signal_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 isChangingObsInt;
+
+ 
+int observation_interval = 10;
 /////////////////
 volatile char c;
 volatile int mm = 0;
 
+volatile int om = 0;    
 int lri = 1000;
 int uri = 700;
 int avi = 150;
@@ -40,45 +51,74 @@
 int vrp = 200;
 int arp = 50;
 
+ 
 int twait = 10;
 int thrsh = 1000;
 int heartmode = 0;
 
+int heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval
+Mutex hr_mutex; //hr_mutex.lock()/unlock()
 
+ 
+ 
 void vpace_irq()
 {
     //heartmodeThread->signal_set(0x1);
     osSignalSet(heartmodeTid, 0x1);
 }
 
+ 
 void apace_irq()
 {
     //heartmodeThread->signal_set(0x10);
     osSignalSet(heartmodeTid, 0x10);
 }
 
-
-
+ 
 void Rx_interrupt()
 {
     while(pc.readable()) {
         c = pc.getc();
-        if(c == 'm') {
+        if(c == 'm' && om != 1) {
             mode_q.put((char*)c);
             mm = 1;
-        } else if(c == 'r' || c == 't') {
+        } else if((c == 'r' || c == 't') && om != 1) {
             mode_q.put((char*)c);
             mm = 0;
         } else if((c == 'a' || c == 'v') && mm) {
             signal_q.put((char*)c);
+        } else if(c == 'o' && om != 1) {
+            mode_q.put((char*)c);
+            om = 1;
+        } else if (c == '\r' && om) {
+            obsint_q.put((char*)c);
+            om = 0;
+        } else if ((int)c > 47 && (int)c < 58 && om) {
+            obsint_q.put((char*)c);
         }
     }
 }
 
-
-
-
-
+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 test_vrp_vv(FILE * results, Timer * ti)
 {
     int vrpwait = vrp/2;
@@ -94,6 +134,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     Thread::wait(vrpwait);
     vsignal = 1;
     vsignal_led = 1;
@@ -102,6 +143,7 @@
     vsignal_led = 0;
     vsignal = 0;
 
+ 
     Thread::wait(vrpwait);
     vsignal = 1;
     difl = ti->read_us();
@@ -111,6 +153,7 @@
     vsignal = 0;
     vsignal_led = 0;
 
+ 
     osSignalWait(0x10, osWaitForever);
     adifu = ti->read_us();
     apace_led = 1;
@@ -118,6 +161,7 @@
     Thread::wait(twait);
     apace_led = 0;
 
+ 
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
@@ -125,6 +169,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     int adif = adifu-difl;
     int vdif = vdifu-difl;
     const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -132,8 +177,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)
 {
@@ -150,6 +197,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     Thread::wait(pvarpwait);
     asignal = 1;
     asignal_led = 1;
@@ -158,6 +206,7 @@
     asignal_led = 0;
     asignal = 0;
 
+ 
     Thread::wait(pvarpwait);
     asignal = 1;
     //difl = ti->read_us();
@@ -167,6 +216,7 @@
     asignal_led = 0;
     asignal = 0;
 
+ 
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
@@ -174,13 +224,16 @@
     Thread::wait(twait);
     vpace_led = 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;
@@ -196,6 +249,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     Thread::wait(pvarp);
     asignal = 1;
     asignal_led = 1;
@@ -204,6 +258,7 @@
     asignal_led = 0;
     asignal = 0;
 
+ 
     Thread::wait(arpwait);
     asignal = 1;
     asignal_led = 1;
@@ -212,6 +267,7 @@
     asignal_led = 0;
     asignal = 0;
 
+ 
     Thread::wait(arpwait);
     asignal = 1;
     asignal_led = 1;
@@ -220,6 +276,7 @@
     asignal_led = 0;
     asignal = 0;
 
+ 
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
@@ -227,13 +284,16 @@
     Thread::wait(twait);
     vpace_led = 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;
@@ -248,6 +308,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     Thread::wait(pvarp);
     asignal = 1;
     asignal_led = 1;
@@ -256,6 +317,7 @@
     asignal_led = 0;
     asignal = 0;
 
+ 
     Thread::wait(arp);
     asignal = 1;
     asignal_led = 1;
@@ -264,6 +326,7 @@
     asignal_led = 0;
     asignal = 0;
 
+ 
     Thread::wait(20);
     vsignal = 1;
     difl = ti->read_us();
@@ -273,6 +336,7 @@
     vsignal = 0;
     vsignal_led = 0;
 
+ 
     osSignalWait(0x10, osWaitForever);
     adifu = ti->read_us();
     apace_led = 1;
@@ -280,6 +344,7 @@
     Thread::wait(twait);
     apace_led = 0;
 
+ 
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
@@ -287,6 +352,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     int adif = adifu-difl;
     int vdif = vdifu-difl;
     const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -294,10 +360,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;
@@ -312,6 +381,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     Thread::wait(pvarp);
     asignal = 1;
     asignal_led = 1;
@@ -320,6 +390,7 @@
     asignal_led = 0;
     asignal = 0;
 
+ 
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
@@ -327,13 +398,16 @@
     Thread::wait(twait);
     vpace_led = 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");
@@ -348,6 +422,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     osSignalWait(0x10, osWaitForever);
     adifu = ti->read_us();
     apace_led = 1;
@@ -355,6 +430,7 @@
     Thread::wait(twait);
     apace_led = 0;
 
+ 
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
@@ -362,6 +438,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     int adif = adifu;
     int vdif = vdifu;
     const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -369,9 +446,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;
@@ -386,6 +465,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     Thread::wait(uri);
     asignal = 1;
     difl = ti->read_us();
@@ -395,6 +475,7 @@
     asignal_led = 0;
     asignal = 0;
 
+ 
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
@@ -402,14 +483,18 @@
     Thread::wait(twait);
     vpace_led = 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;
@@ -424,6 +509,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     Thread::wait(pvarp);
     asignal = 1;
     asignal_led = 1;
@@ -432,6 +518,7 @@
     asignal_led = 0;
     asignal = 0;
 
+ 
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
@@ -439,14 +526,18 @@
     Thread::wait(twait);
     vpace_led = 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");
@@ -461,6 +552,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     while(i < 10) {
         Thread::wait(pvarp);
         asignal = 1;
@@ -470,6 +562,7 @@
         asignal_led = 0;
         asignal = 0;
 
+ 
         Thread::wait(75);
         vsignal = 1;
         difl = ti->read_us();
@@ -481,6 +574,7 @@
         i = i+1;
     }
 
+ 
     osSignalWait(0x10, osWaitForever);
     adifu = ti->read_us();
     apace_led = 1;
@@ -488,6 +582,7 @@
     Thread::wait(twait);
     apace_led = 0;
 
+ 
     osSignalWait(0x1, osWaitForever);
     vdifu = ti->read_us();
     vpace_led = 1;
@@ -495,6 +590,7 @@
     Thread::wait(twait);
     vpace_led = 0;
 
+ 
     int adif = adifu - difl;
     int vdif = vdifu - difl;
     const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -502,9 +598,11 @@
                         (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;
@@ -512,6 +610,7 @@
     t = new Timer();
     t->start();
 
+ 
     test_vrp_vv(testresults, t);
     test_pvarp_aa(testresults, t);
     test_pvarp_arp_aaa(testresults, t);
@@ -525,14 +624,18 @@
 }
 
 
+ 
+ 
 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);
@@ -541,9 +644,11 @@
         aorv = (float)(rand()%2);
         sig = aorv ? rand()%(lri - avi - at.read_ms()) : rand()%(lri - vt.read_ms());
 
+ 
         osEvent ext_signal = osSignalWait(0, sig);
         int evt = ext_signal.value.signals;
 
+ 
         switch(evt) {
             case(0x0):
                 if(aorv) {
@@ -571,18 +676,21 @@
                 vpace_led = 0;
                 break;
 
+ 
             case(0x10):
                 apace_led = 1;
                 Thread::wait(twait);
                 apace_led = 0;
                 break;
 
+ 
 //            case(0x100):
 //
         }
     }
 }
 
+ 
 void manualmode(void const *args)
 {
     while(1) {
@@ -606,23 +714,52 @@
 }
 
 
+void obsinterval()
+{
+    char newObsInt[8];
+    int isChangingObsInt = 1;
+    int i = 0;
+    while(isChangingObsInt) {
+        osEvent evt = obsint_q.get();
+        if(evt.status == osEventMessage) {
+            key = (char)evt.value.p;
+            if(key != '\r' && i < 7 ){
+                newObsInt[i] = key;
+                i++;
+            } else if((key == '\r') && (i > 0)) {
+                int obsint;
+                newObsInt[i] = '\0';
+                sscanf(newObsInt, "%d", &obsint);
+                observation_interval = (obsint > 0 ) ? obsint: 1;
+                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);
 
+ 
 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);
 
+ 
     heartmodeTid = osThreadCreate(osThread(randommode), NULL);
 //    heartmodeTid = osThreadCreate(osThread(testmode), NULL);
 //    heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
+
 //    lcd.printf();
     while(true) {
 //        while(pc.readable()) {
@@ -643,6 +780,7 @@
                     apace_led = 0;
                     vpace_led = 0;
 
+ 
                     heartmodeTid = osThreadCreate(osThread(randommode), NULL);
 //                    Thread::wait(100);
                     break;
@@ -657,6 +795,7 @@
                     apace_led = 0;
                     vpace_led = 0;
 
+ 
                     heartmodeTid = osThreadCreate(osThread(testmode), NULL);
                     break;
                 case('m'):
@@ -670,13 +809,15 @@
                     apace_led = 0;
                     vpace_led = 0;
 
+ 
                     heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
                     manual_mode = 1;
 
+ 
                     break;
                 case('o'):
-                    isChangingObsInt = 1;
-                    lcd.printf("O");
+                    lcd.printf("modeO");
+                    obsinterval();
                     break;
             }
         }