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
Revision 4:a9c37c60425c, committed 2016-12-11
- Comitter:
- terryfan
- Date:
- Sun Dec 11 21:11:54 2016 +0000
- Parent:
- 3:77efff091ef1
- Commit message:
- final pacemaker 12/11
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 77efff091ef1 -r a9c37c60425c main.cpp --- a/main.cpp Fri Dec 09 06:50:30 2016 +0000 +++ b/main.cpp Sun Dec 11 21:11:54 2016 +0000 @@ -20,6 +20,7 @@ osThreadId displayTid; osThreadId pacemodeTid; osThreadId alarmTid; +osThreadId ledTid; TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); RawSerial pc(USBTX, USBRX); @@ -28,23 +29,19 @@ Timer aClock; //PaceSignal model Timer arpClock; -//RtosTimer *apace_timer; -//RtosTimer *vpace_timer; -//RtosTimer *vpace_timer2; - double LRI = 1000; double URI = 700; double VRP = 200; // V noise interval double ARP = 50; // A noise interval -double AVI = 500; // A-V max interval +double AVI = 150; // A-V max interval double PVARP = 300; // V-A max interval double ratio; int wait_period = 10; // 3a requirement -int observation_interval = 10000; // In miliseconds +double observation_interval = 10000; // In miliseconds int upperBound; //for mode changes int lowerBound; //for mode changes -int heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval +double heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval char mode = 'n'; char key = 'n'; char newObsInt[8]; @@ -64,10 +61,6 @@ { LRI = 1000; URI = 700; -// VRP = 200; -// ARP = 50; -// AVI = 150; -// PVARP = 300; } void Rx_interrupt() @@ -95,29 +88,30 @@ } // Function to toggle the LEDs 1,2,3,4 -void toggleLed(int led) +void ledThread(void const *args) + { - switch (led) { - case (1): + while (1) { + osEvent ext_signal = osSignalWait(0, osWaitForever); + int evt = ext_signal.value.signals; + + if (evt == 0xA) { asense_led = 1; Thread::wait(wait_period); asense_led = 0; - break; - case (2): + } else if (evt == 0xB) { vsense_led = 1; Thread::wait(wait_period); vsense_led = 0; - break; - case (3): + } else if (evt == 0xC) { apace_led = 1; Thread::wait(wait_period); apace_led = 0; - break; - case (4): + } else if (evt == 0xD) { vpace_led = 1; Thread::wait(wait_period); vpace_led = 0; - break; + } } } @@ -142,11 +136,11 @@ lcd.cls(); hr_mutex.lock(); - int hr = (heart_beats*60) / (observation_interval / 1000); + double hr = (heart_beats*60) / (observation_interval / 1000); heart_beats = 0; hr_mutex.unlock(); - lcd.printf("%s%d%s","HR: ", hr, " bpm"); + lcd.printf("%s%d%s","HR: ", (int)hr, " bpm"); if (hr > upperBound) { osSignalSet(alarmTid, 0xb); @@ -171,38 +165,6 @@ } -// Timer-driven function to pace the Atrial -void a_pace(void const*) -{ - Apace = 1; - aClock.reset(); -// apace_timer->stop(); - Apace = 0; - osSignalSet(signalTid, 0x3); - - toggleLed(3); -} - -// Timer-driven function to pace the ventrical -void v_pace(void const*) -{ - Vpace = 1; - - vClock.reset(); -// vpace_timer->start(LRI); -// apace_timer->start(LRI-AVI); - Vpace = 0; - - hr_mutex.lock(); - osSignalSet(signalTid, 0x4); - heart_beats++; - hr_mutex.unlock(); - - toggleLed(4); -} - - - void PaceSignal(void const *args) { int pFlag1 = 0; @@ -210,141 +172,145 @@ vClock.start(); aClock.start(); arpClock.start(); -// if(!mm_flag) { -// vpace_timer->start(LRI); -// apace_timer->start(LRI-AVI); -// } -// vpace_timer2->start(AVI); + while(1) { while (!pFlag1) { osEvent ext_signal = osSignalWait(0, osWaitForever); int evt = ext_signal.value.signals; - //lcd.printf("%d",evt); // 4(Vpace), 3(Apace), 2(Vsignal), 1(Asignal) - if (evt == 0x1 && vClock.read_ms() >= PVARP) { //aSense osSignalSet(senseTid, 0x1); aClock.reset(); arpClock.reset(); pFlag1 = 1; - } else if(evt == 0x2 && vClock.read_ms() >= VRP) { //vSignal + } else if(evt == 0x2 && vClock.read_ms() >= VRP) { //vSense + hr_mutex.lock(); osSignalSet(senseTid, 0x2); + heart_beats++; vClock.reset(); -// if(!mm_flag) { -// vpace_timer->start(LRI); -// apace_timer->start(LRI-AVI); -// } + aClock.reset(); + arpClock.reset(); + hr_mutex.unlock(); + pFlag1 = 1; + } else if (evt == 0x3) { //aPace pFlag1 = 1; } } pFlag1 = 0; - lcd.cls(); - lcd.printf("PS1"); while(!pFlag2) { osEvent ext_signal = osSignalWait(0, osWaitForever); int evt = ext_signal.value.signals; - //lcd.printf("%d",evt); - - if (evt == 0x1 && arpClock.read_ms() >= ARP) { //aSignal + if (evt == 0x1 && arpClock.read_ms() >= ARP) { //aSense osSignalSet(senseTid, 0x1); arpClock.reset(); -// aClock.reset(); + } else if(evt == 0x2) { //vSense hr_mutex.lock(); osSignalSet(senseTid, 0x2); heart_beats++; vClock.reset(); + aClock.reset(); + arpClock.reset(); hr_mutex.unlock(); -// if(!mm_flag) { -// vpace_timer->start(LRI); -// apace_timer->start(LRI-AVI); -// } pFlag2 = 1; } else if (evt == 0x4) { //vPace pFlag2 = 1; } } pFlag2 = 0; - lcd.cls(); - lcd.printf("PS2"); } } - void PaceSense(void const *args) { int interval; int pFlag1 = 0; int pFlag2 = 0; + int time_sub = 0; + int evt = 0; while(1) { while (!pFlag1) { - osEvent ext_signal = osSignalWait(0, (LRI-AVI)); - int evt = ext_signal.value.signals; + + time_sub = LRI-AVI - vClock.read_ms(); - //lcd.printf("%d",evt); - if (evt == 0x3) { //aPace 0x0 + if (time_sub > 0 && !mm_flag) { + osEvent ext_signal = osSignalWait(0, time_sub); + evt = ext_signal.value.signals; + } else if(mm_flag) { + osEvent ext_signal = osSignalWait(0, osWaitForever); + evt = ext_signal.value.signals; + } else { + evt = 0x0; + } + + if (evt == 0x0) { //aPace 0x0 + aClock.reset(); + arpClock.reset(); Apace = 1; Thread::wait(1); Apace = 0; osSignalSet(signalTid, 0x3); - aClock.reset(); - arpClock.reset(); - - toggleLed(3); + osSignalSet(ledTid, 0xC); + + interval = AVI; pFlag1 = 1; - } - if (evt == 0x1) { //aSense + } else if (evt == 0x1) { //aSense if(!mm_flag) { -// vpace_timer->stop(); - interval = (vClock.read_ms() + AVI >= URI) ? AVI : URI - vClock.read_ms(); + interval = (vClock.read_ms() + AVI >= URI) ? AVI : URI; + time_sub = interval; } -// if(mm_flag) - toggleLed(evt); + osSignalSet(ledTid, 0xA); pFlag1 = 1; } else if(evt == 0x2) { //vSense - toggleLed(evt); + osSignalSet(ledTid, 0xB); + } else if(evt == 0x3) { //apace + pFlag1 = 1; } -// } else if (evt == 0x3) { //aPace -// aClock.reset(); -// arpClock.reset(); -// pFlag1 = 1; -// } } pFlag1 = 0; - lcd.cls(); - lcd.printf("PS3"); + while(!pFlag2) { - lcd.printf("%d", interval); - osEvent ext_signal = osSignalWait(0, interval); - - int evt = ext_signal.value.signals; - - //lcd.printf("%d",evt); // 4096, 256, 16, 1 - if (evt == 0x4) { //vPace 0x0 + time_sub = (interval == AVI) ? AVI - aClock.read_ms() : URI - vClock.read_ms(); + + if (time_sub > 0 && !mm_flag) { + osEvent ext_signal = osSignalWait(0, time_sub); + evt = ext_signal.value.signals; + } else if(mm_flag) { + osEvent ext_signal = osSignalWait(0, osWaitForever); + evt = ext_signal.value.signals; + } else { + evt = 0x0; + } + + if (evt == 0x0) { //vPace 0x0 + hr_mutex.lock(); + heart_beats++; + vClock.reset(); + aClock.reset(); + arpClock.reset(); Vpace = 1; - vClock.reset(); Thread::wait(1); Vpace = 0; osSignalSet(signalTid, 0x4); - heart_beats++; hr_mutex.unlock(); - toggleLed(4); + osSignalSet(ledTid, 0xD); pFlag2 = 1; + } else if (evt == 0x1) { //aSense - toggleLed(evt); + osSignalSet(ledTid, 0xA); } else if(evt == 0x2) { //vSense - toggleLed(evt); + osSignalSet(ledTid, 0xB); + pFlag2 = 1; + } else if (evt == 0x4) { //vpace pFlag2 = 1; } } pFlag2 = 0; - lcd.cls(); - lcd.printf("PS4"); } } @@ -352,25 +318,20 @@ { initialize_intervals(); mode = 'n'; - lcd.printf("N"); upperBound = 100; //beats per msecond lowerBound = 40; //beats per msecond - //reset obs interval hr_mutex.lock(); heart_beats = 0; hr_mutex.unlock(); vClock.reset(); aClock.reset(); -// vpace_timer->start(LRI); -// apace_timer->start(LRI-AVI); } void exercisemode(void const *args) { initialize_intervals(); mode = 'e'; - lcd.printf("E"); upperBound = 175; //beats per msecond lowerBound = 100; //beats per msecond ratio = (175.00/100.00 + 100.00/40.00) / 2.00; @@ -383,61 +344,58 @@ vClock.reset(); aClock.reset(); -// vpace_timer->start(LRI); -// apace_timer->start(LRI-AVI); } void sleepmode(void const *args) { initialize_intervals(); mode = 's'; - lcd.printf("S"); upperBound = 60; //beats per msecond lowerBound = 30; //beats per msecond v-v 0.5s ratio = (60.00/100.00 + 30.00/40.00) / 2.00; LRI /= ratio; URI /= ratio; - //reset obs interval hr_mutex.lock(); heart_beats = 0; hr_mutex.unlock(); vClock.reset(); aClock.reset(); -// vpace_timer->start(LRI); -// apace_timer->start(LRI-AVI); } void m_vpace() { vClock.reset(); + aClock.reset(); + arpClock.reset(); Vpace = 1; Thread::wait(1); Vpace = 0; osSignalSet(signalTid, 0x4); + osSignalSet(senseTid, 0x4); hr_mutex.lock(); heart_beats++; hr_mutex.unlock(); - - toggleLed(4); + + osSignalSet(ledTid, 0xD); } void m_apace() { aClock.reset(); + arpClock.reset(); Apace = 1; Thread::wait(1); Apace = 0; + osSignalSet(senseTid, 0x3); osSignalSet(signalTid, 0x3); - - toggleLed(3); + osSignalSet(ledTid, 0xC); } void manualmode(void const *args) { upperBound = 175; //beats per msecond lowerBound = 30; //beats per msecond - lcd.printf("M"); mode = 'm'; LRI = 2125; // max V-V (LRI) based on exercise mode URI = 675; // min V-V (URI) based on sleep mode @@ -471,9 +429,16 @@ int obsint; newObsInt[i] = '\0'; sscanf(newObsInt, "%d", &obsint); - observation_interval = (obsint > 0 ) ? obsint: 1; + + if(obsint < 300) { + observation_interval = 300.0; + } else if (obsint > 10000) { + observation_interval = 10000.0; + } else { + observation_interval = (double)obsint; + } isChangingObsInt = 0; - lcd.printf("%d", observation_interval); + } } } @@ -482,17 +447,10 @@ osThreadDef(PaceSignal, osPriorityNormal, DEFAULT_STACK_SIZE); osThreadDef(PaceSense, osPriorityNormal, DEFAULT_STACK_SIZE); osThreadDef(alarmThread, osPriorityBelowNormal, DEFAULT_STACK_SIZE); //priority BelowNormal +osThreadDef(ledThread, osPriorityBelowNormal, DEFAULT_STACK_SIZE); osThreadDef(displayThread, osPriorityLow, DEFAULT_STACK_SIZE); //priority Low osThreadDef(manualmode, osPriorityNormal, DEFAULT_STACK_SIZE); -//osThreadDef(normalmode, osPriorityNormal, DEFAULT_STACK_SIZE); -//osThreadDef(exercisemode, osPriorityNormal, DEFAULT_STACK_SIZE); -//osThreadDef(sleepmode, osPriorityNormal, DEFAULT_STACK_SIZE); - - -//////////////////////////////////////////// -//////////////////////////////////////////// -//////////////////////////////////////////// int main() { @@ -500,73 +458,56 @@ senseTid = osThreadCreate(osThread(PaceSense), NULL); signalTid = osThreadCreate(osThread(PaceSignal), NULL); displayTid = osThreadCreate(osThread(displayThread), NULL); -// pacemodeTid = osThreadCreate(osThread(normalmode), NULL); + ledTid = osThreadCreate(osThread(ledThread), NULL); + normalmode(NULL); - + vsignal.rise(&vsignal_irq); //rising edge of timer asignal.rise(&asignal_irq); -// Callback<void()> apaceTimerTask((void*)NULL, (void (*)(void*))&a_pace); -// Callback<void()> vpaceTimerTask((void*)NULL, (void (*)(void*))&v_pace); -// apace_timer = new RtosTimer(apaceTimerTask); -// vpace_timer = new RtosTimer(vpaceTimerTask); - lcd.cls(); pc.attach(&Rx_interrupt, RawSerial::RxIrq); while(true) { -// lcd.printf("test1"); osEvent evt = mode_q.get(); if(evt.status == osEventMessage) { switch((char)evt.value.p) { case('n'): mm_flag = 0; - lcd.printf("paceN"); + osSignalSet(senseTid, 0x5); osThreadTerminate (pacemodeTid); osThreadTerminate (displayTid); -// pacemodeTid = osThreadCreate(osThread(normalmode), NULL); normalmode(NULL); displayTid = osThreadCreate(osThread(displayThread), NULL); - lcd.printf("%d", observation_interval); break; case('s'): mm_flag = 0; - lcd.printf("paceS"); + osSignalSet(senseTid, 0x5); osThreadTerminate (pacemodeTid); osThreadTerminate (displayTid); -// pacemodeTid = osThreadCreate(osThread(sleepmode), NULL); sleepmode(NULL); displayTid = osThreadCreate(osThread(displayThread), NULL); break; case('e'): mm_flag = 0; - lcd.printf("paceE"); + osSignalSet(senseTid, 0x5); osThreadTerminate (pacemodeTid); osThreadTerminate (displayTid); -// pacemodeTid = osThreadCreate(osThread(exercisemode), NULL); exercisemode(NULL); displayTid = osThreadCreate(osThread(displayThread), NULL); - lcd.printf("%d", observation_interval); break; case('m'): mm_flag = 1; osThreadTerminate (pacemodeTid); - //osThreadTerminate (displayTid); -// apace_timer->stop(); -// vpace_timer->stop(); pacemodeTid = osThreadCreate(osThread(manualmode), NULL); -// displayTid = osThreadCreate(osThread(displayThread), NULL); manual_mode = 1; break; case('o'): - lcd.printf("modeO"); - hr_mutex.lock(); obsinterval(); - hr_mutex.unlock(); osThreadTerminate (displayTid); displayTid = osThreadCreate(osThread(displayThread), NULL); break; } } } -} +} \ No newline at end of file