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

📄 cli_debug.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 4 页
字号:
/************************************************************************
Copyright 200X - 200X+1.

filename     : CLI_Debug.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_User.inc"
#include "Cli_Log.inc"
#include "..\include\Cli_io.h"
#include "Cli_intp.inc"
#include "Cli_cmd.inc"
#include "Board_Pub.h"
#include "Config\Cli_ConfigGlbVar.h"

/*※※※※※※※※※※※※※※*/
/* 命令行的测试代码           */
/*※※※※※※※※※※※※※※*/

/*----------------命令注册桩函数-------------------*/
/*=================================================*/
_U32 CLI_CmdTest1(_U32 ulTermID)
{
    (_VOID)ulTermID;
    return G_SUCCESS;
}


/*┏━━━━━━━━━━命令行的测试处理汇集函数━━━━━━━━━┓*/
/*┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛*/
_U32 CLI_CmdTestProc(ST_DBG_MSG* pDbgMsg)
{
    _U32 ulRet = G_FAILURE;
    _S8 *pParam;

    if (pDbgMsg == G_NULL)
    {
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR,"\r\n  CLI: Test message pointer null!");
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    switch (pDbgMsg->ulCmd)
    {
        case EN_CLI_TEST_HELP:
            DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                     "\r\n 命令行模块调试命令列表"
                 "\r\n\r\n 命令字    命令内容"
                     "\r\n -----------------------------------------------"
                     "\r\n 0x00:     查询本模块调试命令的帮助信息"
                     "\r\n 0x01:     查询本模块调试打印通道信息"
                     "\r\n 0x10      TELNET调试命令"
                 "\r\n\r\n 0x21      测试命令: 命令注册测试"
                     "\r\n 0x22      测试命令: 命令解释测试"
                     "\r\n 0x23      测试命令: 标准输入输出接口测试"
                     "\r\n 0x24      测试命令: 直接输出测试"
                     "\r\n 0x25      测试命令: 操作用户测试"
                     "\r\n 0x26      测试命令: 日志测试"
                     "\r\n 0x27      测试命令: 终端管理测试"
                     "\r\n 0x28      测试命令: 命令行库函数测试(暂无)"
                     "\r\n 0x29      测试命令: 分布式命令管理测试"
                 "\r\n\r\n 命令字后所有参数填零显示该命令的参数帮助信息");
            return G_SUCCESS;

#if ( CLI_TELNET_SUPPORT == G_YES )
        case EN_CLI_TELNET_DIAG:
            if( G_NULL != g_pfn_CFG_CLI_CmdTelnetDiag )
            {
                ulRet = g_pfn_CFG_CLI_CmdTelnetDiag(pDbgMsg->ulPara1, pDbgMsg->ulPara2,
                                                    pDbgMsg->ulPara3, pDbgMsg->ulPara4);
            }
            else
            {
                DBG_Out(PID_CLI, CLI_DBGOUT_MUST, "\r\n CLI: Telnet is not include !");
                return G_SUCCESS;
            }
            break;
#endif

        case EN_CLI_TEST_CMDREG:
            ulRet = CLI_CmdTestReg(pDbgMsg->ulPara1, pDbgMsg->ulPara2,
                                  pDbgMsg->ulPara3, pDbgMsg->ulPara4);
            break;
        case EN_CLI_TEST_INPT:
            ulRet = CLI_CmdTestIntp(pDbgMsg->ulPara1, pDbgMsg->ulPara2,
                                  pDbgMsg->ulPara3, pDbgMsg->ulPara4);
            break;
        case EN_CLI_TEST_SIO:
            ulRet = CLI_CmdTestStandardIO(pDbgMsg->ulPara1, pDbgMsg->ulPara2,
                                  pDbgMsg->ulPara3, pDbgMsg->ulPara4);
            break;

        case EN_CLI_TEST_DIO:
            ulRet = CLI_CmdTestDirectIO(pDbgMsg->ulPara1, pDbgMsg->ulPara2,
                                  pDbgMsg->ulPara3, pDbgMsg->ulPara4);
            break;

        case EN_CLI_TEST_USER:
            break;

        case EN_CLI_TEST_LOG:
            ulRet = CLI_CmdTestLog(pDbgMsg->ulPara1, pDbgMsg->ulPara2,
                                  pDbgMsg->ulPara3, pDbgMsg->ulPara4);
            break;

        case EN_CLI_TEST_TERM:
            ulRet = CLI_CmdTestTerm(pDbgMsg->ulPara1, pDbgMsg->ulPara2,
                                  pDbgMsg->ulPara3, pDbgMsg->ulPara4);
            break;

        case EN_CLI_TEST_LIBFUN:
            break;

        case EN_CLI_TEST_DISTTR:
            ulRet = CLI_CmdTestDisttr(pDbgMsg->ulPara1, pDbgMsg->ulPara2,
                                  pDbgMsg->ulPara3, pDbgMsg->ulPara4);
            break;

        case EN_CLI_TEST_GETMODEP:
            pParam = CI_GetModeParameter(pDbgMsg->ulPara1, pDbgMsg->ulPara2, pDbgMsg->ulPara3);
            if (pParam == G_NULL)
            {

                DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                    "\r\n CLI: Get mode parameter failed!"
                    "\r\n CLI: Test function returned failure!");
                return G_FAILURE;
            }
            DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n CLI: Get mode parameter:%s!", pParam);

            return G_SUCCESS;

        default:
            DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n CLI: Error test command!");
            break;
    }
    if (ulRet != G_SUCCESS)
    {
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n CLI: Test function returned failure!");
    }
    return ulRet;
}


/*--------------------命令行的注册测试处理函数-----------------------*/
/*===================================================================*/
/*       CmdWord = 1               */
/* 说明: Param1: 1、错误语法       */
/*               2、无帮助信息     */
/*               3、注册参数有误   */
/*               4、正确的注册     */
/*               5、否定形式的注册 */
#define CLI_LONG_CMDWORD "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
_U32 CLI_CmdTestReg(_U32 Param1, _U32 Param2, _U32 Param3, _U32 Param4)
{
    const _S8 *szRegCmdErr[13] = {
                         /*1 对象过多*/
                         "cli-test put many object",
                         /*2 对象超长*/
                         "cli-test "CLI_LONG_CMDWORD CLI_LONG_CMDWORD,
                         /*3 参数超长*/
                         "cli-test long-param:"CLI_LONG_CMDWORD CLI_LONG_CMDWORD,
                         /*4 非法字符 */
                         "cli-test invalide: jkl*f%",
                         /*5 无分隔符*/
                         "cli-test irreg1 <name(s16)>",
                         /*6 多分隔符*/
                         "cli-test irret2:irreg:<name(s16)>",
                         /*7 错误组合*/
                         "cli-test irreg3: {param1}|{[param2]}",
                         /*8 有分隔符无参数*/
                         "cli-test irreg5:",
                         /*9 空格使用错误*/
                         "cli-test irreg6: {mt1} |{mt2}",
                         /*10 空格使用错误*/
                         "cli-test irret7:<name(s 16)>",
                         /*11 缺省值位置错误*/
                         "cli-test irret9:<name(s16)>/up",
                         /*12 不应该出现的符号*/
                         "cli-test irreg10:name~1",
                         /*13 无属性的参数值注册*/
                         "cli-test irreg11:<name>"
                         };

    const _S8 *szRegCmdCrt[5] = {
                         /*1 简单命令 */
                         "cli-test single",
                         /*2 互斥与字符型测试 */
                         "cli-test mutex: {aaa}|{bbb <ccc(s16)>}",
                         /*3 可选与整型测试 */
                         "cli-test optional: aaa [-t <time(u10~50)>]",
                         /*4 缺省与ip型测试 */
                         "cli-test default: ip <ip-add(p)/10.10.1.1>",
                         /*5 时间与日期性测试 */
                         "cli-test date-time: <date(d)> <time(t)>"
                         };

    const _S8 *szRegCmdEx[3] = {
                         /*1 极限参数 */
                         "cli-test mul-param: a b c d e f g h I j k l m n o p"
                         "q r s t u v w x y z a b c d e f g h I j k l m",
                         /*2 极限命令字长度*/
                         "cli-test kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
                         "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
                         /*3 多项互斥 */
                         "cli-test mul-mutex: {a}|{b}|{c}|{d}|{e}|{f}|{g}|{h}|{i}|{j}"
                         };

    _S8 *szCmd;
    _U8  ucMode = CTM_DIAG;
    CLI_OPERAT_LEVEL_T   ucLevel = CT_AL_QUERY;
    CLI_CALLBACK_EXEC_FUN pFunc = CLI_CmdTest1;
    _U8  ucModeChange = CT_MC_NULL;
    _U8  ucNewMode = NULL_MODE;
    _U32 ulHelp1 = CLI_LOGOUT_CONFIRM;
    _U32 ulHelp2 = CLI_LOGOUT_CONFIRM;
    _U32 ulHelp3 = CLI_LOGOUT_CONFIRM;
    _S8 szCmdFmt[50];
    (_VOID)Param4;

    szCmd = szCmdFmt;

    if (Param1 ==0 && Param2 == 0 && Param3 == 0 && Param4 == 0)
    {
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                "\r\n param1 -- 测试语法类型: 1. 错误语法"
                "\r\n                         2. 无帮助信息"
                "\r\n                         3. 注册参数有误"
                "\r\n                         4. 正确的注册"
                "\r\n                         5. 否定形式的注册"
                    );
        return G_SUCCESS;
    }

    switch (Param1)
    {
        /* 不规范的语法的13中情况测试 */
        case 1:
            if (Param2 > 13)
            {
                DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                    "\r\n CLI: Test cmdreg param error:%d, %d, %d", Param1, Param2, Param3);
                return G_FAILURE;
            }
            szCmd = (_S8 *)szRegCmdErr[Param2 - 1];
            break;

        /* 无帮助信息的3种情况测试 */
        case 2:
            ulHelp1 = CLI_ML_NULL;
            ulHelp1 = CLI_ML_NULL;
            switch (Param2)
            {
                case 1:
                    ucMode = CTM_CONFIG;
                    EOS_StrCpy(szCmdFmt, "cli-test no-help1");
                    break;
                case 2:
                    EOS_StrCpy(szCmdFmt, "cli-test no-help2");
                    break;
                case 3:
                    ucMode = CTM_GENL;
                    EOS_StrCpy(szCmdFmt, "no cls");
                    break;
                default:
                    DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                        "\r\n CLI: Test cmdreg param error:%d, %d, %d", Param1, Param2, Param3);
                    return G_FAILURE;
            }
            break;

        /*注册参数有误的4中情况测试*/
        case 3:
            switch (Param2)
            {
                /* 没有执行动作 */
                case 1:
                    EOS_StrCpy(szCmdFmt, "cli-test no-action");
                    pFunc = G_NULL;
                    break;
                /* 注册等级超出范围 */
                case 2:
                    EOS_StrCpy (szCmdFmt, "cli-test over-level");
                    ucLevel = (CLI_OPERAT_LEVEL_T)(CT_AL_DEBUG + 5);
                    break;

                /* 注册模式超出范围 */
                case 3:
                    EOS_StrCpy (szCmdFmt, "cli-test over-mode");
                    ucMode = MAX_MODE_NUM + 4;
                    break;

                /* 注册转换到新模式而无模式信息 */
                case 4:
                    ucModeChange = CT_MC_NEW;
                    EOS_StrCpy(szCmdFmt, "cli-test cm-null");
                    break;

                default:
                    DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                        "\r\n CLI: Test cmdreg param error:%d, %d, %d", Param1, Param2, Param3);
                    return G_FAILURE;

            }
            break;

        /*正确注册的5中情况测试*/
        case 4:
            if (Param2 > 5)
            {
                DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                    "\r\n CLI: Test cmdreg param error:%d, %d, %d", Param1, Param2, Param3);
                return G_FAILURE;
            }

            szCmd = (_S8 *)szRegCmdCrt[Param2 - 1];
            break;

        /* 没有注册肯定语句的否定注册*/
        case 5:
            EOS_StrCpy(szCmdFmt, "no abcde");
            break;
        case 6:
            return CT_CmdAutoRegistWithLocfun
                  ("Cli disttribute: <type(normal|no-feedback|long-resp)>",
                   CTM_DIAG, CT_AL_SUPER, CLI_MsTestGet, CLI_MsTestExec, CT_MC_NULL,
                   NULL_MODE, CLI_ML_NULL, CLI_ML_NULL, CLI_ML_NULL);
        case 7:
            if (Param2 > 3 || Param2 == 0)
            {
                DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                    "\r\n CLI: Test cmdreg param error:%d, %d, %d", Param1, Param2, Param3);
                return G_FAILURE;
            }
            szCmd = (_S8 *)szRegCmdEx[Param2 - 1];
            break;

        default:
            return G_FAILURE;
    }

    if (G_SUCCESS != CT_CmdAutoRegist(szCmd,
                                      ucMode,
                                      ucLevel,
                                      pFunc,
                                      ucModeChange,
                                      ucNewMode,
                                      ulHelp1,
                                      ulHelp2,
                                      ulHelp3))
    {
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
            "\r\n CLI: Test cmdreg FAILURE:%d, %d, %d", Param1, Param2, Param3);
    }
    else
    {
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
            "\r\n CLI: Test cmdreg SUCCESS:%d, %d, %d", Param1, Param2, Param3);
    }

    DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
            "\r\n The command to regist is : \r\n %s", szCmd);
    return G_SUCCESS;
}

/*--------------------命令行的参数获取测试函数-----------------------*/
/*===================================================================*/
/*       CmdWord = 2                       */
/* 说明: Param1: 1、一般参数获取           */

⌨️ 快捷键说明

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