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

📄 cli_term.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 5 页
字号:
/************************************************************************
Copyright 200X - 200X+1.

filename     : CLI_Term.c

description  :  1、实现命令行操作终端的任务管理
                2、终端任务数据中的字符串编辑缓冲的处理

author       : Woodhead

modification : Woodhead    create              2004-12-07
************************************************************************/

#include "Ros.h"
#include "CLI_Private.inc"
#include "CLI_Io.h"
#include "CLI_User.inc"
#include "Cli_Log.inc"
#include "CLI_Intp.inc"
#include "CLI_Telnet.inc"
#include "ML.h"
#include "Sys_Ml.h"
#include "Cli_MlPriv.h"
#include "Board_Pub.h"
#include "Config\Cli_ConfigGlbVar.h"

/*********************************************************************/
/* 函数名称 : CLI_SendToTerm()                                       */
/* 函数功能 : 根据终端选择输出函数                                   */
/* 输入参数 : pTermStruct:终端任务数据                                */
/* 输出参数 :                                                        */
/* 返回     : 成功、失败                                             */
/* 上层函数 : IO_OutToTerm                                           */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_U32 CLI_SendToTerm( PTerm_Data_S pTermStruct )
{
    _U32 ulRet = G_FAILURE;

    pTermStruct->iSendLen = (_S32)EOS_StrLen(pTermStruct->szSendBuf);
    if (pTermStruct->iSendLen == 0
     || pTermStruct->ucTermStatus == TERM_SLEEPING)
        return G_SUCCESS;

    switch (pTermStruct->iSocket)
    {
        case SOCKET_FOR_SERIAL:
            ulRet =  CLI_SendToSerial(pTermStruct);
            break;

        #if MULTI_DEVICE_SUPPORT
        /* ??? LingJian_Tailor */
        case SOCKET_FOR_MML:
            ulRet =  CLI_SendToMML(pTermStruct);
            break;
        #endif

        case SOCKET_FOR_WEB:
            CLI_ASSURE_OR_FAIL(0);
            break;

        case SOCKET_NOT_INITIAL:
            break;

        default:
            #if ( CLI_TELNET_SUPPORT == G_YES )
            if( G_NULL != g_pfn_CFG_CLI_SendToTelnet )
            {
                ulRet =  g_pfn_CFG_CLI_SendToTelnet(pTermStruct);
            }
            #endif
            break;
    }
    pTermStruct->szSendBuf[0] = '\0';
    pTermStruct->iSendLen = 0;

    return ulRet;
}

/*********************************************************************/
/* 函数名称 : CLI_SendToTerm()                                       */
/* 函数功能 : 根据终端选择输入函数                                   */
/* 输入参数 : pTermStruct:终端任务数据                                */
/* 输出参数 : pTermStruct:终端任务数据                                */
/* 返回     : 成功、失败                                             */
/* 上层函数 : IO_OutToTerm                                           */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_U32 CLI_ReceiveFromTerm(PTerm_Data_S pTermStruct, _U32 ulSecond)
{
    _U32 ulRet = G_FAILURE;

    switch (pTermStruct->iSocket)
    {
        case SOCKET_FOR_SERIAL:
            ulRet =  CLI_ReceiveFromSerial(pTermStruct, ulSecond);
            break;

        case SOCKET_FOR_MML:
            if (pTermStruct->szRecvBuf[0] != '\0')
                ulRet = G_SUCCESS;
            else
            {
                CLI_DELAY(20);
                ulRet = G_FAILURE;
            }
            break;

        case SOCKET_NOT_INITIAL:
            break;

        default:
            #if ( CLI_TELNET_SUPPORT == G_YES )
            if( G_NULL != g_pfn_CFG_CLI_ReceiveFromTelnet )
            {
                ulRet =  g_pfn_CFG_CLI_ReceiveFromTelnet(pTermStruct, ulSecond);
            }
            #endif
            break;
    }

    if (pTermStruct->ulTimeLeft == 0 || pTermStruct->ucTermStatus == TERM_SLEEPING)
    {
        return G_FAILURE;
    }

    if (ulRet == G_SUCCESS)
    {
        pTermStruct->ulTimeLeft
            = (pTermStruct->ucTimeOutFlag == TIMEOUT_ON ? DEADLINE_SHORT : DEADLINE_LONG);
    }

    pTermStruct->ulDispLineCount = 0;

    return ulRet;
}

#if (EOS_OS_TYPE != EOS_WIN32)
_VOID CLI_SerialInit(_VOID)
{

    return;
}

_U32 CLI_SendToSerial ( PTerm_Data_S pTermStruct )
{
    extern _U32 Drv_Print( const char *pStr, ... );

    _S8     szBuf[TERM_IO_BUFFER], *pCur, *pPos;
    _S32    lStrLen = 0, lCpyLen = 0;
    _S16    lCount = 1000;  //暂定如果10秒还不能被输出,则放弃

    CLI_ASSURE_OR_FAIL( G_NULL != pTermStruct);

    lStrLen = (_S32)EOS_StrLen(pTermStruct->szSendBuf);
    pCur = (_S8 *)pTermStruct->szSendBuf;

    while (lStrLen > 0)
    {
        pCur = pCur + lCpyLen;
        lCpyLen = lStrLen;

        memset(szBuf, 0, TERM_IO_BUFFER);
        /* 如果在szBuf允许范围内发现有'%',则复制长度取这以前的内容*/
        /* 并多增加一个'%'  lzq  */
        if ((pPos = strchr(pCur, '%')) != G_NULL )
        {
            lCpyLen = (_S32)(pPos - pCur + 1);
            szBuf[lCpyLen] = '%';
        }

        EOS_StrNCpy(szBuf, pCur, (_U32)lCpyLen);

        while ((Drv_Print(szBuf) != G_SUCCESS) && (--lCount > 0))
            CLI_DELAY(1);
        lStrLen -= lCpyLen;
    }

    return G_SUCCESS ;
}

/*********************************************************************/
/* 函数名称 : CLI_ReceiveFromSerial()                                */
/* 函数功能 : 从串口终端接收一个字符                                 */
/* 输入参数 : pTermStruct: 端任务数据                                */
/*            ulSecond   : 超时时间                                  */
/* 输出参数 : pTermStruct: 端任务数据                                */
/* 返回     :                                                        */
/* 上层函数 :                                                        */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_U32 CLI_ReceiveFromSerial ( PTerm_Data_S pTermStruct, _U32 ulSecond)
{
    _U32 i;
    _U32 ulTotalTick;

    ulTotalTick = ulSecond * 100;

    CLI_ASSURE_OR_FAIL( G_NULL != pTermStruct );

    for (i = 0; i <= ulTotalTick; i++)
    {
        if (CLI_SerialGetChar((_U8 *)&pTermStruct->szRecvBuf[0]) == G_SUCCESS)
        {
            pTermStruct->iRecvLen = 1 ;
            return G_SUCCESS;
        }
        CLI_DELAY(1);
    }

    return G_FAILURE;
}

#else

//typedef _VOID *HANDLE;
HANDLE hStdIn, hStdOut;
_VOID CLI_SerialInit( _VOID )
{

    _U32 dwMode;

    if (G_FALSE == (_U32)AllocConsole())
    {
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\n\rCan't Alloc console");
        MT_ERRLOG(0);
        return;
    }

    hStdIn = GetStdHandle(STD_INPUT_HANDLE);
    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleMode(hStdIn, &dwMode);
    SetConsoleMode(hStdIn,
                    (dwMode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT))
                            | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);
    return ;
}

_U32 CLI_SendToSerial ( PTerm_Data_S pTermStruct )
{
    _U32 i ;
    _U32 ulTemp ;
    _U32 DataFlag = G_FALSE;
    _U32 cCharsWritten;

    CLI_ASSURE_OR_FAIL( G_NULL != pTermStruct );

    while(G_NULL != pTermStruct->szSendBuf)
    {
        i = 0 ;
        while( pTermStruct->szSendBuf[ i ] )
        {
            if (pTermStruct->szSendBuf[ i ] == KEY_ESC)
                break ;
            i++ ;
        }

        if (pTermStruct->szSendBuf[ i ] == KEY_ESC)
        {
            pTermStruct->szSendBuf[ i ] = '\0' ;
            WriteConsole(hStdOut, pTermStruct->szSendBuf,
                EOS_StrLen(pTermStruct->szSendBuf), &cCharsWritten, G_NULL);
        }
        else
        {
            WriteConsole(hStdOut, pTermStruct->szSendBuf,
                EOS_StrLen(pTermStruct->szSendBuf), &cCharsWritten, G_NULL);
            break ;
        }

        pTermStruct->szSendBuf[ i ] = KEY_ESC ;
        if (pTermStruct->szSendBuf[ i ] != '\0' )
        {
            ulTemp = 0 ;
            DataFlag = G_FALSE;
            while (pTermStruct->szSendBuf[ i ] != '\0')
            {
                if((tolower(pTermStruct->szSendBuf[ i ]) >= 'a') && (tolower(pTermStruct->szSendBuf[ i ]) <= 'd'))
                    break ;
                if (DataFlag == G_TRUE)
                    ulTemp = (_U32)(ulTemp *10 + (_U32)((_U8)pTermStruct->szSendBuf[ i ] - (_U8)'0')) ;
                if (pTermStruct->szSendBuf[ i ] == '[' )
                    DataFlag = G_TRUE;

                i++ ;

            }
            CLI_WinMoveToCurrentPos((_S32)ulTemp, (_S8)tolower(pTermStruct->szSendBuf[ i ])) ;
            EOS_StrCpy(pTermStruct->szSendBuf, (_S8 *)(pTermStruct->szSendBuf + i + 1)) ;
        }

    }
    pTermStruct->iSendLen = 0 ;
    pTermStruct->szSendBuf[ 0 ] = '\0' ;
    return G_SUCCESS ;

}


_U32 CLI_ReceiveFromSerial ( PTerm_Data_S pTermStruct, _U32 ulSecond)
{
    _U32 cCharsread;

    CLI_ASSURE_OR_FAIL( G_NULL != pTermStruct );

    if(ulSecond == 0) /* win32系统暂时不支持直接输入 */
    {
        return G_FAILURE;
    }

    WIN32_CUR_TASK_LOCK_CANCLE();
    ReadConsole(hStdIn, &pTermStruct->szRecvBuf[ 0 ], 1,
           &cCharsread, G_NULL);
    WIN32_CUR_TASK_LOCK_RESTORE();
    pTermStruct->iRecvLen = 1 ;

    return G_SUCCESS ;
}

_VOID CLI_WinMoveToCurrentPos ( _S32 iTmp, _S8 cFlag )
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdOut, &csbi);
    /* 将光标向上移动  */
    if (cFlag == 'a' )
    {
        csbi.dwCursorPosition.Y = (_S16)(csbi.dwCursorPosition.Y - iTmp) ;
        SetConsoleCursorPosition(hStdOut, csbi.dwCursorPosition) ;
    }
    /* 将光标向下移动  */
    else if (cFlag == 'b' )
    {
        csbi.dwCursorPosition.Y = (_S16)(csbi.dwCursorPosition.Y + iTmp) ;
        SetConsoleCursorPosition(hStdOut, csbi.dwCursorPosition) ;
    }

    /* 将光标向左移动   */
    else if (cFlag == 'd' )
    {
        csbi.dwCursorPosition.X = (_S16)(csbi.dwCursorPosition.X - iTmp) ;
        SetConsoleCursorPosition(hStdOut, csbi.dwCursorPosition) ;
    }
    /* 将光标向右移动   */

⌨️ 快捷键说明

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