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

📄 cli_syscmd.c

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

filename     : CLI_Syscmd.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"

extern CT_MODE_T m_sCliSysModes[MAX_MODE_NUM];    /* 命令树 */
extern _U32 m_ulSerialBaudrate;                   /* 串口波特率 */

/*※※※※※※※※※※※※※※*/
/* 命令行的的命令实现函数     */
/*※※※※※※※※※※※※※※*/
/*********************************************************************/
/* 函数功能 : 屏幕清除功能命令实现                                   */
/*********************************************************************/
_U32 CLI_CmdClearScreen(_U32 ulTermID)
{
    PTerm_Data_S lpTermStruc;
    int  iSavePos;
    _U32 ulLine;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if ( (lpTermStruc = CLI_GetCurrentTaskData()) == G_NULL )
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    for (ulLine = 0; ulLine <= LINE_PER_PAGE + 1; ulLine++)
    {
        IO_OutString("\r\n");
        lpTermStruc->ulDispLineCount = 0;
    }

    iSavePos = lpTermStruc->iCurrentPos;
    lpTermStruc->iCurrentPos = 0;
    CLI_MoveToCurrentPos(lpTermStruc, 80*24);
    CLI_SendToTerm(lpTermStruc);
    lpTermStruc->iCurrentPos = iSavePos;
    return G_SUCCESS;

}

_U32 CLI_CmdExit(_U32 ulTermID)
{
    PTerm_Data_S lpTermStruc;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if (IO_GetConfirm(CLI_LOGOUT_CONFIRM, INPUT_NO) != INPUT_YES)
        return CMD_FAILED_SILENT;

    CLI_RecordCurrentCmd();

    if ( (lpTermStruc = CLI_GetCurrentTaskData()) != G_NULL )
    {
        CLI_TermLogout(lpTermStruc);
    }

    return G_SUCCESS;
}

/*********************************************************************/
/* 函数功能 : 设置短超时的命令实现                                   */
/*********************************************************************/
_U32 CLI_CmdSetTimeOutSet(_U32 ulTermID)
{
    PTerm_Data_S pTermStruct ;
    _S8 *pParam;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if ( (pTermStruct = CLI_GetCurrentTaskData()) == G_NULL )
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    if ((pParam = CT_GetParamByName("long|short", ulTermID)) == G_NULL)
        return G_FAILURE;

    if (!EOS_StriCmp(pParam, "long"))
    {
        if (pTermStruct->iSocket == SOCKET_FOR_SERIAL)
        {
            pTermStruct->ucTimeOutFlag = TIMEOUT_OFF;
            pTermStruct->ulTimeLeft    = DEADLINE_LONG;
            IO_Print(CLI_TIMEOUT_LONG);
            return G_SUCCESS;
        }
        else
        {
            IO_Print(CLI_TIMEOUT_TELNET_FAIL);
            return G_SUCCESS;
        }
    }
    else if (!EOS_StriCmp(pParam, "short"))
    {
        pTermStruct->ucTimeOutFlag = TIMEOUT_ON;
        pTermStruct->ulTimeLeft    = DEADLINE_SHORT;
        IO_Print(CLI_TIMEOUT_SHORT);
        return G_SUCCESS;
    }

    return G_FAILURE;
}


/*********************************************************************/
/* 函数功能 : 设置交互允许的命令实现                                 */
/*********************************************************************/
_U32 CLI_CmdSetSmartOn(_U32 ulTermID)
{
    _S8 *pParam;
    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if ((pParam = CT_GetParamByName("on|off", ulTermID)) == G_NULL)
        return G_FAILURE;

    if (!EOS_StriCmp(pParam, "on"))
    {
        /* 透传命令处理任务不支持交互方式的修改 */
        if (m_TDTable[ulTermID - 1].pTermStruct->iSocket == SOCKET_FOR_MML)
            return G_SUCCESS;

        m_TDTable[ulTermID - 1].pTermStruct->pWS->ulSmart = SMART_ON;
        IO_Print(CLI_SMART_ENABLE);
    }
    else
    {
        m_TDTable[ulTermID - 1].pTermStruct->pWS->ulSmart = SMART_OFF;
        IO_Print(CLI_SMART_DISABLE);
    }
    return G_SUCCESS;
}

/*********************************************************************/
/* 函数功能 : 设置交互禁止的命令实现                                 */
/*********************************************************************/
_U32 CLI_CmdSetAlarmPermit(_U32 ulTermID)
{
    _S8 *pParam;
    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if ((pParam = CT_GetParamByName("on|off", ulTermID)) == G_NULL)
        return G_FAILURE;

    if (!EOS_StriCmp(pParam, "on"))
    {
        m_TDTable[ulTermID - 1].pTermStruct->ucAlarmLevel = 1;
    }
    else
    {
        m_TDTable[ulTermID - 1].pTermStruct->ucAlarmLevel = 0;
    }

    return G_SUCCESS;
}

/*********************************************************************/
/* 函数功能 : 设置手动滚屏的命令实现                                 */
/*********************************************************************/
_U32 CLI_CmdSetScroll(_U32 ulTermID)
{
    PTerm_Data_S lpTermStruct;
    _S8 *pParam;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if ( (lpTermStruct = CLI_GetCurrentTaskData()) == G_NULL )
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    /* 透传命令的处理任务不支持滚屏方式的修改 */
    if (lpTermStruct->iSocket == SOCKET_FOR_MML)
        return G_SUCCESS;

    if ((pParam = CT_GetParamByName("automatic|manual", ulTermID)) == G_NULL)
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    if (!EOS_StriCmp(pParam, "automatic"))
    {
        lpTermStruct->ucScroll = SCROLL_AUTO;
        IO_Print(CLI_SCROLL_DISABLE);
        return G_SUCCESS;
    }
    else if (!EOS_StriCmp(pParam, "manual"))
    {
        lpTermStruct->ucScroll = SCROLL_MANUAL;
        IO_Print(CLI_SCROLL_ENABLE);
        return G_SUCCESS;
    }

    return G_FAILURE;
}

/*********************************************************************/
/* 函数功能 : 设备名设置的命令实现                                   */
/*********************************************************************/
_U32 CLI_CmdSetHostName(_U32 ulTermID)
{
    _S8 *szHostName;
    HostName_S sHostName;

    szHostName = CT_GetParamByName("device-name", ulTermID);
    if (szHostName == G_NULL || szHostName[0] == '\0')
    {
        IO_Print(CLI_HOSTNAME_NULL);
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    EOS_StrNCpy( m_szHostName, szHostName, (HOSTNAME_LENGTH - 1) );
    m_szHostName[HOSTNAME_LENGTH - 1] = '\0';

#if CLI_DBASE_SUPPORT
    /* 是否包含RDB模块 */
    if( G_YES == g_ul_INCLUDE_MODULE_CLI_RDB )
    {
        /* 函数指针是否注册 */
        if( G_NULL == g_pfn_CFG_CLI_RDB_RecordDirectUpdate )
        {
            MT_ERRLOG(0);
            return G_FAILURE;
        }

        EOS_StrCpy (sHostName.szHostName, szHostName);
        (_VOID)g_pfn_CFG_CLI_RDB_RecordDirectUpdate(m_ulCliUserHandle, m_usHostNameTable, 0, &sHostName);
    }
#endif

    return G_SUCCESS;
}

/*********************************************************************/
/* 函数功能 : 串口波特率的设置命令实现                               */
/*********************************************************************/
_U32 CLI_CmdSetBaudrate(_U32 ulTermID)
{
    _U32 ulBaudrate;

    if (ulTermID != 1)
    {
        IO_Print(CLI_BAUDRATE_SET_ERR);
        return G_FAILURE;
    }

    if (G_SUCCESS != CT_GetUlongByName("baudrate", ulTermID, &ulBaudrate))
    {
        return G_FAILURE;
    }

    m_ulSerialBaudrate = ulBaudrate; /* 为了给查询串口速率提供一个全局变量 */
    IO_Print(CLI_BAUDRATE_SETTING, ulBaudrate);

#if (EOS_OS_TYPE != EOS_WIN32)
    CLI_DELAY(100);  // 延时 1s,让提示信息有机会输出
    if (G_SUCCESS != CLI_SerialSetBaudrate( ulBaudrate))
    {
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n  CLI(error return): CLI_CmdSetBaudrate:: CLI_DrvSetSetBaudrate");
        return G_FAILURE;
    }
#endif
    return G_SUCCESS;
}


/*********************************************************************/
/* 函数功能 : 增加用户的命令实现                                     */
/*********************************************************************/
_U32 CLI_CmdUserAdd(_U32 ulTermID)
{
    _S8 szUsername[USERNAME_LEN];
    _S8 szPassword[PASSWORD_LEN], szPwdCfrm[PASSWORD_LEN];
    _S8 szTmp[20], *pParam;
    _U32 ulLevel, ulType = 1;
    _U32 ulCount;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if ((pParam = CT_GetParamByName("operator-name", ulTermID)) == G_NULL)
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    EOS_StrNCpy( szUsername, pParam, (USERNAME_LEN - 1) );
    szUsername[USERNAME_LEN - 1] = '\0';

    for (ulCount = 0; ulCount < 3; ulCount++)
    {
        IO_Print(CLI_PASSWORD_INPUT);
        if (IO_GetString(szPassword, PASSWORD_LEN, EN_SHOWBACK_INVISIBLE) != G_SUCCESS)
            return G_FAILURE;

        if (szPassword[0] == '\0')
        {
            IO_Print(CLI_USER_PASSWORD_NULL);
            continue;
        }
        else if (szPassword[0] == KEY_CTRL_C)
        {
            IO_Print(CLI_STRING_INVALID);
            continue;
        }

        IO_Print(CLI_PASSWORD_CONFIRM);
        if (IO_GetString(szPwdCfrm, PASSWORD_LEN, EN_SHOWBACK_INVISIBLE) != G_SUCCESS)
            return G_FAILURE;

        if (EOS_StrCmp (szPassword, szPwdCfrm) != 0)
        {
            IO_Print(CLI_PASSWORD_NOT_SAME);
            continue;
        }
        break;
    }

    if (ulCount == 3)
        return G_FAILURE;

    IO_Print(CLI_USER_LEVEL_INTUT);
    for (ulCount = 0; ulCount < 3; ulCount++)
    {
        if (IO_GetString(szTmp, 2, EN_GETSTRING_NORMALLY) != G_SUCCESS)
            return G_FAILURE;
        if ((_U32)EOS_atoul(szTmp, &ulLevel) != G_SUCCESS)
        {
            if (ulCount == 2)
                return G_FAILURE;
            IO_Print(CLI_INPUT_NEED_NUM, 3);
            continue;
        }
        if (ulLevel == 0 || ulLevel > 3)
        {
            if (ulCount == 2)
                return G_FAILURE;
            IO_Print(CLI_INPUT_OVERFLOW, 3);
            continue;
        }
        break;
    }

    if (ulCount == 3)
        return G_FAILURE;

#if 0  //目前的网管实现暂时不需要命令行提供用户鉴别
    IO_Print(CLI_USER_TYPE_INPUT);
    for (ulCount = 0; ulCount < 3; ulCount++)
    {
        if (IO_GetString(szTmp, 2, EN_GETSTRING_NORMALLY) != G_SUCCESS)
            return G_FAILURE;
        if ((_U32)EOS_atoul(szTmp, &ulType) != G_SUCCESS)
        {
            if (ulCount == 2)
                return G_FAILURE;
            IO_Print(CLI_INPUT_NEED_NUM, 2);
            continue;
        }
        if (ulType == 0 || ulType > 3)
        {
            if (ulCount == 2)
                return G_FAILURE;
            IO_Print(CLI_INPUT_OVERFLOW, 2);
            continue;
        }
        break;
    }

    if (ulCount == 3)
        return G_FAILURE;
#endif

    return CLI_AddTermUser(szUsername, szPassword, (_U8)(ulLevel - 1),(_U8)ulType, ML_ENG);
}

/*********************************************************************/
/* 函数功能 : 删除用户的命令实现                                     */
/*********************************************************************/
_U32 CLI_CmdUserDel(_U32 ulTermID)
{
    _S8 szUsername[USERNAME_LEN];
    _S8 *pParam;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if ((pParam = CT_GetParamByName("operator-name", ulTermID)) == G_NULL)
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    EOS_StrCpy (szUsername, pParam);

    if (CLI_DelTermUser(szUsername) != G_SUCCESS)
    {
        return G_FAILURE;

⌨️ 快捷键说明

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