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

📄 cli_term.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 5 页
字号:
/*      调用函数    :CLI_MoveToCurrentPos ( )                       */
/*      被调函数    :                                               */
/*==================================================================*/
_VOID CLI_DealWithBackSpace ( PTerm_Data_S pTermStruct )
{
    _U32 ulTmp ;

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

    /*--------------------------------------------------------------*/
    /* 光标前无字符可删除,则告警                                    */
    /*--------------------------------------------------------------*/
    if ( pTermStruct->iCurrentPos == 0
     || (pTermStruct->szInputCmd[0] != 0 && pTermStruct->iCurrentPos <= (_S32)strlen(pTermStruct->szInputCmd)))
    {
        CLI_Bell ( pTermStruct ) ;
        return;
    }

    /* 如果终端类型不是vt100时的处理  */
    if (    EOS_StrCmp ( pTermStruct->TelnetParam.TermType, "VT100" )
         && EOS_StrCmp ( pTermStruct->TelnetParam.TermType, "vt100" ) )
    {
        pTermStruct->iCurrentPos -- ;
        CLI_MoveToCurrentPos ( pTermStruct, (_U32)pTermStruct->iCurrentPos + 1 ) ;
        ulTmp = (_U32)pTermStruct->iCurrentPos ;
        /* 处理编辑缓冲区删除光标前的一字符,并刷新发送缓冲区    */
        do
        {
            if ( pTermStruct->szEditBuf[ ulTmp + 1 ] )
                pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
                    = pTermStruct->szEditBuf[ ulTmp + 1 ] ;

            else
                pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
                    = ' ' ;

            pTermStruct->szEditBuf[ ulTmp ]
                = pTermStruct->szEditBuf[ ulTmp + 1 ] ;
            ulTmp ++ ;

        } while ( pTermStruct->szEditBuf[ ulTmp - 1 ] ) ;

        pTermStruct->szSendBuf[ pTermStruct->iSendLen ] = '\0' ;
        /* 重新显示当前光标后的字符后,刷新光标位置              */
        CLI_MoveToCurrentPos ( pTermStruct, EOS_StrLen ( pTermStruct->szEditBuf ) + 1 ) ;
        return ;
    }

    /* 终端类型是vt100的处理 */
    else
    {
        pTermStruct->iCurrentPos -- ;
        CLI_MoveToCurrentPos ( pTermStruct, (_U32)pTermStruct->iCurrentPos + 1 ) ;
        ulTmp = (_U32)pTermStruct->iCurrentPos ;
        /* 处理编辑缓冲区删除光标前的一字符,并刷新发送缓冲区    */
        do
        {
            if ( pTermStruct->szEditBuf[ ulTmp + 1 ] )
                pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
                    = pTermStruct->szEditBuf[ ulTmp + 1 ] ;

            else
                pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
                    = ' ' ;

            pTermStruct->szEditBuf[ ulTmp ]
                = pTermStruct->szEditBuf[ ulTmp + 1 ] ;
            ulTmp ++ ;

        } while ( pTermStruct->szEditBuf[ ulTmp - 1 ] ) ;
        pTermStruct->szSendBuf[ pTermStruct->iSendLen ] = '\0' ;
        /*------------------------------------------------------*/
        /* 重新显示当前光标后的字符后,刷新光标位置              */
        /*------------------------------------------------------*/
        CLI_MoveToCurrentPos ( pTermStruct, EOS_StrLen ( pTermStruct->szEditBuf ) + 1 ) ;

    }
    return ;
}


/*==================================================================*/
/*      函数名      :CLI_DealWithDelete                              */
/*      函数功能    :对Delete键的处理                               */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      返回值      :无                                             */
/*      调用函数    :CLI_MoveToCurrentPos ( )                       */
/*      被调函数    :                                               */
/*==================================================================*/
_VOID CLI_DealWithDelete ( PTerm_Data_S pTermStruct )
{
    _U32 ulTmp ;

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

    /* 光标后有字符可以删除  */
    if ( pTermStruct->szEditBuf[ pTermStruct->iCurrentPos ] )
    {
        ulTmp = (_U32)pTermStruct->iCurrentPos ;
        /* 处理编辑缓冲区删除光标后的一字符,并刷新发送缓冲区    */
        do
        {
            if ( pTermStruct->szEditBuf[ ulTmp + 1 ] )
                pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
                    = pTermStruct->szEditBuf[ ulTmp + 1 ] ;
            else
                pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
                    = ' ' ;

            pTermStruct->szEditBuf[ ulTmp ]
                = pTermStruct->szEditBuf[ ulTmp + 1 ] ;
            ulTmp ++ ;

        } while ( pTermStruct->szEditBuf[ ulTmp - 1 ] ) ;
        pTermStruct->szSendBuf[ pTermStruct->iSendLen ] = '\0' ;

        CLI_MoveToCurrentPos ( pTermStruct, EOS_StrLen ( pTermStruct->szEditBuf ) + 1 ) ;

    }
    /* 光标后无字符可以删除,则警告  */
    else
        CLI_Bell ( pTermStruct ) ;

    return ;
}


/*==================================================================*/
/*      函数名      :CLI_PrevCmdDisp                                */
/*      函数功能    :DOSKEY功能的上一条命令自动获取                 */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      返回值      :无                                             */
/*      调用函数    :CLI_MoveToCurrentPos ( )                       */
/*      被调函数    :                                               */
/*==================================================================*/
_VOID CLI_PrevCmdDisp ( PTerm_Data_S pTermStruct )
{
    _U32 ulTmp ;

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

    /* 该操作需要历史缓冲中存在命令 */
    if ( pTermStruct->iHistoryPos > 0 )
    {
        /* 将光标左移到屏幕显示的第一列上  */
        if ( pTermStruct->iCurrentPos )
        {
            ulTmp = (_U32)pTermStruct->iCurrentPos ;
            pTermStruct->iCurrentPos = 0 ;
            CLI_MoveToCurrentPos ( pTermStruct, ulTmp ) ;
        }
        /* 清除用户的当前输入 */
        if ( EOS_StrLen ( pTermStruct->szEditBuf ) )
        {
            pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
            ulTmp = 0 ;
            while ( pTermStruct->szEditBuf[ ulTmp ++ ] )
                pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ] = ' ' ;
            pTermStruct->szSendBuf [ pTermStruct->iSendLen ] = '\0' ;

            CLI_MoveToCurrentPos ( pTermStruct, EOS_StrLen ( pTermStruct->szEditBuf ) ) ;
        }

        /* 用当前命令前的历史命令刷新编辑缓冲区  */
        EOS_StrCpy ( pTermStruct->szEditBuf,
                 pTermStruct->szHistory[ pTermStruct->iHistoryPos - 1 ] ) ;
        pTermStruct->iHistoryPos -- ;

        /* 重新显示新的命令 */
        EOS_StrCat ( pTermStruct->szSendBuf, pTermStruct->szEditBuf ) ;
        pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;

        /* 刷新当前的光标位置 */
        pTermStruct->iCurrentPos = (_S32)EOS_StrLen ( pTermStruct->szEditBuf ) ;

    }
    /* 当前命令之前无历史命令,鸣警 */
    else
        CLI_Bell ( pTermStruct ) ;

    return ;
}


/*==================================================================*/
/*      函数名      :CLI_NextCmdDisp                                */
/*      函数功能    :DOSKEY功能的下一条命令自动获取                 */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      返回值      :无                                             */
/*      调用函数    :CLI_MoveToCurrentPos ( )                       */
/*      被调函数    :                                               */
/*==================================================================*/
_VOID CLI_NextCmdDisp ( PTerm_Data_S pTermStruct )
{
    _U32 ulTmp ;

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

    /* 该操作需要历史缓冲中存在命令 */
    if (    pTermStruct->iHistoryPos + 1 < HISTORY_SIZE
         && pTermStruct->szHistory[ pTermStruct->iHistoryPos + 1 ][0] )
    {

        /* 将光标左移到屏幕显示的第一列上  */
        if ( pTermStruct->iCurrentPos )
        {
            ulTmp = (_U32)pTermStruct->iCurrentPos ;
            pTermStruct->iCurrentPos = 0 ;
            CLI_MoveToCurrentPos ( pTermStruct, ulTmp ) ;
        }

        /* 清除用户的当前输入 */
        if ( EOS_StrLen ( pTermStruct->szEditBuf ) )
        {
            pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
            ulTmp = 0 ;
            while ( pTermStruct->szEditBuf[ ulTmp ++ ] )
                pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ] = ' ' ;
            pTermStruct->szSendBuf [ pTermStruct->iSendLen ] = '\0' ;

            CLI_MoveToCurrentPos ( pTermStruct, EOS_StrLen ( pTermStruct->szEditBuf ) ) ;
        }

        /* 用当前命令后的历史命令刷新编辑缓冲区  */
        EOS_StrCpy (pTermStruct->szEditBuf,
                pTermStruct->szHistory[ pTermStruct->iHistoryPos + 1 ] ) ;
        pTermStruct->iHistoryPos ++ ;

        /* 重新显示新的命令 */
        if ( EOS_StrLen ( pTermStruct->szEditBuf ) )
        {
            EOS_StrCat ( pTermStruct->szSendBuf, pTermStruct->szEditBuf ) ;
            pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
        }

        /* 刷新当前的光标位置 */
        pTermStruct->iCurrentPos = (_S32)EOS_StrLen ( pTermStruct->szEditBuf ) ;

    }
    /* 当前命令之后无历史命令,鸣警 */
    else
        CLI_Bell ( pTermStruct ) ;

    return ;
}

/*==================================================================*/
/*      函数名      :CLI_MoveToCurrentPos                           */
/*      函数功能    :将光标移到当前位置                             */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*                   _U32 iPos 光标移动的起始位置                    */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      返回值      :无                                             */
/*      调用函数    :无                                             */
/*      被调函数    :                                               */
/*==================================================================*/
_VOID CLI_MoveToCurrentPos ( PTerm_Data_S pTermStruct, _U32 iPos )
{
    _S32  iTmp ;
    _S8 szTmp[4] ;
    _U32 ulInputCmdLen = EOS_StrLen(pTermStruct->szInputCmd);

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

    /* 将光标上下移动 */
    iTmp = ((_S32)iPos + pTermStruct->iPromptLen - (_S32)ulInputCmdLen) / 80
           - (pTermStruct->iCurrentPos + pTermStruct->iPromptLen -(_S32)ulInputCmdLen) / 80 ;
    /* 将光标向上移动 */
    if ( iTmp > 0)
    {
        EOS_StrCat( pTermStruct->szSendBuf, "\x1b[" ) ;
        EOS_Sprintf ( szTmp, "%d", iTmp ) ;
        EOS_StrCat(pTermStruct->szSendBuf, szTmp ) ;
        EOS_StrCat(pTermStruct->szSendBuf, "A" ) ;
        pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
    }
    /* 将光标向下移动   */
    else if ( iTmp < 0 )
    {
        EOS_StrCat ( pTermStruct->szSendBuf, "\x1b[" ) ;
        EOS_Sprintf ( szTmp, "%d", 0 - iTmp ) ;
        EOS_StrCat ( pTermStruct->szSendBuf, szTmp ) ;
        EOS_StrCat ( pTermStruct->szSendBuf, "B" ) ;
        pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
    }

    /* 将光标左右移动  */
    iTmp = ( (_S32)iPos + pTermStruct->iPromptLen - (_S32)ulInputCmdLen) % 80
        - ( pTermStruct->iCurrentPos + pTermStruct->iPromptLen - (_S32)ulInputCmdLen ) % 80 ;

    /* 将光标向左移动 */
    if ( iTmp > 0 )
    {
        EOS_StrCat ( pTermStruct->szSendBuf, "\x1b[" ) ;
        EOS_Sprintf ( szTmp, "%d", iTmp ) ;
        EOS_StrCat ( pTermStruct->szSendBuf, szTmp ) ;
        EOS_StrCat ( pTermStruct->szSendBuf, "D" ) ;
        pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
    }
    /* 将光标向右移动   */
    else if ( iTmp < 0 )
    {
        EOS_StrCat ( pTermStruct->szSendBuf, "\x1b[" ) ;
        EOS_Sprintf ( szTmp, "%d", 0 - iTmp ) ;
        EOS_StrCat ( pTermStruct->szSendBuf, szTmp ) ;
        EOS_StrCat ( pTermStruct->szSendBuf, "C" ) ;
        pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
    }
    return ;
}


/*==================================================================*/
/*      函数名      :CLI_Bell                                       */
/*      函数功能    :如果接收到的字符不能处理,则警告                */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      返回值      :无        

⌨️ 快捷键说明

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