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
Fork of Pacemaker by
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 }
Generated on Sun Jul 24 2022 07:25:46 by
1.7.2
