📄 cli_term.c
字号:
/************************************************************************
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 + -