j,hjgvcjyhchh
Dependencies: TextLCD mbed-rtos mbed
main.cpp
- Committer:
- sanjeet25
- Date:
- 2015-12-01
- Revision:
- 0:1f328e1c709f
File content as of revision 0:1f328e1c709f:
#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); Mutex mutex; DigitalOut APace1(LED1); DigitalOut VPace1(LED2); DigitalOut ASense_LED(LED3); DigitalOut VSense_LED(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 psend1; Modes mode; //mode=Normal; Mutex PacemakerMutex; Thread *pa; Thread *pv; Thread *psend; Thread *aorv; Thread *pmode; void resetTimer0(); void resetTimer1(); void AorVPacesend(); void ASignalreceive(); void VSignalreceive(); void PacemakerAtrial(); void PacemakerModes(); void timer0_init(); void timer1_init(); void updatePacemaker(); 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 AorVPacesend(void const* args) { while(1) { Thread::signal_wait(0x01); if(aPace) { APace=1; VPace1=0; //APace1=1; wait(0.002); APace1=0; } else { // pc.printf("Sending VPace"); VPace=1; //VPace1=1; wait(0.002); VPace1=0; //APace1=0; } } } void ASignalreceive() { //pc.printf("ASignalreceive"); asig=true; } void VSignalreceive() { //pc.printf("VSignalreceive"); vsig=true; } void ASensesend() { mutex.unlock(); ASense_LED = 1; //pc.printf("ASensesend"); ASense=1; wait(0.002); ASense_LED=0; //ASense = 0; mutex.unlock(); } void VSensesend() { mutex.lock(); ASense_LED = 1; //pc.printf("VSensesend"); VSense=1; wait(0.002); ASense_LED=0; //VSense=0; mutex.unlock(); } void PacemakerVentricalEvent(void const* args) { pc.printf("enteredpventricalevent"); while(1) { switch(pventrical) { case AWait: pc.printf("AWAIT ENTERED"); //while(vsig==false||ASense==0||VPace==0); if(vsig==true) { vsig=false; pc.printf("vsig in"); VSensesend(); pventrical=AWait; break; } else if(ASense==1) { resetTimer0(); ASense=0; } 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); pc.printf("exiting pventrical event"); break; } } } void PacemakerSend(void const* args) { pc.printf("enteredpsend"); while(1) { switch(psend1) { case AVIEvent: // while(time_count<AVI||VSense==0||mode!=Manual); if(time_count>=AVI) { (*aorv).signal_set(0x01); //AorVPacesend("s"); psend1=VentricalEvent; } else if(mode==Manual) { while (mode==Manual); psend1=AVIEvent; } else if(VSense==1) psend1=VentricalEvent; VSense=0; break; case VentricalEvent: //while(ASense==0||time_count<LRI||VSense==0||mode!=Manual); if(ASense==1) { ASense=0; if(mode==Manual) { while(mode==Manual); psend1=AVIEvent; } else if(VSense==1) { resetTimer0(); VSense=0; psend1=PostVSense; } else { resetTimer0(); psend1=AVIEvent; } } break; case PostVSense: //while(mode!=Manual||ASense==0||time_count<LRI-AVI); if(mode==Manual) { while(mode==Manual); psend1=AVIEvent; } else if(ASense==1) { if(mode==Manual) { while(mode==Manual); } else { resetTimer0(); psend1=AVIEvent; } } else if(time_count>=LRI-AVI) { while(mode!=Manual); while(mode==Manual); psend1=AVIEvent; } break; } } } void PacemakerAtrial(void const* args) { pc.printf("enteredpatrial"); while(1) { //while(asig==false||APace==0); if(asig==true) { asig=false; pc.printf("asig in"); ASensesend(); } pc.printf("%u",time_count); resetTimer0(); pc.printf("%u",time_count); //while(VSense==0||VPace==0); pc.printf("%u",time1_count); resetTimer1(); pc.printf("%u",time1_count); pc.printf("waiting for pvarp"); while(time_count<PVARP); while(time1_count<URI); pc.printf("exiting patrial event"); } } void PacemakerModes(void const* args) { pc.printf("enteredpmodes"); while(1) { //if(pc.readable()) { Thread::wait(0x02); mutex.lock(); //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) { mode=Manual; pc.printf("Ventricular"); // AorVPacesend(); aPace=false; (*aorv).signal_set(0x01); } } else if((key_input=='a'||key_input=='A')&&!changePacemakerInterval) { if(mode==Manual) { mode=Manual; //AorVPacesend(); pc.printf("Atrial"); aPace=true; (*aorv).signal_set(0x01); } } else if((key_input=='o'||key_input=='O')&&!changePacemakerInterval) { int a = 10 + rand() % 80; mode=Observer; pc.printf("Observer and %u",a); pacemakerInterval =a; } mutex.unlock(); //} } } void Rx_interrupt() { if(pc.readable()) { key_input=LPC_UART0->RBR; //read uart buffer data and clear the interrupt flag (*pmode).signal_set(0x02); //initiate the serial thread to change the state of the timer } } int main () { pc.baud(9600); pc.attach(&Rx_interrupt, Serial::RxIrq); 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 aorvpacesend(AorVPacesend); aorv=&aorvpacesend; //Thread pdisplay(PacemakerDisplay); while(1) { } }