HAHAHAHHA

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541-pacemaker-heart by Terry Fang

Revision:
1:57cd3ae5f44a
Parent:
0:da581483b90d
Child:
2:18b496a20413
--- a/main.cpp	Thu Dec 01 05:02:25 2016 +0000
+++ b/main.cpp	Fri Dec 02 21:39:47 2016 +0000
@@ -17,15 +17,21 @@
 Thread *heartmodeThread;
 osThreadId heartmodeTid;
 
+Queue<char,256> mode_q;
+Queue<char,256> signal_q;
+
+
+FILE * testresults;
+
 /////////////////
 TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
 RawSerial pc(USBTX, USBRX);
 char key = 'n';
-char c;
 int manual_mode;
 int isChangingObsInt;
 /////////////////
-
+volatile char c;
+volatile int mm = 0;
 
 int lri = 1000;
 int uri = 700;
@@ -37,6 +43,8 @@
 int twait = 10;
 int thrsh = 1000;
 int heartmode = 0;
+
+
 void vpace_irq()
 {
     //heartmodeThread->signal_set(0x1);
@@ -49,6 +57,28 @@
     osSignalSet(heartmodeTid, 0x10);
 }
 
+
+
+void Rx_interrupt()
+{
+    while(pc.readable()) {
+        c = pc.getc();
+        if(c == 'm') {
+            mode_q.put((char*)c);
+            mm = 1;
+        } else if(c == 'r' || c == 't') {
+            mode_q.put((char*)c);
+            mm = 0;
+        } else if((c == 'a' || c == 'v') && mm) {
+            signal_q.put((char*)c);
+        }
+    }
+}
+
+
+
+
+
 void test_vrp_vv(FILE * results, Timer * ti)
 {
     int vrpwait = vrp/2;
@@ -478,7 +508,7 @@
 void testmode(void const *args)
 {
     Timer *t;
-    FILE * testresults = fopen("/local/testreport.txt", "w");  // Open "out.txt" on the local file system for writing
+    testresults = fopen("/local/testreport.txt", "w");  // Open "out.txt" on the local file system for writing
     t = new Timer();
     t->start();
 
@@ -546,70 +576,101 @@
                 Thread::wait(twait);
                 apace_led = 0;
                 break;
+
+//            case(0x100):
+//
         }
     }
 }
 
-//void Rx_interrupt()
-//{
-//    while(pc.readable()) {
-//        c = pc.getc();
-//        if(c == 'r') {
-//            heartmode = 0;
-//        } else if (heartmode == 0) {
-//            randommode(NULL);
-//        } else if (c == 't') {
-//            heartmode = 1;
-//        } else if (c == 'm') {
-//            heartmode = 2;
-//        } else if (heartmode == 2 && c == 'a') {
-//            asignal = 1;
-//            asignal_led = 1;
-//            Thread::wait(10);
-//            asignal = 0;
-//            asignal_led = 0;
-//        } else if (heartmode == 2 && c == 'v') {
-//            vsignal = 1;
-//            vsignal_led = 1;
-//            Thread::wait(10);
-//            vsignal = 0;
-//            vsignal_led = 0;
-//        }
-//    }
-//}
+void manualmode(void const *args)
+{
+    while(1) {
+        osEvent evt = signal_q.get();
+        if(evt.status == osEventMessage) {
+            if((char)evt.value.p == 'a') {
+                asignal = 1;
+                asignal_led = 1;
+                Thread::wait(twait);
+                asignal_led = 0;
+                asignal = 0;
+            } else if((char)evt.value.p == 'v') {
+                vsignal = 1;
+                vsignal_led = 1;
+                Thread::wait(twait);
+                vsignal = 0;
+                vsignal_led = 0;
+            }
+        }
+    }
+}
 
 
-//osThreadDef(randommode, osPriorityNormal, DEFAULT_STACK_SIZE);
+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);
+    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(randommode), NULL);
+//    heartmodeTid = osThreadCreate(osThread(testmode), NULL);
+//    heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
 //    lcd.printf();
     while(true) {
-        while(pc.readable()) {
-            key = pc.getc();
-            switch(key) {
+//        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(NULL);
+//                    randommode.terminate();
+                    osThreadTerminate (heartmodeTid);
+                    if (testresults != NULL) {
+                        fclose(testresults);
+                    }
+                    asignal_led = 0;
+                    vsignal_led = 0;
+                    apace_led = 0;
+                    vpace_led = 0;
+
+                    heartmodeTid = osThreadCreate(osThread(randommode), NULL);
 //                    Thread::wait(100);
                     break;
                 case('t'):
                     lcd.printf("T");
-                    testmode(NULL);
+                    osThreadTerminate (heartmodeTid);
+                    if (testresults != NULL) {
+                        fclose(testresults);
+                    }
+                    asignal_led = 0;
+                    vsignal_led = 0;
+                    apace_led = 0;
+                    vpace_led = 0;
+
+                    heartmodeTid = osThreadCreate(osThread(testmode), NULL);
                     break;
                 case('m'):
                     lcd.printf("M");
+                    osThreadTerminate (heartmodeTid);
+                    if (testresults != NULL) {
+                        fclose(testresults);
+                    }
+                    asignal_led = 0;
+                    vsignal_led = 0;
+                    apace_led = 0;
+                    vpace_led = 0;
+
+                    heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
                     manual_mode = 1;
 
                     break;
@@ -619,24 +680,5 @@
                     break;
             }
         }
-
-        if(manual_mode) {
-            key = pc.getc();
-            if(key == 'a') {
-                asignal = 1;
-                asignal_led = 1;
-                Thread::wait(twait);
-                asignal_led = 0;
-                asignal = 0;
-            } else if(key == 'v') {
-                vsignal = 1;
-                vsignal_led = 1;
-                Thread::wait(twait);
-                vsignal = 0;
-                vsignal_led = 0;
-            } else if(key == 'q') {
-                manual_mode = 0;
-            }
-        }
     }
 }
\ No newline at end of file