
HAHAHAHHA
Dependencies: TextLCD mbed-rtos mbed
Fork of 541-pacemaker-heart by
Diff: main.cpp
- Revision:
- 3:1498846197ee
- Parent:
- 2:18b496a20413
- Child:
- 4:cf40000fdac1
--- a/main.cpp Mon Dec 05 03:11:53 2016 +0000 +++ b/main.cpp Wed Dec 07 15:09:32 2016 +0000 @@ -2,79 +2,95 @@ #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; +osThreadId beats; +osThreadId displayTid; +osThreadId HeartSenseTid; +Timer vClock; - Queue<char,256> mode_q; Queue<char,256> signal_q; - +Queue<char,256> obsint_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; +volatile int om = 0; int lri = 1000; int uri = 700; int avi = 150; int pvarp = 300; -int vrp = 200; +int vrp = 100; int arp = 50; - + int twait = 10; int thrsh = 1000; int heartmode = 0; +int v_flag = 0; +int observation_interval = 10000; // In miliseconds int heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval Mutex hr_mutex; //hr_mutex.lock()/unlock() - - +void HeartSense(void const *args) +{ + while(1) { + osEvent ext_signal = osSignalWait(0, osWaitForever); + int evt2 = ext_signal.value.signals; + + switch(evt2) { + case(0x1): + vpace_led = 1; + v_flag = 1; + Thread::wait(twait); + vpace_led = 0; + v_flag = 0; + break; + + case(0x10): + apace_led = 1; + Thread::wait(twait); + apace_led = 0; + break; + } + } +} + void vpace_irq() { //heartmodeThread->signal_set(0x1); - osSignalSet(heartmodeTid, 0x1); + osSignalSet(HeartSenseTid, 0x1); } - + void apace_irq() { //heartmodeThread->signal_set(0x10); - osSignalSet(heartmodeTid, 0x10); + osSignalSet(HeartSenseTid, 0x10); } - + void Rx_interrupt() { while(pc.readable()) { @@ -101,24 +117,38 @@ 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 h_beats(void const *args) +{ + vClock.start(); + while(1) { + if(vsignal == 1 && vClock.read_ms() >= vrp) { + v_flag = 1; + } + + if(v_flag == 1) { //osSignalWait(0x1, osWaitForever); when vpace happens, v_flag is set and beats++ + hr_mutex.lock(); + heart_beats++; + hr_mutex.unlock(); + vClock.reset(); + v_flag = 0; + } + } +} + void test_vrp_vv(FILE * results, Timer * ti) { int vrpwait = vrp/2; @@ -130,11 +160,13 @@ apace_led = 0; osSignalWait(0x1, osWaitForever); ti->reset(); + v_flag = 1; vpace_led = 1; Thread::wait(twait); + v_flag = 0; vpace_led = 0; - + Thread::wait(vrpwait); vsignal = 1; vsignal_led = 1; @@ -143,7 +175,7 @@ vsignal_led = 0; vsignal = 0; - + Thread::wait(vrpwait); vsignal = 1; difl = ti->read_us(); @@ -153,7 +185,7 @@ vsignal = 0; vsignal_led = 0; - + osSignalWait(0x10, osWaitForever); adifu = ti->read_us(); apace_led = 1; @@ -161,15 +193,17 @@ Thread::wait(twait); apace_led = 0; - + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; + v_flag = 1; fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + int adif = adifu-difl; int vdif = vdifu-difl; const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && @@ -177,10 +211,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) { @@ -194,10 +228,12 @@ osSignalWait(0x1, osWaitForever); ti->reset(); vpace_led = 1; + v_flag = 1; Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + Thread::wait(pvarpwait); asignal = 1; asignal_led = 1; @@ -206,7 +242,7 @@ asignal_led = 0; asignal = 0; - + Thread::wait(pvarpwait); asignal = 1; //difl = ti->read_us(); @@ -216,24 +252,26 @@ asignal_led = 0; asignal = 0; - + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; + v_flag = 1; fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); Thread::wait(twait); vpace_led = 0; + v_flag = 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; @@ -246,10 +284,12 @@ osSignalWait(0x1, osWaitForever); ti->reset(); vpace_led = 1; + v_flag = 1; Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + Thread::wait(pvarp); asignal = 1; asignal_led = 1; @@ -258,7 +298,7 @@ asignal_led = 0; asignal = 0; - + Thread::wait(arpwait); asignal = 1; asignal_led = 1; @@ -267,7 +307,7 @@ asignal_led = 0; asignal = 0; - + Thread::wait(arpwait); asignal = 1; asignal_led = 1; @@ -276,24 +316,26 @@ asignal_led = 0; asignal = 0; - + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; + v_flag = 1; fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); Thread::wait(twait); vpace_led = 0; + v_flag = 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; @@ -305,10 +347,12 @@ osSignalWait(0x1, osWaitForever); ti->reset(); vpace_led = 1; + v_flag = 1; Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + Thread::wait(pvarp); asignal = 1; asignal_led = 1; @@ -317,7 +361,7 @@ asignal_led = 0; asignal = 0; - + Thread::wait(arp); asignal = 1; asignal_led = 1; @@ -326,7 +370,7 @@ asignal_led = 0; asignal = 0; - + Thread::wait(20); vsignal = 1; difl = ti->read_us(); @@ -336,7 +380,7 @@ vsignal = 0; vsignal_led = 0; - + osSignalWait(0x10, osWaitForever); adifu = ti->read_us(); apace_led = 1; @@ -344,15 +388,17 @@ Thread::wait(twait); apace_led = 0; - + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; + v_flag = 1; fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + int adif = adifu-difl; int vdif = vdifu-difl; const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && @@ -360,13 +406,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; @@ -378,10 +424,12 @@ osSignalWait(0x1, osWaitForever); ti->reset(); vpace_led = 1; + v_flag = 1; Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + Thread::wait(pvarp); asignal = 1; asignal_led = 1; @@ -390,24 +438,26 @@ asignal_led = 0; asignal = 0; - + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; + v_flag = 1; fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); Thread::wait(twait); vpace_led = 0; + v_flag = 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"); @@ -419,10 +469,11 @@ osSignalWait(0x1, osWaitForever); ti->reset(); vpace_led = 1; + v_flag = 1; Thread::wait(twait); vpace_led = 0; + v_flag = 0; - osSignalWait(0x10, osWaitForever); adifu = ti->read_us(); apace_led = 1; @@ -430,15 +481,17 @@ Thread::wait(twait); apace_led = 0; - + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; + v_flag = 1; fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + int adif = adifu; int vdif = vdifu; const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && @@ -446,11 +499,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; @@ -462,10 +515,12 @@ osSignalWait(0x1, osWaitForever); ti->reset(); vpace_led = 1; + v_flag = 1; Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + Thread::wait(uri); asignal = 1; difl = ti->read_us(); @@ -475,26 +530,28 @@ asignal_led = 0; asignal = 0; - + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; + v_flag = 1; fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); Thread::wait(twait); vpace_led = 0; + v_flag = 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; @@ -506,10 +563,12 @@ osSignalWait(0x1, osWaitForever); ti->reset(); vpace_led = 1; + v_flag = 1; Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + Thread::wait(pvarp); asignal = 1; asignal_led = 1; @@ -518,26 +577,28 @@ asignal_led = 0; asignal = 0; - + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; + v_flag = 1; fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); Thread::wait(twait); vpace_led = 0; + v_flag = 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"); @@ -549,10 +610,12 @@ osSignalWait(0x1, osWaitForever); ti->reset(); vpace_led = 1; + v_flag = 1; Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + while(i < 10) { Thread::wait(pvarp); asignal = 1; @@ -562,7 +625,7 @@ asignal_led = 0; asignal = 0; - + Thread::wait(75); vsignal = 1; difl = ti->read_us(); @@ -574,7 +637,7 @@ i = i+1; } - + osSignalWait(0x10, osWaitForever); adifu = ti->read_us(); apace_led = 1; @@ -582,15 +645,17 @@ Thread::wait(twait); apace_led = 0; - + osSignalWait(0x1, osWaitForever); vdifu = ti->read_us(); vpace_led = 1; + v_flag = 1; fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); Thread::wait(twait); vpace_led = 0; + v_flag = 0; - + int adif = adifu - difl; int vdif = vdifu - difl; const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && @@ -598,19 +663,19 @@ (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 + testresults = fopen("/local/test.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); @@ -624,31 +689,27 @@ } - - + + 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()); + sig = aorv ? rand()%(lri - avi) : rand()%(lri); - osEvent ext_signal = osSignalWait(0, sig); int evt = ext_signal.value.signals; - switch(evt) { case(0x0): if(aorv) { @@ -668,29 +729,31 @@ vsignal = 0; break; } - case(0x1): - at.reset(); - vt.reset(); - vpace_led = 1; - Thread::wait(twait); - vpace_led = 0; - break; +// case(0x1): +// at.reset(); +// vt.reset(); +// vpace_led = 1; +// v_flag = 1; +// Thread::wait(twait); +// vpace_led = 0; +// v_flag = 0; +// break; +// +// +// case(0x10): +// apace_led = 1; +// Thread::wait(twait); +// apace_led = 0; +// break; - - case(0x10): - apace_led = 1; - Thread::wait(twait); - apace_led = 0; - break; - // case(0x100): // } } } - + void manualmode(void const *args) { while(1) { @@ -713,7 +776,6 @@ } } - void obsinterval() { char newObsInt[8]; @@ -723,55 +785,59 @@ osEvent evt = obsint_q.get(); if(evt.status == osEventMessage) { key = (char)evt.value.p; - if(key != '\r' && i < 7 ){ + if(key != '\r' && i < 7 ) { newObsInt[i] = key; i++; } else if((key == '\r') && (i > 0)) { + hr_mutex.lock(); + heart_beats = 0; + hr_mutex.unlock(); int obsint; newObsInt[i] = '\0'; sscanf(newObsInt, "%d", &obsint); + hr_mutex.lock(); observation_interval = (obsint > 0 ) ? obsint: 1; + hr_mutex.unlock(); 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); +osThreadDef(h_beats, osPriorityNormal, DEFAULT_STACK_SIZE); +osThreadDef(displayThread, osPriorityNormal, DEFAULT_STACK_SIZE); +osThreadDef(HeartSense, 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); - + HeartSenseTid = osThreadCreate(osThread(HeartSense), NULL); heartmodeTid = osThreadCreate(osThread(randommode), NULL); + beats = osThreadCreate(osThread(h_beats), NULL); + displayTid = osThreadCreate(osThread(displayThread), 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); + osThreadTerminate (displayTid); if (testresults != NULL) { fclose(testresults); } @@ -780,13 +846,14 @@ apace_led = 0; vpace_led = 0; - + displayTid = osThreadCreate(osThread(displayThread), NULL); heartmodeTid = osThreadCreate(osThread(randommode), NULL); // Thread::wait(100); break; case('t'): lcd.printf("T"); osThreadTerminate (heartmodeTid); + osThreadTerminate (displayTid); if (testresults != NULL) { fclose(testresults); } @@ -795,12 +862,13 @@ apace_led = 0; vpace_led = 0; - + displayTid = osThreadCreate(osThread(displayThread), NULL); heartmodeTid = osThreadCreate(osThread(testmode), NULL); break; case('m'): lcd.printf("M"); osThreadTerminate (heartmodeTid); + osThreadTerminate (displayTid); if (testresults != NULL) { fclose(testresults); } @@ -809,15 +877,17 @@ apace_led = 0; vpace_led = 0; - + displayTid = osThreadCreate(osThread(displayThread), NULL); heartmodeTid = osThreadCreate(osThread(manualmode), NULL); manual_mode = 1; - + break; case('o'): lcd.printf("modeO"); obsinterval(); + osThreadTerminate (displayTid); + displayTid = osThreadCreate(osThread(displayThread), NULL); break; } }