heart modes, send, receive

Dependencies:   Terminal TextLCD mbed-rtos mbed

Fork of Heart by CIS541

Revision:
1:c340c31174a5
Parent:
0:a307f0abfd4d
Child:
2:fc2f41386ee4
--- /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