fork the master
Dependencies: TextLCD mbed-rtos mbed
Fork of Pacemaker by
main.cpp@4:cce9946d9dcd, 2014-11-29 (annotated)
- Committer:
- Jing_Qiu
- Date:
- Sat Nov 29 20:52:33 2014 +0000
- Revision:
- 4:cce9946d9dcd
- Parent:
- 3:34e9766539fe
- Child:
- 5:376358077dc8
second commit
Who changed what in which revision?
User | Revision | Line number | New 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 |
Jing_Qiu | 4:cce9946d9dcd | 5 | * Author: Jing |
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 | } |