📄 cli_log.c
字号:
/************************************************************************
Copyright 200X - 200X+1.
filename : CLI_Log.c
description : 本文件实现命令行的日志管理功能。提供日志的记录、保存与查询
author : Woodhead
modification : Woodhead create 2004-12-07
************************************************************************/
#include "Ros.h"
#include "ML.h"
#include "Sys_Ml.h"
#include "Cli_MlPriv.h"
#include "Cli_Private.inc"
#include "Cli_intp.inc"
#include "Cli_User.inc"
#include "Cli_Log.inc"
#include "..\include\Cli_Io.h"
#include "Config\Cli_ConfigGlbVar.h"
extern _U32 m_ulLogTag;
/* 日志表的控制头 */
ST_LOG_TBL_CTRL *m_pstLogTblCtrl = G_NULL;
/* 日志表 */
#if !LOG_SAVE_FLASH
P_ST_LOG_ITEM m_astLogTable = G_NULL;
#else
P_ST_LOG_ITEM m_pstLogCur = G_NULL;
#endif
/* 根据用户权限记录的日志索引映射表的控制结构 */
ST_LOG_INDEX_MAP_CTRL m_astLogIndexMapCtrl[CT_AL_NULL];
/* 根据用户权限记录的日志索引映射表 */
_U16 *m_ausLogMapIndexTable[CT_AL_NULL] =
{
G_NULL,
G_NULL,
G_NULL,
G_NULL,
G_NULL,
};
/* 映射表重新设置的最小用户权限 */
_U32 m_ulLogMapResetMinLevel = CT_AL_QUERY;
#if !LOG_SAVE_FLASH
/*==============================================================*/
/* 函数名 :CLI_LogInit */
/* 函数功能 :日志初始化 */
/*==============================================================*/
_U32 CLI_LogInit(_VOID)
{
_U32 ulRet;
_U32 ulUserLevel;
_U32 ulAllocSize;
_U8 *pucMem;
DBG_ASSERT( 0 != LOG_MAX_NUM );
/* 从静态内存申请索引映射表的内存 */
ulAllocSize = sizeof(_U16) * LOG_MAX_NUM * CT_AL_NULL;
pucMem = ROS_MemStaticAlloc( ulAllocSize );
if( G_NULL == pucMem )
{
MT_ERRLOG(ulAllocSize);
return G_FAILURE;
}
else
{
/* 索引映射表先全部清为非法值 */
EOS_MemSet( pucMem, G_NULL_BYTE, ulAllocSize );
}
for( ulUserLevel = 0; ulUserLevel < CT_AL_NULL; ulUserLevel ++ )
{
m_ausLogMapIndexTable[ulUserLevel] = (_U16 *)( pucMem + ulUserLevel * sizeof(_U16) * LOG_MAX_NUM );
}
/* 索引映射表控制结构初始化 */
EOS_MemZero( m_astLogIndexMapCtrl, CT_AL_NULL * sizeof(ST_LOG_INDEX_MAP_CTRL) );
/* 从顶部内存申请日志表的内存 */
ulAllocSize = sizeof(ST_LOG_TBL_CTRL);
m_pstLogTblCtrl = (ST_LOG_TBL_CTRL *)ROS_MemTopAlloc( ulAllocSize, 4 );
if( G_NULL == m_pstLogTblCtrl )
{
MT_ERRLOG(ulAllocSize);
return G_FAILURE;
}
/* 从顶部内存申请日志表的内存 */
ulAllocSize = sizeof(ST_LOG_ITEM) * LOG_MAX_NUM;
m_astLogTable = (P_ST_LOG_ITEM)ROS_MemTopAlloc( ulAllocSize, 4 );
if( G_NULL == m_astLogTable )
{
MT_ERRLOG(ulAllocSize);
return G_FAILURE;
}
/* 如果日志表的全面检查不通过, 则是第一次初始化;
否则, 表示上次复位前的日志信息有效 */
ulRet = CLI_LogTableCheck();
if ( G_SUCCESS != ulRet )
{
ulRet = CLI_LogTableInit();
if( G_SUCCESS != ulRet )
{
MT_ERRLOG(0);
return G_FAILURE;
}
}
/* 需要重新设置索引映射表 */
m_ulLogMapResetMinLevel = CT_AL_QUERY;
return G_SUCCESS;
}
/*==============================================================*/
/* 函数名 :CLI_LogTableInit */
/* 函数功能 :日志表初始化 */
/*==============================================================*/
_U32 CLI_LogTableInit(_VOID)
{
_U32 ulRet;
_U16 usIndex;
/* 日志表的记录的初始化 */
EOS_MemZero( (_VOID *)m_astLogTable, ( sizeof(ST_LOG_ITEM) * LOG_MAX_NUM ) );
for (usIndex = 0; usIndex < LOG_MAX_NUM; usIndex ++)
{
m_astLogTable[usIndex].ulLevel = CT_AL_NULL;
m_astLogTable[usIndex].ulLogMode = LOG_MODE_BUTT;
}
/* 日志表的控制头初始化 */
m_pstLogTblCtrl->ulMagic = LOG_SAVE_MAGIC;
m_pstLogTblCtrl->usLogMaxNum = (_U16)LOG_MAX_NUM;
m_pstLogTblCtrl->usLogCount = 0;
m_pstLogTblCtrl->usLogHead = 0;
m_pstLogTblCtrl->usLogTail = 0;
m_pstLogTblCtrl->usCtrlCrc = EOS_CrcMakeCheckSum((_U8*)m_pstLogTblCtrl + sizeof(_U16), sizeof(ST_LOG_TBL_CTRL) - sizeof(_U16));
/* DEBUG版本, 做一次全面的校验 */
#if ( VERSION_TYPE == VERSION_DEBUG )
{
ulRet = CLI_LogTableCheck();
if( G_SUCCESS != ulRet )
{
MT_ERRLOG(0);
return G_FAILURE;
}
}
#endif
/* 需要重新设置索引映射表 */
m_ulLogMapResetMinLevel = CT_AL_QUERY;
return G_SUCCESS;
}
/*********************************************************************/
/* 函数名称 : CLI_LogItemCheck() */
/* 函数功能 : 检查一条日志表项的合法性 */
/* 输入参数 : pstLogItem 指定的日志 */
/* 输出参数 : 无 */
/* 返回 : 成功、失败 */
/*********************************************************************/
_U32 CLI_LogItemCheck(P_ST_LOG_ITEM pstLogItem)
{
_U16 usLogCrc;
if (pstLogItem == G_NULL)
{
MT_ERRLOG(0);
return G_FAILURE;
}
if (pstLogItem->szCommand[0] == '\0'
|| pstLogItem->szUserName[0] == '\0'
|| pstLogItem->ulLevel >= CT_AL_NULL
|| pstLogItem->ulLogMode >= LOG_MODE_BUTT)
{
if( ROS_IsAllRegProcInitOK() == G_TRUE )
{
MT_ERRLOG((_U32)(pstLogItem - m_astLogTable));
}
return G_FAILURE;
}
usLogCrc = EOS_CrcMakeCheckSum((_U8*)pstLogItem + sizeof(_U16), sizeof(ST_LOG_ITEM) - sizeof(_U16));
if (usLogCrc != pstLogItem->usLogCrc)
{
if( ROS_IsAllRegProcInitOK() == G_TRUE )
{
DBG_ErrLog(0, (EN_ERR_LEVLE)2, (_U32)(pstLogItem - m_astLogTable), usLogCrc);
}
return G_FAILURE;
}
return G_SUCCESS;
}
/*********************************************************************/
/* 函数名称 : CLI_LogTableCtlrCheck() */
/* 函数功能 : 检查日志表的控制头的合法性. */
/* 输入参数 : 无. */
/* 输出参数 : 无. */
/* 返回 : 成功、失败 */
/*********************************************************************/
_U32 CLI_LogTableCtlrCheck( _VOID )
{
_U16 usCrc;
DBG_ASSERT( G_NULL != m_pstLogTblCtrl );
DBG_ASSERT( G_NULL != m_astLogTable );
if( m_pstLogTblCtrl->ulMagic != LOG_SAVE_MAGIC
|| m_pstLogTblCtrl->usLogMaxNum != LOG_MAX_NUM
|| m_pstLogTblCtrl->usLogCount > LOG_MAX_NUM
|| m_pstLogTblCtrl->usLogHead >= LOG_MAX_NUM
|| m_pstLogTblCtrl->usLogTail >= LOG_MAX_NUM
)
{
return G_FAILURE;
}
usCrc = EOS_CrcMakeCheckSum( (_U8*)m_pstLogTblCtrl + sizeof(_U16),
sizeof(ST_LOG_TBL_CTRL) - sizeof(_U16) );
if( usCrc != m_pstLogTblCtrl->usCtrlCrc )
{
return G_FAILURE;
}
return G_SUCCESS;
}
/*********************************************************************/
/* 函数名称 : CLI_LogTableCheck() */
/* 函数功能 : 日志表的全面检查. */
/* 输入参数 : 无. */
/* 输出参数 : 无 */
/* 返回 : 成功、失败 */
/*********************************************************************/
_U32 CLI_LogTableCheck( _VOID )
{
_U16 usIndex;
_U16 usCount = 0;
P_ST_LOG_ITEM psLogItem;
DBG_ASSERT( G_NULL != m_pstLogTblCtrl );
DBG_ASSERT( G_NULL != m_astLogTable );
/* 控制头的检查 */
if( CLI_LogTableCtlrCheck() != G_SUCCESS )
{
return G_FAILURE;
}
/* 日志表为空的情况 */
if( 0 == m_pstLogTblCtrl->usLogCount )
{
if( m_pstLogTblCtrl->usLogHead == m_pstLogTblCtrl->usLogTail )
{
return G_SUCCESS;
}
else
{
DBG_ASSERT(0);
return G_FAILURE;
}
}
/* 日志表不为空的情况 */
usIndex = m_pstLogTblCtrl->usLogHead;
do
{
psLogItem = CLI_GetOneLog( usIndex );
/* 所有记录项的合法性检查 */
if( CLI_LogItemCheck( psLogItem ) != G_SUCCESS )
{
return G_FAILURE;
}
if( ++ usCount > m_pstLogTblCtrl->usLogCount )
{
DBG_ASSERT(0);
return G_FAILURE;
}
usIndex = CLI_INCCYCLE( usIndex, LOG_MAX_NUM );
}while( usIndex != m_pstLogTblCtrl->usLogTail );
if( usCount != m_pstLogTblCtrl->usLogCount )
{
DBG_ASSERT(0);
return G_FAILURE;
}
else
{
return G_SUCCESS;
}
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_LogMapReset();
功能 : 根据日志表, 重新设置索引映射表;
输入参数 : 无.
输出参数 : 无.
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_LogMapReset( _VOID )
{
_U32 i;
_U32 ulUserLevel;
_U16 usLogIndex;
P_ST_LOG_ITEM pstLogItem;
ST_LOG_INDEX_MAP_CTRL *pstMapCtrl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -