
HAHAHAHHA
Dependencies: TextLCD mbed-rtos mbed
Fork of 541-pacemaker-heart by
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; } } } }