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

📄 lpt.c

📁 构建一个嵌入式系统时
💻 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 + -