class using the modern device windsensor rev. c to detect faint breathing above a user programed threshold using non-blocking interrupt service routines.
victimBreath.cpp@0:031f7beccd55, 2016-11-24 (annotated)
- Committer:
- dehrlich
- Date:
- Thu Nov 24 19:32:41 2016 +0000
- Revision:
- 0:031f7beccd55
Class using the modern device windsensor rev. c to detect faint breathing above a programed threshold using a non-blocking interrupt service routine.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dehrlich | 0:031f7beccd55 | 1 | #include "victimBreath.h" |
dehrlich | 0:031f7beccd55 | 2 | #include "mbed.h" |
dehrlich | 0:031f7beccd55 | 3 | |
dehrlich | 0:031f7beccd55 | 4 | AnalogIn windSensor(p17); |
dehrlich | 0:031f7beccd55 | 5 | DigitalOut myLED(LED1); |
dehrlich | 0:031f7beccd55 | 6 | Ticker breathReader; |
dehrlich | 0:031f7beccd55 | 7 | |
dehrlich | 0:031f7beccd55 | 8 | volatile float thresh = windSensor*1.4; |
dehrlich | 0:031f7beccd55 | 9 | //volatile bool Breath = false; // set on each visit to interrupt routine |
dehrlich | 0:031f7beccd55 | 10 | volatile bool isBreathing = false; |
dehrlich | 0:031f7beccd55 | 11 | volatile int breathCount = 0; //increment if breath is above thresh on each visit to interrupt routine |
dehrlich | 0:031f7beccd55 | 12 | |
dehrlich | 0:031f7beccd55 | 13 | victimBreath :: victimBreath(){ |
dehrlich | 0:031f7beccd55 | 14 | } |
dehrlich | 0:031f7beccd55 | 15 | |
dehrlich | 0:031f7beccd55 | 16 | void victimBreath :: startReading(){ |
dehrlich | 0:031f7beccd55 | 17 | breathReader.attach(this, &victimBreath::sample, .002f); |
dehrlich | 0:031f7beccd55 | 18 | //volatile float a = windSensor; |
dehrlich | 0:031f7beccd55 | 19 | //printf("\nwindsensor reads: %f", a); |
dehrlich | 0:031f7beccd55 | 20 | //printf("\nthresh is: %f", thresh); |
dehrlich | 0:031f7beccd55 | 21 | } |
dehrlich | 0:031f7beccd55 | 22 | |
dehrlich | 0:031f7beccd55 | 23 | void victimBreath :: stopReading(){ |
dehrlich | 0:031f7beccd55 | 24 | breathReader.detach(); |
dehrlich | 0:031f7beccd55 | 25 | __enable_irq(); |
dehrlich | 0:031f7beccd55 | 26 | } |
dehrlich | 0:031f7beccd55 | 27 | |
dehrlich | 0:031f7beccd55 | 28 | void victimBreath :: reset() { |
dehrlich | 0:031f7beccd55 | 29 | //thresh = windSensor*1.2; //set thresh to an appropraite percent above the baseline reading |
dehrlich | 0:031f7beccd55 | 30 | //Breath = false; // true victims breath crosses thresh |
dehrlich | 0:031f7beccd55 | 31 | isBreathing = false; //true if we get 3 'Breaths' in the calling programs time window-->means victim is breathing |
dehrlich | 0:031f7beccd55 | 32 | breathCount = 0; |
dehrlich | 0:031f7beccd55 | 33 | } |
dehrlich | 0:031f7beccd55 | 34 | |
dehrlich | 0:031f7beccd55 | 35 | //call this member function to see if victim is breathing |
dehrlich | 0:031f7beccd55 | 36 | bool victimBreath :: breathDetected() { |
dehrlich | 0:031f7beccd55 | 37 | return isBreathing; //only return positive if we get the critical number of Breaths in the given time window |
dehrlich | 0:031f7beccd55 | 38 | } |
dehrlich | 0:031f7beccd55 | 39 | |
dehrlich | 0:031f7beccd55 | 40 | |
dehrlich | 0:031f7beccd55 | 41 | // THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE. |
dehrlich | 0:031f7beccd55 | 42 | // Timer 2 makes sure that we take a reading every 2 miliseconds |
dehrlich | 0:031f7beccd55 | 43 | void victimBreath :: sample() { // triggered when Timer2 counts to 124 |
dehrlich | 0:031f7beccd55 | 44 | __disable_irq(); |
dehrlich | 0:031f7beccd55 | 45 | float readVal = windSensor; // sample |
dehrlich | 0:031f7beccd55 | 46 | |
dehrlich | 0:031f7beccd55 | 47 | |
dehrlich | 0:031f7beccd55 | 48 | //check to see if victim is breathing at all above natural variation in sensor noise |
dehrlich | 0:031f7beccd55 | 49 | if(readVal >= thresh){ |
dehrlich | 0:031f7beccd55 | 50 | breathCount++; //increment global counter |
dehrlich | 0:031f7beccd55 | 51 | } |
dehrlich | 0:031f7beccd55 | 52 | if(breathCount >= 3){ //should set this higher if want more certainty in victim breathing |
dehrlich | 0:031f7beccd55 | 53 | isBreathing = true; |
dehrlich | 0:031f7beccd55 | 54 | } |
dehrlich | 0:031f7beccd55 | 55 | __enable_irq(); // enable interrupts again |
dehrlich | 0:031f7beccd55 | 56 | //return; |
dehrlich | 0:031f7beccd55 | 57 | } |
dehrlich | 0:031f7beccd55 | 58 | |
dehrlich | 0:031f7beccd55 | 59 |