
HAHAHAHHA
Dependencies: TextLCD mbed-rtos mbed
Fork of 541-pacemaker-heart by
Diff: main.cpp
- Revision:
- 2:18b496a20413
- Parent:
- 1:57cd3ae5f44a
- Child:
- 3:1498846197ee
--- a/main.cpp Fri Dec 02 21:39:47 2016 +0000 +++ b/main.cpp Mon Dec 05 03:11:53 2016 +0000 @@ -2,37 +2,48 @@ #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 isChangingObsInt; + + +int observation_interval = 10; ///////////////// volatile char c; volatile int mm = 0; +volatile int om = 0; int lri = 1000; int uri = 700; int avi = 150; @@ -40,45 +51,74 @@ 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') { + if(c == 'm' && om != 1) { mode_q.put((char*)c); mm = 1; - } else if(c == 'r' || c == 't') { + } 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; @@ -94,6 +134,7 @@ Thread::wait(twait); vpace_led = 0; + Thread::wait(vrpwait); vsignal = 1; vsignal_led = 1; @@ -102,6 +143,7 @@ vsignal_led = 0; vsignal = 0; + Thread::wait(vrpwait); vsignal = 1; difl = ti->read_us(); @@ -111,6 +153,7 @@ vsignal = 0; vsignal_led = 0; + osSignalWait(0x10, osWaitForever); adifu = ti->read_us(); apace_led = 1; @@ -118,6 +161,7 @@ Thread::wait(twait); apace_led = 0; + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; @@ -125,6 +169,7 @@ Thread::wait(twait); vpace_led = 0; + int adif = adifu-difl; int vdif = vdifu-difl; const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && @@ -132,8 +177,10 @@ (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) { @@ -150,6 +197,7 @@ Thread::wait(twait); vpace_led = 0; + Thread::wait(pvarpwait); asignal = 1; asignal_led = 1; @@ -158,6 +206,7 @@ asignal_led = 0; asignal = 0; + Thread::wait(pvarpwait); asignal = 1; //difl = ti->read_us(); @@ -167,6 +216,7 @@ asignal_led = 0; asignal = 0; + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; @@ -174,13 +224,16 @@ 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; @@ -196,6 +249,7 @@ Thread::wait(twait); vpace_led = 0; + Thread::wait(pvarp); asignal = 1; asignal_led = 1; @@ -204,6 +258,7 @@ asignal_led = 0; asignal = 0; + Thread::wait(arpwait); asignal = 1; asignal_led = 1; @@ -212,6 +267,7 @@ asignal_led = 0; asignal = 0; + Thread::wait(arpwait); asignal = 1; asignal_led = 1; @@ -220,6 +276,7 @@ asignal_led = 0; asignal = 0; + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; @@ -227,13 +284,16 @@ 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; @@ -248,6 +308,7 @@ Thread::wait(twait); vpace_led = 0; + Thread::wait(pvarp); asignal = 1; asignal_led = 1; @@ -256,6 +317,7 @@ asignal_led = 0; asignal = 0; + Thread::wait(arp); asignal = 1; asignal_led = 1; @@ -264,6 +326,7 @@ asignal_led = 0; asignal = 0; + Thread::wait(20); vsignal = 1; difl = ti->read_us(); @@ -273,6 +336,7 @@ vsignal = 0; vsignal_led = 0; + osSignalWait(0x10, osWaitForever); adifu = ti->read_us(); apace_led = 1; @@ -280,6 +344,7 @@ Thread::wait(twait); apace_led = 0; + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; @@ -287,6 +352,7 @@ Thread::wait(twait); vpace_led = 0; + int adif = adifu-difl; int vdif = vdifu-difl; const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && @@ -294,10 +360,13 @@ (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; @@ -312,6 +381,7 @@ Thread::wait(twait); vpace_led = 0; + Thread::wait(pvarp); asignal = 1; asignal_led = 1; @@ -320,6 +390,7 @@ asignal_led = 0; asignal = 0; + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; @@ -327,13 +398,16 @@ 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"); @@ -348,6 +422,7 @@ Thread::wait(twait); vpace_led = 0; + osSignalWait(0x10, osWaitForever); adifu = ti->read_us(); apace_led = 1; @@ -355,6 +430,7 @@ Thread::wait(twait); apace_led = 0; + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; @@ -362,6 +438,7 @@ Thread::wait(twait); vpace_led = 0; + int adif = adifu; int vdif = vdifu; const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && @@ -369,9 +446,11 @@ (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; @@ -386,6 +465,7 @@ Thread::wait(twait); vpace_led = 0; + Thread::wait(uri); asignal = 1; difl = ti->read_us(); @@ -395,6 +475,7 @@ asignal_led = 0; asignal = 0; + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; @@ -402,14 +483,18 @@ 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; @@ -424,6 +509,7 @@ Thread::wait(twait); vpace_led = 0; + Thread::wait(pvarp); asignal = 1; asignal_led = 1; @@ -432,6 +518,7 @@ asignal_led = 0; asignal = 0; + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; @@ -439,14 +526,18 @@ 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"); @@ -461,6 +552,7 @@ Thread::wait(twait); vpace_led = 0; + while(i < 10) { Thread::wait(pvarp); asignal = 1; @@ -470,6 +562,7 @@ asignal_led = 0; asignal = 0; + Thread::wait(75); vsignal = 1; difl = ti->read_us(); @@ -481,6 +574,7 @@ i = i+1; } + osSignalWait(0x10, osWaitForever); adifu = ti->read_us(); apace_led = 1; @@ -488,6 +582,7 @@ Thread::wait(twait); apace_led = 0; + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; @@ -495,6 +590,7 @@ Thread::wait(twait); vpace_led = 0; + int adif = adifu - difl; int vdif = vdifu - difl; const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && @@ -502,9 +598,11 @@ (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; @@ -512,6 +610,7 @@ t = new Timer(); t->start(); + test_vrp_vv(testresults, t); test_pvarp_aa(testresults, t); test_pvarp_arp_aaa(testresults, t); @@ -525,14 +624,18 @@ } + + 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); @@ -541,9 +644,11 @@ 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) { @@ -571,18 +676,21 @@ 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) { @@ -606,23 +714,52 @@ } +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()) { @@ -643,6 +780,7 @@ apace_led = 0; vpace_led = 0; + heartmodeTid = osThreadCreate(osThread(randommode), NULL); // Thread::wait(100); break; @@ -657,6 +795,7 @@ apace_led = 0; vpace_led = 0; + heartmodeTid = osThreadCreate(osThread(testmode), NULL); break; case('m'): @@ -670,13 +809,15 @@ apace_led = 0; vpace_led = 0; + heartmodeTid = osThreadCreate(osThread(manualmode), NULL); manual_mode = 1; + break; case('o'): - isChangingObsInt = 1; - lcd.printf("O"); + lcd.printf("modeO"); + obsinterval(); break; } }