This program consists of the software developed for the ELEC5870M Individual Project. It runs on the mbed LPC1768. It uses the mbed RTOS to perform the following tasks: - Implements intuitive GUI with buttons, LCD TFT Display and LEDs. - Serial Communication with the RPi - I2C communication with INA219 voltage current sensors - Power control at the USB ports
Dependencies: Adafruit_GFX Adafruit_ST7735 INA219 MODSERIAL MbedJSONValue mbed-rtos mbed
Logs/LogManager.h
- Committer:
- OHstin
- Date:
- 2017-04-30
- Revision:
- 6:196a63a3378d
- Parent:
- 3:7666de697752
File content as of revision 6:196a63a3378d:
#ifndef LOGMANAGER_H #define LOGMANAGER_H #include "LogRecord.h" // stores struct LogInstructions{ int parameter; int duration; } logInstructions; const static char *LOGDATA_LOC = "/local/log.txt"; const static char *LOGDATA1_LOC = "/local/log6.txt"; const static char *LOGDATA2_LOC = "/local/log2.txt"; const static char *LOGDATA3_LOC = "/local/log5.txt"; const static char *LOGDATA4_LOC = "/local/log4.txt"; class LogManager { public: LogManager(); void createNewLog(int parameter, int duration); int retrieveLog(LogRecord records[]); void deleteLog(LogRecord &); private: void createLogStructure(); void updateLog(); bool logFileExists(); bool logAvailable(int &); void readData(MbedJSONValue &, const char *location); void writeData(MbedJSONValue &, const char *location); char currLog[5]; // stores the log id of the current log char logLocation[20]; // location of the current log LogRecord *record; // is used a buffer to store record data Ticker timer1; // create ticker object }; LogManager::LogManager() { // constructor myled = 1; // it first checks if the log file exists // and if not, creates the JSON data structure if(!logFileExists()) { createLogStructure(); } } void LogManager::createNewLog(int parameter, int duration) { // loops through the data structure to find an available // spot in the log structure int id = 0; if(!logAvailable(id)) { /// do some work // for example show display message return; } // determine the location of the log switch(id) { case 1: strcpy(logLocation,LOGDATA1_LOC); break; case 2: strcpy(logLocation,LOGDATA2_LOC); break; case 3: strcpy(logLocation,LOGDATA3_LOC); break; case 4: strcpy(logLocation,LOGDATA4_LOC); break; default: break; } // id will have the location of the empty log //create Log ID strcpy(currLog,"l"); char num[2]; sprintf(num,"%d",id); strcat(currLog,num); // intialises the log structure // e.g parameter, duration etc // create temporary JSON object MbedJSONValue temp; // populate JSONObject readData(temp,logLocation); // intialises the log structure // e.g parameter, duration etc record = new LogRecord(currLog); record->initialiseRecord(temp,parameter,duration); // write the data to file writeData(temp,logLocation); //RtosTimer timer() // set an interrupt to do this depending on the interval timer1.attach(callback(this,&LogManager::updateLog),10.0); // call ISR every 10.0 seconds // starts updating the log updateLog(); } void LogManager::updateLog() { // update the record with necessary data //// REMEMBER TO WAIT BEFORE PERMISSION IS GRANTED // read the log from logstructure on file // this will be a JSON object // create temporary JSON object MbedJSONValue temp; // populate JSONObject readData(temp,logLocation); // update the JSON object if (record->updateRecord(temp)) { // check if logging is unfinished // write the new JSON data to file writeData(temp,logLocation); } else { // Logging is complete // stop recurring interrupts here timer1.detach(); // delete the Log Record delete record; // COMMIT SUICIDE delete this; } } bool LogManager::logFileExists() { // this function checks whether the file // that stores log data exists FILE *file; if (file = fopen(LOGDATA1_LOC, "r")) { fclose(file); return true; } return false; } bool LogManager::logAvailable( int &id) { // check if there is a space available for logging bool positionAvailable = false; // create location buffer char location[20]; // loop through logs to check if there is a free position for( int i = 0; i < 4; i++ ) { int number = i+1; // determine location switch(number) { case 1: strcpy(location,LOGDATA1_LOC); break; case 2: strcpy(location,LOGDATA2_LOC); break; case 3: strcpy(location,LOGDATA3_LOC); break; case 4: strcpy(location,LOGDATA4_LOC); break; default: break; } // create temporary JSON object MbedJSONValue temp; // populate JSON object readData(temp,location); //create Log ID char logID[] = "l"; char num[2]; sprintf(num,"%d",number); strcat(logID,num); // retrieve the status int status = temp[logID]["s"].get<int>(); // check availability if(status == 0) { id = number; positionAvailable = true; break; } } return positionAvailable; } void LogManager::createLogStructure() { // this function creates the json data structure // and stores it on file // create location buffer char location[20]; // create 4 empty logs in the JSON Object for( int i = 0; i < 4; i++) { int number = i+1; // create new temporary JSON object MbedJSONValue temp; // determine location switch(number) { case 1: strcpy(location,LOGDATA1_LOC); break; case 2: strcpy(location,LOGDATA2_LOC); break; case 3: strcpy(location,LOGDATA3_LOC); break; case 4: strcpy(location,LOGDATA4_LOC); break; default: break; } //create Log ID char logID[] = "l"; char num[2]; sprintf(num,"%d",number); strcat(logID,num); temp[logID]["p"] = 0; temp[logID]["mx"] = 0; temp[logID]["mn"] = 0; temp[logID]["av"] = 0; temp[logID]["s"] = 0; temp[logID]["d"] = 0; temp[logID]["%"] = 0; temp[logID]["v"] = 0; temp[logID]["t"] = 0; // write the data to file writeData(temp,location); } } int LogManager::retrieveLog(LogRecord records[]) { // look for the unempty records by checking their status int numberOfRecords = 0; // location of record in array int position = 0; // create location buffer char location[20]; for ( int i = 0; i < 4; i++) { int number = i+1; // determine location switch(number) { case 1: strcpy(location,LOGDATA1_LOC); break; case 2: strcpy(location,LOGDATA2_LOC); break; case 3: strcpy(location,LOGDATA3_LOC); break; case 4: strcpy(location,LOGDATA4_LOC); break; default: break; } // create temporary JSON Object MbedJSONValue temp; // populate JSON object readData(temp,location); //create Log ID char logID[] = "l"; char num[2]; sprintf(num,"%d",number); strcat(logID,num); // look for logs with data int status = temp[logID]["s"].get<int>(); if(status != 0) { // logfile is not empty therefore // create new record LogRecord newRecord(logID); newRecord.initialiseRecord(temp,number); // store the records in an array records[position] = newRecord; position++; // increment the record counter numberOfRecords++; } } return numberOfRecords; } void LogManager::deleteLog(LogRecord &record) { // this function resets the log data // in the log structure to the default values // first determine the location // create location buffer char location[20]; switch(record.getID()) { case 1: strcpy(location,LOGDATA1_LOC); break; case 2: strcpy(location,LOGDATA2_LOC); break; case 3: strcpy(location,LOGDATA3_LOC); break; case 4: strcpy(location,LOGDATA4_LOC); break; default: break; } // create temporary JSON Object MbedJSONValue temp; //create Log ID char logID[] = "l"; char num[2]; sprintf(num,"%d",record.getID()); strcat(logID,num); // create empty log temp[logID]["p"] = 0; temp[logID]["mx"] = 0; temp[logID]["mn"] = 0; temp[logID]["av"] = 0; temp[logID]["s"] = 0; temp[logID]["d"] = 0; temp[logID]["%"] = 0; temp[logID]["v"] = 0; temp[logID]["t"] = 0; // write the data to file writeData(temp,location); //wait_ms(100); } void LogManager::readData(MbedJSONValue &temp, const char *location) { // buffer to store string read from file char read_string[100]; // create the file pointer FILE *fp; // prepare file for reading fp = fopen(location, "r"); // read the logs string into buffer fgets(read_string,100,fp); // convert string into JSON Data parse(temp,read_string); // close the file fclose(fp); } void LogManager::writeData(MbedJSONValue &temp, const char *location) { // create the file pointer FILE *fp; // prepare file for writing fp = fopen(location, "w"); // convert json object to string std::string s; s = temp.serialize(); // write string to file fprintf(fp,"%s",s.c_str()); // close the file fclose(fp); } #endif