HAHAHAHHA

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541-pacemaker-heart by Terry Fang

main.cpp

Committer:
terryfan
Date:
2016-12-02
Revision:
1:57cd3ae5f44a
Parent:
0:da581483b90d
Child:
2:18b496a20413

File content as of revision 1:57cd3ae5f44a:

#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;

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';
int manual_mode;
int isChangingObsInt;
/////////////////
volatile char c;
volatile int mm = 0;

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 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;
    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;
    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;

//            case(0x100):
//
        }
    }
}

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(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()) {
//            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);
                    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");
                    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;
                case('o'):
                    isChangingObsInt = 1;
                    lcd.printf("O");
                    break;
            }
        }
    }
}