Year Two Project ELEC 2645: Embedded Systems Project Portable Weather Station

Dependencies:   BMP180 ConfigFile N5110 PowerControl beep mbed

TemperatureLog.h

Committer:
OHstin
Date:
2015-05-11
Revision:
0:da2b8c7a1ec1

File content as of revision 0:da2b8c7a1ec1:

/**
@file temperaturelog.h
*/

#ifndef TEMPERATURELOG_H
#define TEMPERATURELOG_H

#include "Outputs.h"
#include "ConfigFile.h"
#include "Sensors.h"

/**
@brief logs temperature 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
@date April 2015
*/



class TemperatureLog
{
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 tcfgW; // temperature CFG Write


    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 Temperature Log Screen

    @param - integer duration, the length of time to log temperature
    @returns
    -1   - navigate to previous screen

    */
    int start(int duration);


};

int TemperatureLog::start(int duration)
{
    // initialisations
    logFinished = false;
    logCounter = 0;
    lcd.printString("Logging...",20,2);

    backButton.mode(PullDown); // activate pullDown Resistor
    backButton.rise(this,&TemperatureLog::onBack); // call onBack when the back button is pressed

    stop.attach(this,&TemperatureLog::turnOffScreen, 5); // turn off LCD screen after 5 seconds
    batLedTimer.attach(this, &TemperatureLog::checkBatVoltage, 10); // check battery voltage  every 5 seconds

    // check battery voltage
    checkBatVoltage();
    // turn on the log led
    turnOnLogLed();
    // initialise the 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 results makes 84 logs in 5 minutes
        logTimer.attach(this, &TemperatureLog::logData,3.614);
    } else if ( duration == 1) {
        // this intervals results makes 84 logs in 10 minutes
        logTimer.attach(this, &TemperatureLog::logData,7.229);
    } else if ( duration == 2) {
        // this intervals results makes 84 logs in 30 minutes
        logTimer.attach(this, &TemperatureLog::logData,21.687);
    } else  {
        // this intervals results makes 84 logs in 1 hour
        logTimer.attach(this, &TemperatureLog::logData,42.373);
    }

    while (!logFinished) {

        // mbed goes to sleep to save power
        Sleep();

    }

    // remove interrupts
    logTimer.detach();
    backButton.rise(NULL);

    turnOffLogLed();

    return -1;
}

void TemperatureLog::initCfg( int duration )
{

    // Create the Duration Key and Value Pair
    char *theDurationKey = "durationKey";
    char theDurationValue[32];

    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
    tcfgW.setValue(theDateKey,theDateValue);
    tcfgW.setValue(theTimeKey,theTimeValue);
    tcfgW.setValue(theDurationKey,theDurationValue);


}

void TemperatureLog::logData()
{

    if ( logCounter < 84 ) { // // data is still logging

        // get the current temperature
        float temperature = getTemperature();

        // 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",temperature); // converting float to string

        // set the created key and value pairs to the cfg object
        tcfgW.setValue(theCounterKey,theCounterValue);
        tcfgW.setValue(theKey,theValue);


    } else {

        saveData(); // save the data
        logFinished = true; // logging has finished successfully
    }
    // increment the log counter
    logCounter++;

}

void TemperatureLog::saveData()
{
    // save the data to onboard flash memory as a cfg file
    tcfgW.write("/local/temp.cfg");

}

void TemperatureLog::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 TemperatureLog::turnOffScreen()
{
    // turn off the LCD screen to save power
    lcd.turnOff();

}

void TemperatureLog::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