heart modes, send, receive
Dependencies: Terminal TextLCD mbed-rtos mbed
Fork of Heart by
Diff: heart.cpp
- Revision:
- 1:c340c31174a5
- Parent:
- 0:a307f0abfd4d
- Child:
- 2:fc2f41386ee4
diff -r a307f0abfd4d -r c340c31174a5 heart.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/heart.cpp Sun Nov 29 01:17:40 2015 +0000 @@ -0,0 +1,230 @@ +#include "mbed.h" +#include "TextLCD.h" +#include "rtos.h" + +TextLCD lcd(p15, p16, p17, p18, p19, p20); +Serial pc(USBTX, USBRX); + +InterruptIn APace(p23); +InterruptIn VPace(p24); + +DigitalOut ASignal(p25); +DigitalOut VSignal(p26); + +DigitalOut ASignal1(LED2); +DigitalOut VSignal1(LED3); + +const int minwait_A=50; +const int minwait_V=50; + +volatile int time_count=0; +volatile int time1_count; +int m=0; +int s=0; +int ms=0; + +char key_input; + +int LRI=1500; +int URI=600; + +volatile bool Areceived=false; +volatile bool Vreceived=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; + +typedef enum Modes { + Test, + Normal, + Sleep, + Random, + Sports, + Manual, + AtrialMode, + VentricularMode +}; +Modes mode; + +Mutex HeartMutex; + +void resetTimer0(); +void resetTimer1(); +void VCheck(); +void ACheck(); +void ASignalsend(); +void VSignalsend(); +void HeartReceive(); +void HeartSend(); +void HeartKeyBoardModeSwitch(); + + +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_TIM0->IR & 0x01) == 0x01) { // if interrupt provided, continue to next line + LPC_TIM0->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_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 + +} + +void resetTimer0() +{ + m=0; + s=0; + ms=0; + LPC_TIM0->TCR = 0; + lcd.locate(0,0); + lcd.printf("%02d:%02d:%02d", m,s,ms); +} + +void resetTimer1() +{ + m=0; + s=0; + ms=0; + LPC_TIM1->TCR = 0; + lcd.locate(0,0); + time_count=0; +} + +void VCheck() +{ + Vreceived=true; +} + +void ACheck() +{ + Areceived=true; +} + +void ASignalsend() +{ + ASignal=1; + ASignal1=1; + VSignal1=0; +} + +void VSignalsend() +{ + VSignal=1; + VSignal1=1; + ASignal1=0; +} +void HeartReceive(void const* args) +{ + while(1) { + pc.printf("HR"); + while(Areceived==false||Vreceived==false); + if(Vreceived==true) { + resetTimer0(); + pc.printf("VPace aaya"); + } else if(Areceived==true) { + resetTimer0(); + pc.printf("APace aaya"); + } + } +} + +void HeartSend(void const* args) +{ + while(!pc.readable()) { + int r = rand() % 2; + pc.printf("HS"); + while(time_count<minwait_V && mode!=Random && (mode==Test || mode==Manual)); + pc.printf("%u",time_count); + if(r==0) { //(time_count<minwait_V && mode!=Random && mode==Test && mode==Manual && r==0) { + VSignalsend(); + pc.printf("Vsignal"); + resetTimer0(); + } else if(r==1) { + ASignalsend(); + pc.printf("ASignal"); + resetTimer0(); + } + } +} +void HeartKeyBoardModeSwitch(void const* args) +{ + while(1) { + if(pc.readable()) { + + key_input = pc.getc(); + + if(key_input=='r'||key_input=='R') { + mode=Random; + pc.printf("Random"); + HeartSend("s"); + } else if(key_input=='t'||key_input=='T') { + mode=Test; + pc.printf("Test"); + } else if(key_input=='m'||key_input=='M') { + mode=Manual; + pc.printf("Manual"); + key_input = pc.getc(); + } else if(mode==Manual&&(key_input=='v'||key_input=='V')) { + mode=Manual; + pc.printf("Ventricular"); + } else if(mode==Manual&&(key_input=='a'||key_input=='A')) { + mode=Manual; + pc.printf("Atrial"); + + + } + } + } +} +int main() +{ + pc.baud(9600); + VPace.rise(&VCheck); + APace.rise(&ACheck); + timer0_init(); + timer1_init(); + Thread heartreceive(HeartReceive); + Thread heartsend(HeartSend); + Thread heartkeyboard(HeartKeyBoardModeSwitch); + + while(1) { + } +} \ No newline at end of file