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

📄 cli_log.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************************************************************
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 + -