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

📄 cli_io.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 3 页
字号:
    {
        /* 接收来自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 + -