Year Two Project ELEC 2645: Embedded Systems Project Portable Weather Station
Dependencies: BMP180 ConfigFile N5110 PowerControl beep mbed
Diff: DataController.h
- Revision:
- 0:da2b8c7a1ec1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DataController.h Mon May 11 15:25:52 2015 +0000 @@ -0,0 +1,448 @@ +/** +@file DataController.h +@brief Manages the display of logged data on onto the LCD + + +*/ + +#ifndef DATACONTROLLER_H +#define DATACONTROLLER_H + +#include "Outputs.h" +#include "ConfigFile.h" + +/** +@brief Manages the display of logged data on onto the LCD \n +@brief consists of three different pages\n +@brief Page 1 shows date, time and duration of the log\n +@brief Page 2 shows the maximum, average and minimum values recorded\n +@brief Page 3 shows a plot of logged data against time\n +@author Augustine Kizito K\n +@date April 2015 + +*/ + +class DataController +{ +private: + char units[10]; // parameter of data temperature/pressure + char time[32]; // the time the log was taken + char date[32]; // the date the log was taken + char duration[10]; // the duration of the log + char average[10]; // average value + char maximum[10]; // maximum value + char minimum[10]; // minimum value + float dataArray[84]; // array that stores retrieved data + int dataAmount; // contains the number of retrieved data values + int parameter; // tracks whether the data is temperature or pressure + + bool dataPresent; // should know of data is available in file of not + int currentPage; // the current page that is displayed -1,0,1,2 or 3 + bool changePage; // false means go stay on page, true means go to new Page + + + void showPageOne(); // shows date/time/duration info of data + void showPageTwo(); // shows max/min/average info of data + void showPageThree(); // shows plot of data + void clear(); // clears the LCD screen but status bar remains + float calculateAverage(float array[], int size); // returns average + float calculateMaximum(float array[], int size); // returns maximum + float calculateMinimum(float array[], int size); // return minimum + void plot(float array[], int size); // plots the data on screen + void initArray(); // intialises the data Array + void invertPixels(); // highlights the string in the sixth bank + +protected: + /** + Creates a data controller instance + + @param file - file location of logged data + @param pr - parameter of logged data. 1 for temperature, 2 for pressure + + */ + DataController(char *file, int pr); + + /** + Starts the execution of the data controller + + */ + void begin(); + + /** + Navigates to the next page + + */ + void nextPage(); + + /** + Navigates to the previous page + + */ + void previousPage(); + + +}; + + + + + + + + +DataController::DataController( char *file , int pr) +{ + // Initialise private data attributes + dataPresent = false; + currentPage = 0; + changePage = false; + dataAmount = 0; + parameter = pr; + + if (pr) { // if the parameter is temperature + char *uts = " Cel"; // units are in celsius + strcpy(units,uts); + } else { // if parameter is pressure + char *uts = "mb"; // units are in millibars + strcpy(units,uts); + } + + + // Create Keys along with their respective Value Buffers + // Value data for each key is stored in Value Buffer + + // Time Key + char *theTimeKey = "timeKey"; + char theTimeValue[BUFSIZ]; + + // Date Key + char *theDateKey = "dateKey"; + char theDateValue[BUFSIZ]; + + // Duration Key + char *theDurationKey = "durationKey"; + char theDurationValue[BUFSIZ]; + + // Counter Key + char *theCounterKey = "counterKey"; + char theCounterValue[BUFSIZ]; + + // Value buffer is to store data points of retreived data + char theValue[BUFSIZ]; + + // initialise array where data points of retreived data + // will be stored + void initArray(); + + if (cfg.read(file)) { // if the CFG file exists, read it + + // initialise + dataPresent = true; + int count = 0; + + //retrieve the date + if (cfg.getValue(theDateKey, &theDateValue[0], sizeof(theDateValue))) { + + strcpy(date,theDateValue); + + } + + // retrieve the time + if (cfg.getValue(theTimeKey, &theTimeValue[0], sizeof(theTimeValue))) { + + strcpy(time,theTimeValue); + + } + + // retrieve the duration + if (cfg.getValue(theDurationKey, &theDurationValue[0], sizeof(theDurationValue))) { + + strcpy(duration,theDurationValue); + + } + + + // retrieve the number of elements stored + if (cfg.getValue(theCounterKey, &theCounterValue[0], sizeof(theCounterValue))) { + + count = atoi(theCounterValue); // convert to integer + + } + + // retrieve/parse the available data points depending of the number of elements + for ( int i = 0; i < (count+1); i++) { + + // Create a new key + char theKey[20] = "key"; + + char countString[20]; // create empty string + + sprintf(countString,"%d",i); // convert int to string + + strcat(theKey,countString); //concatentate the strings + + // retreive tha data point and store it in array + if (cfg.getValue(theKey, &theValue[0], sizeof(theValue))) { + + dataArray[i] = atof(theValue); // convert to string to float and store in array + + } + + } + // update variable with the number of retrieved elements/datapoints + dataAmount = count+1; + + // calculate maximum value of retrieved data points + float max = calculateMaximum(dataArray,dataAmount); + // calculate average value of retreived data points + float avg = calculateAverage(dataArray, dataAmount); + // calculate maximum value of retieved data points + float min = calculateMinimum(dataArray, dataAmount); + + sprintf(maximum,"%0.2f%s",max,units); // converting float to string + sprintf(average,"%0.2f%s",avg,units); // converting float to string + sprintf(minimum,"%0.2f%s",min,units); // converting float to string + + } else { // there is no file available + currentPage = -1; + } + +} + +void DataController::begin() +{ + + while (currentPage != -1) { // the user does not exit + + if ( currentPage == 0) { // show the first page + + showPageOne(); + + while(!changePage) { // user does not change the page + + // mbed goes to sleep to save power + Sleep(); + } + changePage = false; // reset + clear(); // clear the screen + } + + if (currentPage == 1) { // show the second page + + showPageTwo(); + while(!changePage) { // user does not change page + + // mbed goes to sleep to save power + Sleep(); + + } + changePage = false; //reset + clear(); // clear the screen + } + + if (currentPage == 2) { // show the third page + + showPageThree(); + while(!changePage) { // user does not change page + + // mbed goes to sleep to save power + Sleep(); + + } + + changePage = false; //reset + clear(); // clear the screen + + } + + + } + +} + +void DataController::nextPage() +{ + // add the current page + currentPage++; + changePage = true; // user wants to change page + + // prevents from going to a page that doesnt exist + if (currentPage > 2) { + + currentPage = 2; // set to the third page + } +} + +void DataController::previousPage() +{ + // subtract the current page + currentPage--; + changePage = true; // user wants to change page + + // prevents from navigating to a page that doesn't exist + if (currentPage < -1) { + + currentPage = -1; // leave the data controller + } + +} + +void DataController::clear() +{ + // clears the section of the LCD being used + for ( int x = 0; x < 84; x++) { + + for ( int y = 8; y < 48; y++) { + + lcd.clearPixel(x,y); + + } + + } + + lcd.refresh(); + + +} + +void DataController::showPageOne() +{ + // data on the first page + + lcd.printString("Date: ",0,2); // Date + lcd.printString("Time: ",0,3); // Time + lcd.printString("Durtn: ",0,4); // Duration + lcd.printString("View Data", 0,5); // View Data + lcd.printString(date,35,2); // Date Value + lcd.printString(time,35,3); // Time Value + lcd.printString(duration,40,4); // Duration Value + invertPixels(); // invert Pixels in the 6th bank +} + +void DataController::showPageTwo() +{ + // data on the second page + + lcd.printString("Max: ",0,2); // Maximum + lcd.printString("Avg: ",0,3); // Average + lcd.printString("Min: ",0,4); // Minimum + lcd.printString("View Plot", 0,5); // View Plot + lcd.printString(maximum,30,2); // Maximum Value + lcd.printString(average,30,3); // Average Value + lcd.printString(minimum,30,4); // Minimum Value + invertPixels(); // invert Pixels in the 6th bank +} + +void DataController::showPageThree() +{ + // plot data on the LCD screen + plot(dataArray,dataAmount); + +} + +float DataController::calculateMaximum(float array[], int size) +{ + // Scan though Array and determine maximum + float max = array[0]; + + for (int i = 1; i < size; i++) { + + if ( array[i] > max ) { + + max = array[i]; + + } + } + + return max; + +} + +float DataController::calculateAverage(float array[], int size) +{ + + float total = 0; + float avg = 0; + + // caculate the total of data points + for ( int i = 0; i < size; i++) { + + total = total + array[i]; + + } + + // divide total by number of data points to get average + avg = total/size; + + return avg; + +} + +float DataController::calculateMinimum(float array[], int size) +{ + float min = array[0]; + + // scan through array and determing minimum + for (int i = 1; i < size; i++) { + + if ( array[i] < min ) { + + min = array[i]; + + } + } + + return min; + +} + +void DataController::plot(float array[], int size) +{ + for (int i = 0; i < size; i++) { + + float value = array[i]; + + if (parameter) { // parameter is temperature + lcd.drawLine(i,(31*((50-value)/50)+16),i,47,1); + } else { // parameter is pressure + lcd.drawLine(i,(31*((1200-value)/1200)+16),i,47,1); + } + + } + +} + +void DataController::initArray() +{ + // initialise dataArray elements to zero + for ( int i = 0; i < 84; i++) { + dataArray[i] = 0; + } +} + +void DataController::invertPixels() +{ + int onset = 39; // x coordinate where inversion starts + int termination = onset + 9; // bank's length height is 9 pixels + + for ( int m = onset; m < termination; m++) { + + for ( int n = 0; n < 84; n++) { + + if((lcd.getPixel(n,m)) == 0) { // if the pixel is clear + lcd.setPixel(n,m); // set the pixel + } else { + lcd.clearPixel(n,m); // else clear the pixel + } + + } + } + + lcd.refresh(); // refresh the lcd screen + + +} + + + +#endif \ No newline at end of file