Eric Stahl / Mbed 2 deprecated 541-pacemaker-heart_done

Dependencies:   TextLCD mbed-rtos mbed

Fork of 541-pacemaker-heart by Terry Fang

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }