HAHAHAHHA

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541-pacemaker-heart by Terry Fang

Revision:
0:da581483b90d
Child:
1:57cd3ae5f44a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Dec 01 05:02:25 2016 +0000
@@ -0,0 +1,642 @@
+#include "mbed.h"
+#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;
+
+/////////////////
+TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
+RawSerial pc(USBTX, USBRX);
+char key = 'n';
+char c;
+int manual_mode;
+int isChangingObsInt;
+/////////////////
+
+
+int lri = 1000;
+int uri = 700;
+int avi = 150;
+int pvarp = 300;
+int vrp = 200;
+int arp = 50;
+
+int twait = 10;
+int thrsh = 1000;
+int heartmode = 0;
+void vpace_irq()
+{
+    //heartmodeThread->signal_set(0x1);
+    osSignalSet(heartmodeTid, 0x1);
+}
+
+void apace_irq()
+{
+    //heartmodeThread->signal_set(0x10);
+    osSignalSet(heartmodeTid, 0x10);
+}
+
+void test_vrp_vv(FILE * results, Timer * ti)
+{
+    int vrpwait = vrp/2;
+    int adifu,vdifu,difl = 0;
+    fprintf(results, "   Test VRP VV\n\n  Time    Action\n");
+    osSignalWait(0x10, osWaitForever);
+    apace_led = 1;
+    Thread::wait(twait);
+    apace_led = 0;
+    osSignalWait(0x1, osWaitForever);
+    ti->reset();
+    vpace_led = 1;
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    Thread::wait(vrpwait);
+    vsignal = 1;
+    vsignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VS");
+    Thread::wait(twait);
+    vsignal_led = 0;
+    vsignal = 0;
+
+    Thread::wait(vrpwait);
+    vsignal = 1;
+    difl = ti->read_us();
+    vsignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VS");
+    Thread::wait(twait);
+    vsignal = 0;
+    vsignal_led = 0;
+
+    osSignalWait(0x10, osWaitForever);
+    adifu = ti->read_us();
+    apace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AP");
+    Thread::wait(twait);
+    apace_led = 0;
+
+    osSignalWait(0x1, osWaitForever);
+    vdifu = ti->read_us();
+    vpace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    int adif = adifu-difl;
+    int vdif = vdifu-difl;
+    const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
+                        (adif < ((lri-avi)*1000 + thrsh)) &&
+                        (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)
+{
+    int pvarpwait = pvarp/2;
+    int vdifu = 0;
+    fprintf(results, "  Test PVARP AA\n\n  Time    Action\n");
+    osSignalWait(0x10, osWaitForever);
+    apace_led = 1;
+    Thread::wait(twait);
+    apace_led = 0;
+    osSignalWait(0x1, osWaitForever);
+    ti->reset();
+    vpace_led = 1;
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    Thread::wait(pvarpwait);
+    asignal = 1;
+    asignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+    Thread::wait(twait);
+    asignal_led = 0;
+    asignal = 0;
+
+    Thread::wait(pvarpwait);
+    asignal = 1;
+    //difl = ti->read_us();
+    asignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+    Thread::wait(twait);
+    asignal_led = 0;
+    asignal = 0;
+
+    osSignalWait(0x1, osWaitForever);
+    vdifu = ti->read_us();
+    vpace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
+    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;
+    int vdifu = 0;
+    fprintf(results, "Test PVARP ARP AAA\n\n  Time    Action\n");
+    osSignalWait(0x10, osWaitForever);
+    apace_led = 1;
+    Thread::wait(twait);
+    apace_led = 0;
+    osSignalWait(0x1, osWaitForever);
+    ti->reset();
+    vpace_led = 1;
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    Thread::wait(pvarp);
+    asignal = 1;
+    asignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+    Thread::wait(twait);
+    asignal_led = 0;
+    asignal = 0;
+
+    Thread::wait(arpwait);
+    asignal = 1;
+    asignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+    Thread::wait(twait);
+    asignal_led = 0;
+    asignal = 0;
+
+    Thread::wait(arpwait);
+    asignal = 1;
+    asignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+    Thread::wait(twait);
+    asignal_led = 0;
+    asignal = 0;
+
+    osSignalWait(0x1, osWaitForever);
+    vdifu = ti->read_us();
+    vpace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
+    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;
+    fprintf(results, "Test PVARP ARP AAV\n\n  Time    Action\n");
+    osSignalWait(0x10, osWaitForever);
+    apace_led = 1;
+    Thread::wait(twait);
+    apace_led = 0;
+    osSignalWait(0x1, osWaitForever);
+    ti->reset();
+    vpace_led = 1;
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    Thread::wait(pvarp);
+    asignal = 1;
+    asignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+    Thread::wait(twait);
+    asignal_led = 0;
+    asignal = 0;
+
+    Thread::wait(arp);
+    asignal = 1;
+    asignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+    Thread::wait(twait);
+    asignal_led = 0;
+    asignal = 0;
+
+    Thread::wait(20);
+    vsignal = 1;
+    difl = ti->read_us();
+    vsignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VS");
+    Thread::wait(twait);
+    vsignal = 0;
+    vsignal_led = 0;
+
+    osSignalWait(0x10, osWaitForever);
+    adifu = ti->read_us();
+    apace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AP");
+    Thread::wait(twait);
+    apace_led = 0;
+
+    osSignalWait(0x1, osWaitForever);
+    vdifu = ti->read_us();
+    vpace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    int adif = adifu-difl;
+    int vdif = vdifu-difl;
+    const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
+                        (adif < ((lri-avi)*1000 + thrsh)) &&
+                        (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;
+    fprintf(results, "Test VPACE After A\n\n  Time    Action\n");
+    osSignalWait(0x10, osWaitForever);
+    apace_led = 1;
+    Thread::wait(twait);
+    apace_led = 0;
+    osSignalWait(0x1, osWaitForever);
+    ti->reset();
+    vpace_led = 1;
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    Thread::wait(pvarp);
+    asignal = 1;
+    asignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+    Thread::wait(twait);
+    asignal_led = 0;
+    asignal = 0;
+
+    osSignalWait(0x1, osWaitForever);
+    vdifu = ti->read_us();
+    vpace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
+    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");
+    int adifu,vdifu = 0;
+    osSignalWait(0x10, osWaitForever);
+    apace_led = 1;
+    Thread::wait(twait);
+    apace_led = 0;
+    osSignalWait(0x1, osWaitForever);
+    ti->reset();
+    vpace_led = 1;
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    osSignalWait(0x10, osWaitForever);
+    adifu = ti->read_us();
+    apace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AP");
+    Thread::wait(twait);
+    apace_led = 0;
+
+    osSignalWait(0x1, osWaitForever);
+    vdifu = ti->read_us();
+    vpace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    int adif = adifu;
+    int vdif = vdifu;
+    const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
+                        (adif < ((lri-avi)*1000 + thrsh)) &&
+                        (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;
+    fprintf(results, "   Test AVI\n\n  Time    Action\n");
+    osSignalWait(0x10, osWaitForever);
+    apace_led = 1;
+    Thread::wait(twait);
+    apace_led = 0;
+    osSignalWait(0x1, osWaitForever);
+    ti->reset();
+    vpace_led = 1;
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    Thread::wait(uri);
+    asignal = 1;
+    difl = ti->read_us();
+    asignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+    Thread::wait(twait);
+    asignal_led = 0;
+    asignal = 0;
+
+    osSignalWait(0x1, osWaitForever);
+    vdifu = ti->read_us();
+    vpace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
+    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;
+    fprintf(results, "   Test URI\n\n  Time    Action\n");
+    osSignalWait(0x10, osWaitForever);
+    apace_led = 1;
+    Thread::wait(twait);
+    apace_led = 0;
+    osSignalWait(0x1, osWaitForever);
+    ti->reset();
+    vpace_led = 1;
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    Thread::wait(pvarp);
+    asignal = 1;
+    asignal_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+    Thread::wait(twait);
+    asignal_led = 0;
+    asignal = 0;
+
+    osSignalWait(0x1, osWaitForever);
+    vdifu = ti->read_us();
+    vpace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
+    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");
+    int adifu,vdifu,difl,i = 0;
+    osSignalWait(0x10, osWaitForever);
+    apace_led = 1;
+    Thread::wait(twait);
+    apace_led = 0;
+    osSignalWait(0x1, osWaitForever);
+    ti->reset();
+    vpace_led = 1;
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    while(i < 10) {
+        Thread::wait(pvarp);
+        asignal = 1;
+        asignal_led = 1;
+        fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
+        Thread::wait(twait);
+        asignal_led = 0;
+        asignal = 0;
+
+        Thread::wait(75);
+        vsignal = 1;
+        difl = ti->read_us();
+        vsignal_led = 1;
+        fprintf(results, "%6d%8s\n", ti->read_ms(), "VS");
+        Thread::wait(twait);
+        vsignal = 0;
+        vsignal_led = 0;
+        i = i+1;
+    }
+
+    osSignalWait(0x10, osWaitForever);
+    adifu = ti->read_us();
+    apace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "AP");
+    Thread::wait(twait);
+    apace_led = 0;
+
+    osSignalWait(0x1, osWaitForever);
+    vdifu = ti->read_us();
+    vpace_led = 1;
+    fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
+    Thread::wait(twait);
+    vpace_led = 0;
+
+    int adif = adifu - difl;
+    int vdif = vdifu - difl;
+    const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
+                        (adif < ((lri-avi)*1000 + thrsh)) &&
+                        (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;
+    FILE * testresults = fopen("/local/testreport.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);
+    test_pvarp_arp_aav(testresults, t);
+    test_vpace_after_a(testresults, t);
+    test_apace_vpace_av(testresults, t);
+    test_avi_a(testresults, t);
+    test_uri_a(testresults, t);
+    test_normal_10(testresults, t);
+    fclose(testresults);
+}
+
+
+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());
+
+        osEvent ext_signal = osSignalWait(0, sig);
+        int evt = ext_signal.value.signals;
+
+        switch(evt) {
+            case(0x0):
+                if(aorv) {
+                    asignal = 1;
+                    asignal_led = 1;
+                    Thread::wait(twait);
+                    asignal_led = 0;
+                    asignal = 0;
+                    break;
+                } else {
+                    vsignal = 1;
+                    at.reset();
+                    vt.reset();
+                    vsignal_led = 1;
+                    Thread::wait(twait);
+                    vsignal_led = 0;
+                    vsignal = 0;
+                    break;
+                }
+            case(0x1):
+                at.reset();
+                vt.reset();
+                vpace_led = 1;
+                Thread::wait(twait);
+                vpace_led = 0;
+                break;
+
+            case(0x10):
+                apace_led = 1;
+                Thread::wait(twait);
+                apace_led = 0;
+                break;
+        }
+    }
+}
+
+//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;
+//        }
+//    }
+//}
+
+
+//osThreadDef(randommode, osPriorityNormal, DEFAULT_STACK_SIZE);
+osThreadDef(testmode, 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);
+//    lcd.printf();
+    while(true) {
+        while(pc.readable()) {
+            key = pc.getc();
+            switch(key) {
+                    //pvarp = 0.3s
+                case('r'):
+                    lcd.printf("R");
+                    randommode(NULL);
+//                    Thread::wait(100);
+                    break;
+                case('t'):
+                    lcd.printf("T");
+                    testmode(NULL);
+                    break;
+                case('m'):
+                    lcd.printf("M");
+                    manual_mode = 1;
+
+                    break;
+                case('o'):
+                    isChangingObsInt = 1;
+                    lcd.printf("O");
+                    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