yay!
Dependencies: TextLCD mbed-rtos mbed
Fork of 541_Pacermaker by
Diff: main.cpp
- Revision:
- 4:8e3dc7e73627
- Parent:
- 3:2ed03f9e0042
- Child:
- 6:a1a3e73d90f3
--- a/main.cpp Wed Dec 02 02:27:30 2015 +0000 +++ b/main.cpp Wed Dec 02 04:13:44 2015 +0000 @@ -1,5 +1,7 @@ -#include "main.h" -//#include "TextLCD.h" +#include "PacemakerLibrary.h" +#include "TextLCD.h" + +TextLCD lcd(p15,p16,p17,p18,p19,p20); void incrementHeartRate() { heartRateMutex.lock(); @@ -8,15 +10,15 @@ } void setVSignal(bool state) { - expectVMutex.lock(); + VMutex.lock(); waitVSignal = state; - expectVMutex.unlock(); + VMutex.unlock(); } void setASignal(bool state) { - expectAMutex.lock(); + AMutex.lock(); waitASignal = state; - expectAMutex.unlock(); + AMutex.unlock(); } void setTimeConstraint(int i) { @@ -28,8 +30,36 @@ void printToLCD() { displayMutex.lock(); // pc.printf("%04d\r\n", avgHeartRate); -// pc.printf("%02d\r\n", observationInterval/1000); -// pc.printf("%04d\r\n", (heartRateHeart*(60/sec))); +// pc.printf("%02d\r\n", pacemakerIntervalInMs/1000); +// pc.printf("%04d\r\n", (heartRateHeart*(60/sec))); + lcd.cls(); + lcd.locate(0,0); + lcd.printf("Rate: %.2f BPM", avgHeartRate); + lcd.locate(0,1); + switch(pacemakerMode) + { + default: + case NORMAL: + { + lcd.printf("NORMAL"); + break; + } + case EXERCISE: + { + lcd.printf("EXERCISE"); + break; + } + case SLEEP: + { + lcd.printf("SLEEP (ZZZ)"); + break; + } + case MANUAL: + { + lcd.printf("MANUAL"); + break; + } + } displayMutex.unlock(); } @@ -67,7 +97,7 @@ void changeMode() { - switch(paceMakerMode) + switch(pacemakerMode) { default: case NORMAL: @@ -90,7 +120,7 @@ break; } } - modeChanged=false; + changePacemakerMode=false; } void pacemakerModeSwitch(const void *args) @@ -98,7 +128,7 @@ while(1) { Thread::signal_wait(signal3); - if(modeChanged) + if(changePacemakerMode) { changeMode(); } @@ -111,13 +141,13 @@ { asenseLED=1; wait(0.001); - println("ASense Received"); +// pc.printf("ASense Received at %d ms\r\n", globalTimer.read_ms()); asenseLED=0; - if(modeChanged) + if(changePacemakerMode) { (*P_PacemakerModeSwitch).signal_set(signal3); } - aSenseOccurred=true; + ASenseReceived=true; (*P_PacemakerReceive).signal_set(signal4); } } @@ -127,86 +157,75 @@ if(waitVSignal) { vsenseLED=1; - println("VSense Received"); +// pc.printf("VSense Received at %d ms\r\n", globalTimer.read_ms()); wait(0.001); vsenseLED=0; - if(modeChanged) + if(changePacemakerMode) { (*P_PacemakerModeSwitch).signal_set(signal3); } - canPaceV=false; - aSenseOccurred=false; + waitVPace=false; + ASenseReceived=false; (*P_PacemakerReceive).signal_set(signal4); } } -void timeOut(const void *args) +void timeConstraintTimeout(const void *args) { - // check which time out has occurred - // generate appropriate pace signal - // reset timer to new value - //apaceLED=1; if(timeConstraint==AVI_const) { - //generate VPace - if(canPaceV) + //trigger vpace + if(waitVPace) { - paceA=false; + APace=false; (*P_PacemakerSend).signal_set(signal1); } else { - canPaceV=true; + waitVPace=true; } } else if(timeConstraint==PVAB_const) { setVSignal(true); setTimeConstraint(AVI_const); - timerRunning=true; - TimeOutTimer->start(AVI-PVAB); + TimeConstTimerOn=true; + TimeConstTimer->start(AVI-PVAB); } else if(timeConstraint==VRP_const) { - //now we can sense a Ventrival event, but not an atrial event as PVARP is not over - //restart timer for PVARP setVSignal(true); setTimeConstraint(PVARP_const);; - timerRunning=true; - TimeOutTimer->start(PVARP-VRP); + TimeConstTimerOn=true; + TimeConstTimer->start(PVARP-VRP); } else if(timeConstraint==PVARP_const) { - //now we can sense Atrial events as well setASignal(true); setTimeConstraint(LRI_const); - timerRunning=true; - TimeOutTimer->start(LRI-PVARP-AVI); + TimeConstTimerOn=true; + TimeConstTimer->start(LRI-PVARP-AVI); } else if(timeConstraint==LRI_const) { - //generate APace - paceA=true; + //trigger apace + APace=true; (*P_PacemakerSend).signal_set(signal1); } } -void uriTimeOut(const void *args) +void atrialEventTimeout(const void *args) { - // uri is over - //check is a vpace has to be generated; If yes then generate the pace; else enable a flag that lets the thread generate the pace - if(paceVPending || canPaceV) + if(VPaceNotReceived || waitVPace) { - //pace V as a pace occurred during URI - paceA=false; - paceVPending=false; + APace=false; + VPaceNotReceived=false; (*P_PacemakerSend).signal_set(signal1); } else { - canPaceV=true; //allow the PM to pace V as URI is now over + waitVPace=true; } - } void pacemakerReceive(const void *args) @@ -214,29 +233,29 @@ while(1) { Thread::signal_wait(signal4); - if(timerRunning) + if(TimeConstTimerOn) { - TimeOutTimer->stop(); - timerRunning=false; + TimeConstTimer->stop(); + TimeConstTimerOn=false; } - if(aSenseOccurred) + if(ASenseReceived) { setASignal(false); setVSignal(true); - timerRunning=true; + TimeConstTimerOn=true; setTimeConstraint(AVI_const); - TimeOutTimer->start(AVI);//500); + TimeConstTimer->start(AVI); } else { incrementHeartRate(); setVSignal(false); setASignal(false); - canPaceV=false; - URITimeOutTimer->start(URI); - timerRunning=true; + waitVPace=false; + AtrialEventTimer->start(URI); + TimeConstTimerOn=true; setTimeConstraint(VRP_const); - TimeOutTimer->start(VRP); + TimeConstTimer->start(VRP); } } } @@ -246,49 +265,50 @@ while(1) { Thread::signal_wait(signal1); - if(paceA) + if(APace) { - println("APace Sent"); + pc.printf("APace Sent at %d ms\r\n", globalTimer.read_ms()); apaceLED=1; aPace=1; Thread::wait(1); aPace=0; apaceLED=0; - if(modeChanged) + if(changePacemakerMode) { changeMode(); } - // start AVI Timer + setASignal(false); setVSignal(false); setTimeConstraint(PVAB_const); - timerRunning=true; - if (paceMakerMode != MANUAL) { - TimeOutTimer->start(PVAB); + if (pacemakerMode != MANUAL) { + TimeConstTimerOn=true; + TimeConstTimer->start(PVAB); } } else { - println("VPace Sent"); + pc.printf("VPace Sent at %d ms\r\n", globalTimer.read_ms()); vpaceLED=1; vPace=1; Thread::wait(1); vPace=0; vpaceLED=0; - if(modeChanged) + if(changePacemakerMode) { changeMode(); } - // start VRP and URI timers + setVSignal(false); setASignal(false); incrementHeartRate(); - canPaceV=false; - URITimeOutTimer->start(URI); + waitVPace=false; + AtrialEventTimer->start(URI); setTimeConstraint(VRP_const); - timerRunning=true; - if (paceMakerMode != MANUAL) { - TimeOutTimer->start(VRP); + TimeConstTimerOn=true; + if (pacemakerMode != MANUAL) { + TimeConstTimerOn=true; + TimeConstTimer->start(VRP); } } } @@ -306,7 +326,7 @@ if (input >= 10 && input <= 90) { pacemakerInterval=input; - observationInterval=pacemakerInterval*1000; + pacemakerIntervalInMs = pacemakerInterval*1000; displayTimer.reset(); heartRateMutex.lock(); heartRate=0; @@ -322,47 +342,58 @@ while(1) { Thread::signal_wait(signal2); - if((((ch=='a')||(ch=='A')) && paceMakerMode==MANUAL) && !observationChange) + if (char_read == 'a' && pacemakerMode == MANUAL) { - //fire A Pace - paceA=true; + APace=true; (*P_PacemakerSend).signal_set(signal1); } - else if((((ch=='v')||(ch=='V')) && paceMakerMode==MANUAL) && !observationChange) + else if (char_read == 'v' && pacemakerMode == MANUAL) { - //fire V Pace - if(canPaceV) + if(waitVPace) { - paceA=false; - paceVPending=false; + APace=false; + VPaceNotReceived=false; (*P_PacemakerSend).signal_set(signal1); } else { - paceVPending=true; + VPaceNotReceived=true; } } - else if(((((ch=='n')||(ch=='N'))&& paceMakerMode!=NORMAL) && !observationChange) && !modeChanged) + else if (char_read == 'n' && pacemakerMode != NORMAL && !changePacemakerMode) { - paceMakerMode=NORMAL; - modeChanged=true; - } - else if(((((ch=='e')||(ch=='E')) && paceMakerMode!=EXERCISE) && !observationChange) && !modeChanged) - { - paceMakerMode=EXERCISE; - modeChanged=true; + if (pacemakerMode == MANUAL) { + // restart A/V timers + TimeConstTimerOn=true; + TimeConstTimer->start(VRP); + } + pacemakerMode=NORMAL; + changePacemakerMode=true; } - else if(((((ch=='s')||(ch=='S')) && paceMakerMode!=SLEEP) && !observationChange) && !modeChanged) + else if (char_read == 'e' && pacemakerMode != EXERCISE && !changePacemakerMode) { - paceMakerMode=SLEEP; - modeChanged=true; + if (pacemakerMode == MANUAL) { + // restart A/V timers + TimeConstTimer->start(VRP); + } + pacemakerMode=EXERCISE; + changePacemakerMode=true; } - else if(((((ch=='m')||(ch=='M')) && paceMakerMode!=MANUAL) && !observationChange) && !modeChanged) + else if (char_read == 's' && pacemakerMode != SLEEP && !changePacemakerMode) { - paceMakerMode=MANUAL; - modeChanged=true; + if (pacemakerMode == MANUAL) { + // restart A/V timers + TimeConstTimer->start(VRP); + } + pacemakerMode=SLEEP; + changePacemakerMode=true; } - else if(((((ch=='o')||(ch=='O')) && !observationChange) && !modeChanged)) + else if (char_read == 'm' && pacemakerMode != MANUAL && !changePacemakerMode) + { + pacemakerMode=MANUAL; + changePacemakerMode=true; + } + else if (char_read == 'o' && !changePacemakerMode) { // blocks, reading characters, until "return" is pressed observationMutex.lock(); @@ -383,12 +414,12 @@ Thread::wait(5); buzzer=0; Thread::wait(5); - if(!ringingAlarm) + if(!alarmPrinted) { displayMutex.lock(); println("!!!***Alarm High***!!!"); displayMutex.unlock(); - ringingAlarm=true; + alarmPrinted=true; } } while(avgHeartRate < (60000/LRI)) @@ -397,17 +428,17 @@ Thread::wait(10); buzzer=0; Thread::wait(10); - if(!ringingAlarm) + if(!alarmPrinted) { displayMutex.lock(); println("!!!***Alarm Low***!!!"); displayMutex.unlock(); - ringingAlarm=true; + alarmPrinted=true; } } - if(ringingAlarm) + if(alarmPrinted) { - ringingAlarm=false; + alarmPrinted=false; // resetDisplay(); } } @@ -420,10 +451,10 @@ while(1) { observationMutex.lock(); - if (displayTimer.read_ms() >= observationInterval) { + if (displayTimer.read_ms() >= pacemakerIntervalInMs) { displayTimer.reset(); printToLCD(); - avgHeartRate=heartRate*(60/pacemakerInterval); + avgHeartRate=heartRate*(60.0/pacemakerInterval); heartRateMutex.lock(); heartRate=0; heartRateMutex.unlock(); @@ -445,8 +476,9 @@ ASignal.rise(&aSense); VSignal.rise(&vSense); - TimeOutTimer=new RtosTimer(timeOut, osTimerOnce, (void*)0); - URITimeOutTimer=new RtosTimer(uriTimeOut, osTimerOnce, (void *)0); + + TimeConstTimer = new RtosTimer(timeConstraintTimeout, osTimerOnce, (void*)0); + AtrialEventTimer = new RtosTimer(atrialEventTimeout, osTimerOnce, (void *)0); Thread PacemakerSend(pacemakerSend); P_PacemakerSend=&PacemakerSend; @@ -472,12 +504,14 @@ PacemakerAlarm.set_priority(osPriorityAboveNormal); setTimeConstraint(VRP_const); - TimeOutTimer->start(VRP); + TimeConstTimer->start(VRP); + + globalTimer.start(); while(1) { if(pc.readable()) { - ch=pc.getc(); + char_read = pc.getc(); (*P_PacemakerKeyboard).signal_set(signal2); } }