Mercurial > hg > beaglert
diff examples/10-Instruments/d-box/logger.cpp @ 464:8fcfbfb32aa0 prerelease
Examples reorder with subdirectories. Added header to each project. Moved Doxygen to bottom of render.cpp.
author | Robert Jack <robert.h.jack@gmail.com> |
---|---|
date | Mon, 20 Jun 2016 16:20:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/10-Instruments/d-box/logger.cpp Mon Jun 20 16:20:38 2016 +0100 @@ -0,0 +1,188 @@ +/* + * logger.cpp + * + * Created on: Aug 6, 2014 + * Author: VIctor Zappi and Andrew McPherson + */ + +#include "logger.h" + +// main extern vars +extern int gShouldStop; +extern int gVerbose; + +// file nanme extern vars +extern char gId; +extern char gGroup; + + +// logged extern vars +extern int s0TouchNum; +extern float s0Touches_[MAX_TOUCHES]; +extern float s0Size_[MAX_TOUCHES]; +extern int s0LastIndex; + +extern int s1TouchNum; +extern float s1Touches_[MAX_TOUCHES]; +extern float s1Size_[MAX_TOUCHES]; +extern int s1LastIndex; + +extern int fsr; + + + +string logPath = "/boot/uboot/instrumentLog"; +string logFileIncipit = "/datalog"; +string logFileName = ""; +ofstream logFile; +timeval logTimeVal; +unsigned long long logTimeOrig; +int logCnt = 0; // counts how many lines so far +int logCntSwap = 50; // how many log lines before closing and re-opening the file + + +// create the log file, using incremental name convention +int initLogLoop() +{ + if(gVerbose==1) + cout << "---------------->Init Log Thread" << endl; + + + // transform chars into strings via stringstream objs + stringstream id_ss, group_ss, freedom_ss; + id_ss << gId; + group_ss << gGroup; + + int logNum = -1; + int logMax = -1; + int pathLen = logPath.length() + logFileIncipit.length() + 4; // + 4 is: "_", id, group, "_" + glob_t globbuf; + + // check how many log files are already there, and choose name according to this + glob( (logPath + logFileIncipit + "*").c_str(), 0, NULL, &globbuf); + + // cycle through all and find the highest index + for(unsigned int i=0; i<globbuf.gl_pathc; i++) + { + // playing with 0-9 char digits, forming a number from 0 to 9999 + logNum = (globbuf.gl_pathv[i][pathLen]-48) * 1000; // 42 to 45 are the indices of the chars forming the file index + logNum += (globbuf.gl_pathv[i][pathLen+1]-48) * 100; + logNum += (globbuf.gl_pathv[i][pathLen+2]-48) * 10; + logNum += globbuf.gl_pathv[i][pathLen+3]-48; + if(logNum > logMax) + logMax = logNum; + } + logNum = logMax + 1; // new index + + globfree(&globbuf); + + ostringstream numString; + numString << setw (4) << setfill ('0') << logNum; // set integer with 4 figures + + // here are the new names: PATH + DIR + INCIPIT + _ + id + group + freedom + _ + NUM (4figures) + _A.txt + logFileName = logPath + logFileIncipit; + logFileName += "_" + id_ss.str() + group_ss.str() + freedom_ss.str(); + logFileName += "_" + numString.str(); //static_cast<ostringstream*>( &(ostringstream() << logNum) )->str(); + logFileName += ".txt"; + + + // create new files + FILE *fp_a = fopen(logFileName.c_str(), "wb"); + if(!fp_a) + { + dbox_printf("Cannot create files...\n"); + return 2; + } + fclose(fp_a); + + // ready to append + logFile.open(logFileName.c_str(), ios::out | ios::app); + + dbox_printf("Logging on file %s\n", logFileName.c_str()); + + return 0; +} + + +void writeData(unsigned long long time) +{ + + float fsr_ = ((float)(1799-fsr)/1799.0); + logFile << time << "\t" // timestamp + << s0TouchNum << "\t"; // sensor 0 touch count + for(int i=0; i<MAX_TOUCHES; i++) + logFile << s0Touches_[i] << "\t"; // sensor 0 touch pos x + for(int i=0; i<MAX_TOUCHES; i++) + logFile << s0Size_[i] << "\t"; // sensor 0 touch size + logFile << s0LastIndex << "\t" // sensor 0 last index + << fsr_ << "\t" // sensor 0 FSR pressure + << s1TouchNum << "\t"; // sensor 1 touch count + for(int i=0; i<MAX_TOUCHES; i++) + logFile << s1Touches_[i] << "\t"; // sensor 1 touch pos x + for(int i=0; i<MAX_TOUCHES; i++) + logFile << s1Size_[i] << "\t"; // sensor 1 touch size + logFile << s1LastIndex << "\t" // sensor 1 last index + //... AND SO ON + << "\n"; + + //dbox_printf("%d\n", s0LastIndex); + //dbox_printf("s0TouchNum: %d\t s0Touches[0]: %f\t s0Size[0]: %f\t s0LastIndex: %d\n", s0TouchNum, s0Touches_[0], s0Size_[0], s0LastIndex); + +} + +void logData(unsigned long long time) +{ + // if it's time to change write-file + if(logCnt >= logCntSwap) + { + logFile.close(); // close file, dump stream + logCnt = 0; // ready for another whole round + + // open again, ready to append + logFile.open(logFileName.c_str(), ios::out | ios::app); + } + + writeData(time); + + logCnt++; +} + + + + +void *logLoop(void *) +{ + set_realtime_priority(10); + + if(gVerbose==1) + dbox_printf("_________________Log Thread!\n"); + + // get time reference + gettimeofday(&logTimeVal, NULL); + logData(0); + + logTimeOrig = logTimeVal.tv_usec; + logTimeOrig *= 0.001; // from usec to msec + logTimeOrig += logTimeVal.tv_sec*1000; // from sec to msec + + usleep(5000); + + while(!gShouldStop) + { + gettimeofday(&logTimeVal, NULL); + unsigned long long currentTime = logTimeVal.tv_usec; + currentTime *= 0.001; // from usec to msec + currentTime += logTimeVal.tv_sec*1000; // from sec to msec + + logData(currentTime-logTimeOrig); + + usleep(5000); + } + + if(logFile!=NULL) + logFile.close(); + + dbox_printf("log thread ended\n"); + + return (void *)0; +}