fork the master

Dependencies:   TextLCD mbed-rtos mbed

Fork of Pacemaker by pacemaker team

Committer:
Jing_Qiu
Date:
Sat Nov 29 20:41:09 2014 +0000
Revision:
3:34e9766539fe
Parent:
2:bb8dc0c2e25e
Child:
4:cce9946d9dcd
second commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mfrede 0:6d04b1860ecf 1 /*
mfrede 0:6d04b1860ecf 2 * Pacemaker MBED code
mfrede 0:6d04b1860ecf 3 *
mfrede 0:6d04b1860ecf 4 * CIS541 Embedded Systems for Life Critical Applications
mfrede 0:6d04b1860ecf 5 *
mfrede 0:6d04b1860ecf 6 *
mfrede 1:e37d0cad77e2 7 */
Jing_Qiu 3:34e9766539fe 8
mfrede 1:e37d0cad77e2 9 #include "mbed.h"
mfrede 1:e37d0cad77e2 10 #include "LPC17xx.h"
mfrede 1:e37d0cad77e2 11 #include "TextLCD.h"
mfrede 1:e37d0cad77e2 12 #include "rtos.h"
mfrede 1:e37d0cad77e2 13
Jing_Qiu 3:34e9766539fe 14 #define AVI_h 100
Jing_Qiu 3:34e9766539fe 15 #define AVI_l 30
Jing_Qiu 3:34e9766539fe 16 #define PVARP_h 500
Jing_Qiu 3:34e9766539fe 17 #define PVARP_l 150
Jing_Qiu 3:34e9766539fe 18
Jing_Qiu 3:34e9766539fe 19 #define VRP_h 500
Jing_Qiu 3:34e9766539fe 20 #define VRP_l 150
Jing_Qiu 3:34e9766539fe 21 #define BM(x) (1<<(x))
Jing_Qiu 3:34e9766539fe 22 #define PULSE_WIDTH_V 200
Jing_Qiu 3:34e9766539fe 23 #define PULSE_WIDTH_A 100
Jing_Qiu 3:34e9766539fe 24
Jing_Qiu 3:34e9766539fe 25 int LRI_h = 1666;
Jing_Qiu 3:34e9766539fe 26 int LRI_l = 666;
Jing_Qiu 3:34e9766539fe 27
mfrede 1:e37d0cad77e2 28 Serial pc(USBTX, USBRX);
mfrede 1:e37d0cad77e2 29 TextLCD myPanel(p15,p16,p17,p18,p19,p20,TextLCD::LCD16x2);
mfrede 1:e37d0cad77e2 30 char mode = 'N';
Jing_Qiu 3:34e9766539fe 31
mfrede 1:e37d0cad77e2 32 int a_clock;
mfrede 1:e37d0cad77e2 33 int v_clock;
mfrede 1:e37d0cad77e2 34
Jing_Qiu 3:34e9766539fe 35 InterruptIn atrial_int(p17);
Jing_Qiu 3:34e9766539fe 36 InterruptIn vent_int(p18);
Jing_Qiu 3:34e9766539fe 37
Jing_Qiu 3:34e9766539fe 38 const int a_pace = 5; //pin 21 a pace output
Jing_Qiu 3:34e9766539fe 39 const int v_pace = 3; //pin 23 v pace output
Jing_Qiu 3:34e9766539fe 40
Jing_Qiu 3:34e9766539fe 41 bool aSensed = 0; // 0 means that we are expecting Apace or Asense next
Jing_Qiu 3:34e9766539fe 42 DigitalOut myled(LED1);
Jing_Qiu 3:34e9766539fe 43 //DigitalOut testpin(p6);
Jing_Qiu 3:34e9766539fe 44
Jing_Qiu 3:34e9766539fe 45 void initTimer();
Jing_Qiu 3:34e9766539fe 46 void startTimer();
Jing_Qiu 3:34e9766539fe 47 void initGPIO_outputs();
Jing_Qiu 3:34e9766539fe 48 void setGPIO(const int pinName);
Jing_Qiu 3:34e9766539fe 49 void clearGPIO(const int pinName);
Jing_Qiu 3:34e9766539fe 50
Jing_Qiu 3:34e9766539fe 51 void asense();
Jing_Qiu 3:34e9766539fe 52 void vsense();
Jing_Qiu 3:34e9766539fe 53
Jing_Qiu 3:34e9766539fe 54 void apace();
Jing_Qiu 3:34e9766539fe 55 void vpace();
Jing_Qiu 3:34e9766539fe 56
Jing_Qiu 3:34e9766539fe 57
Jing_Qiu 3:34e9766539fe 58 void apace()
Jing_Qiu 3:34e9766539fe 59 {
Jing_Qiu 3:34e9766539fe 60 setGPIO(a_pace);
Jing_Qiu 3:34e9766539fe 61 wait_us(PULSE_WIDTH_A);
Jing_Qiu 3:34e9766539fe 62 clearGPIO(a_pace);
Jing_Qiu 3:34e9766539fe 63 }
Jing_Qiu 3:34e9766539fe 64
Jing_Qiu 3:34e9766539fe 65 void vpace()
Jing_Qiu 3:34e9766539fe 66 {
Jing_Qiu 3:34e9766539fe 67 setGPIO(v_pace);
Jing_Qiu 3:34e9766539fe 68 wait_us(PULSE_WIDTH_V);
Jing_Qiu 3:34e9766539fe 69 clearGPIO(v_pace);
Jing_Qiu 3:34e9766539fe 70 }
Jing_Qiu 3:34e9766539fe 71
Jing_Qiu 3:34e9766539fe 72 void initGPIO_outputs()
Jing_Qiu 3:34e9766539fe 73 {
Jing_Qiu 3:34e9766539fe 74 LPC_SC->PCONP |= 1<<15;
Jing_Qiu 3:34e9766539fe 75 LPC_GPIO2->FIODIR |= 1<<5;
Jing_Qiu 3:34e9766539fe 76 LPC_GPIO2->FIODIR |= 1<<3;
Jing_Qiu 3:34e9766539fe 77 LPC_GPIO2->FIODIR &= ~(1<<1);
Jing_Qiu 3:34e9766539fe 78 LPC_GPIO2->FIODIR &= ~(1<<2);
Jing_Qiu 3:34e9766539fe 79 }
Jing_Qiu 3:34e9766539fe 80
Jing_Qiu 3:34e9766539fe 81 void setGPIO(const int pinName)
Jing_Qiu 3:34e9766539fe 82 {
Jing_Qiu 3:34e9766539fe 83 LPC_GPIO2->FIOPIN |= (1<<pinName);
Jing_Qiu 3:34e9766539fe 84 }
Jing_Qiu 3:34e9766539fe 85
Jing_Qiu 3:34e9766539fe 86 void clearGPIO(const int pinName)
Jing_Qiu 3:34e9766539fe 87 {
Jing_Qiu 3:34e9766539fe 88 LPC_GPIO2->FIOPIN &= ~(1<<pinName);
Jing_Qiu 3:34e9766539fe 89 }
Jing_Qiu 3:34e9766539fe 90
Jing_Qiu 3:34e9766539fe 91 void initTimer()
Jing_Qiu 3:34e9766539fe 92 {
Jing_Qiu 3:34e9766539fe 93 // set up OS timer (timer0)
Jing_Qiu 3:34e9766539fe 94 LPC_SC->PCONP |= BM(1); //power up timer0
Jing_Qiu 3:34e9766539fe 95 LPC_SC->PCLKSEL0 |= BM(2); // clock = CCLK (96 MHz)
Jing_Qiu 3:34e9766539fe 96 LPC_TIM0->PR = 48000; // set prescale to 48000 (2048 Hz timer)
Jing_Qiu 3:34e9766539fe 97 LPC_TIM0->MR0 = 1; // match0 compare value (32-bit)
Jing_Qiu 3:34e9766539fe 98 LPC_TIM0->MCR |= BM(0)|BM(1); // interrupt and reset on match0 compare
Jing_Qiu 3:34e9766539fe 99 NVIC_EnableIRQ(TIMER0_IRQn); // enable timer interrupt
Jing_Qiu 3:34e9766539fe 100 }
Jing_Qiu 3:34e9766539fe 101
Jing_Qiu 3:34e9766539fe 102 void startTimer()
Jing_Qiu 3:34e9766539fe 103 {
Jing_Qiu 3:34e9766539fe 104 LPC_TIM0->TCR |= BM(1); // reset timer1
Jing_Qiu 3:34e9766539fe 105 LPC_TIM0->TCR &= ~BM(1); // release reset
Jing_Qiu 3:34e9766539fe 106 LPC_TIM0->TCR |= BM(0); // start timer
Jing_Qiu 3:34e9766539fe 107 }
Jing_Qiu 3:34e9766539fe 108
Jing_Qiu 3:34e9766539fe 109 void resetTimer()
Jing_Qiu 3:34e9766539fe 110 {
Jing_Qiu 3:34e9766539fe 111 LPC_TIM0->TCR |= BM(1); // reset timer0
Jing_Qiu 3:34e9766539fe 112 LPC_TIM0->TCR &= ~BM(1); // release reset
Jing_Qiu 3:34e9766539fe 113 }
Jing_Qiu 3:34e9766539fe 114
Jing_Qiu 3:34e9766539fe 115
Jing_Qiu 3:34e9766539fe 116
mfrede 1:e37d0cad77e2 117 void display_thread_handler(void const *args)
mfrede 1:e37d0cad77e2 118 {
mfrede 1:e37d0cad77e2 119 while(1)
mfrede 1:e37d0cad77e2 120 {
mfrede 1:e37d0cad77e2 121
mfrede 1:e37d0cad77e2 122 }
mfrede 1:e37d0cad77e2 123 }
mfrede 1:e37d0cad77e2 124
mfrede 1:e37d0cad77e2 125
mfrede 1:e37d0cad77e2 126 void asense() {
Jing_Qiu 3:34e9766539fe 127 if (v_clock >= VRP_l) { //Ignore vSense outside this time interval
Jing_Qiu 3:34e9766539fe 128 v_clock = 0;
Jing_Qiu 3:34e9766539fe 129 aSensed = 0;
Jing_Qiu 3:34e9766539fe 130 }
mfrede 1:e37d0cad77e2 131 }
mfrede 1:e37d0cad77e2 132
mfrede 1:e37d0cad77e2 133 void vsense() {
Jing_Qiu 3:34e9766539fe 134 if ((v_clock >= PVARP_l) && aSensed == 0){
Jing_Qiu 3:34e9766539fe 135 a_clock = 0;
Jing_Qiu 3:34e9766539fe 136 aSensed = 1;
Jing_Qiu 3:34e9766539fe 137 }
mfrede 1:e37d0cad77e2 138 }
mfrede 1:e37d0cad77e2 139
mfrede 1:e37d0cad77e2 140 void button_handler(void const *args)
mfrede 1:e37d0cad77e2 141 {
mfrede 1:e37d0cad77e2 142 while(1)
mfrede 1:e37d0cad77e2 143 {
mfrede 1:e37d0cad77e2 144 char buffer;
mfrede 1:e37d0cad77e2 145 if(pc.readable()) {
mfrede 1:e37d0cad77e2 146 buffer = pc.getc();
mfrede 1:e37d0cad77e2 147 if (buffer == 'N')
mfrede 1:e37d0cad77e2 148 mode = buffer;
mfrede 1:e37d0cad77e2 149 else if (buffer == 'S')
mfrede 1:e37d0cad77e2 150 mode = buffer;
mfrede 1:e37d0cad77e2 151 else if (buffer == 'E')
mfrede 1:e37d0cad77e2 152 mode = buffer;
mfrede 1:e37d0cad77e2 153 else if (buffer == 'M')
mfrede 1:e37d0cad77e2 154 mode = buffer;
mfrede 1:e37d0cad77e2 155 else if (buffer == 'A' && mode == 'M')
mfrede 1:e37d0cad77e2 156 apace();
mfrede 1:e37d0cad77e2 157 else if (buffer == 'V' && mode == 'M')
mfrede 1:e37d0cad77e2 158 vpace();
Jing_Qiu 3:34e9766539fe 159 //else if (buffer == 'O');
Jing_Qiu 3:34e9766539fe 160 //setobervation
Jing_Qiu 3:34e9766539fe 161 //else if (buffer == '\n');
mfrede 1:e37d0cad77e2 162
Jing_Qiu 3:34e9766539fe 163 //else
mfrede 1:e37d0cad77e2 164
mfrede 1:e37d0cad77e2 165 }
mfrede 1:e37d0cad77e2 166 }
mfrede 1:e37d0cad77e2 167 }
mfrede 1:e37d0cad77e2 168
Jing_Qiu 3:34e9766539fe 169 void pacemaker_thread_handler(void const *args)
Jing_Qiu 3:34e9766539fe 170 {
Jing_Qiu 3:34e9766539fe 171 initGPIO_outputs();
Jing_Qiu 3:34e9766539fe 172
Jing_Qiu 3:34e9766539fe 173 /**********************************************************
Jing_Qiu 3:34e9766539fe 174 ************Initialize timer to interrupt every 1 ms*********
Jing_Qiu 3:34e9766539fe 175 ***********************************************************/
Jing_Qiu 3:34e9766539fe 176
Jing_Qiu 3:34e9766539fe 177 initTimer();
Jing_Qiu 3:34e9766539fe 178 startTimer();
Jing_Qiu 3:34e9766539fe 179
Jing_Qiu 3:34e9766539fe 180 atrial_int.rise(&asense);
Jing_Qiu 3:34e9766539fe 181 vent_int.rise(&vsense);
Jing_Qiu 3:34e9766539fe 182 while(1){}
Jing_Qiu 3:34e9766539fe 183
Jing_Qiu 3:34e9766539fe 184 }
Jing_Qiu 3:34e9766539fe 185
Jing_Qiu 3:34e9766539fe 186
Jing_Qiu 3:34e9766539fe 187 /**********************************************************
Jing_Qiu 3:34e9766539fe 188 ************ timer interrupt every 1 ms*********
Jing_Qiu 3:34e9766539fe 189 ***********************************************************/
Jing_Qiu 3:34e9766539fe 190
Jing_Qiu 3:34e9766539fe 191 extern "C" void TIMER0_IRQHandler (void) {
Jing_Qiu 3:34e9766539fe 192 if((LPC_TIM0->IR & 0x01) == 0x01) // if MR0 interrupt
Jing_Qiu 3:34e9766539fe 193 {
Jing_Qiu 3:34e9766539fe 194 LPC_TIM0->IR |= (1 << 0); // Clear MR0 interrupt flag
Jing_Qiu 3:34e9766539fe 195 if (v_clock >= (LRI_h-AVI_l) && aSensed == 0) {
Jing_Qiu 3:34e9766539fe 196 a_clock = 0;
Jing_Qiu 3:34e9766539fe 197 aSensed = 1;
Jing_Qiu 3:34e9766539fe 198 //printf("Apace %d\r\n",v_clk);
Jing_Qiu 3:34e9766539fe 199 apace();
Jing_Qiu 3:34e9766539fe 200 /*
Jing_Qiu 3:34e9766539fe 201 setGPIO(a_pace);
Jing_Qiu 3:34e9766539fe 202 wait_us(PULSE_WIDTH_A);
Jing_Qiu 3:34e9766539fe 203 clearGPIO(a_pace);
Jing_Qiu 3:34e9766539fe 204 */
Jing_Qiu 3:34e9766539fe 205 }
Jing_Qiu 3:34e9766539fe 206 if ((a_clock >= AVI_h) && aSensed == 1) {
Jing_Qiu 3:34e9766539fe 207 v_clock = 0;
Jing_Qiu 3:34e9766539fe 208 aSensed = 0;
Jing_Qiu 3:34e9766539fe 209 //printf("Vpace %d\r\n",a_clk);
Jing_Qiu 3:34e9766539fe 210 /*
Jing_Qiu 3:34e9766539fe 211 setGPIO(v_pace);
Jing_Qiu 3:34e9766539fe 212 wait_us(PULSE_WIDTH_V);
Jing_Qiu 3:34e9766539fe 213 clearGPIO(v_pace);
Jing_Qiu 3:34e9766539fe 214 */
Jing_Qiu 3:34e9766539fe 215 vpace();
Jing_Qiu 3:34e9766539fe 216 }
Jing_Qiu 3:34e9766539fe 217 v_clock++;
Jing_Qiu 3:34e9766539fe 218 a_clock++;
Jing_Qiu 3:34e9766539fe 219 }
Jing_Qiu 3:34e9766539fe 220 }
mfrede 1:e37d0cad77e2 221
mfrede 1:e37d0cad77e2 222
Jing_Qiu 3:34e9766539fe 223 int main (void) {
Jing_Qiu 3:34e9766539fe 224 //TODO set parameters
Jing_Qiu 3:34e9766539fe 225 myled = 0;
Jing_Qiu 3:34e9766539fe 226
Jing_Qiu 3:34e9766539fe 227 Thread display(display_thread_handler);
Jing_Qiu 3:34e9766539fe 228 Thread keyboard(button_handler);
Jing_Qiu 3:34e9766539fe 229 Thread pacemaker(pacemaker_thread_handler);
Jing_Qiu 3:34e9766539fe 230
Jing_Qiu 3:34e9766539fe 231 while(1){}
Jing_Qiu 3:34e9766539fe 232
Jing_Qiu 3:34e9766539fe 233
mfrede 1:e37d0cad77e2 234 }