📄 lpt.c
字号:
/*
创建:李勇 2003-05-16
修改:
对打印进行控制,分任务、分级别。可以任意控制某一任务的某一级别是否能够打印。
*/
#include "vxworks.h"
#include "time.h"
#include "stdio.h"
#include "stdarg.h"
#include "include/sysdef.h"
#include "maintain/message.h"
#include "maintain/lpt.h"
UINT8 ptDataBuf[1024];
UINT8 printData[256 + 1], logData[256 + 1];//256,TASK_NUM系统支持的最大任务数
void switch2Virtual(PRINT_MSG *pMsg);
void initPrintData(void)
{
UINT16 i;
for (i = 0; i < TASK_NUM; i++)
{
printData[i] = 0x70; /* 初始化为打印 PT_WARN、PT_ERROR、PT_FATAL 级别 */
logData[i] = 0x70;
}
for(i=0; i<TASK_MAX; i++)
{
traceFlag[i] = FALSE;
}
strcpy(traceNumber, "notrace");
}
/*
!!!注意,在getTaskNo函数中不能使用lpt打印,否则会造成函数调用上的递归死锁。
因为在lpt宏中使用到的getTaskNo函数。
*/
UINT8 getTaskNo()
{
int tid;
tid = taskIdSelf();
if (tid == tidRoot)
{
return TASK_ROOT;
}
if (tid == tidH323)
{
return TASK_H323;
}
if (tid == tidH323User)
{
return TASK_H323USER;
}
if (tid == tidRas)
{
return TASK_RAS;
}
if (tid == tidGkManager)
{
return TASK_GK_MANAGER;
}
if (tid == tidManager)
{
return TASK_MANAGER;
}
if (tid == tidTimer)
{
return TASK_TIMER;
}
if(tid == tidPortScan)
{
return TASK_PORT_SCAN;
}
if(tid == tidUser)
{
return TASK_USER;
}
if (tid == tidQ931User)
{
return TASK_Q931User;
}
if (tid == tidISDN)
{
return TASK_ISDN;
}
if(tid == tidAgent)
{
return TASK_AGENT;
}
if(tid == tidHttpSock)
{
return TASK_HTTP;
}
if (tid == tidWatchDog)
{
return TASK_WD;
}
if(tid == tidSNMP)
{
return TASK_SNMP;
}
if(tid == tidSnmpd)
{
return TASK_TSNMPD;
}
if(tid == tidNo1User)
{
return TASK_No1User;
}
if (tid == tidRasUser)
{
return TASK_RASUSER;
}
if(tid == tidConf)
{
return TASK_CONF;
}
if(tid == tidDeviceScan)
{
return TASK_DEV;
}
if(tid == tidAppScan)
{
return TASK_APP;
}
if(tid==tidDtmfUser)
{
return TASK_DtmfUser;
}
if(tid==tidBill)
{
return TASK_bILL;
}
if(tid==tidClock)
{
return TASK_CLOCK;
}
if (tid == tidVoipProxy)
{
return TASK_VOIP_PROXY;
}
// 更新一下SHELL ID,因为在NIP平台下SHELL ID会发生变化
tidShell = taskNameToId("tShell");
if(tid == tidShell)
{
return TASK_SHELL;
}
if(tid == tidKedaH323)
{
return TASK_KEDAH323;
}
if(tid == tidMgcRcv)
{
return TASK_MGCRECV;
}
/*
if(tid == tidStunServer)
{
return TASK_STUN_SERVER;
}*/
printf("in getTaskNo( ), can not get taskNo from tid 0x%x\n", tid);
return 0xff; /* 0xff 表示找不到taskNo */
}
extern void getClock(CLOCK * clock);
extern STATUS rm(char *fileName);
void taskPrint(void)
{
PRINT_MSG ptMsg;
CLOCK clock;
UINT8 levelString[20], taskNo;
FILE * logFile;
UINT32 fileLen;
taskDelay(300); /* 3秒后,可以保证已从网守得取了时间 */
if ((logFile = fopen (LOG_FILE_NAME, "a"))== NULL)
{
printf( "can not open LOG_FILE_NAME when system start\n");
return ;
}
getClock(&clock);
fprintf(logFile, "\n\n\n\n ***************** SYS START at %d-%d-%d %d:%d:%d ***************** \n\n",
clock.year,clock.month, clock.date,clock.hour, clock.minute, clock.second);
fclose(logFile);
for (;;)
{
if (msgQReceive (qidPrint, (char *)&ptMsg, sizeof(ptMsg), WAIT_FOREVER) == ERROR)
{
perror(" in taskPrint receive qidPrint msg failure\n");
continue;
}
taskNo = ptMsg.taskNo;
if (taskNo >= TASK_MAX)
{
continue;
}
/* 取得打印级别字符 */
switch(ptMsg.printLevel)
{
case PT_FATAL:
strcpy(levelString, "FATAL: ");
break;
case PT_ERROR:
strcpy(levelString, "ERROR: ");
break;
case PT_WARN:
strcpy(levelString, "WARN: ");
break;
case PT_INFO:
strcpy(levelString, "INFO: ");
break;
case PT_IMPORT:
strcpy(levelString, "IMPORT: ");
break;
case PT_NORMAL:
strcpy(levelString, "NORMAL: ");
break;
case PT_DEBUG:
strcpy(levelString, "DEBUG: ");
break;
case PT_SIGNAL:
strcpy(levelString, "SIGNAL: ");
break;
default:
strcpy(levelString, "UNKNOW_LV:");
break;
}
/* 打印文件名, 行号和内容 */
//yht mod 2004-7-30
if ((printData[taskNo] & (ptMsg.printLevel)) != 0)
{
if(ptMsg.printLevel==PT_SIGNAL)
{
//printf("\n----------------------SIGNAL for %s----------------\n",ptMsg.fileName);
printf("%s",ptMsg.printData);
}
else
{
printf("%-7s %-10s %-5d %s", levelString, ptMsg.fileName, ptMsg.lineNo, ptMsg.printData);
}
}
/* 如果打印级别为FATAL、ERROR、WARN、RARE,则要将打印内容输入日志 */
if ((logData[taskNo] & (ptMsg.printLevel)) != 0)
{
getClock(&clock);
logFile = fopen(LOG_FILE_NAME , "a");
if(logFile == NULL)
{
printf( "can not open LOG_FILE_NAME \n");
continue;
}
fileLen = getFileLen(logFile);
if(fileLen >= LOG_FILE_LEN)
{
fclose(logFile);
rm(LOG_FILE_NAME); /* 将原有日志文件删除 */
if ((logFile = fopen (LOG_FILE_NAME, "a"))== NULL)
{
printf("can not create new LOG_FILE_NAME \n");
continue ;
}
else
{
fprintf(logFile, "\n*** create new log file at %d-%d-%d %d:%d:%d ***\n",
clock.year,clock.month, clock.date,clock.hour, clock.minute, clock.second);
}
}
fseek(logFile, 0, SEEK_END);
fprintf(logFile, " %d-%d-%d %d:%d:%d ", clock.year,clock.month, clock.date,
clock.hour, clock.minute, clock.second);
fprintf(logFile, "%s %s %d %s", levelString, ptMsg.fileName, ptMsg.lineNo, ptMsg.printData);
fclose(logFile);
}
#if 0 //cf mod 2004-8-16所有的pt_signal打印都不写到文件里了
/* 如果打印级别为SIGNAL,则要将打印内容输入跟踪信令文件 */
if(ptMsg.printLevel == PT_SIGNAL)
{
getClock(&clock);
traceFile = fopen(TRACE_FILE_NAME , "a");
if(traceFile == NULL)
{
printf( "can not open TRACE_FILE_NAME \n");
continue;
}
fileLen = getFileLen(traceFile);
if(fileLen >= LOG_FILE_LEN)//为2M
{
fclose(traceFile);
rm(TRACE_FILE_NAME); /* 将原有日志文件删除 */
if ((traceFile = fopen (TRACE_FILE_NAME, "a"))== NULL)
{
printf("can not create new TRACE_FILE_NAME \n");
continue ;
}
else
{
fprintf(traceFile, "\n*** create new trace file at %d-%d-%d %d:%d:%d ***\n",
clock.year,clock.month, clock.date,clock.hour, clock.minute, clock.second);
}
}
fseek(traceFile, 0, SEEK_END);
fprintf(traceFile, " %d-%d-%d %d:%d:%d ", clock.year,clock.month, clock.date,
clock.hour, clock.minute, clock.second);
fprintf(traceFile, "%s %s %d %s", levelString, ptMsg.fileName, ptMsg.lineNo, ptMsg.printData);
fclose(traceFile);
}
#endif
}
}
BOOL requirePrintOrLog(UINT8 lv)
{
UINT8 taskNo;
taskNo = getTaskNo();
if (taskNo >= TASK_MAX)
{
return FALSE;
}
if(traceFlag[taskNo] == TRUE)
{
return TRUE;
}
if ((printData[taskNo] & lv) != 0)
{
return TRUE;
}
if ((logData[taskNo] & lv) != 0 )
{
return TRUE;
}
if(lv==PT_SIGNAL)//PT_SIGNAL
{
return TRUE;
}
return FALSE;
}
void printAndLog(UINT8 lv, char * file, UINT32 line, char * data)
{
PRINT_MSG msg;
UINT8 taskNo, findFlag;
UINT16 fileNameLen, i;
char * p;
if (file == NULL)
{
return;
}
fileNameLen = strlen(file);
if (fileNameLen == 0)
{
return;
}
p = file + fileNameLen -1;
findFlag = FALSE;
for (i = 0; i < fileNameLen; i++)
{
if ((*p) == '/')
{
findFlag = TRUE;
break;
}
p--;
}
if (findFlag)
{
p++;
}
else
{
p = file + PATH_LEN;
}
taskNo = getTaskNo();
msg.printLevel = lv;
strncpy(msg.fileName, p, MAX_FILE_NAME_LEN);
msg.fileName[MAX_FILE_NAME_LEN -1] = 0;
msg.lineNo = line;
strncpy(msg.printData, data, MAX_PRINT_DATA_LEN);
msg.printData[MAX_PRINT_DATA_LEN -1] = 0;
msg.taskNo = taskNo;
msg.trace = traceFlag[taskNo];
//yht 2004-8-5
switch2Virtual(&msg);
msgQSend(qidPrint, (char *)&msg, sizeof(msg), NULL, MSG_PRI_NORMAL);
}
void ptFormat(const char *fmt, ...)
{
UINT16 length;
va_list v;
/* Format the given line with the arguments */
va_start(v, fmt);
length = vsprintf(ptDataBuf, fmt, v);
ptDataBuf[length] = 0;
va_end(v);
}
UINT32 getFileLen(FILE * p_file)
{
UINT32 fileLen;
UINT32 current;
if (p_file == NULL)
{
printf("input p_file is NULL\n");
return 0;
}
current = ftell(p_file);
fseek(p_file, 0, SEEK_END);
fileLen = ftell( p_file);
fseek(p_file, current, SEEK_SET);//cf :add
return fileLen;
}
//yht add
void switch2Virtual(PRINT_MSG *pMsg)
{
UINT8 taskNo;
UINT8 *temp=NULL;
taskNo=pMsg->taskNo;
if(taskNo!=TASK_DEV)
{
return;
}
strncpy(temp,pMsg->printData,4);
temp[4]=0;
if(!strcmp(temp,"PORT"))
{
taskNo=TASK_PORT_SCAN;
}
//其他的任务
pMsg->taskNo=taskNo;
pMsg->trace=traceFlag[taskNo];
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -