Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: TextLCD mbed-rtos mbed
Fork of 541-pacemaker-heart by
main.cpp
00001 #include "mbed.h" 00002 #include "rtos.h" 00003 #include "TextLCD.h" 00004 00005 LocalFileSystem local("local"); 00006 00007 InterruptIn vpace(p5); 00008 InterruptIn apace(p6); 00009 DigitalOut vsignal(p7); 00010 DigitalOut asignal(p8); 00011 00012 DigitalOut asignal_led(LED1); 00013 DigitalOut vsignal_led(LED2); 00014 DigitalOut apace_led(LED3); 00015 DigitalOut vpace_led(LED4); 00016 00017 Thread *heartmodeThread; 00018 osThreadId heartmodeTid; 00019 osThreadId beats; 00020 osThreadId displayTid; 00021 osThreadId HeartSenseTid; 00022 Timer vClock; 00023 00024 Queue<char,256> mode_q; 00025 Queue<char,256> signal_q; 00026 Queue<char,256> obsint_q; 00027 00028 FILE * testresults; 00029 00030 TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); 00031 RawSerial pc(USBTX, USBRX); 00032 char key = 'n'; 00033 int manual_mode; 00034 00035 volatile char c; 00036 volatile int mm = 0; 00037 00038 volatile int om = 0; 00039 int lri = 1000; 00040 int uri = 700; 00041 int avi = 150; 00042 int pvarp = 300; 00043 int vrp = 200; 00044 int arp = 25; 00045 00046 00047 int twait = 10; 00048 int thrsh = 1000; 00049 int heartmode = 0; 00050 int v_flag = 0; 00051 int observation_interval = 10000; // In miliseconds 00052 int tmm = 0; //testmode flag 00053 00054 int heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval 00055 Mutex hr_mutex; //hr_mutex.lock()/unlock() 00056 00057 void HeartSense(void const *args) 00058 { 00059 while(1) { 00060 osEvent ext_signal = osSignalWait(0, osWaitForever); 00061 int evt2 = ext_signal.value.signals; 00062 00063 switch(evt2) { 00064 case(0x1): 00065 vpace_led = 1; 00066 v_flag = 1; 00067 Thread::wait(twait); 00068 vpace_led = 0; 00069 v_flag = 0; 00070 break; 00071 00072 case(0x10): 00073 apace_led = 1; 00074 Thread::wait(twait); 00075 apace_led = 0; 00076 break; 00077 } 00078 } 00079 } 00080 00081 void vpace_irq() 00082 { 00083 //lcd.printf("In vpace IRQ/n"); 00084 //heartmodeThread->signal_set(0x1); 00085 if(tmm) 00086 { 00087 osSignalSet(heartmodeTid, 0x1); 00088 } 00089 osSignalSet(HeartSenseTid, 0x1); 00090 } 00091 00092 00093 void apace_irq() 00094 { 00095 //heartmodeThread->signal_set(0x10); 00096 //lcd.printf("In apace IRQ/n"); 00097 if(tmm) 00098 { 00099 osSignalSet(heartmodeTid, 0x10); 00100 } 00101 osSignalSet(HeartSenseTid, 0x10); 00102 } 00103 00104 00105 void Rx_interrupt() 00106 { 00107 while(pc.readable()) { 00108 c = pc.getc(); 00109 if(c == 'm' && om != 1) { 00110 mode_q.put((char*)c); 00111 mm = 1; 00112 } else if((c == 'r' || c == 't') && om != 1) { 00113 mode_q.put((char*)c); 00114 mm = 0; 00115 } else if((c == 'a' || c == 'v') && mm) { 00116 signal_q.put((char*)c); 00117 } else if(c == 'o' && om != 1) { 00118 mode_q.put((char*)c); 00119 om = 1; 00120 } else if (c == '\r' && om) { 00121 obsint_q.put((char*)c); 00122 om = 0; 00123 } else if ((int)c > 47 && (int)c < 58 && om) { 00124 obsint_q.put((char*)c); 00125 } 00126 } 00127 } 00128 00129 void displayThread(void const *args) 00130 { 00131 00132 while (1) { 00133 Thread::wait(observation_interval); 00134 lcd.cls(); 00135 00136 hr_mutex.lock(); 00137 int hr = (heart_beats*60) / (observation_interval / 1000); 00138 heart_beats = 0; 00139 hr_mutex.unlock(); 00140 00141 lcd.printf("%s%d%s","HR: ", hr, " bpm"); 00142 } 00143 } 00144 00145 void h_beats(void const *args) 00146 { 00147 vClock.start(); 00148 while(1) { 00149 if(vsignal == 1 && vClock.read_ms() >= vrp) { 00150 v_flag = 1; 00151 } 00152 00153 if(v_flag == 1) { //osSignalWait(0x1, osWaitForever); when vpace happens, v_flag is set and beats++ 00154 hr_mutex.lock(); 00155 heart_beats++; 00156 hr_mutex.unlock(); 00157 vClock.reset(); 00158 v_flag = 0; 00159 } 00160 } 00161 } 00162 00163 void test_vrp_vv(FILE * results, Timer * ti) 00164 { 00165 int vrpwait = vrp/2; 00166 int adifu,vdifu,difl = 0; 00167 fprintf(results, " Test VRP VV\n\n Time Action\n"); 00168 osSignalWait(0x10, osWaitForever); 00169 apace_led = 1; 00170 Thread::wait(twait); 00171 apace_led = 0; 00172 osSignalWait(0x1, osWaitForever); 00173 ti->reset(); 00174 v_flag = 1; 00175 vpace_led = 1; 00176 Thread::wait(twait); 00177 v_flag = 0; 00178 vpace_led = 0; 00179 00180 00181 Thread::wait(vrpwait); 00182 vsignal = 1; 00183 vsignal_led = 1; 00184 fprintf(results, "%6d%8s\n", ti->read_ms(), "VS"); 00185 Thread::wait(twait); 00186 vsignal_led = 0; 00187 vsignal = 0; 00188 00189 00190 Thread::wait(vrpwait); 00191 vsignal = 1; 00192 difl = ti->read_us(); 00193 vsignal_led = 1; 00194 fprintf(results, "%6d%8s\n", ti->read_ms(), "VS"); 00195 Thread::wait(twait); 00196 vsignal = 0; 00197 vsignal_led = 0; 00198 00199 00200 osSignalWait(0x10, osWaitForever); 00201 adifu = ti->read_us(); 00202 apace_led = 1; 00203 fprintf(results, "%6d%8s\n", ti->read_ms(), "AP"); 00204 Thread::wait(twait); 00205 apace_led = 0; 00206 00207 00208 osSignalWait(0x1, osWaitForever); 00209 vdifu = ti->read_us(); 00210 vpace_led = 1; 00211 v_flag = 1; 00212 fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); 00213 Thread::wait(twait); 00214 vpace_led = 0; 00215 v_flag = 0; 00216 00217 00218 int adif = adifu-difl; 00219 int vdif = vdifu-difl; 00220 const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && 00221 (adif < ((lri-avi)*1000 + thrsh)) && 00222 (vdif >= (lri*1000 - thrsh)) && 00223 (vdif < (lri*1000 + thrsh))) ? "Passed": "Failed"; 00224 00225 00226 fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif); 00227 00228 00229 } 00230 void test_pvarp_aa(FILE * results, Timer * ti) 00231 { 00232 int pvarpwait = pvarp/2; 00233 int vdifu = 0; 00234 fprintf(results, " Test PVARP AA\n\n Time Action\n"); 00235 osSignalWait(0x10, osWaitForever); 00236 apace_led = 1; 00237 Thread::wait(twait); 00238 apace_led = 0; 00239 osSignalWait(0x1, osWaitForever); 00240 ti->reset(); 00241 vpace_led = 1; 00242 v_flag = 1; 00243 Thread::wait(twait); 00244 vpace_led = 0; 00245 v_flag = 0; 00246 00247 00248 Thread::wait(pvarpwait); 00249 asignal = 1; 00250 asignal_led = 1; 00251 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00252 Thread::wait(twait); 00253 asignal_led = 0; 00254 asignal = 0; 00255 00256 00257 Thread::wait(pvarpwait); 00258 asignal = 1; 00259 //difl = ti->read_us(); 00260 asignal_led = 1; 00261 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00262 Thread::wait(twait); 00263 asignal_led = 0; 00264 asignal = 0; 00265 00266 00267 osSignalWait(0x1, osWaitForever); 00268 vdifu = ti->read_us(); 00269 vpace_led = 1; 00270 v_flag = 1; 00271 fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); 00272 Thread::wait(twait); 00273 vpace_led = 0; 00274 v_flag = 0; 00275 00276 00277 int vdif = vdifu; 00278 const char * res = ((vdif >= (uri*1000 - thrsh)) && 00279 (vdif < (uri*1000 + thrsh))) ? "Passed": "Failed"; 00280 00281 00282 fprintf(results, "\nResult: %s %d\n\n", res, vdif); 00283 } 00284 00285 00286 void test_pvarp_arp_aaa(FILE * results, Timer * ti) 00287 { 00288 int arpwait = arp/2; 00289 int vdifu = 0; 00290 fprintf(results, "Test PVARP ARP AAA\n\n Time Action\n"); 00291 osSignalWait(0x10, osWaitForever); 00292 apace_led = 1; 00293 Thread::wait(twait); 00294 apace_led = 0; 00295 osSignalWait(0x1, osWaitForever); 00296 ti->reset(); 00297 vpace_led = 1; 00298 v_flag = 1; 00299 Thread::wait(twait); 00300 vpace_led = 0; 00301 v_flag = 0; 00302 00303 00304 Thread::wait(pvarp); 00305 asignal = 1; 00306 asignal_led = 1; 00307 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00308 Thread::wait(twait); 00309 asignal_led = 0; 00310 asignal = 0; 00311 00312 00313 Thread::wait(arpwait); 00314 asignal = 1; 00315 asignal_led = 1; 00316 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00317 Thread::wait(twait); 00318 asignal_led = 0; 00319 asignal = 0; 00320 00321 00322 Thread::wait(arpwait); 00323 asignal = 1; 00324 asignal_led = 1; 00325 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00326 Thread::wait(twait); 00327 asignal_led = 0; 00328 asignal = 0; 00329 00330 00331 osSignalWait(0x1, osWaitForever); 00332 vdifu = ti->read_us(); 00333 vpace_led = 1; 00334 v_flag = 1; 00335 fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); 00336 Thread::wait(twait); 00337 vpace_led = 0; 00338 v_flag = 0; 00339 00340 00341 int vdif = vdifu; 00342 const char * res = ((vdif >= (uri*1000 - thrsh)) && 00343 (vdif < (uri*1000 + thrsh))) ? "Passed": "Failed"; 00344 00345 00346 fprintf(results, "\nResult: %s %d\n\n", res, vdif); 00347 } 00348 00349 00350 void test_pvarp_arp_aav(FILE * results, Timer * ti) 00351 { 00352 int adifu,vdifu,difl = 0; 00353 fprintf(results, "Test PVARP ARP AAV\n\n Time Action\n"); 00354 osSignalWait(0x10, osWaitForever); 00355 apace_led = 1; 00356 Thread::wait(twait); 00357 apace_led = 0; 00358 osSignalWait(0x1, osWaitForever); 00359 ti->reset(); 00360 vpace_led = 1; 00361 v_flag = 1; 00362 Thread::wait(twait); 00363 vpace_led = 0; 00364 v_flag = 0; 00365 00366 00367 Thread::wait(pvarp); 00368 asignal = 1; 00369 asignal_led = 1; 00370 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00371 Thread::wait(twait); 00372 asignal_led = 0; 00373 asignal = 0; 00374 00375 00376 Thread::wait(arp); 00377 asignal = 1; 00378 asignal_led = 1; 00379 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00380 Thread::wait(twait); 00381 asignal_led = 0; 00382 asignal = 0; 00383 00384 00385 Thread::wait(20); 00386 vsignal = 1; 00387 difl = ti->read_us(); 00388 vsignal_led = 1; 00389 fprintf(results, "%6d%8s\n", ti->read_ms(), "VS"); 00390 Thread::wait(twait); 00391 vsignal = 0; 00392 vsignal_led = 0; 00393 00394 00395 osSignalWait(0x10, osWaitForever); 00396 adifu = ti->read_us(); 00397 apace_led = 1; 00398 fprintf(results, "%6d%8s\n", ti->read_ms(), "AP"); 00399 Thread::wait(twait); 00400 apace_led = 0; 00401 00402 00403 osSignalWait(0x1, osWaitForever); 00404 vdifu = ti->read_us(); 00405 vpace_led = 1; 00406 v_flag = 1; 00407 fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); 00408 Thread::wait(twait); 00409 vpace_led = 0; 00410 v_flag = 0; 00411 00412 00413 int adif = adifu-difl; 00414 int vdif = vdifu-difl; 00415 const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && 00416 (adif < ((lri-avi)*1000 + thrsh)) && 00417 (vdif >= (lri*1000 - thrsh)) && 00418 (vdif < (lri*1000 + thrsh))) ? "Passed": "Failed"; 00419 00420 00421 fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif); 00422 00423 00424 } 00425 00426 00427 void test_vpace_after_a(FILE * results, Timer * ti) 00428 { 00429 int vdifu = 0; 00430 fprintf(results, "Test VPACE After A\n\n Time Action\n"); 00431 osSignalWait(0x10, osWaitForever); 00432 apace_led = 1; 00433 Thread::wait(twait); 00434 apace_led = 0; 00435 osSignalWait(0x1, osWaitForever); 00436 ti->reset(); 00437 vpace_led = 1; 00438 v_flag = 1; 00439 Thread::wait(twait); 00440 vpace_led = 0; 00441 v_flag = 0; 00442 00443 00444 Thread::wait(pvarp); 00445 asignal = 1; 00446 asignal_led = 1; 00447 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00448 Thread::wait(twait); 00449 asignal_led = 0; 00450 asignal = 0; 00451 00452 00453 osSignalWait(0x1, osWaitForever); 00454 vdifu = ti->read_us(); 00455 vpace_led = 1; 00456 v_flag = 1; 00457 fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); 00458 Thread::wait(twait); 00459 vpace_led = 0; 00460 v_flag = 0; 00461 00462 00463 int vdif = vdifu; 00464 const char * res = ((vdif >= (uri*1000 - thrsh)) && 00465 (vdif < (uri*1000 + thrsh))) ? "Passed": "Failed"; 00466 00467 00468 fprintf(results, "\nResult: %s %d\n\n", res, vdif); 00469 } 00470 00471 00472 void test_apace_vpace_av(FILE * results, Timer * ti) 00473 { 00474 fprintf(results, "Test APACE After V\n\n Time Action\n"); 00475 int adifu,vdifu = 0; 00476 osSignalWait(0x10, osWaitForever); 00477 apace_led = 1; 00478 Thread::wait(twait); 00479 apace_led = 0; 00480 osSignalWait(0x1, osWaitForever); 00481 ti->reset(); 00482 vpace_led = 1; 00483 v_flag = 1; 00484 Thread::wait(twait); 00485 vpace_led = 0; 00486 v_flag = 0; 00487 00488 osSignalWait(0x10, osWaitForever); 00489 adifu = ti->read_us(); 00490 apace_led = 1; 00491 fprintf(results, "%6d%8s\n", ti->read_ms(), "AP"); 00492 Thread::wait(twait); 00493 apace_led = 0; 00494 00495 00496 osSignalWait(0x1, osWaitForever); 00497 vdifu = ti->read_us(); 00498 vpace_led = 1; 00499 v_flag = 1; 00500 fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); 00501 Thread::wait(twait); 00502 vpace_led = 0; 00503 v_flag = 0; 00504 00505 00506 int adif = adifu; 00507 int vdif = vdifu; 00508 const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && 00509 (adif < ((lri-avi)*1000 + thrsh)) && 00510 (vdif >= (lri*1000 - thrsh)) && 00511 (vdif < (lri*1000 + thrsh))) ? "Passed": "Failed"; 00512 00513 00514 fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif); 00515 } 00516 00517 00518 void test_avi_a(FILE * results, Timer * ti) 00519 { 00520 int vdifu,difl = 0; 00521 fprintf(results, " Test AVI\n\n Time Action\n"); 00522 osSignalWait(0x10, osWaitForever); 00523 apace_led = 1; 00524 Thread::wait(twait); 00525 apace_led = 0; 00526 osSignalWait(0x1, osWaitForever); 00527 ti->reset(); 00528 vpace_led = 1; 00529 v_flag = 1; 00530 Thread::wait(twait); 00531 vpace_led = 0; 00532 v_flag = 0; 00533 00534 00535 Thread::wait(uri); 00536 asignal = 1; 00537 difl = ti->read_us(); 00538 asignal_led = 1; 00539 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00540 Thread::wait(twait); 00541 asignal_led = 0; 00542 asignal = 0; 00543 00544 00545 osSignalWait(0x1, osWaitForever); 00546 vdifu = ti->read_us(); 00547 vpace_led = 1; 00548 v_flag = 1; 00549 fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); 00550 Thread::wait(twait); 00551 vpace_led = 0; 00552 v_flag = 0; 00553 00554 00555 int vpc = (avi*1000) + difl; 00556 const char * res = ((vpc >= (vdifu - thrsh)) && 00557 (vpc < (vdifu + thrsh))) ? "Passed": "Failed"; 00558 00559 00560 fprintf(results, "\nResult: %s %d\n\n", res, vpc); 00561 00562 00563 } 00564 00565 00566 void test_uri_a(FILE * results, Timer * ti) 00567 { 00568 int vdifu = 0; 00569 fprintf(results, " Test URI\n\n Time Action\n"); 00570 osSignalWait(0x10, osWaitForever); 00571 apace_led = 1; 00572 Thread::wait(twait); 00573 apace_led = 0; 00574 osSignalWait(0x1, osWaitForever); 00575 ti->reset(); 00576 vpace_led = 1; 00577 v_flag = 1; 00578 Thread::wait(twait); 00579 vpace_led = 0; 00580 v_flag = 0; 00581 00582 00583 Thread::wait(pvarp); 00584 asignal = 1; 00585 asignal_led = 1; 00586 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00587 Thread::wait(twait); 00588 asignal_led = 0; 00589 asignal = 0; 00590 00591 00592 osSignalWait(0x1, osWaitForever); 00593 vdifu = ti->read_us(); 00594 vpace_led = 1; 00595 v_flag = 1; 00596 fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); 00597 Thread::wait(twait); 00598 vpace_led = 0; 00599 v_flag = 0; 00600 00601 00602 int vdif = vdifu; 00603 const char * res = ((vdif >= (uri*1000 - thrsh)) && 00604 (vdif < (uri*1000 + thrsh))) ? "Passed": "Failed"; 00605 00606 00607 fprintf(results, "\nResult: %s %d\n\n", res, vdif); 00608 00609 00610 } 00611 00612 00613 void test_normal_10(FILE * results, Timer * ti) 00614 { 00615 fprintf(results, " Test Normal x10\n\n Time Action\n"); 00616 int adifu,vdifu,difl,i = 0; 00617 osSignalWait(0x10, osWaitForever); 00618 apace_led = 1; 00619 Thread::wait(twait); 00620 apace_led = 0; 00621 osSignalWait(0x1, osWaitForever); 00622 ti->reset(); 00623 vpace_led = 1; 00624 v_flag = 1; 00625 Thread::wait(twait); 00626 vpace_led = 0; 00627 v_flag = 0; 00628 00629 00630 while(i < 10) { 00631 Thread::wait(pvarp); 00632 asignal = 1; 00633 asignal_led = 1; 00634 fprintf(results, "%6d%8s\n", ti->read_ms(), "AS"); 00635 Thread::wait(twait); 00636 asignal_led = 0; 00637 asignal = 0; 00638 00639 00640 Thread::wait(75); 00641 vsignal = 1; 00642 difl = ti->read_us(); 00643 vsignal_led = 1; 00644 fprintf(results, "%6d%8s\n", ti->read_ms(), "VS"); 00645 Thread::wait(twait); 00646 vsignal = 0; 00647 vsignal_led = 0; 00648 i = i+1; 00649 } 00650 00651 00652 osSignalWait(0x10, osWaitForever); 00653 adifu = ti->read_us(); 00654 apace_led = 1; 00655 fprintf(results, "%6d%8s\n", ti->read_ms(), "AP"); 00656 Thread::wait(twait); 00657 apace_led = 0; 00658 00659 00660 osSignalWait(0x1, osWaitForever); 00661 vdifu = ti->read_us(); 00662 vpace_led = 1; 00663 v_flag = 1; 00664 fprintf(results, "%6d%8s\n", ti->read_ms(), "VP"); 00665 Thread::wait(twait); 00666 vpace_led = 0; 00667 v_flag = 0; 00668 00669 00670 int adif = adifu - difl; 00671 int vdif = vdifu - difl; 00672 const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) && 00673 (adif < ((lri-avi)*1000 + thrsh)) && 00674 (vdif >= (lri*1000 - thrsh)) && 00675 (vdif < (lri*1000 + thrsh))) ? "Passed": "Failed"; 00676 00677 00678 fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif); 00679 } 00680 00681 00682 void testmode(void const *args) 00683 { 00684 Timer *t; 00685 testresults = fopen("/local/test.txt", "w"); // Open "out.txt" on the local file system for writing 00686 t = new Timer(); 00687 t->start(); 00688 00689 00690 test_vrp_vv(testresults, t); 00691 test_pvarp_aa(testresults, t); 00692 test_pvarp_arp_aaa(testresults, t); 00693 test_pvarp_arp_aav(testresults, t); 00694 test_vpace_after_a(testresults, t); 00695 test_apace_vpace_av(testresults, t); 00696 test_avi_a(testresults, t); 00697 test_uri_a(testresults, t); 00698 test_normal_10(testresults, t); 00699 fclose(testresults); 00700 } 00701 00702 00703 00704 00705 void randommode(void const *args) 00706 { 00707 int aorv,sig = 0; 00708 00709 //osEvent ext_signal = osSignalWait(0, 1); 00710 //int evt = ext_signal.value.signals; 00711 //osSignalSet(heartmodeTid, 0x1); 00712 //osSignalWait(0, osWaitForever); 00713 while(heartmode == 0) { 00714 aorv = (float)(rand()%2); 00715 sig = aorv ? rand()%(lri - avi) : rand()%(lri); 00716 00717 osEvent ext_signal = osSignalWait(0, sig); 00718 int evt = ext_signal.value.signals; 00719 00720 switch(evt) { 00721 case(0x0): 00722 if(aorv) { 00723 asignal = 1; 00724 asignal_led = 1; 00725 Thread::wait(twait); 00726 asignal_led = 0; 00727 asignal = 0; 00728 break; 00729 } else { 00730 vsignal = 1; 00731 vsignal_led = 1; 00732 Thread::wait(twait); 00733 vsignal_led = 0; 00734 vsignal = 0; 00735 break; 00736 } 00737 // case(0x1): 00738 // vpace_led = 1; 00739 // v_flag = 1; 00740 // Thread::wait(twait); 00741 // vpace_led = 0; 00742 // v_flag = 0; 00743 // break; 00744 // 00745 // 00746 // case(0x10): 00747 // apace_led = 1; 00748 // Thread::wait(twait); 00749 // apace_led = 0; 00750 // break; 00751 00752 00753 // case(0x100): 00754 // 00755 } 00756 } 00757 } 00758 00759 00760 void manualmode(void const *args) 00761 { 00762 while(1) { 00763 osEvent evt = signal_q.get(); 00764 if(evt.status == osEventMessage) { 00765 if((char)evt.value.p == 'a') { 00766 asignal = 1; 00767 asignal_led = 1; 00768 Thread::wait(twait); 00769 asignal_led = 0; 00770 asignal = 0; 00771 } else if((char)evt.value.p == 'v') { 00772 vsignal = 1; 00773 vsignal_led = 1; 00774 Thread::wait(twait); 00775 vsignal = 0; 00776 vsignal_led = 0; 00777 } 00778 } 00779 } 00780 } 00781 00782 void obsinterval() 00783 { 00784 char newObsInt[8]; 00785 int isChangingObsInt = 1; 00786 int i = 0; 00787 while(isChangingObsInt) { 00788 osEvent evt = obsint_q.get(); 00789 if(evt.status == osEventMessage) { 00790 key = (char)evt.value.p; 00791 if(key != '\r' && i < 7 ) { 00792 newObsInt[i] = key; 00793 i++; 00794 } else if((key == '\r') && (i > 0)) { 00795 hr_mutex.lock(); 00796 heart_beats = 0; 00797 hr_mutex.unlock(); 00798 int obsint; 00799 newObsInt[i] = '\0'; 00800 sscanf(newObsInt, "%d", &obsint); 00801 hr_mutex.lock(); 00802 observation_interval = (obsint > 0 ) ? obsint: 1; 00803 hr_mutex.unlock(); 00804 isChangingObsInt = 0; 00805 //lcd.printf("%d", observation_interval); 00806 } 00807 } 00808 } 00809 } 00810 osThreadDef(randommode, osPriorityNormal, DEFAULT_STACK_SIZE); 00811 osThreadDef(testmode, osPriorityNormal, DEFAULT_STACK_SIZE); 00812 osThreadDef(manualmode, osPriorityNormal, DEFAULT_STACK_SIZE); 00813 osThreadDef(h_beats, osPriorityNormal, DEFAULT_STACK_SIZE); 00814 osThreadDef(displayThread, osPriorityNormal, DEFAULT_STACK_SIZE); 00815 osThreadDef(HeartSense, osPriorityNormal, DEFAULT_STACK_SIZE); 00816 00817 int main() 00818 { 00819 vpace.rise(&vpace_irq); 00820 apace.rise(&apace_irq); 00821 00822 pc.attach(&Rx_interrupt, RawSerial::RxIrq); 00823 00824 //heartmodeThread = new Thread(); 00825 00826 // Callback<void()> testmodeTask((void*)NULL,(void (*)(void *))&testmode); 00827 00828 HeartSenseTid = osThreadCreate(osThread(HeartSense), NULL); 00829 heartmodeTid = osThreadCreate(osThread(randommode), NULL); 00830 beats = osThreadCreate(osThread(h_beats), NULL); 00831 displayTid = osThreadCreate(osThread(displayThread), NULL); 00832 // heartmodeTid = osThreadCreate(osThread(testmode), NULL); 00833 // heartmodeTid = osThreadCreate(osThread(manualmode), NULL); 00834 00835 while(true) { 00836 osEvent evt = mode_q.get(); 00837 if(evt.status == osEventMessage) { 00838 switch((char)evt.value.p) { 00839 //pvarp = 0.3s 00840 case('r'): 00841 tmm = 0; 00842 lcd.printf("R"); 00843 osThreadTerminate (heartmodeTid); 00844 osThreadTerminate (displayTid); 00845 if (testresults != NULL) { 00846 fclose(testresults); 00847 } 00848 asignal_led = 0; 00849 vsignal_led = 0; 00850 apace_led = 0; 00851 vpace_led = 0; 00852 00853 displayTid = osThreadCreate(osThread(displayThread), NULL); 00854 heartmodeTid = osThreadCreate(osThread(randommode), NULL); 00855 // Thread::wait(100); 00856 break; 00857 case('t'): 00858 00859 tmm = 1; 00860 lcd.printf("T"); 00861 osThreadTerminate (heartmodeTid); 00862 osThreadTerminate (displayTid); 00863 asignal_led = 0; 00864 vsignal_led = 0; 00865 apace_led = 0; 00866 vpace_led = 0; 00867 osSignalClear (heartmodeTid,0); 00868 displayTid = osThreadCreate(osThread(displayThread), NULL); 00869 heartmodeTid = osThreadCreate(osThread(testmode), NULL); 00870 00871 if (testresults != NULL) { 00872 fclose(testresults); 00873 } 00874 00875 break; 00876 case('m'): 00877 tmm = 0; 00878 lcd.printf("M"); 00879 osThreadTerminate (heartmodeTid); 00880 osThreadTerminate (displayTid); 00881 if (testresults != NULL) { 00882 fclose(testresults); 00883 } 00884 asignal_led = 0; 00885 vsignal_led = 0; 00886 apace_led = 0; 00887 vpace_led = 0; 00888 00889 displayTid = osThreadCreate(osThread(displayThread), NULL); 00890 heartmodeTid = osThreadCreate(osThread(manualmode), NULL); 00891 manual_mode = 1; 00892 00893 00894 break; 00895 case('o'): 00896 tmm = 0; 00897 lcd.printf("modeO"); 00898 obsinterval(); 00899 osThreadTerminate (displayTid); 00900 displayTid = osThreadCreate(osThread(displayThread), NULL); 00901 break; 00902 } 00903 } 00904 } 00905 }
Generated on Sun Nov 26 2023 19:23:33 by
1.7.2
