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

📄 cli_syscmd.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 3 页
字号:

    pObj = pObject;
    if (pObj == G_NULL)
        return G_FALSE;

    if (pObj->action.rightLevel > (CLI_OPERAT_LEVEL_T)ulLevel)
        return G_FALSE;

    //如果即不是当前模式,又不是全局模式的对象,不予显示
    if (ulMode != pObj->action.ulMode && CTM_GLOBAL != pObj->action.ulMode)
    {
        return G_FALSE;
    }

    if (ulMode == pObj->action.ulMode)
        return G_TRUE;
    pObj = pObj->pSubObject;

    while (pObj != G_NULL)
    {
        if (pObj->action.ulMode == ulMode
         && pObj->action.rightLevel <= (CLI_OPERAT_LEVEL_T)ulLevel)
            return G_TRUE;

        if (pObj->pSubObject != 0)
            pObj = pObj->pSubObject;
        else if (pObj->pNext != 0)
            pObj = pObj->pNext;
        else
        {
            if (pObj->pParent == pObject)
                break;

            while (pObj->pParent->pNext == G_NULL)
            {
                pObj = pObj->pParent;
                if (pObj->pParent == pObject)
                    return G_FALSE;
            }
            pObj = pObj->pParent->pNext;
        }
    }

    return G_FALSE;
}

/*********************************************************************/
/* 函数功能 : 在help命令中显示指定的对象信息                         */
/*********************************************************************/
_U32 CLI_ObjectShow(_U32 ulTermID, _U32 ulMode, _U32 ulLevel, CT_OBJECT_P pObject)
{
    _U32 ulBlank[5] = {0, 0, 0, 0, 0};
    _U32 ulBlankTotal = 0, i, j;
    _U32 ulObjNum = 0;
    CT_OBJECT_P pObj, pObjTmp;
    _S8 szInfo[256];
    _S8 szHelp[128];
    _U32 ulPos = 0;
    _S8 *szOutput;
    _U32 ulRet = G_SUCCESS;

    if (!CLI_IsObjNeedShow(ulMode, pObject, ulLevel))
    {
        return G_FAILURE;
    }

    if ((szOutput = ROS_MemAlloc(4096, ROS_MEM_ALLOC_OPT_LEAK_CHECK))
         == G_NULL)
         return G_FAILURE;

    szOutput[0] = '\0';
    szInfo[0] = '\0';

    pObj = pObject;

    while (pObj != G_NULL)
    {
        EOS_ClearWatchDog();

        if (pObj->action.rightLevel <= (CLI_OPERAT_LEVEL_T)ulLevel
            && (pObj->action.ulMode == ulMode || pObj->action.ulMode == CTM_GLOBAL)
            && (CLI_IsObjNeedShow(ulMode, pObj, ulLevel)))
        {
            if (pObj == pObject
             || (pObj->pPrevious == G_NULL && pObj->pNext == G_NULL))
            {
                EOS_StrCat(szOutput, "  ");
            }
            else if (pObj->pPrevious == G_NULL)
            {
                EOS_StrCat(szOutput, "+-");
            }
            else
            {
                i = 0, j = 0;
                //计算该对象的兄长对象
                pObjTmp = pObj->pPrevious;
                while (pObjTmp != G_NULL)
                {
                    if (CLI_IsObjNeedShow(ulMode, pObjTmp, ulLevel))
                        i++;
                    pObjTmp = pObjTmp->pPrevious;
                }

                //计算该对象的弟弟对象
                pObjTmp = pObj->pNext;
                while (pObjTmp != G_NULL)
                {
                    if (CLI_IsObjNeedShow(ulMode, pObjTmp, ulLevel))
                        j++;
                    pObjTmp = pObjTmp->pNext;
                }
                if ((i + j) == 0) //如果前后没有可显示的对象
                    EOS_StrCat(szOutput, "  ");
                else if (i == 0) //如果该对象前的可显示对象个数为0,则该对象为第一个
                    EOS_StrCat(szOutput, "+-");
                else
                    EOS_StrCat(szOutput, "|-");
            }
            ulPos += 2;

            EOS_Sprintf(szInfo, "%-7s", pObj->szName);
            EOS_StrCat(szOutput, szInfo);
            ulPos += EOS_StrLen(szInfo);

            if (!CI_IsObjectExecutable(pObj, HAVEACTIONS))
            {
                CI_GetObjectHelpString((_S8 *)ML_GetString(ulTermID, pObj->action.ulHelpID), szHelp);

                if (ulPos <  38)
                {
                    for (i = 0; i < 38 - ulPos; i++)
                        EOS_StrCat(szOutput, " ");
                }

                if (EOS_StrLen(szHelp) > 40)
                {
                    ulBlankTotal = 0;
                    for (i = 0; i < 37; i++)
                    {
                        if ((_U8)szHelp[i] > 127)
                            ulBlankTotal ++;
                    }
                    if (ulBlankTotal % 2 == 0)
                        EOS_StrCpy(szHelp + 37, "...");
                    else
                        EOS_StrCpy(szHelp + 38, "...");
                }
                EOS_StrCat(szOutput, szHelp);
            }
        }
        else if (pObj->action.ulMode != ulMode && ulMode == CTM_GLOBAL)
        {
            ulRet = 2;
        }

        if (pObj->pSubObject != G_NULL)
        {
            ulBlank[ulObjNum++] = EOS_StrLen(szInfo) + 2;
            pObj = pObj->pSubObject;
        }
        else if (pObj == pObject)
        {
            break;
        }
        else if (pObj->pNext != G_NULL)
        {
            if (pObj->action.rightLevel <= (CLI_OPERAT_LEVEL_T)ulLevel
                && (pObj->action.ulMode == ulMode || pObj->action.ulMode == CTM_GLOBAL)
                && (CLI_IsObjNeedShow(ulMode, pObj, ulLevel)))
            {
                EOS_StrCat(szOutput, "\r\n");
                ulPos = 0;
            }
            else if (pObj->action.ulMode != ulMode && ulMode == CTM_GLOBAL)
            {
                ulRet = 2;
            }

            ulBlankTotal = 0;
            for (i = 0; i < ulObjNum; i++)
            {
                ulBlankTotal += ulBlank[i];
            }
            for (i = 0; i < ulBlankTotal; i++)
            {

                if (pObj->action.rightLevel <= (CLI_OPERAT_LEVEL_T)ulLevel
                    && (pObj->action.ulMode == ulMode || pObj->action.ulMode == CTM_GLOBAL)
                    && (CLI_IsObjNeedShow(ulMode, pObj, ulLevel)))
                {
                    if (ulObjNum == 2 && i == ulBlank[0] && pObj->pParent->pNext != G_NULL)
                        EOS_StrCat(szOutput, "|");
                    else
                        EOS_StrCat(szOutput, " ");
                    ulPos++;
                }
                else if (pObj->action.ulMode != ulMode && ulMode == CTM_GLOBAL)
                {
                    ulRet = 2;
                }
            }
            pObj = pObj->pNext;
        }
        else
        {
            while (pObj->pParent != pObject
                && pObj->pParent->pNext == G_NULL)
            {
                pObj = pObj->pParent;
                --ulObjNum;

            }
            if (pObj->pParent == pObject)
            {
                break;
            }

            if (pObj->pParent->pNext != G_NULL)
            {
                --ulObjNum;

                if (pObj->action.rightLevel <= (CLI_OPERAT_LEVEL_T)ulLevel
                    && (pObj->action.ulMode == ulMode || pObj->action.ulMode == CTM_GLOBAL)
                    && (CLI_IsObjNeedShow(ulMode, pObj, ulLevel)))
                {
                    EOS_StrCat(szOutput, "\r\n");
                    ulPos = 0;
                }
                else if (pObj->action.ulMode != ulMode && ulMode == CTM_GLOBAL)
                {
                    ulRet = 2;
                }
                ulBlankTotal = 0;

                for (i = 0; i < ulObjNum; i++)
                {
                    ulBlankTotal += ulBlank[i];
                }
                for (i = 0; i < ulBlankTotal; i++)
                {
                    if (pObj->action.rightLevel <= (CLI_OPERAT_LEVEL_T)ulLevel
                        && (pObj->action.ulMode == ulMode || pObj->action.ulMode == CTM_GLOBAL)
                        && (CLI_IsObjNeedShow(ulMode, pObj, ulLevel)))
                    {
                        EOS_StrCat(szOutput, " ");
                        ulPos++;
                    }
                    else if (pObj->action.ulMode != ulMode && ulMode == CTM_GLOBAL)
                    {
                        ulRet = 2;
                    }
                }
                pObj = pObj->pParent->pNext;
            }
            else
            {
                break;
            }
        }

    }
    EOS_StrCat(szOutput, "\r\n");
    IO_OutString(szOutput);

    ROS_MemFree(szOutput);
    return ulRet;
}

/*********************************************************************/
/* 函数功能 : 命令树的列表显示                                       */
/*********************************************************************/
_U32 CLI_CmdHelp(_U32 ulTermID)
{
    _U32 ulMode;
    _U32 ulObjIndex = 0;
    CT_OBJECT_P pObj, pObjSave[5] = {G_NULL, G_NULL, G_NULL, G_NULL, G_NULL};
    PTerm_Data_S pTermStruct;
    _U32 ulRet;

    pTermStruct = m_TDTable[ulTermID - 1].pTermStruct;

    IO_Print(CLI_HELP_INFO);

    for (ulMode = 0; ulMode < CTM_TOTAL; ulMode ++)
    {
        if (m_sCliSysModes[ulMode].pObject == G_NULL)
            continue;

        if (m_sCliSysModes[ulMode].rightLevel > pTermStruct->ucUserLevel)
            continue;

        pObj = m_sCliSysModes[ulMode].pObject->pSubObject;

        IO_OutString("\r\n\r\n --------------------------------\r\n");
        IO_Print(CLI_CMD_HELP_MODE, m_sCliSysModes[ulMode].szModeName);
        IO_OutString("\r\n --------------------------------\r\n");

        ulObjIndex = 0;

        while (pObj != G_NULL
            && (ulMode == CTM_GLOBAL || pObj != m_sCliSysModes[CTM_GLOBAL].pObject->pSubObject))
        {
            if (!EOS_StriCmp(pObj->szName, "cm"))
            {
                pObj = pObj->pNext;
                continue;
            }

            if (IO_IsOutputBroken(ulTermID))
                return G_SUCCESS;

            CLI_DELAY(1);

            //如果非全局模式下的命令大于全局模式的命令,
            //则先显示可能需要显示的全局模式命令
            if (ulMode != CTM_GLOBAL )
            {
                while (pObjSave[ulObjIndex] != G_NULL && EOS_StriCmp(pObj->szName, pObjSave[ulObjIndex]->szName) > 0)
                {
                    CLI_ObjectShow(ulTermID, ulMode, (_U32)pTermStruct->ucUserLevel, pObjSave[ulObjIndex]);
                    ulObjIndex++;
                }
            }

            //显示当前分支
            ulRet = CLI_ObjectShow(ulTermID, ulMode, (_U32)pTermStruct->ucUserLevel, pObj);
            if (2 == ulRet && ulMode == CTM_GLOBAL)
            {
                if (ulObjIndex < 5)
                {
                    pObjSave[ulObjIndex++] = pObj;
                }
            }
            pObj = pObj->pNext;

            if (pObj == G_NULL && ulObjIndex < 5 && pObjSave[ulObjIndex] != 0)
            {
                //如果显示完全了,但还有全局模式的遗留命令没有输出,尝试输出
                while (ulObjIndex < 5 && pObjSave[ulObjIndex] != 0)
                {
                    CLI_ObjectShow(ulTermID, ulMode, (_U32)pTermStruct->ucUserLevel, pObjSave[ulObjIndex]);
                    ulObjIndex++;
                }
            }
        }
    }
    return G_SUCCESS;
}


/*********************************************************************/
/* 函数功能 : 从任何模式进入调试模式的命令实现                       */
/*********************************************************************/
_U32 CLI_EnterDiagMode(_U32 ulTermID)
{
    CT_WS_P pWS;
    _S8 *pParamNO;

    pWS = m_TDTable[ulTermID - 1].pTermStruct->pWS;

    IO_Print(CLI_DIAGNOSE_MODE_NOTE);
    CLI_DELAY(50);
    if (pWS->ulCurrentMode == CTM_GENL)
        return G_SUCCESS;

    /* Write to pWS       */
    if(CI_CmdPush(&(pWS->cmdStack),
          pWS->szCmdString,
          CTM_DIAG) != G_SUCCESS )
    {
        IO_Print(CLI_PUSH_CMD_FAILED);
        return G_FAILURE;
    }
    pWS->ulCurrentMode = CTM_DIAG;
    pWS->ulParamIndex += m_sCliSysModes[CTM_DIAG].ulParamCount;

    pParamNO = CI_GetModeParameter(CTM_DIAG, 2, pWS->ulTermId) ;
    CI_EnterMode(CTM_DIAG, pParamNO) ;

    return G_SUCCESS;
}

/*********************************************************************/
/* 函数功能 : 显示当前终端设置信息                                   */
/*********************************************************************/
_U32 CLI_CmdTermConfig(_U32 ulTermID)
{
    PTerm_Data_S pTermStruct;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

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

    /* 当前用户名 */
    IO_PrintToTerm(ulTermID, CLI_TERM_CURRENT_USERNAME,pTermStruct->szCurUserName);
    /* 命令交互 */
    IO_PrintToTerm(ulTermID, CLI_TERM_PWS_SMART,ML_GetString(ulTermID,PUB_STRING_ON-pTermStruct->pWS->ulSmart));
    /* 告警输出 */
    IO_PrintToTerm(ulTermID, CLI_TERM_ALARM_OUTPUT, ML_GetString(ulTermID,PUB_STRING_OFF+pTermStruct->ucAlarmLevel));
    /* 滚屏方式 */
    IO_PrintToTerm(ulTermID, CLI_TERM_AUTO_SCROLL,  ML_GetString(ulTermID,CLI_TERM_SCROLL_AUTO+pTermStruct->ucScroll));

    return G_SUCCESS;
}

/*********************************************************************/
/* 函数功能 : 显示串口的波特率                                   */
/*********************************************************************/
_U32 CLI_CmdShowBaudrate(_U32 ulTermID)
{
    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    IO_PrintToTerm(ulTermID, CLI_SERIAL_BAUDRATE, m_ulSerialBaudrate);
    return G_SUCCESS;
}

⌨️ 快捷键说明

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