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;
+}