📄 cli_io.c
字号:
{
/* 接收来自Client端的数据 */
if ( CLI_ReceiveFromTerm(pTermStruct, pTermStruct->ulTimeLeft) != G_SUCCESS)
{
if (pTermStruct->ucTermStatus < TERM_LOGED || pTermStruct->ulTimeLeft == 0)
return G_FAILURE;
continue ;
}
if (!IS_TERM_NORMAL(pTermStruct))
return G_FAILURE;
/* 编辑接收到的字符串 */
if (!CLI_EditString(pTermStruct))
{
if (ucMode == EN_GETSTRING_FOR_COMMAND && !(strcmp(pTermStruct->szEditBuf, pTermStruct->szInputCmd))
&& (pTermStruct->szRecvBuf[0] == 0xa || pTermStruct->szRecvBuf[0] == 0xd))
{
return G_FAILURE;
}
break ;
}
if (ucMode == EN_GETSTRING_FOR_COMMAND && pTermStruct->szRecvBuf[0] == '?')
{
break;
}
if (pTermStruct->iSendLen == 0)
continue;
/* 回显输入信息 */
/* 如果输入模式为星号回显,用星号替代输出缓冲的字符 */
if ( ucMode == EN_SHOWBACK_INVISIBLE)
{
for (i = 0; i < pTermStruct->iSendLen; i++)
{
if (pTermStruct->szSendBuf[i] < 0x20
|| pTermStruct->szSendBuf[i] > 0x7e)
{
if (pTermStruct->szSendBuf[i] == 0)
break;
//如果在输入的时候出现方向控制符,唯一的可能性就是左移删除"\x1b[1D"
//如果存在其它的可能性,此处可能需修改
if (EOS_StrNCmp(&pTermStruct->szSendBuf[i], "\x1b[1D", 4) == 0)
{
i += 3; //这里只递增3是因为循环本身会进行一次递增
if (pTermStruct->szSendBuf[i + 1] == 0x20)
i++;
}
continue;
}
pTermStruct->szSendBuf[i] = '*';
}
}
CLI_SendToTerm(pTermStruct);
}
EOS_StrCpy( szInput, pTermStruct->szEditBuf );
if (ucMode == EN_GETSTRING_FOR_COMMAND)
{
EOS_StrCpy(pTermStruct->szCommandBuf, pTermStruct->szEditBuf);
/*如果该输入是被"?"中断的,输入为"?"*/
if ( EOS_StrLen(szInput) > 0 && szInput[EOS_StrLen ( szInput ) - 1] == '?' )
{
szInput[0] = '?';
szInput[1] = '\0';
}
}
/* 恢复任务数据的编辑状态到适应命令行 */
pTermStruct->iEditStatus = COMMAND_INPUT;
pTermStruct->iMaxLen = CT_MAX_CMDBUF;
pTermStruct->szEditBuf[0] = '\0' ;
pTermStruct->iCurrentPos = 0 ;
/*如果该输入是被CTCR+C中断的,输入为空*/
if ( EOS_StrLen(szInput) > 0 && szInput[EOS_StrLen ( szInput ) - 1] == KEY_CTRL_Z )
szInput[0] = '\0';
return G_SUCCESS ;
}
/*-------------------------------------------------------------------*/
/* 函数名称 : IO_GetConfirm */
/* 功 能 : 等待用户输入确认信息 */
/* 输入参数 : ulInfoID :语种ID */
/* ulDefaultChoice:缺省输入 */
/* 输出参数 : 无 */
/* 返回 : INPUT_NO/INPUT_YES/INPUT_TIMEOUT */
/* 调用说明 : 该调用导致终端任务阻塞,直到超时或接收到按键输入. 如果 */
/* 输入回车或三次均为'n'与'y'之外的内容, 返回缺省选项. */
/* 超时时间统一定义为5秒 */
/* 典型示例 : if (IO_GetConfirm(CLI_KICK_OFF_ANTHOR, INPUT_NO) */
/* != INPUT_YES) */
/* ...... ; */
/*-------------------------------------------------------------------*/
_U32 IO_GetConfirm(_U32 ulInfoID, _U32 ulDefaultChoice)
{
_S8 szPrompt[20];
_U32 ulCount;
_U32 ulRet;
_S8 cInput;
PTerm_Data_S pTermStruct ;
ulRet = ulDefaultChoice;
if ((pTermStruct = CLI_GetCurrentTaskData()) == G_NULL)
{
MT_ERRLOG(0);
return ulRet;
}
if (pTermStruct->iSocket == SOCKET_FOR_MML)
{
return INPUT_YES;
}
if (ulDefaultChoice == INPUT_YES)
EOS_StrCpy(szPrompt, " Y/N[Y]:");
else
EOS_StrCpy(szPrompt, " Y/N[N]:");
/* 对于输入错误的情况,提供最多3次输入机会,之后以缺省输入返回*/
for (ulCount = 0; ulCount < 3; ulCount ++)
{
IO_Print(ulInfoID);
IO_OutToTerm(pTermStruct, szPrompt);
/* 等待终端输入确认信息,5秒超时 */
pTermStruct->szRecvBuf[0] = '\0';
CLI_ReceiveFromTerm(pTermStruct, 5);
if (!IS_TERM_NORMAL(pTermStruct))
{
return ulDefaultChoice;
}
else if (pTermStruct->szRecvBuf[0] == '\0')
{
IO_Print(CLI_INPUT_CONFIRM_TIMEOUT);
return INPUT_TIMEOUT;
}
cInput = pTermStruct->szRecvBuf[0];
pTermStruct->szRecvBuf[0] = '\0';
pTermStruct->iRecvLen = 0;
if ( cInput != G_NULL)
{
switch (cInput)
{
case 'y':
case 'Y':
IO_OutString("Yes\r\n");
return INPUT_YES;
case 'n':
case 'N':
IO_OutString("No\r\n");
return INPUT_NO;
/* 如果输入回车, 则返回缺省值 */
case '\r':
case '\n':
IO_OutString("\r\n");
return ulRet;
default:
if(ulCount >= 2)
{
return ulRet;
}
IO_Print(CLI_INPUT_CONFIRM_ERROR);
break;
}
}
}
return ulRet;
}
_VOID IO_DispBaseInit(_VOID)
{
_U32 ulCount;
m_DispBase.ulFirstPos = 0;
m_DispBase.ulLastPos = 0;
for (ulCount = 0; ulCount < ASYN_DISPLAY_NUM; ulCount++)
{
m_DispBase.s_AsynShowPool[ulCount].pString = G_NULL;
m_DispBase.s_AsynShowPool[ulCount].ulTermID = 0;
}
return;
}
/*-------------------------------------------------------------------*/
/* 函数名称 : IO_GetCurretTermID */
/* 功 能 : 获取当前用户的终端ID */
/* 输入参数 : 无 */
/* 输出参数 : 无 */
/* 返回 : 终端ID */
/* 调用说明 : 该接口主要用于非命令行的定向打印所需要的参数:终端ID获取*/
/* 建议作返回值的判断, 1~6为合法的终端ID */
/* 典型示例 : IO_GetCurretTermID(&ulID); */
/* IO_PrintToTerm(ulID, CLI_ML_DISP_INFO); */
/*-------------------------------------------------------------------*/
_U32 IO_GetCurretTermID(_U32 *ulTermID)
{
PTerm_Data_S pTermStruct ;
if ((pTermStruct = CLI_GetCurrentTaskData()) == G_NULL)
return G_FAILURE;
*ulTermID = pTermStruct->ulTermId;
return G_SUCCESS;
}
/*-------------------------------------------------------------------*/
/* 函数名称 : IO_GetDbgUserTermID */
/* 功 能 : 获取调试用户登录的终端ID */
/* 输入参数 : 无 */
/* 输出参数 : 无 */
/* 返回 : 已登录:终端ID/未登录: 0 */
/* 调用说明 : */
/*-------------------------------------------------------------------*/
_U32 IO_GetDbgUserTermID(_VOID)
{
if (m_sUserTable[0].ulTermId != 0 && m_sUserTable[0].ucUserStatus >= TERM_LOGED)
return m_sUserTable[0].ulTermId;
else
return 0;
}
/*-------------------------------------------------------------------*/
/* 函数名称 : IO_SetScrollAuto */
/* 功 能 : 设置当前终端为自动滚屏 */
/* 输入参数 : 无 */
/* 输出参数 : 无 */
/* 返回 : 成功、失败 */
/* 调用说明 : */
/*-------------------------------------------------------------------*/
_U32 IO_SetScrollAuto(_VOID)
{
PTerm_Data_S pTermStruct ;
if ((pTermStruct = CLI_GetCurrentTaskData()) == G_NULL)
return G_FAILURE;
m_CLIucScroll = pTermStruct->ucScroll;
pTermStruct->ucScroll = SCROLL_AUTO;
return G_SUCCESS;
}
/*-------------------------------------------------------------------*/
/* 函数名称 : IO_SetScrollBack */
/* 功 能 : 恢复当前终端的滚屏方式 */
/* 输入参数 : 无 */
/* 输出参数 : 无 */
/* 返回 : 成功、失败 */
/* 调用说明 : 该接口须与IO_SetScrollAuto配套使用 */
/*-------------------------------------------------------------------*/
_U32 IO_SetScrollBack(_VOID)
{
PTerm_Data_S pTermStruct ;
if ((pTermStruct = CLI_GetCurrentTaskData()) == G_NULL)
return G_FAILURE;
pTermStruct->ucScroll = m_CLIucScroll;
return G_SUCCESS;
}
/*-------------------------------------------------------------------*/
/* 函数名称 : IO_IsTermNormal */
/* 功 能 : 判断当前终端是否正常 */
/* 输入参数 : ulTermID: 终端ID */
/* 输出参数 : 无 */
/* 返回 : TRUE/FALSE */
/* 调用说明 : 因为本函数提供给其它模块使用,因此正常的终端状态应当 */
/* 大于TERM_LOGED */
/*-------------------------------------------------------------------*/
_BOOL IO_IsTermNormal(_U32 ulTermID)
{
PTerm_Data_S pTermStruct ;
if (!CLI_IS_TERMID_VALIDE(ulTermID))
return G_FALSE;
pTermStruct = m_TDTable[ulTermID - 1].pTermStruct;
if (pTermStruct->ucTermStatus >= TERM_LOGED && pTermStruct->ulTimeLeft != 0)
return G_TRUE;
return G_FALSE;
}
/*-------------------------------------------------------------------*/
/* 函数名称 : IO_IsOutputBroken */
/* 功 能 : 判断当前的输出是否被中止 */
/* 输入参数 : ulTermID: 终端ID */
/* 输出参数 : 无 */
/* 返回 : TRUE/FALSE */
/* 调用说明 : 该接口一般用于有较多的输出过程中调用 */
/*-------------------------------------------------------------------*/
_BOOL IO_IsOutputBroken(_U32 ulTermID)
{
PTerm_Data_S pTermStruct ;
if (!CLI_IS_TERMID_VALIDE(ulTermID))
return G_FALSE;
pTermStruct = m_TDTable[ulTermID - 1].pTermStruct;
if (pTermStruct->ucTermStatus >= TERM_LOGED && pTermStruct->ulDispLineCount == CLI_INVALID)
return G_TRUE;
return G_FALSE;
}
/*==================================================================*/
/* 函数名 :IO_IsAlarmOutToTerm */
/* 函数功能 :是否允许告警向指定终端发送的判断 */
/*==================================================================*/
_BOOL IO_IsAlarmOutToTerm(_U32 ulTermID)
{
if (!CLI_IS_TERMID_VALIDE(ulTermID))
return G_FALSE;
if (m_TDTable[ulTermID - 1].pTermStruct->ucAlarmLevel == 1)
return G_TRUE;
else
return G_FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -