local timers

Dependencies:   TextLCD mbed-rtos mbed

Fork of pacemaker_FINAL_v2 by Pacemaker

Committer:
jfields
Date:
Thu Dec 04 03:26:06 2014 +0000
Revision:
5:8cd62e3c3c3a
Parent:
4:584d9e2e4fae
Child:
6:704de3abb5e9
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jfields 4:584d9e2e4fae 1 #include "constants.h"
jfields 0:3afa00a23ce2 2
jfields 5:8cd62e3c3c3a 3 // global timer
jfields 5:8cd62e3c3c3a 4 Timer tv;
jfields 5:8cd62e3c3c3a 5 Timer ta;
jfields 0:3afa00a23ce2 6
jfields 1:ea01c3232c4a 7 // mutexes
jfields 5:8cd62e3c3c3a 8 Mutex t_mutex; // protect reading of ta, tv
jfields 1:ea01c3232c4a 9 Mutex status_mutex; // protect reading of
jfields 1:ea01c3232c4a 10 Mutex input_mutex; // protects reading input
jfields 4:584d9e2e4fae 11 Mutex man_mutex; // protects manual
jfields 4:584d9e2e4fae 12 Mutex state_mutex; // protects waitingForV
jfields 0:3afa00a23ce2 13
jfields 0:3afa00a23ce2 14 // functions
jfields 2:3773afd2256c 15 void A_func(void const *args);
jfields 2:3773afd2256c 16 void V_func(void const *args);
jfields 0:3afa00a23ce2 17 void manage_flags(void const *i);
jfields 0:3afa00a23ce2 18 void flashLED(int i);
jfields 1:ea01c3232c4a 19 void calcHR(void const *args);
jfields 1:ea01c3232c4a 20 void disp(void const *args);
jfields 1:ea01c3232c4a 21 void input_func(void const *args);
jfields 1:ea01c3232c4a 22 void setVals(char c);
jfields 2:3773afd2256c 23 void makeManual();
jfields 2:3773afd2256c 24 void blind();
jfields 3:c60266d9ce0b 25 void get_listener(void const *args);
jfields 4:584d9e2e4fae 26 void updateSR();
jfields 0:3afa00a23ce2 27
jfields 0:3afa00a23ce2 28 // threads
jfields 2:3773afd2256c 29 Thread * A_thread;
jfields 2:3773afd2256c 30 Thread * V_thread;
jfields 1:ea01c3232c4a 31 Thread * input_thread;
jfields 0:3afa00a23ce2 32 Thread * disp_thread;
jfields 3:c60266d9ce0b 33 Thread * listener;
jfields 0:3afa00a23ce2 34
jfields 0:3afa00a23ce2 35 // rtos timers
jfields 0:3afa00a23ce2 36 RtosTimer * VRP_timer;
jfields 0:3afa00a23ce2 37 RtosTimer * PVARP_timer;
jfields 0:3afa00a23ce2 38 RtosTimer * HR_timer;
jfields 0:3afa00a23ce2 39
jfields 0:3afa00a23ce2 40 int main() {
jfields 0:3afa00a23ce2 41
jfields 0:3afa00a23ce2 42 // init threads
jfields 1:ea01c3232c4a 43 disp_thread = new Thread(disp);
jfields 1:ea01c3232c4a 44 input_thread = new Thread(input_func);
jfields 2:3773afd2256c 45 A_thread = new Thread(A_func);
jfields 2:3773afd2256c 46 V_thread = new Thread(V_func);
jfields 3:c60266d9ce0b 47 listener = new Thread(get_listener);
jfields 0:3afa00a23ce2 48
jfields 0:3afa00a23ce2 49 // init timers
jfields 0:3afa00a23ce2 50 VRP_timer = new RtosTimer(manage_flags, osTimerOnce, (void *)1);
jfields 0:3afa00a23ce2 51 PVARP_timer = new RtosTimer(manage_flags, osTimerOnce, (void *)2);
jfields 0:3afa00a23ce2 52 HR_timer = new RtosTimer(calcHR, osTimerPeriodic, (void *)0);
jfields 0:3afa00a23ce2 53
jfields 0:3afa00a23ce2 54 // start display and heart rate sample
jfields 0:3afa00a23ce2 55 HR_timer->start(sampleRate);
jfields 0:3afa00a23ce2 56 disp_thread->signal_set(RUN);
jfields 0:3afa00a23ce2 57
jfields 5:8cd62e3c3c3a 58 // start pacemaker
jfields 5:8cd62e3c3c3a 59 ta.start();
jfields 5:8cd62e3c3c3a 60 tv.start();
jfields 5:8cd62e3c3c3a 61 V_thread->signal_set(RUN);
jfields 5:8cd62e3c3c3a 62
jfields 0:3afa00a23ce2 63 // main thread
jfields 0:3afa00a23ce2 64 while (1) {
jfields 0:3afa00a23ce2 65
jfields 0:3afa00a23ce2 66 }
jfields 0:3afa00a23ce2 67 }
jfields 0:3afa00a23ce2 68
jfields 2:3773afd2256c 69 void A_func(void const *args) {
jfields 2:3773afd2256c 70 while (1) {
jfields 5:8cd62e3c3c3a 71 Thread::signal_wait(RUN, osWaitForever);
jfields 5:8cd62e3c3c3a 72 int done = 0;
jfields 5:8cd62e3c3c3a 73 ta.reset();
jfields 5:8cd62e3c3c3a 74 while (!done) {
jfields 5:8cd62e3c3c3a 75 if (AGet == 1 && !isPVARP) {
jfields 5:8cd62e3c3c3a 76 V_thread->signal_set(RUN);
jfields 5:8cd62e3c3c3a 77 flashLED(4);
jfields 5:8cd62e3c3c3a 78 done = 1;
jfields 2:3773afd2256c 79 }
jfields 5:8cd62e3c3c3a 80 if (ta.read_ms() >= LRI-AVI) {
jfields 5:8cd62e3c3c3a 81 V_thread->signal_set(RUN);
jfields 5:8cd62e3c3c3a 82 APace = 1;
jfields 5:8cd62e3c3c3a 83 Thread::wait(2);
jfields 5:8cd62e3c3c3a 84 APace = 0;
jfields 5:8cd62e3c3c3a 85 flashLED(2);
jfields 5:8cd62e3c3c3a 86 done = 1;
jfields 5:8cd62e3c3c3a 87 }
jfields 2:3773afd2256c 88 }
jfields 2:3773afd2256c 89 }
jfields 2:3773afd2256c 90 }
jfields 2:3773afd2256c 91
jfields 2:3773afd2256c 92 void V_func(void const *args) {
jfields 2:3773afd2256c 93 while (1) {
jfields 5:8cd62e3c3c3a 94 Thread::signal_wait(RUN, osWaitForever);
jfields 5:8cd62e3c3c3a 95 int done = 0;
jfields 5:8cd62e3c3c3a 96 tv.reset();
jfields 5:8cd62e3c3c3a 97 while (!done) {
jfields 5:8cd62e3c3c3a 98 if (VGet == 1 && !isVRP) {
jfields 5:8cd62e3c3c3a 99 A_thread->signal_set(RUN);
jfields 5:8cd62e3c3c3a 100 blind();
jfields 5:8cd62e3c3c3a 101 flashLED(3);
jfields 5:8cd62e3c3c3a 102 done = 1;
jfields 2:3773afd2256c 103 }
jfields 5:8cd62e3c3c3a 104 if (tv.read_ms() >= AVI) {
jfields 5:8cd62e3c3c3a 105 A_thread->signal_set(RUN);
jfields 5:8cd62e3c3c3a 106 VPace = 1;
jfields 5:8cd62e3c3c3a 107 Thread::wait(2);
jfields 5:8cd62e3c3c3a 108 VPace = 0;
jfields 5:8cd62e3c3c3a 109 blind();
jfields 5:8cd62e3c3c3a 110 flashLED(1);
jfields 5:8cd62e3c3c3a 111 done = 1;
jfields 5:8cd62e3c3c3a 112 }
jfields 2:3773afd2256c 113 }
jfields 2:3773afd2256c 114 }
jfields 2:3773afd2256c 115 }
jfields 2:3773afd2256c 116
jfields 1:ea01c3232c4a 117 void input_func(void const *args) {
jfields 1:ea01c3232c4a 118 while (1) {
jfields 1:ea01c3232c4a 119 input_mutex.lock();
jfields 1:ea01c3232c4a 120 input=pc.getc();
jfields 1:ea01c3232c4a 121 if (input == 'n') setVals('n');
jfields 1:ea01c3232c4a 122 if (input == 's') setVals('s');
jfields 1:ea01c3232c4a 123 if (input == 'e') setVals('e');
jfields 2:3773afd2256c 124 if (input == 'm') makeManual();
jfields 3:c60266d9ce0b 125 if (input == 'o') {
jfields 3:c60266d9ce0b 126 lcd.printf("Enter\n\n");
jfields 3:c60266d9ce0b 127 Omode = 1;
jfields 3:c60266d9ce0b 128 input = pc.getc();
jfields 4:584d9e2e4fae 129 if (input == '1') {
jfields 4:584d9e2e4fae 130 sampleRate = 10000;
jfields 4:584d9e2e4fae 131 updateSR();
jfields 4:584d9e2e4fae 132 }
jfields 4:584d9e2e4fae 133 if (input == '2') {
jfields 4:584d9e2e4fae 134 sampleRate = 20000;
jfields 4:584d9e2e4fae 135 updateSR();
jfields 4:584d9e2e4fae 136 }
jfields 4:584d9e2e4fae 137 if (input == '3') {
jfields 4:584d9e2e4fae 138 sampleRate = 30000;
jfields 4:584d9e2e4fae 139 updateSR();
jfields 4:584d9e2e4fae 140 }
jfields 4:584d9e2e4fae 141 if (input == '4') {
jfields 4:584d9e2e4fae 142 sampleRate = 60000;
jfields 4:584d9e2e4fae 143 updateSR();
jfields 4:584d9e2e4fae 144 }
jfields 4:584d9e2e4fae 145 if (input == '5') {
jfields 4:584d9e2e4fae 146 sampleRate = 100000;
jfields 4:584d9e2e4fae 147 updateSR();
jfields 4:584d9e2e4fae 148 }
jfields 3:c60266d9ce0b 149 }
jfields 1:ea01c3232c4a 150 input_mutex.unlock();
jfields 1:ea01c3232c4a 151 }
jfields 1:ea01c3232c4a 152 }
jfields 1:ea01c3232c4a 153
jfields 0:3afa00a23ce2 154 void calcHR(void const *args) {
jfields 4:584d9e2e4fae 155 status_mutex.lock();
jfields 0:3afa00a23ce2 156 if (firstSample == 1) {
jfields 0:3afa00a23ce2 157 HR = beats*(60000/sampleRate);
jfields 0:3afa00a23ce2 158 firstSample = 0;
jfields 0:3afa00a23ce2 159 }
jfields 0:3afa00a23ce2 160 else {
jfields 0:3afa00a23ce2 161 HR = (beats*60000/sampleRate+HR)/2;
jfields 0:3afa00a23ce2 162 }
jfields 4:584d9e2e4fae 163 if (HR>=UB || HR<=LB) {
jfields 4:584d9e2e4fae 164 speaker.period(1.0/500.0); // 500hz period
jfields 4:584d9e2e4fae 165 speaker =0.5;
jfields 4:584d9e2e4fae 166 }
jfields 4:584d9e2e4fae 167 else {
jfields 4:584d9e2e4fae 168 speaker=0.0;
jfields 4:584d9e2e4fae 169 }
jfields 4:584d9e2e4fae 170 status_mutex.unlock();
jfields 0:3afa00a23ce2 171 disp_thread->signal_set(RUN);
jfields 0:3afa00a23ce2 172 }
jfields 0:3afa00a23ce2 173
jfields 0:3afa00a23ce2 174 void disp(void const *args) {
jfields 0:3afa00a23ce2 175 while (1) {
jfields 0:3afa00a23ce2 176 Thread::signal_wait(RUN,osWaitForever);
jfields 4:584d9e2e4fae 177 status_mutex.lock();
jfields 3:c60266d9ce0b 178 if (!Omode) {
jfields 3:c60266d9ce0b 179 lcd.printf("HR = %d ppm\nCycle = %d s\n",HR,sampleRate/1000);
jfields 3:c60266d9ce0b 180 }
jfields 0:3afa00a23ce2 181 beats = 0;
jfields 4:584d9e2e4fae 182 status_mutex.unlock();
jfields 0:3afa00a23ce2 183 }
jfields 0:3afa00a23ce2 184 }
jfields 0:3afa00a23ce2 185
jfields 0:3afa00a23ce2 186 void manage_flags(void const *i) {
jfields 1:ea01c3232c4a 187 status_mutex.lock();
jfields 0:3afa00a23ce2 188 if ((int)i==1) isVRP = 0;
jfields 0:3afa00a23ce2 189 if ((int)i==2) isPVARP = 0;
jfields 1:ea01c3232c4a 190 status_mutex.unlock();
jfields 0:3afa00a23ce2 191 }
jfields 0:3afa00a23ce2 192
jfields 0:3afa00a23ce2 193 void flashLED(int i) {
jfields 0:3afa00a23ce2 194 leds[i-1] = 1;
jfields 0:3afa00a23ce2 195 wait(0.01);
jfields 0:3afa00a23ce2 196 leds[i-1] = 0;
jfields 0:3afa00a23ce2 197 }
jfields 0:3afa00a23ce2 198
jfields 0:3afa00a23ce2 199 void blind() {
jfields 4:584d9e2e4fae 200 status_mutex.lock();
jfields 0:3afa00a23ce2 201 isVRP = 1;
jfields 0:3afa00a23ce2 202 isPVARP = 1;
jfields 0:3afa00a23ce2 203 VRP_timer->start(VRP);
jfields 0:3afa00a23ce2 204 PVARP_timer->start(PVARP);
jfields 0:3afa00a23ce2 205 beats++;
jfields 4:584d9e2e4fae 206 status_mutex.unlock();
jfields 0:3afa00a23ce2 207 }
jfields 0:3afa00a23ce2 208
jfields 2:3773afd2256c 209 void makeManual() {
jfields 4:584d9e2e4fae 210 man_mutex.lock();
jfields 3:c60266d9ce0b 211 inManual = 1;
jfields 4:584d9e2e4fae 212 man_mutex.unlock();
jfields 3:c60266d9ce0b 213 UB = 175;
jfields 3:c60266d9ce0b 214 LB = 30;
jfields 3:c60266d9ce0b 215 int done = 0;
jfields 3:c60266d9ce0b 216 while (!done) {
jfields 2:3773afd2256c 217 input = pc.getc();
jfields 2:3773afd2256c 218 if (input == 'v') {
jfields 3:c60266d9ce0b 219 VPace = 1;
jfields 3:c60266d9ce0b 220 Thread::wait(2);
jfields 3:c60266d9ce0b 221 VPace = 0;
jfields 2:3773afd2256c 222 flashLED(1);
jfields 2:3773afd2256c 223 }
jfields 2:3773afd2256c 224 if (input == 'a') {
jfields 3:c60266d9ce0b 225 APace = 1;
jfields 3:c60266d9ce0b 226 Thread::wait(2);
jfields 3:c60266d9ce0b 227 APace = 0;
jfields 2:3773afd2256c 228 flashLED(2);
jfields 2:3773afd2256c 229 }
jfields 3:c60266d9ce0b 230 if (input == 's') {
jfields 3:c60266d9ce0b 231 setVals('s');
jfields 3:c60266d9ce0b 232 done = 1;
jfields 3:c60266d9ce0b 233 }
jfields 3:c60266d9ce0b 234 if (input == 'e') {
jfields 3:c60266d9ce0b 235 setVals('s');
jfields 3:c60266d9ce0b 236 done = 1;
jfields 3:c60266d9ce0b 237 }
jfields 3:c60266d9ce0b 238 if (input == 'n') {
jfields 3:c60266d9ce0b 239 setVals('s');
jfields 3:c60266d9ce0b 240 done = 1;
jfields 3:c60266d9ce0b 241 }
jfields 3:c60266d9ce0b 242 if (input == 'o') {
jfields 3:c60266d9ce0b 243 lcd.printf("Enter\n\n");
jfields 3:c60266d9ce0b 244 Omode = 1;
jfields 3:c60266d9ce0b 245 input = pc.getc();
jfields 4:584d9e2e4fae 246 if (input == '1') {
jfields 4:584d9e2e4fae 247 sampleRate = 10000;
jfields 4:584d9e2e4fae 248 updateSR();
jfields 4:584d9e2e4fae 249 }
jfields 4:584d9e2e4fae 250 if (input == '2') {
jfields 4:584d9e2e4fae 251 sampleRate = 20000;
jfields 4:584d9e2e4fae 252 updateSR();
jfields 4:584d9e2e4fae 253 }
jfields 4:584d9e2e4fae 254 if (input == '3') {
jfields 4:584d9e2e4fae 255 sampleRate = 30000;
jfields 4:584d9e2e4fae 256 updateSR();
jfields 4:584d9e2e4fae 257 }
jfields 4:584d9e2e4fae 258 if (input == '4') {
jfields 4:584d9e2e4fae 259 sampleRate = 60000;
jfields 4:584d9e2e4fae 260 updateSR();
jfields 4:584d9e2e4fae 261 }
jfields 4:584d9e2e4fae 262 if (input == '5') {
jfields 4:584d9e2e4fae 263 sampleRate = 100000;
jfields 4:584d9e2e4fae 264 updateSR();
jfields 4:584d9e2e4fae 265 }
jfields 3:c60266d9ce0b 266 }
jfields 3:c60266d9ce0b 267 }
jfields 3:c60266d9ce0b 268 VRP_timer->stop();
jfields 3:c60266d9ce0b 269 PVARP_timer->stop();
jfields 4:584d9e2e4fae 270 man_mutex.lock();
jfields 3:c60266d9ce0b 271 inManual = 0;
jfields 4:584d9e2e4fae 272 man_mutex.unlock();
jfields 3:c60266d9ce0b 273 }
jfields 3:c60266d9ce0b 274
jfields 3:c60266d9ce0b 275 void get_listener(void const *args) {
jfields 3:c60266d9ce0b 276 while (1) {
jfields 3:c60266d9ce0b 277 if (inManual) {
jfields 3:c60266d9ce0b 278 if (AGet == 1) {
jfields 3:c60266d9ce0b 279 flashLED(4);
jfields 3:c60266d9ce0b 280 while (AGet == 1);
jfields 3:c60266d9ce0b 281 }
jfields 3:c60266d9ce0b 282 if (VGet == 1) {
jfields 3:c60266d9ce0b 283 flashLED(3);
jfields 3:c60266d9ce0b 284 while (VGet == 1);
jfields 3:c60266d9ce0b 285 }
jfields 3:c60266d9ce0b 286 }
jfields 2:3773afd2256c 287 }
jfields 0:3afa00a23ce2 288 }
jfields 1:ea01c3232c4a 289
jfields 1:ea01c3232c4a 290 void setVals(char c) {
jfields 1:ea01c3232c4a 291 if (c == 'n') {
jfields 1:ea01c3232c4a 292 PVARP = N_PVARP;
jfields 1:ea01c3232c4a 293 VRP = N_VRP;
jfields 1:ea01c3232c4a 294 LRI = N_LRI;
jfields 1:ea01c3232c4a 295 AVI = N_AVI;
jfields 1:ea01c3232c4a 296 UB = N_UB;
jfields 1:ea01c3232c4a 297 LB = N_LB;
jfields 1:ea01c3232c4a 298 }
jfields 1:ea01c3232c4a 299 if (c == 's') {
jfields 1:ea01c3232c4a 300 PVARP = S_PVARP;
jfields 1:ea01c3232c4a 301 VRP = S_VRP;
jfields 1:ea01c3232c4a 302 LRI = S_LRI;
jfields 1:ea01c3232c4a 303 AVI = S_AVI;
jfields 1:ea01c3232c4a 304 UB = S_UB;
jfields 1:ea01c3232c4a 305 LB = S_LB;
jfields 1:ea01c3232c4a 306 }
jfields 1:ea01c3232c4a 307 if (c == 'e') {
jfields 1:ea01c3232c4a 308 PVARP = E_PVARP;
jfields 1:ea01c3232c4a 309 VRP = E_VRP;
jfields 1:ea01c3232c4a 310 LRI = E_LRI;
jfields 1:ea01c3232c4a 311 AVI = E_AVI;
jfields 1:ea01c3232c4a 312 UB = E_UB;
jfields 1:ea01c3232c4a 313 LB = E_LB;
jfields 1:ea01c3232c4a 314 }
jfields 1:ea01c3232c4a 315 }
jfields 2:3773afd2256c 316
jfields 4:584d9e2e4fae 317 void updateSR() {
jfields 4:584d9e2e4fae 318 status_mutex.lock();
jfields 4:584d9e2e4fae 319 beats = 0;
jfields 4:584d9e2e4fae 320 HR = 0;
jfields 4:584d9e2e4fae 321 Omode = 0;
jfields 4:584d9e2e4fae 322 firstSample = 1;
jfields 4:584d9e2e4fae 323 HR_timer->stop();
jfields 4:584d9e2e4fae 324 HR_timer->start(sampleRate);
jfields 4:584d9e2e4fae 325 status_mutex.unlock();
jfields 4:584d9e2e4fae 326 disp_thread->signal_set(RUN);
jfields 4:584d9e2e4fae 327 }
jfields 2:3773afd2256c 328
jfields 2:3773afd2256c 329
jfields 2:3773afd2256c 330
jfields 2:3773afd2256c 331
jfields 2:3773afd2256c 332