HAHAHAHHA

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541-pacemaker-heart by Terry Fang

main.cpp

Committer:
terryfan
Date:
2016-12-05
Revision:
2:18b496a20413
Parent:
1:57cd3ae5f44a
Child:
3:1498846197ee

File content as of revision 2:18b496a20413:

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


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

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' && om != 1) {
            mode_q.put((char*)c);
            mm = 1;
        } 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;
    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;
            }
        }
    }
}


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()) {
//            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'):
                    lcd.printf("modeO");
                    obsinterval();
                    break;
            }
        }
    }
}