fork the master

Dependencies:   TextLCD mbed-rtos mbed

Fork of Pacemaker by pacemaker team

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002  * Pacemaker MBED code
00003  *
00004  * CIS541 Embedded Systems for Life Critical Applications
00005  * Authors: Jing Qiu
00006  *          Michael Frederick
00007  *          Tim Hu
00008  *          Alex Little
00009  * 
00010  */
00011 
00012 #include "mbed.h"
00013 #include "LPC17xx.h"
00014 #include "TextLCD.h"
00015 #include "rtos.h"
00016 #include <ctype.h>
00017 
00018 #define AVI_h 100
00019 #define AVI_l 30
00020 #define PVARP_h 500
00021 #define PVARP_l 150
00022 
00023 #define VRP_h 500
00024 #define VRP_l 150
00025 #define BM(x) (1<<(x))
00026 #define PULSE_WIDTH_V 10
00027 #define PULSE_WIDTH_A 10
00028 
00029 TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
00030 
00031 int LRI_h = 1666;
00032 int LRI_l = 666;
00033 int observation_interval=10000;   //ms
00034 bool setObservation = false;
00035 
00036 Serial pc(USBTX, USBRX);
00037 
00038 char mode = 'N';
00039 
00040 int a_clock;
00041 int v_clock;
00042 bool setobservation = false;
00043 
00044 int beat;
00045 
00046 InterruptIn atrial_int(p21); // double check me
00047 InterruptIn vent_int(p22); // me too
00048 
00049 DigitalOut aPace(p23);
00050 DigitalOut vPace(p24);
00051 
00052 bool aSensed = 0; // 0 means that we are expecting Apace or Asense next
00053 DigitalOut led1(LED1);   //apace
00054 DigitalOut led2(LED2);   //vpace
00055 DigitalOut led3(LED3);   //asense
00056 DigitalOut led4(LED4);   //vsense
00057 
00058 void initTimer();
00059 void startTimer();
00060 
00061 void asense();
00062 void vsense();
00063 
00064 void apace();
00065 void vpace();
00066 
00067 
00068 void apace()
00069 {
00070     led1 = 1;
00071     aPace = 1;
00072     wait_ms(PULSE_WIDTH_A);
00073     aPace = 0;
00074     led1 = 0;   
00075     beat++;
00076     
00077 }
00078 
00079 void vpace()
00080 {
00081     led2= 1;
00082     vPace = 1;
00083     wait_ms(PULSE_WIDTH_V);
00084     vPace = 0;
00085     led2 = 0;
00086 }
00087 
00088 void initTimer()
00089 {
00090     // set up OS timer (timer0)
00091     LPC_SC->PCONP |= BM(1); //power up timer0
00092     LPC_SC->PCLKSEL0 |= BM(2); // clock = CCLK (96 MHz)
00093     LPC_TIM0->PR = 48000; // set prescale to 48000 (2048 Hz timer) 
00094     LPC_TIM0->MR0 = 1; // match0 compare value (32-bit)
00095     LPC_TIM0->MCR |= BM(0)|BM(1); // interrupt and reset on match0 compare
00096     NVIC_EnableIRQ(TIMER0_IRQn); // enable timer interrupt
00097 }
00098 
00099 void startTimer()
00100 {
00101     LPC_TIM0->TCR |= BM(1); // reset timer1
00102     LPC_TIM0->TCR &= ~BM(1); // release reset
00103     LPC_TIM0->TCR |= BM(0); // start timer
00104 }
00105 
00106 void resetTimer()
00107 {
00108     LPC_TIM0->TCR |= BM(1); // reset timer0
00109     LPC_TIM0->TCR &= ~BM(1); // release reset
00110 }
00111 
00112 
00113 
00114 void display_thread_handler(void const *args)
00115 {    
00116     while(1)
00117     {
00118         wait_ms(observation_interval);
00119         pc.printf("BPM: %d\r\n",beat*60000/observation_interval);
00120         lcd.cls();
00121         lcd.printf("BPM: %d\r\n", beat*60000/observation_interval);
00122         beat=0;
00123     }
00124 }
00125 
00126 
00127 void asense() {
00128     if (v_clock >= VRP_l) { //Ignore vSense outside this time interval
00129         v_clock = 0;
00130         aSensed = 0;
00131      }
00132      led3 = 1;
00133      wait_ms(PULSE_WIDTH_A);
00134      led3 = 0;
00135      
00136 }
00137 
00138 void vsense() {
00139     if ((a_clock >= PVARP_l) && aSensed == 0){ 
00140         a_clock = 0;
00141         aSensed = 1;
00142         beat++;
00143     }
00144     led4 = 1;
00145     wait_ms(PULSE_WIDTH_V);
00146     led4 = 0;
00147 }
00148 
00149 void button_handler(void const *args)
00150 {
00151     int observation_temp=0;
00152     while(1)
00153     {
00154       char buffer;
00155       if(pc.readable()) {
00156         buffer = toupper(pc.getc());
00157         if (buffer == 'N')
00158         {
00159             mode = buffer;
00160             LRI_h = 1500;
00161             LRI_l = 600;
00162         }
00163         else if (buffer == 'S')
00164         {
00165             mode = buffer;
00166             LRI_h = 2000;
00167             LRI_l = 1000;
00168         }
00169         else if (buffer == 'E')
00170         {
00171             mode = buffer;
00172             LRI_h = 600;
00173             LRI_l = 342;
00174         }
00175         else if (buffer == 'M')
00176         {
00177             mode = buffer;
00178             LRI_h = 2000;
00179             LRI_l = 342;
00180         }
00181         else if (buffer == 'A' && mode == 'M')
00182             apace();
00183         else if (buffer == 'V' && mode == 'M')
00184             vpace();
00185         else if (buffer == 'O') {
00186             setObservation = true;
00187             observation_temp = 0;
00188         }
00189         else if (buffer == 13  && setObservation) //newline
00190         {
00191             observation_interval = observation_temp*1000;
00192             setObservation = false;
00193          //   printf("observation interval now: %d\r\n",observation_interval);
00194         }
00195         else if (setObservation)
00196         {
00197             observation_temp *= 10;
00198             observation_temp += buffer-48;
00199         
00200         }
00201       }
00202     }
00203 }
00204 
00205 void pacemaker_thread_handler(void const *args)
00206 {
00207     
00208     /**********************************************************
00209     ************Initialize timer to interrupt every 1 ms*********
00210     ***********************************************************/
00211     
00212     initTimer();
00213     startTimer();
00214     
00215     while(1){}    
00216     
00217 }
00218 
00219  
00220 /**********************************************************
00221  ************ timer interrupt every 1 ms*********
00222  ***********************************************************/
00223     
00224 extern "C" void TIMER0_IRQHandler (void) {
00225     if((LPC_TIM0->IR & 0x01) == 0x01) // if MR0 interrupt
00226     {
00227         LPC_TIM0->IR |= (1 << 0); // Clear MR0 interrupt flag
00228        if (v_clock >= (LRI_h-AVI_l) && aSensed == 0) {
00229             a_clock = 0;
00230             aSensed = 1;  
00231             //printf("Apace %d\r\n",v_clk);
00232             apace();
00233             /*
00234             setGPIO(a_pace);
00235             wait_us(PULSE_WIDTH_A);
00236             clearGPIO(a_pace);
00237             */
00238         }
00239         if ((a_clock >= AVI_h) && aSensed == 1) {
00240             v_clock = 0;
00241             aSensed = 0;
00242             //led3 = 0;
00243             //printf("Vpace %d\r\n",a_clk);
00244             /*
00245             setGPIO(v_pace);
00246             wait_us(PULSE_WIDTH_V);
00247             clearGPIO(v_pace);
00248             */         
00249             vpace();
00250         }
00251         v_clock++;
00252         a_clock++;
00253         
00254         if(v_clock>500) led3 = 0;
00255         if(a_clock>500) led4 = 0;
00256     } 
00257 }
00258 
00259 
00260 int main (void) {
00261     //TODO set parameters
00262     atrial_int.rise(&asense);
00263     vent_int.rise(&vsense);
00264 
00265     Thread display(display_thread_handler);
00266     Thread keyboard(button_handler);
00267     Thread pacemaker(pacemaker_thread_handler);
00268 
00269     while(1){}
00270     
00271 
00272 }