Year Two Project ELEC 2645: Embedded Systems Project Portable Weather Station
Dependencies: BMP180 ConfigFile N5110 PowerControl beep mbed
Diff: PressureLog.h
- Revision:
- 0:da2b8c7a1ec1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PressureLog.h Mon May 11 15:25:52 2015 +0000 @@ -0,0 +1,252 @@ +/** +@file pressurelog.h +*/ +#ifndef PRESSURELOG_H +#define PRESSURELOG_H + +#include "Outputs.h" +#include "ConfigFile.h" +#include "Sensors.h" + +/** +@brief logs pressure values over a predetermined length of time\n +@brief the logged data is then stored on the onboard flash memory\n +@brief the lCD screen is turned off after 5 seconds to save energy +@author Augustine K Kizito +@date April 2015 +*/ + + +class PressureLog +{ +private: + bool logFinished; // tracks if logging was successfuly finished + int logCounter; //tracks how many times data has been logged + bool changeScreen; // tracks if the user pressed a button that changes the screen + int nextScreen; // tracks whether the user wants to go to + //the previous screen or next screen + Timeout stop; // timeout that will turn off the screen after a given time + Ticker logTimer; // ticker that will log data at intervals + Ticker batLedTimer; // ticker that will check battery status at intervals + ConfigFile pcfgW; // pressure CFG object + + void onBack(); // user pressed the back button + void turnOffScreen(); // powers down the lcd screen + void logData(); // logs data by storing it in ConfigFile object + void saveData(); // saves data to the mbed flash drive + void initCfg(int duration); // initialises the cfg object with vital data + void checkBatVoltage(); // checks if batteryVoltage is low + +public: + /** + Manages the execution of the Pressure Log Screen + + @param - integer duration, the length of time to pressure + @returns + -1 - navigate to previous screen + + */ + int start(int duration); + + +}; + +int PressureLog::start(int duration) +{ + // initialisations + logFinished = false; + logCounter = 0; + lcd.printString("Logging...",20,2); + + backButton.mode(PullDown); // activate pullDown Resistor + backButton.rise(this,&PressureLog::onBack); // call onBack when the back button is pressed + + stop.attach(this,&PressureLog::turnOffScreen, 5); // turn off LCD screen after 5 seconds + batLedTimer.attach(this, &PressureLog::checkBatVoltage, 10); // check battery voltage every 5 seconds + + // check the Battery Voltage + checkBatVoltage(); + // Turn on the Log Led + turnOnLogLed(); + // Initialise CFG object + initCfg(duration); + // start the debounce timer + debounce.start(); + + // 84 data points should be recorded for every log + + logData(); // log the data + + if ( duration == 0) { + // this intervals makes 84 logs in 5 minutes + logTimer.attach(this, &PressureLog::logData,3.614); + } else if ( duration == 1) { + // this intervals makes 84 logs in 10 minutes + logTimer.attach(this, &PressureLog::logData,7.229); + } else if ( duration == 2) { + // this intervals makes 84 logs in 30 minutes + logTimer.attach(this, &PressureLog::logData,21.687); + } else { + // this intervals makes 84 logs in 1 hour + logTimer.attach(this, &PressureLog::logData,42.373); + } + + while (!logFinished) { + + // mbed goes to sleep to save power + Sleep(); + + } + + // remove interrupts + logTimer.detach(); + backButton.rise(NULL); + + turnOffLogLed(); + + return -1; +} + +void PressureLog::initCfg( int duration ) +{ + + // Create the Duration Key and Value Pair + char *theDurationKey = "durationKey"; + char theDurationValue[32]; + + // Set the Duration Value appropriately + if ( duration == 0 ) { + + char theDurationString[32] = "5 min"; + strcpy(theDurationValue,theDurationString); + + } else if ( duration == 1) { + + char theDurationString[32] = "10 min"; + strcpy(theDurationValue,theDurationString); + + } else if ( duration == 2) { + + char theDurationString[32] = "30 min"; + strcpy(theDurationValue,theDurationString); + + } else { + + char theDurationString[32] = "1 hour"; + strcpy(theDurationValue,theDurationString); + } + + // Create the Time and Value Pair + char *theTimeKey = "timeKey"; + char theTimeValue[32]; + + // Create the Date Key and Value Pair + char *theDateKey = "dateKey"; + char theDateValue[32]; + + ////GET THE CURRENT TIME/////////// + time_t seconds = time(NULL); + strftime(theDateValue, 32, "%d/%m/%y", localtime(&seconds)); // format the date in day/month/year + strftime(theTimeValue, 32, "%R", localtime(&seconds)); // format the time in HH:MM 24 Hr clock + //////////////////////////////////////////// + + // set the created Key and Value Pairs to the cfg object + pcfgW.setValue(theDateKey,theDateValue); + pcfgW.setValue(theTimeKey,theTimeValue); + pcfgW.setValue(theDurationKey,theDurationValue); + + +} + +void PressureLog::logData() +{ + + if ( logCounter < 84 ) { // data is still logging + + // get the current pressure + float pressure = getPressure(); + + // create a new Counter Key and Value Pair + char *theCounterKey = "counterKey"; + char theCounterValue[32] = ""; + + // assign the logCounter as the CounterValue + sprintf(theCounterValue,"%d",logCounter); + + // Create a new Key and Value Pair + char theKey[32] = "key"; + char theValue[32] = ""; + + // concatentate the Key Value and Counter Value strings + strcat(theKey,theCounterValue); + + sprintf(theValue,"%0.2f",pressure); // converting float to string + + // set the created key and value pairs to the cfg object + pcfgW.setValue(theCounterKey,theCounterValue); + pcfgW.setValue(theKey,theValue); + + + } else { + + saveData(); // save the data + logFinished = true; // logging has finished successfully + } + + // increment the log counter + logCounter++; + +} + +void PressureLog::saveData() +{ + // save the data to onboard flash memory as a cfg file + pcfgW.write("/local/prs.cfg"); + +} + +void PressureLog::onBack() +{ + if (debounceSuccess()) { // debouncing successful + + playSound(); + // if user presses the back button, save data and terminate logging + + saveData(); // save the data + logFinished = true; // logging has finished successfully + debounce.reset(); // reset the debounce timer + + } + +} + +void PressureLog::turnOffScreen() +{ + // turn off the LCD screen to save power + lcd.turnOff(); + +} + +void PressureLog::checkBatVoltage() +{ + // read the battery voltage + float batteryVoltage = getVoltage(); + + if (batteryVoltage < 6.5) { // check if battery is low + + if(!batStatLedState) { // if the battery low led is not already on + + turnOnBatStatLed(); // turn on the battery low led + } + + + } else { + + turnOffBatStatLed(); // ensure that the battery low led is turned off + + } + + +} + +#endif \ No newline at end of file