⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logunit.cpp

📁 robocup源代码2001年清华机器人源代码
💻 CPP
字号:
/*
    Copyright (C) 2001  Tsinghuaeolus

    Authors : ChenJiang, YaoJinyi, CaiYunpeng, Lishi

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

	If you make any changes or have any comments we would appreciate a 
	message to yjy01@mails.tsinghua.edu.cn.
*/

#include "logunit.h"
#include <string.h>
#include "global.h"

Log::Log(int max){
	LogOn[0] = true;	LogOn[1] = true;	LogOn[2] = true;	LogOn[3] = true;
	LogOn[4] = true;	LogOn[5] = true;	LogOn[6] = true;	LogOn[7] = true;
	LogOn[8] = true;	LogOn[9] = true;	LogOn[10] = true;	LogOn[11] = true;
	LogOn[12] = true;	LogOn[13] = true;	LogOn[14] = true;	LogOn[15] = true;
	LogOn[16] = true;	LogOn[17] = true;	LogOn[18] = true;	LogOn[19] = true;
	LogOn[20] = true;	LogOn[21] = true;	LogOn[22] = true;	LogOn[23] = true;
	LogOn[24] = true;	LogOn[25] = true;	LogOn[26] = true;	LogOn[27] = true;
	LogOn[28] = true;	LogOn[29] = true;	LogOn[30] = true;	LogOn[31] = true;
	for(int i =0; i < 32; i ++){
		LogOn[i] = false;
	}

	LogLocked = false;
	LogCounts = 0;
	for(i =0; i < 32; i++)
		label[i][0] = 0;

	hFile = INVALID_HANDLE_VALUE;
	fp = NULL;
	maxlogcount = max;
	filenameset = false;

	sa.nLength = sizeof(sa);
	sa.bInheritHandle = TRUE;
	sa.lpSecurityDescriptor = NULL;

	logbuffer_len = 0;
}

Log::~Log(){
	if (hFile != INVALID_HANDLE_VALUE)
		CloseHandle(hFile);
	if (fp != NULL){
		if (logbuffer_len > 0){
			fwrite(logbuffer, logbuffer_len, 1, fp);
			logbuffer_len = 0;
		}
		fclose(fp);
	}
}

bool Log::CanLog(int lognum){
	if (lognum < 0 || lognum >31) lognum = 0;
	if (LogOn[lognum] && filenameset && LogCounts<1
		&& situation.CurrentTime >= 0 && !situation.ClockStopped && situation.CurrentTime != 6000){
		LogCounts ++;
		return true;
	}
	else
		return false;
}

void Log::AssociateFile(char *filename){
	if (filename != NULL){
		strcpy(logfilename, filename);
		//hFile = CreateFile(logfilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
		fp = fopen(logfilename, "w");
		filenameset = true;
	}
	else{
		filenameset = false;
	}
}

void Log::SetLogOn(int lognum){
	if (lognum < 0 || lognum >31) lognum = 0;
	LogOn[lognum] = true;
}

void Log::SetLogOff(int lognum){
	if (lognum < 0 || lognum >31) lognum = 0;
	LogOn[lognum] = false;
}

void Log::SetLabel(int lognum, char* caption){
	if (lognum < 0 || lognum >31) lognum = 0;
	strcpy(&label[lognum][0], caption);
}

void Log::LogCore(int lognum, char * log){
	if (lognum < 0 || lognum >31) lognum = 0;

	int writetofile = 0;
	if (/*hFile !=  INVALID_HANDLE_VALUE */ fp != NULL){
		int len_header, len_logstring;

		if (label[lognum][0] != 0)
			len_header = sprintf(&header[0],"(p%d,t%d)[%s]", MyNumber, situation.CurrentTime, label[lognum]);
		else
			len_header = sprintf(&header[0],"(p%d,t%d)", MyNumber, situation.CurrentTime);
		
		len_logstring = strlen(log);

		/*memcpy(logbuffer+logbuffer_len, header, len_header);
		logbuffer_len += len_header;
		memcpy(logbuffer+logbuffer_len, log, len_logstring);
		logbuffer_len += len_logstring;
		*(logbuffer+logbuffer_len) = 10;
		logbuffer_len += 1;*/
		
		if (logbuffer_len + len_header + len_logstring + 1 > 5 * MAXMESG - 100 && logbuffer_len > 0){
			fwrite(logbuffer, logbuffer_len, 1, fp);
			fflush(fp);
			logbuffer_len = 0;
			writetofile = 1;
		}

		memcpy(logbuffer+logbuffer_len, header, len_header);
		logbuffer_len += len_header;
		memcpy(logbuffer+logbuffer_len, log, len_logstring);
		logbuffer_len += len_logstring;
		*(logbuffer+logbuffer_len) = 10;
		logbuffer_len += 1;
	}

	logcount ++;
	if (logcount >= maxlogcount &&   fp != NULL/*hFile != INVALID_HANDLE_VALUE*/) {
		fflush(fp);
		//CloseHandle(hFile);
		//hFile = CreateFile(logfilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		logcount = 0;
	}
	LogCounts --;
	if (writetofile){
		//DoLog(LOG_NONE, "Start Log");
	}
}


void Log::LogAction(int lognum,char * format, ...){
	if (!CanLog(lognum)) return;
	va_list argptr;
	va_start(argptr, format);
	vsprintf(logstring, format, argptr);
	va_end(argptr);
	LogCore(lognum,logstring);
}

void Log::LogAction(char* format, ...){
	if (!CanLog(0)) return;
	va_list argptr;
	va_start(argptr, format);
	vsprintf(logstring, format, argptr);
	va_end(argptr);
	LogCore(0,logstring);
}
/*	Log Data	*/
void LogData::LogCore(int lognum, char * log){
	if (lognum < 0 || lognum >31) lognum = 0;

	if (/*hFile !=  INVALID_HANDLE_VALUE */ fp != NULL){
		int len_logstring;

		len_logstring = strlen(log);
		if (logbuffer_len + len_logstring + 1 > 5 * MAXMESG - 100){
			fwrite(logbuffer, logbuffer_len, 1, fp);
			logbuffer_len = 0;
		}

		memcpy(logbuffer+logbuffer_len, log, len_logstring);
		logbuffer_len += len_logstring;
		*(logbuffer+logbuffer_len) = 10;
		logbuffer_len += 1;
	}

	logcount ++;
	if (logcount >= maxlogcount &&   fp != NULL/*hFile != INVALID_HANDLE_VALUE*/) {
		fclose(fp);
		fp = fopen(logfilename, "a");
		//CloseHandle(hFile);
		//hFile = CreateFile(logfilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		logcount = 0;
	}
	LogCounts --;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -