hack gt final code
Dependencies: 4DGL-uLCD-SE BMP085 PinDetect SDFileSystem mbed wave_player
Revision 14:23390a020d1c, committed 2016-09-28
- Comitter:
- otis22894
- Date:
- Wed Sep 28 00:16:16 2016 +0000
- Parent:
- 13:735e81c0f6a9
- Commit message:
- initial commit;
Changed in this revision
--- a/Heart.cpp Sun Sep 21 11:15:41 2014 +0000 +++ b/Heart.cpp Wed Sep 28 00:16:16 2016 +0000 @@ -19,7 +19,7 @@ volatile int beatCount = 0; volatile int PulseLength = 0; -AnalogIn ain(p17); +AnalogIn ain(p16); DigitalOut myLED(LED1); Ticker pulseReader;
--- a/main.cpp Sun Sep 21 11:15:41 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,392 +0,0 @@ - -#include "mbed.h" -#include "SDFileSystem.h" -#include "wave_player.h" -#include "uLCD_4DGL.h" -#include "PinDetect.h" -#include "Heart.h" -#include "statistics.h" -#include "spikes.h" -#include "BMP085.h" -#include <string> -#include <sstream> - -using namespace std; - -#define SHORT_SAMPLE 5 -#define LONG_SAMPLE 20 - -#define BEGIN_COMPRESSIONS "begin30ChestCompressions" -#define BREATH_TONE "breathTone" -#define CLIP_SENSOR "clipPulseSensorToEar" -#define CONTINUE_COMPRESSIONS "continueChestCompressions" -#define PLACE_MASK "placeMaskOverVictimsMouthWithTheSharpestCornerOverTheNose" -#define PREPARE_BREATH "prepareToBreatheIntoMask" -#define ROLL_VICTIM "rollVictimOntoSide" -#define START_BREATHING "startBreathing" -#define STOP_COMPRESSIONS "stopChestCompressions" -#define TILT_HEAD "tiltHeadBackFor10Seconds" -#define MONITOR_CONDITION "monitorVictimConditionAndReturnMaskToFaceIfBreathingStops" -#define RETILT_HEAD "retiltHeadByPushingChinAwayFromChest" -#define NEXT_KEY "pressNextKeyWhenReady" -#define NEXT_REMINDER "pleasePressNextKeyToContinueOrPressRepeatToHearTheLastCommand" -#define CHEST_COMPRESSIONS "prepareForChestCompressions" -#define REMOVE_MASK "removeTheMaskAndCheckTheAirway" -#define REMOVE_OBJECT "removeObject" -#define REPLACE_MASK "replaceMaskOnVictimsFace" -#define COUNT "count" -string lastMessage; - -SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card -AnalogOut DACout(p18); -wave_player waver(&DACout); -uLCD_4DGL uLCD(p28, p27, p29); -I2C i2c(p9, p10); -AnalogIn windSensor(p17); -PinDetect repeatButton(p14); -PinDetect nextButton(p13); -Timer timer; -Heart heart = Heart(); -BMP085 barometer(p9, p10); -Ticker ticker; -SpikeFinder s = SpikeFinder(4, 4, 3.0); -DigitalOut GLED1(p26); -DigitalOut GLED2(p25); -DigitalOut GLED3(p24); -DigitalOut RLED1(p23); -DigitalOut RLED2(p22); -DigitalOut RLED3(p21); -float windSensorVoltage; -//const int address = 0x77 << 1; -bool breathing; -bool pulse; -bool breath_success = true; -ostringstream stream; -Timer breathTimer; -bool next = false; -bool adult = true; -int cycleCount = 0; -Ticker LEDTicker; - -void playMessage(string messageName); -void getBreathing(); -void getPulse(); -void getVitals(); -bool checkBreath(); -void promptBreaths(int amt,bool check); -void chestCompressions(); -void CPR(); -void rescueBreathing(); -void auditVitals(); -void unconsciousChocking(); -void repeat_callback_function (void); -void next_callback_function (void); -void waitForNext(); -void tick(); -void welcomeLED(); -void cycleLEDs(); - -int main(){ - repeatButton.mode(PullUp); - nextButton.mode(PullUp); - wait(0.1); - repeatButton.attach_deasserted(&repeat_callback_function); - nextButton.attach_deasserted(&next_callback_function); - repeatButton.setSampleFrequency(); - nextButton.setSampleFrequency(); - - /*while(1){ - uLCD.printf("HERE"); - waitForNext(); - chestCompressions(); - wait(0.5); - }*/ - - welcomeLED(); - playMessage(PLACE_MASK); - waitForNext(); - playMessage(CLIP_SENSOR); - waitForNext(); - playMessage(TILT_HEAD); - waitForNext(); - getVitals(); - - if(pulse&&breathing){ - playMessage(ROLL_VICTIM); - while(1){ - playMessage(MONITOR_CONDITION); - wait(5); - } - } - - promptBreaths(2,true); - if(breath_success){ - auditVitals(); - }else{ - playMessage(RETILT_HEAD); - waitForNext(); - promptBreaths(1,true); - if(breath_success){ - auditVitals(); - }else{ - unconsciousChocking(); - } - } -} - -void repeat_callback_function (void){ - playMessage(lastMessage); -} - -void next_callback_function (void){ - next = true; -} - -void tick() { - __disable_irq(); - barometer.update(); - s.addSample(barometer.get_pressure()); - __enable_irq(); -} - -void waitForNext(){ - playMessage(NEXT_KEY); - timer.start(); - while(!next){ - if(timer.read()>3){ - playMessage(NEXT_REMINDER); - timer.reset(); - } - } - timer.stop(); - timer.reset(); - next = false; -} - -void playMessage(string messageName){ - string pathName = "/sd/" + messageName + ".wav"; - char * cstrName = new char[pathName.length() + 1]; - cstrName[pathName.length()]=0; - memcpy(cstrName,pathName.c_str(),pathName.size()); - FILE *wave_file; - wave_file=fopen(cstrName,"r"); - waver.play(wave_file); - fclose(wave_file); - wait(1); - if(messageName.compare(NEXT_REMINDER) != 0 - && messageName.compare(NEXT_KEY) != 0){ - lastMessage = messageName; - } -} - -void getBreathing(){ - //SENSOR DATA - breathing = false; -} - -void getPulse(){ - pulse = heart.beatDetected(); -} - -void getVitals(){ - timer.start(); - heart.startReading(); - while(timer.read()<10){} - heart.stopReading(); - - getBreathing(); - getPulse(); - - timer.stop(); - timer.reset(); - heart.reset(); -} - -bool checkBreath(){ - windSensorVoltage = 0; - ticker.attach(&tick, .1); - while(windSensorVoltage<6.15){ - while(windSensorVoltage<6.15){ - wait(0.1); - windSensorVoltage = windSensor*10; - //THINK OF ANOTHER WAY THAT DOESN'T INVOLVE A SECOND WHILE LOOP - } - windSensorVoltage = windSensor*10; - wait(0.5); - } - uLCD.printf("BREATH DETECTED"); - cycleLEDs(); - LEDTicker.attach(&cycleLEDs,0.116); - //cycleLEDs(); - playMessage(BREATH_TONE); - LEDTicker.detach(); - ticker.detach(); - while(windSensorVoltage>6.15){ - windSensorVoltage = windSensor*10; - } - if(s.highSpikeFound()){ - s.reset(); - return false; - }else{ - s.reset(); - return true; - } -} - -void promptBreaths(int amt,bool check){ - bool local_check;; - for(int i = 0;i<amt;i++){ - playMessage(PREPARE_BREATH); - if(check){ - waitForNext(); - } - playMessage(START_BREATHING); - local_check = checkBreath(); - breath_success = breath_success & local_check; - } -} - -void chestCompressions(){ - playMessage(CHEST_COMPRESSIONS); - waitForNext(); - playMessage(BEGIN_COMPRESSIONS); - wait(1); - playMessage(COUNT); - playMessage(STOP_COMPRESSIONS); -} - -void CPR(){ - while(1){ - chestCompressions(); - } -} - -void rescueBreathing(){ - while(pulse){ - timer.start(); - while(timer.read()<120){ - promptBreaths(1,false); - if(adult){ - wait(3); //Need 5s total loop time if adult - }else{ - wait(1); //Need 3s total loop time if child - } - } - timer.stop(); - timer.reset(); - playMessage(TILT_HEAD); - waitForNext(); - getVitals(); - } - CPR(); -} - -void auditVitals(){ - if(pulse && !breathing){ - rescueBreathing(); - }else if(!pulse && !breathing){ - CPR(); - }else{//ERROR} - } -} - -void unconsciousChocking(){ - bool stillChocking = true; - while(stillChocking){ - chestCompressions(); - playMessage(REMOVE_MASK); - playMessage(REMOVE_OBJECT); - waitForNext(); - playMessage(REPLACE_MASK); - promptBreaths(2,true); - if(breath_success){ - stillChocking = false; - } - } - playMessage(TILT_HEAD); - waitForNext(); - getVitals(); - auditVitals(); -} - -void cycleLEDs(){ - cycleCount++; - if(cycleCount==1){ - GLED1 = 1; - } - if(cycleCount==2){ - GLED2 = 1; - } - if(cycleCount==3){ - GLED3 = 1; - } - if(cycleCount==4){ - RLED1 = 1; - } - if(cycleCount==5){ - RLED2 = 1; - } - if(cycleCount==6){ - RLED3 = 1; - } - if(cycleCount==7){ - GLED1 = 0; - GLED2 = 0; - GLED3 = 0; - RLED1 = 0; - RLED2 = 0; - RLED3 = 0; - cycleCount = 0; - } -} - -void welcomeLED(){ - for(int i =0;i<5;i++){ - GLED1 = 1; - GLED2 = 1; - GLED3 = 1; - RLED1 = 1; - RLED2 = 1; - RLED3 = 1; - wait (0.5); - GLED1 = 0; - GLED2 = 0; - GLED3 = 0; - RLED1 = 0; - RLED2 = 0; - RLED3 = 0; - } - GLED1 = 1; - wait(0.1); - GLED1 = 0; - GLED2 = 1; - wait(0.1); - GLED2 = 0; - GLED3 = 1; - wait(0.1); - GLED3 = 0; - RLED1 = 1; - wait(0.1); - RLED1 = 0; - RLED2 = 1; - wait(0.1); - RLED2 = 0; - RLED3 = 1; - wait(0.2); - RLED3 = 0; - RLED2 = 1; - wait(0.1); - RLED2 = 0; - RLED1 = 1; - wait(0.1); - RLED1 = 0; - GLED3 = 1; - wait(0.1); - GLED3 = 0; - GLED2 = 1; - wait(0.1); - GLED2 = 0; - GLED1 = 1; - wait(0.1); - GLED1 = 0; -} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main_old.cpp Wed Sep 28 00:16:16 2016 +0000 @@ -0,0 +1,396 @@ +#include "mbed.h" +#include "SDFileSystem.h" +#include "wave_player.h" +//#include "uLCD_4DGL.h" +#include "PinDetect.h" +#include "Heart.h" +#include "statistics.h" +#include "spikes.h" +#include "BMP085.h" +#include <string> +#include <sstream> + +using namespace std; + +#define SHORT_SAMPLE 5 +#define LONG_SAMPLE 20 + +#define BEGIN_COMPRESSIONS "begin30ChestCompressions" +#define BREATH_TONE "breathTone" +#define CLIP_SENSOR "clipPulseSensorToEar" +#define CONTINUE_COMPRESSIONS "continueChestCompressions" +#define PLACE_MASK "placeMaskOverVictimsMouthWithTheSharpestCornerOverTheNose" +#define PREPARE_BREATH "prepareToBreatheIntoMask" +#define ROLL_VICTIM "rollVictimOntoSide" +#define START_BREATHING "startBreathing" +#define STOP_COMPRESSIONS "stopChestCompressions" +#define TILT_HEAD "tiltHeadBackFor10Seconds" +#define MONITOR_CONDITION "monitorVictimConditionAndReturnMaskToFaceIfBreathingStops" +#define RETILT_HEAD "retiltHeadByPushingChinAwayFromChest" +#define NEXT_KEY "pressNextKeyWhenReady" +#define NEXT_REMINDER "pleasePressNextKeyToContinueOrPressRepeatToHearTheLastCommand" +#define CHEST_COMPRESSIONS "prepareForChestCompressions" +#define REMOVE_MASK "removeTheMaskAndCheckTheAirway" +#define REMOVE_OBJECT "removeObject" +#define REPLACE_MASK "replaceMaskOnVictimsFace" +#define COUNT "count" +string lastMessage; + +SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card +AnalogOut DACout(p18); +wave_player waver(&DACout); +AnalogIn windSensor(p17); +PinDetect repeatButton(p14); +PinDetect nextButton(p13); +Timer timer; +Heart heart = Heart(); +BMP085 barometer(p9, p10); +Ticker ticker; +SpikeFinder s = SpikeFinder(4, 4, 4.0); +DigitalOut GLED1(p26); +DigitalOut GLED2(p25); +DigitalOut GLED3(p24); +DigitalOut RLED1(p23); +DigitalOut RLED2(p22); +DigitalOut RLED3(p21); +DigitalOut testLED(LED1); +float windSensorVoltage; +bool breathing; +bool pulse; +bool breath_success = true; +ostringstream stream; +Timer breathTimer; +bool next = false; +bool adult = true; +int cycleCount = 0; +Ticker LEDTicker; + +void playMessage(string messageName); +void getBreathing(); +void getPulse(); +void getVitals(); +bool checkBreath(); +void promptBreaths(int amt,bool check); +void chestCompressions(); +void CPR(); +void rescueBreathing(); +void auditVitals(); +void unconsciousChocking(); +void repeat_callback_function (void); +void next_callback_function (void); +void waitForNext(); +void tick(); +void welcomeLED(); +void cycleLEDs(); + +int main(){ + repeatButton.mode(PullUp); + nextButton.mode(PullUp); + wait(1); + repeatButton.attach_deasserted(&repeat_callback_function); + nextButton.attach_deasserted(&next_callback_function); + repeatButton.setSampleFrequency(); + nextButton.setSampleFrequency(); + wait(1); + + /*while(1){ + printf("HERE"); + waitForNext(); + checkBreath(); + wait(0.5); + }*/ + + welcomeLED(); + testLED = 1; + wait(3); + playMessage(PLACE_MASK); + testLED = 0; + wait(3); + waitForNext(); + playMessage(CLIP_SENSOR); + waitForNext(); + playMessage(TILT_HEAD); + waitForNext(); + getVitals(); + + if(pulse){ + playMessage(ROLL_VICTIM); + while(1){ + playMessage(MONITOR_CONDITION); + wait(5); + } + } + + promptBreaths(2,true); + if(breath_success){ + auditVitals(); + }else{ + playMessage(RETILT_HEAD); + waitForNext(); + promptBreaths(1,true); + if(breath_success){ + auditVitals(); + }else{ + unconsciousChocking(); + } + } +} + +void repeat_callback_function (void){ + playMessage(lastMessage); +} + +void next_callback_function (void){ + next = true; +} + +void tick() { + __disable_irq(); + barometer.update(); + s.addSample(barometer.get_pressure()); + __enable_irq(); +} + +void waitForNext(){ + playMessage(NEXT_KEY); + timer.start(); + while(!next){ + if(timer.read()>3){ + playMessage(NEXT_REMINDER); + timer.reset(); + } + } + timer.stop(); + timer.reset(); + next = false; +} + +void playMessage(string messageName){ + string pathName = "/sd/" + messageName + ".wav"; + char * cstrName = new char[pathName.length() + 1]; + cstrName[pathName.length()]=0; + memcpy(cstrName,pathName.c_str(),pathName.size()); + FILE *wave_file; + wave_file=fopen(cstrName,"r"); + waver.play(wave_file); + fclose(wave_file); + wait(1); + if(messageName.compare(NEXT_REMINDER) != 0 + && messageName.compare(NEXT_KEY) != 0){ + lastMessage = messageName; + } +} + +void getBreathing(){ + //SENSOR DATA + breathing = false; +} + +void getPulse(){ + pulse = heart.beatDetected(); +} + +void getVitals(){ + timer.start(); + heart.startReading(); + while(timer.read()<10){} + heart.stopReading(); + + getBreathing(); + getPulse(); + + timer.stop(); + timer.reset(); + heart.reset(); +} + +bool checkBreath(){ + windSensorVoltage = 0; + ticker.attach(&tick, .1); + while(windSensorVoltage<6.15){ + while(windSensorVoltage<6.15){ + wait(0.1); + windSensorVoltage = windSensor*10; + printf("%f",windSensorVoltage); + //THINK OF ANOTHER WAY THAT DOESN'T INVOLVE A SECOND WHILE LOOP + } + windSensorVoltage = windSensor*10; + wait(0.5); + } + //uLCD.printf("BREATH DETECTED"); + cycleLEDs(); + LEDTicker.attach(&cycleLEDs,0.116); + cycleLEDs(); + playMessage(BREATH_TONE); + LEDTicker.detach(); + ticker.detach(); + while(windSensorVoltage>6.15){ + windSensorVoltage = windSensor*10; + } + if(s.highSpikeFound()){ + s.reset(); + return false; + }else{ + s.reset(); + return true; + } +} + +void promptBreaths(int amt,bool check){ + bool local_check;; + for(int i = 0;i<amt;i++){ + playMessage(PREPARE_BREATH); + if(check){ + waitForNext(); + } + playMessage(START_BREATHING); + local_check = checkBreath(); + breath_success = breath_success & local_check; + } +} + +void chestCompressions(){ + playMessage(CHEST_COMPRESSIONS); + waitForNext(); + playMessage(BEGIN_COMPRESSIONS); + wait(1); + playMessage(COUNT); + playMessage(STOP_COMPRESSIONS); +} + +void CPR(){ + while(1){ + promptBreaths(2,true); + chestCompressions(); + } +} + +void rescueBreathing(){ + while(pulse){ + timer.start(); + while(timer.read()<120){ + promptBreaths(1,false); + if(adult){ + wait(3); //Need 5s total loop time if adult + }else{ + wait(1); //Need 3s total loop time if child + } + } + timer.stop(); + timer.reset(); + playMessage(TILT_HEAD); + waitForNext(); + getVitals(); + } + CPR(); +} + +void auditVitals(){ + if(pulse && !breathing){ + rescueBreathing(); + }else if(!pulse && !breathing){ + CPR(); + }else{//ERROR} + } +} + +void unconsciousChocking(){ + bool stillChocking = true; + while(stillChocking){ + chestCompressions(); + playMessage(REMOVE_MASK); + playMessage(REMOVE_OBJECT); + waitForNext(); + playMessage(REPLACE_MASK); + promptBreaths(2,true); + if(breath_success){ + stillChocking = false; + } + } + playMessage(TILT_HEAD); + waitForNext(); + getVitals(); + auditVitals(); +} + +void cycleLEDs(){ + cycleCount++; + if(cycleCount==1){ + RLED1 = 1; + } + if(cycleCount==2){ + RLED2 = 1; + } + if(cycleCount==3){ + RLED3 = 1; + } + if(cycleCount==4){ + GLED1 = 1; + } + if(cycleCount==5){ + GLED2 = 1; + } + if(cycleCount==6){ + GLED3 = 1; + } + if(cycleCount==7){ + GLED1 = 0; + GLED2 = 0; + GLED3 = 0; + RLED1 = 0; + RLED2 = 0; + RLED3 = 0; + cycleCount = 0; + } +} + +void welcomeLED(){ + for(int i =0;i<5;i++){ + GLED1 = 1; + GLED2 = 1; + GLED3 = 1; + RLED1 = 1; + RLED2 = 1; + RLED3 = 1; + wait (0.5); + GLED1 = 0; + GLED2 = 0; + GLED3 = 0; + RLED1 = 0; + RLED2 = 0; + RLED3 = 0; + } + RLED1 = 1; + wait(0.1); + RLED1 = 0; + RLED2 = 1; + wait(0.1); + RLED2 = 0; + RLED3 = 1; + wait(0.1); + RLED3 = 0; + GLED1 = 1; + wait(0.1); + GLED1 = 0; + GLED2 = 1; + wait(0.1); + GLED2 = 0; + GLED3 = 1; + wait(0.2); + GLED3 = 0; + GLED2 = 1; + wait(0.1); + GLED2 = 0; + GLED1 = 1; + wait(0.1); + GLED1 = 0; + RLED3 = 1; + wait(0.1); + RLED3 = 0; + RLED2 = 1; + wait(0.1); + RLED2 = 0; + RLED1 = 1; + wait(0.1); + RLED1 = 0; +} \ No newline at end of file