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
Pacemaker.cpp
- Committer:
- sanjeet25
- Date:
- 2015-11-30
- Revision:
- 0:894a7ad8ea79
- Child:
- 1:d965ae2443b9
File content as of revision 0:894a7ad8ea79:
#include "mbed.h" #include "TextLCD.h" #include "rtos.h" TextLCD lcd(p15, p16, p17, p18, p19, p20); Serial pc(USBTX, USBRX); int pacemakerRate=0; InterruptIn ASignal(p25); InterruptIn VSignal(p26); int AVI = 65; int ASense=0; int VSense=0; int modeset; bool aPace; DigitalOut APace(p23); DigitalOut VPace(p24); DigitalOut APace1(LED1); DigitalOut VPace1(LED2); DigitalOut HighAl(LED3); DigitalOut LowAl(LED4); InterruptIn ASig(p25); InterruptIn VSig(p26); int pacemakerInterval=10; const int minwait_A=50; const int minwait_V=50; int modeSwitchTimeInterval = 1500; volatile int time_count=0; int m=0; int s=0; int ms=0; int PVARP=150; char key_input; bool changePacemakerInterval; int LRI=1500; int URI=600; int low[4] = {30,40,100,30}; int high[4] = {60,100,175,175}; volatile bool asig=false; volatile bool vsig=false; const int sleepModeURI = 1000; const int sleepModeLRI = 2000; const int normalModeURI = 600; const int normalModeLRI = 1500; const int sportsModeURI = 343; const int sportsModeLRI = 600; const int manualModeURI = 343; const int manualModeLRI = 2000; int time1_count=0; int PVAB = 10; int VRP = 150; typedef enum Modes { Test, Normal, Sleep, Random, Sports, Manual, Observer }; typedef enum pacemakersend { AVIEvent, VentricalEvent, ManualMode, PostVSense }; typedef enum pacemakerventrical { AWait }; pacemakerventrical pventrical; //pacemakersend psend; Modes mode; //mode=Normal; Mutex PacemakerMutex; Thread *pa; Thread *pv; Thread *psend; Thread *pmode; void resetTimer0(); void resetTimer1(); void VPacesend(); void APacesend(); void ASignalreceive(); void VSignalreceive(); void PacemakerAtrial(); void PacemakerModes(); void timer0_init(); void timer1_init(); void ASignalreceive(); void updatePacemaker(); void VSignalreceive(); void PacemakerVentricularInterval(); extern "C" void TIMER0_IRQHandler (void) { if((LPC_TIM0->IR & 0x01) == 0x01) { // if interrupt provided, continue to next line LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag time_count++; //increment time_count } } void timer0_init(void) { LPC_SC->PCONP |=1<1; //power on the timer LPC_TIM0->MR0 = 23980; //10 msec period i.e the timer count will increment every 10ms LPC_TIM0->MCR = 3; //reset control //3 = Interrupt & reset timer0 on match //1 = Interrupt only, no reset NVIC_EnableIRQ(TIMER0_IRQn); //enable interrupt LPC_TIM0->TCR = 1; //enable the timer } extern "C" void TIMER1_IRQHandler (void) { if((LPC_TIM1->IR & 0x01) == 0x01) { // if interrupt provided, continue to next line LPC_TIM1->IR |= 1 << 0; // Clear MR0 interrupt flag time1_count++; //increment time_count } } void timer1_init(void) { LPC_SC->PCONP |=1<1; //power on the timer LPC_TIM1->MR0 = 23980; //10 msec period i.e the timer count will increment every 10ms LPC_TIM1->MCR = 3; //reset control //3 = Interrupt & reset timer0 on match //1 = Interrupt only, no reset NVIC_EnableIRQ(TIMER1_IRQn); //enable interrupt LPC_TIM1->TCR = 1; //enable the timer } void resetTimer0() { time_count; LPC_TIM0->TCR = 0; lcd.locate(0,0); lcd.printf("%02d:%02d:%02d", m,s,ms); } void resetTimer1() { time1_count=0; LPC_TIM1->TCR = 0; lcd.locate(0,0); lcd.printf("%02d:%02d:%02d", m,s,ms); } //void VPacesend() //{ // VPace=1; // VPace1=1; // APace=0; // APace1=0; //} void AorVPacesend() { Thread::signal_wait(0x01); if(aPace) { APace=1; VPace1=0; APace1=1; VPace=0; } else { VPace=1; VPace1=1; APace=0; APace1=0; } } void ASignalreceive() { pc.printf("ASignalreceive"); asig=true; vsig=false; } void VSignalreceive() { pc.printf("VSignalreceive"); vsig=true; asig=false; } void ASensesend() { pc.printf("ASensesend"); ASense=1; wait(0.002); ASense=0; } void sound_HighAlarm() { pc.printf("high"); HighAl=1; LowAl=0; } void sound_LowAlarm() { pc.printf("low"); LowAl=1; HighAl=0; } void updatePacemaker() { int temp = 60/pacemakerInterval; pacemakerRate = pacemakerRate + temp; } void VSensesend() { pc.printf("VSensesend"); VSense=1; wait(0.002); VSense=0; } void PacemakerVentricalEvent(void const* args) { pc.printf("enteredpventricalevent"); while(1) { switch(pventrical) { case AWait: while(vsig==false||ASense==0||VPace==0); if(vsig==true) { pc.printf("vsig in"); VSensesend(); pventrical=AWait; break; } else if(ASense==1) { resetTimer0(); } else if(APace==1) { resetTimer0(); } while(time_count<PVAB); while(vsig==false||VPace==0); if(vsig==true) pc.printf("vsig in"); VSensesend(); resetTimer0(); while(time_count<VRP); break; } } } void PacemakerSend(void const* args) { pc.printf("enteredpsend"); while(1) { switch(psend) { case AVIEvent: while(time_count<AVI||VSense==0||mode!=Manual); if(time_count>=AVI) { VPacesend(); psend=VentricalEvent; } else if(mode==Manual) { while (mode==Manual); psend=AVIEvent; } else if(VSense==1) psend=VentricalEvent; break; case VentricalEvent: while(ASense==0||time_count<LRI||VSense==0||mode!=Manual); if(ASense==1) { if(mode==Manual) { while(mode==Manual); psend=AVIEvent; } else if(VSense==1) { resetTimer0(); psend=PostVSense; } else { resetTimer0(); psend=AVIEvent; } } break; case PostVSense: while(mode!=Manual||ASense==0||time_count<LRI-AVI); if(mode==Manual) { while(mode==Manual); psend=AVIEvent; } else if(ASense==1) { if(mode==Manual) { while(mode==Manual); } else { resetTimer0(); psend=AVIEvent; } } else if(time_count>=LRI-AVI) { while(mode!=Manual); while(mode==Manual); psend=AVIEvent; } break; } } } void PacemakerAtrial(void const* args) { pc.printf("enteredpatrial"); while(1) { while(asig==false||APace==0); if(asig==1) { pc.printf("asig in"); ASensesend(); } resetTimer0(); while(VSense==0||VPace==0); resetTimer1(); while(time_count<PVARP); while(time1_count<URI); } } void PacemakerModes(void const* args) { pc.printf("enteredpmodes"); while(1) { if(pc.readable()) { key_input = pc.getc(); if((key_input=='n'||key_input=='N')&&!changePacemakerInterval) { mode = Normal; pc.printf("Normal"); LRI=normalModeLRI; URI=normalModeURI; // (*Pace).signal_set(0x01); //resetTimer0(); modeset=0; } else if((key_input=='s'||key_input=='S')&&!changePacemakerInterval) { mode=Sleep; pc.printf("Sleep"); modeset=1; LRI=sleepModeLRI; URI=sleepModeURI; // (*Pace).signal_set(0x01); //resetTimer0(); } else if((key_input=='e'||key_input=='E')&&!changePacemakerInterval) { mode=Sports; pc.printf("Exercise"); modeset=2; LRI=sportsModeLRI; URI=sportsModeURI; // (*Pace).signal_set(0x01); //resetTimer0(); } else if((key_input=='m'||key_input=='M')&&!changePacemakerInterval) { mode=Manual; modeset=3; LRI=manualModeLRI; URI=manualModeURI; aPace=true; //(*Pace).signal_set(0x02); pc.printf("Manual"); } else if((key_input=='v'||key_input=='V')&& !changePacemakerInterval) { if(mode==Manual) { pc.printf("Ventricular"); VPacesend(); aPace=false; (*Pace).signal_set(0x02); } } else if((key_input=='a'||key_input=='A')&&!changePacemakerInterval) { if(mode==Manual) { APacesend(); pc.printf("Atrial"); aPace=true; (*Pace).signal_set(0x02); } } else if((key_input=='o'||key_input=='O')&&!changePacemakerInterval) { int a = 10 + rand() % 80; mode=Observer; pc.printf("Observer and %u",a); pacemakerInterval =a; } } } } //void PacemakerDisplay(void const* args) //{ pc.printf("enteredpdisplay"); // while(1) { // while(VPace==0||VSense==0) { // if(time_count<=pacemakerInterval*1000); // updatePacemaker(); // } // pc.printf("%u",pacemakerRate); // while(time_count<=pacemakerInterval*1000); // if(pacemakerRate<low[modeset]) { // resetTimer0(); // sound_LowAlarm(); // pc.printf("low"); // } else if(pacemakerRate>high[modeset]) { // resetTimer0(); // pc.printf("high"); // sound_HighAlarm(); // } else if(pacemakerRate<=high[modeset]&&pacemakerRate<=low[modeset]) { // resetTimer0(); // pc.printf("Normal"); // } // } // //} int main () { pc.baud(9600); VSignal.rise(&VSignalreceive); ASignal.rise(&ASignalreceive); timer0_init(); timer1_init(); Thread patrial(PacemakerAtrial); pa=&patrial; Thread pventrical(PacemakerVentricalEvent); pv=&pventrical; Thread pacesend(PacemakerSend); psend=&pacesend; Thread pmodes(PacemakerModes); pmode=&pmodes; //Thread pdisplay(PacemakerDisplay); while(1) { } }