void irsdkDiskServer::logHeaderToIBT()
{
	if(file)
		fclose(file);

	char path[MAX_PATH];

	// changed 07/07/2014 - Thorsten Kuypers
	//initPathStr(path, MAX_PATH);
	//strncpy_s(path, MAX_PATH, dataLogPath, strlen(dataLogPath));
	localHeader.tickRate = irsdkServer::sampleRate;
	sprintf_s(path, MAX_PATH, "%s\\%s-", irsdkDiskServer::dataLogPath, irsdkDiskServer::dataLogFileName);

	t_time = time(NULL);

	file = openUniqueFile(path, "ibt", t_time, true);

	if(file)
	{
		int offset = 0;

		// reset
		diskSubHeaderOffset = 0;
		diskLastLap = -1;

		// main header
		//****FixMe, no need to clone localHeader?
		memcpy(&diskHeader, &localHeader, sizeof(diskHeader));
		offset += sizeof(diskHeader);
		//****FixMe, is this nessisary?
		diskHeader.sessionInfoLen = (int)strlen(sessionStr);

		// sub header is written out at end of session
		memset(&diskSubHeader, 0, sizeof(diskSubHeader));
		diskSubHeader.sessionStartDate = t_time;
		diskSubHeaderOffset = offset;
		offset += sizeof(diskSubHeader);

		// pointer to var definitions
		diskHeader.varHeaderOffset = offset;
		offset += diskHeader.numVars * sizeof(irsdk_varHeader);

		// pointer to session info string
		diskHeader.sessionInfoOffset = offset;
		offset += diskHeader.sessionInfoLen;

		// pointer to start of buffered data
		diskHeader.numBuf = 1;
		diskHeader.varBuf[0].bufOffset = offset;

		fwrite(&diskHeader, 1, sizeof(diskHeader), file);
		fwrite(&diskSubHeader, 1, sizeof(diskSubHeader), file);
		fwrite(&localVarHeader, 1, diskHeader.numVars * sizeof(irsdk_varHeader), file);
		fwrite(sessionStr, 1, diskHeader.sessionInfoLen, file);

		if(ftell(file) != diskHeader.varBuf[0].bufOffset)
			printf("ERROR: file pointer mismach: %d != %d\n", ftell(file), diskHeader.varBuf[0].bufOffset);
	}
}
void irsdkDiskServer::logHeaderToCSV()
{
	if(file)
		fclose(file);

	char path[MAX_PATH];
	initPathStr(path, MAX_PATH);

	t_time = time(NULL);

	file = openUniqueFile(path, "csv", t_time, false);

	if(file)
	{
		// remove trailing ... from string
		char *pStr = strstr(sessionStr, "...");
		if(pStr)
			*pStr = '\0';

		// and write the whole thing out
		fputs(sessionStr, file);

		// reserve space for entrys that will be filled in later
		fprintf(file, "SessionLogInfo:\n");

		// get file open time as a string
		char tstr[512];
		tm tm_time;
		localtime_s(&tm_time, &t_time);
		strftime(tstr, 512, " %Y-%m-%d %H:%M:%S", &tm_time);
		tstr[512-1] = '\0';
		fprintf(file, " SessionStartDate: %s\n", tstr);

		fprintf(file, " SessionStartTime: ");
		startTimeOffset = fileReserveSpace(file);
		startTime = -1.0;

		fprintf(file, " SessionEndTime: ");
		endTimeOffset = fileReserveSpace(file);
		endTime = -1.0;

		fprintf(file, " SessionLapCount: ");
		lapCountOffset = fileReserveSpace(file);
		lapCount = 0;
		lastLap = -1;

		fprintf(file, " SessionRecordCount: ");
		recordCountOffset = fileReserveSpace(file);
		recordCount = 0;

		fprintf(file, "...\n");

		// dump the var names
		for(int i=0; i<localHeader.numVars; i++)
		{
			const irsdk_varHeader *rec = &localVarHeader[i];

			if(rec->type != irsdk_char && rec->count > 1)
			{
				for(int j=0; j<rec->count; j++)
					fprintf(file, "%s_%d, ", rec->name, j+1);
			}
			else
				fprintf(file, "%s, ", rec->name);
		}
		fprintf(file, "\n");

		// dump the var descriptions
		for(int i=0; i<localHeader.numVars; i++)
		{
			const irsdk_varHeader *rec = &localVarHeader[i];

			int count = (rec->type != irsdk_char && rec->count > 1) ? rec->count : 1;
			for(int j=0; j<count; j++)
				fprintf(file, "%s, ", rec->desc);
		}
		fprintf(file, "\n");

		// dump the var units
		for(int i=0; i<localHeader.numVars; i++)
		{
			const irsdk_varHeader *rec = &localVarHeader[i];

			int count = (rec->type != irsdk_char && rec->count > 1) ? rec->count : 1;
			for(int j=0; j<count; j++)
				fprintf(file, "%s, ", rec->unit);
		}
		fprintf(file, "\n");

		// dump the var data type
		for(int i=0; i<localHeader.numVars; i++)
		{
			const irsdk_varHeader *rec = &localVarHeader[i];

			int count = (rec->type != irsdk_char && rec->count > 1) ? rec->count : 1;
			for(int j=0; j<count; j++)
			{
				switch(rec->type)
				{
				case irsdk_char:
					fprintf(file, "string, ");
					break;
				case irsdk_bool:
					fprintf(file, "boolean, ");
					break;
				case irsdk_int:
					fprintf(file, "integer, ");
					break;
				case irsdk_bitField:
					fprintf(file, "bitfield, ");
					break;
				case irsdk_float:
					fprintf(file, "float, ");
					break;
				case irsdk_double:
					fprintf(file, "double, ");
					break;
				default:
					fprintf(file, "unknown, ");
					break;
				}
			}
		}
		fprintf(file, "\n");
	}
}