📄 cli_syscmd.c
字号:
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 + -