optical/NxBase/console.c

916 lines
17 KiB
C
Raw Normal View History

2025-09-04 01:45:08 +00:00
#define _IN_CONSOLE_C
#include "console.h"
#include "serial.h"
#include "trigger.h"
#include "cpuid.h"
//---------------------------------------------------------------------------------------------
int g_useQueue = 1; // = 0, <20><>ʹ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD>= 1<><31>ʹ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//---------------------------------------------------------------------------------------------
void SetConsoleOutType(int type)
{
if (type != 0)
{
g_useQueue = 1;
}
else
{
g_useQueue = 0;
}
}
//---------------------------------------------------------------------------------------------
int SendData(u8 * pDatBuf, int len)
{
if (g_useQueue == 1)
{
#if (CONSOLE_PORT == COMM_USART1)
return Usart1SendData(pDatBuf, len);
#elif (CONSOLE_PORT == COMM_USART2)
return Usart2SendData(pDatBuf, len);
#elif (CONSOLE_PORT == COMM_USART3)
return Usart3SendData(pDatBuf, len);
#elif (CONSOLE_PORT == COMM_USART4)
return Usart4SendData(pDatBuf, len);
#elif (CONSOLE_PORT == COMM_USART5)
return Usart5SendData(pDatBuf, len);
#elif (CONSOLE_PORT == COMM_USART6)
return Usart6SendData(pDatBuf, len);
#else
return 0;
#endif
}
else
{
#if (CONSOLE_PORT == COMM_USART1)
return Usart1SendDataSync(pDatBuf, len);
#elif (CONSOLE_PORT == COMM_USART2)
return Usart2SendDataSync(pDatBuf, len);
#elif (CONSOLE_PORT == COMM_USART3)
return Usart3SendDataSync(pDatBuf, len);
#elif (CONSOLE_PORT == COMM_USART4)
return Usart4SendDataSync(pDatBuf, len);
#elif (CONSOLE_PORT == COMM_USART5)
return Usart5SendDataSync(pDatBuf, len);
#elif (CONSOLE_PORT == COMM_USART6)
return Usart6SendDataSync(pDatBuf, len);
#else
return 0;
#endif
}
}
int ResvData(u8 * pDat, int expectLen)
{
if (g_useQueue == 1)
{
#if (CONSOLE_PORT == COMM_USART1)
return Usart1GetData(pDat, expectLen);
#elif (CONSOLE_PORT == COMM_USART2)
return Usart2GetData(pDat, expectLen);
#elif (CONSOLE_PORT == COMM_USART3)
return Usart3GetData(pDat, expectLen);
#elif (CONSOLE_PORT == COMM_USART4)
return Usart4GetData(pDat, expectLen);
#elif (CONSOLE_PORT == COMM_USART5)
return Usart5GetData(pDat, expectLen);
#elif (CONSOLE_PORT == COMM_USART6)
return Usart6GetData(pDat, expectLen);
#else
return 0;
#endif
}
else
{
#if (CONSOLE_PORT == COMM_USART1)
return Usart1GetDataSync(pDat, expectLen);
#elif (CONSOLE_PORT == COMM_USART2)
return Usart2GetDataSync(pDat, expectLen);
#elif (CONSOLE_PORT == COMM_USART3)
return Usart3GetDataSync(pDat, expectLen);
#elif (CONSOLE_PORT == COMM_USART4)
return Usart4GetDataSync(pDat, expectLen);
#elif (CONSOLE_PORT == COMM_USART5)
return Usart5GetDataSync(pDat, expectLen);
#elif (CONSOLE_PORT == COMM_USART6)
return Usart6GetDataSync(pDat, expectLen);
#else
return 0;
#endif
}
}
// <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
#if (CONSOLE_PORT == COMM_USART1)
#define INIT_USART InitUsart1
#elif (CONSOLE_PORT == COMM_USART2)
#define INIT_USART InitUsart2
#elif (CONSOLE_PORT == COMM_USART3)
#define INIT_USART InitUsart3
#elif (CONSOLE_PORT == COMM_USART4)
#define INIT_USART InitUsart4
#elif (CONSOLE_PORT == COMM_USART5)
#define INIT_USART InitUsart5
#elif (CONSOLE_PORT == COMM_USART6)
#define INIT_USART InitUsart6
#else
#endif
//---------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>
#include <stdio.h>
#include <string.h>
#if defined ( __CC_ARM )
#pragma import(__use_no_semihosting_swi)
//<2F><>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>֧<EFBFBD>ֺ<EFBFBD><D6BA><EFBFBD>
struct __FILE
{
int handle;
};
FILE __stdout;
FILE __stdin;
// <20>ض<EFBFBD><D8B6><EFBFBD> fputc <20><><EFBFBD><EFBFBD>
int fputc(int ch, FILE *f)
{
u8 c = (u8)ch;
SendData(&c, 1);
return ch;
}
// <20>ض<EFBFBD><D8B6><EFBFBD> fgetc <20><><EFBFBD><EFBFBD>
int fgetc(FILE *f)
{
int ch;
u8 c;
ch = ResvData(&c, 1);
if (ch == 1)
{
#if (0) // <20><><EFBFBD><EFBFBD>
SendData(&c, 1);
#endif
return c;
}
return -1;
}
int ferror(FILE *f)
{
// <20><><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>
return EOF;
}
void _ttywrch(int ch)
{
u8 c = (u8)ch;
SendData(&c, 1);
}
void _sys_exit(int return_code)
{
while (1);
}
#define GETCHAR getchar
#define PUTCHAR putchar
#elif defined ( __GNUC__ )
int __io_putchar(int ch)
{
u8 c;
c = ch;
SendData(&c, 1);
return ch;
}
int __io_getchar(void)
{
int ch;
u8 c;
ch = ResvData(&c, 1);
if (ch == 1)
{
ch = (int)c;
return ch;
}
return 0;
}
int _read(int file, char *ptr, int len)
{
int rslt;
rslt = ResvData((u8*)ptr, len);
return rslt;
}
int _write(int file, char *ptr, int len)
{
SendData((u8*)ptr, len);
return len;
}
#define PUTCHAR __io_putchar
#define GETCHAR __io_getchar
#endif
int PutChar(int ch)
{
return PUTCHAR(ch);
}
int GetChar(void)
{
return GETCHAR();
}
//---------------------------------------------------------------------------------------------
typedef struct
{
int pause; // <20><>ͣ
int newCmd; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
int cmdExec; // <20><><EFBFBD><EFBFBD>ִ<EFBFBD>б<EFBFBD>־
int cancel; // <20><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>ִ<EFBFBD>б<EFBFBD>־
char command[MAX_CMD_LINE]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int cmdInCtrl; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
int cmdPointer; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
int cmdLen; // <20><><EFBFBD><EFBFBD><EEB3A4>
char cmdBuf[MAX_CMD_LINE]; // <20><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD>
}CmdLine;
CmdLine g_cmdLine;
//---------------------------------------------------------------------------------------------
int IsNewCommand(void)
{
return g_cmdLine.newCmd;
}
int LockExecAndGetCmdStr(char*pBuf)
{
int len;
EnterCritical();
len = g_cmdLine.cmdLen;
g_cmdLine.cmdExec = 1;
g_cmdLine.newCmd = 0;
ExitCritical();
memcpy(pBuf, g_cmdLine.command, len);
return len;
}
void UnlockExec(void)
{
g_cmdLine.cmdExec = 0;
}
void SetPauseStatus(int sta)
{
if (sta != 0)
{
g_cmdLine.pause = 1;
}
else
{
g_cmdLine.pause = 0;
}
}
//---------------------------------------------------------------------------------------------
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
#define HISTORY_CMD_NUM 10 // <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD>
char g_cmdHistory[HISTORY_CMD_NUM][MAX_CMD_LINE];
int g_cmdHisIdx = 0; // <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
int g_cmdHisNum = 0; // <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int g_cmdHisSer = -1; // <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int g_cursorNum = 0; // 20220412
void InitHistory(void)
{
g_cmdHisIdx = 0; // <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
g_cmdHisNum = 0; // <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_cmdHisSer = -1; // <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_cursorNum = 0;
memset(g_cmdHistory, 0, HISTORY_CMD_NUM*MAX_CMD_LINE);
}
void AddNewCmdToHistory(char * pCmd)
{
if (pCmd != NULL)
{
// <20>жϵ<D0B6>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2>
for (int i = 0; i < g_cmdHisNum; i++)
{
if (strcmp(&(g_cmdHistory[i][0]), pCmd) == 0) // <20>Ѵ<EFBFBD><D1B4><EFBFBD>
{
int temp1, temp2;
int count;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (i >= g_cmdHisIdx)
{
count = g_cmdHisNum - (i - g_cmdHisIdx);
}
else
{
count = g_cmdHisIdx - i;
}
count--;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
for (int j = 0; j < count; j++)
{
temp1 = i + j;
temp2 = temp1 + 1;
if (temp1 >= g_cmdHisNum)
{
temp1 -= g_cmdHisNum;
}
if (temp2 >= g_cmdHisNum)
{
temp2 -= g_cmdHisNum;
}
memset(&(g_cmdHistory[temp1][0]), 0, MAX_CMD_LINE);
strcpy(&(g_cmdHistory[temp1][0]), &(g_cmdHistory[temp2][0]));
if (j == (count - 1))
{
memset(&(g_cmdHistory[temp2][0]), 0, MAX_CMD_LINE);
strcpy(&(g_cmdHistory[temp2][0]), pCmd);
}
}
return;
}
}
if (g_cmdHisIdx >= HISTORY_CMD_NUM)
{
g_cmdHisIdx = 0;
}
memset(&(g_cmdHistory[g_cmdHisIdx][0]), 0, MAX_CMD_LINE);
strcpy(&(g_cmdHistory[g_cmdHisIdx][0]), pCmd);
g_cmdHisIdx++;
if (g_cmdHisNum < HISTORY_CMD_NUM)
{
g_cmdHisNum++;
}
}
}
// <20>Ϲ<EFBFBD><CFB9><EFBFBD><EAB4A6>
void UpCursorProc(void)
{
if (g_cursorNum > 0)
{
g_cursorNum--;
}
else
{
return;
}
g_cmdHisSer--;
if (g_cmdHisSer < 0)
{
g_cmdHisSer = g_cmdHisNum - 1;
}
if (1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (g_cmdLine.cmdPointer != 0)
{
PUTCHAR(0x08); // <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
PUTCHAR(' '); // <20><><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD>
PUTCHAR(0x08); // <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
g_cmdLine.cmdPointer--;
}
// <20><>ʾ<EFBFBD><CABE>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
if (g_cmdLine.cmdExec == 0 && g_cmdLine.newCmd == 0)
{
char ch;
for (int i = 0; i < MAX_CMD_LINE; i++)
{
ch = g_cmdHistory[g_cmdHisSer][i];
if (ch > 0x1F && ch < 0x7F) // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (g_cmdLine.cmdPointer < MAX_CMD_LINE-1)
{
PUTCHAR(ch); // <20><><EFBFBD><EFBFBD>ʾ
g_cmdLine.cmdBuf[g_cmdLine.cmdPointer] = ch;
g_cmdLine.cmdPointer++;
}
}
}
}
else
{
g_cmdLine.cmdPointer = 0;
g_cmdLine.cmdBuf[0] = 0;
}
}
}
// <20>¹<EFBFBD><C2B9><EFBFBD><EAB4A6>
void DownCursorProc(void)
{
if (g_cursorNum < g_cmdHisNum)
{
g_cursorNum++;
}
else
{
return;
}
g_cmdHisSer++;
if (g_cursorNum == g_cmdHisNum)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (g_cmdLine.cmdPointer != 0)
{
PUTCHAR(0x08); // <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
PUTCHAR(' '); // <20><><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD>
PUTCHAR(0x08); // <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
g_cmdLine.cmdPointer--;
}
return;
}
if (g_cmdHisSer >= g_cmdHisNum)
{
g_cmdHisSer = 0;
}
if (1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (g_cmdLine.cmdPointer != 0)
{
PUTCHAR(0x08); // <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
PUTCHAR(' '); // <20><><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD>
PUTCHAR(0x08); // <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
g_cmdLine.cmdPointer--;
}
// <20><>ʾ<EFBFBD><CABE>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
if (g_cmdLine.cmdExec == 0 && g_cmdLine.newCmd == 0)
{
char ch;
for (int i = 0; i < MAX_CMD_LINE; i++)
{
ch = g_cmdHistory[g_cmdHisSer][i];
if (ch > 0x1F && ch < 0x7F) // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (g_cmdLine.cmdPointer < MAX_CMD_LINE-1)
{
PUTCHAR(ch); // <20><><EFBFBD><EFBFBD>ʾ
g_cmdLine.cmdBuf[g_cmdLine.cmdPointer] = ch;
g_cmdLine.cmdPointer++;
}
}
}
}
else
{
g_cmdLine.cmdPointer = 0;
g_cmdLine.cmdBuf[0] = 0;
}
}
}
//---------------------------------------------------------------------------------------------
void OutNewCmdLine(void)
{
g_cmdLine.cmdPointer = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
g_cmdLine.cmdLen = 0; // <20><><EFBFBD><EFBFBD><EEB3A4>
PUTCHAR(0x0D); // <20>س<EFBFBD>
PUTCHAR(0x0A); // <20><><EFBFBD><EFBFBD>
PUTCHAR('C');
PUTCHAR('M');
PUTCHAR('D');
PUTCHAR(':');
PUTCHAR('>');
}
//---------------------------------------------------------------------------------------------
void InitConsole(void)
{
InitTrigger();
#if (CONSOLE_PORT != COMM_NONE)
INIT_USART(B115200, '8', 'N', '1');
#endif
AddTriggerToList(10, ConsoleCmdScan, NULL); // 10ms <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>̨
printf("\x0c"); // <20><><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD>
printf("\033[1;40;32m"); // <20><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>ն˱<D5B6><CBB1><EFBFBD>Ϊ<EFBFBD><CEAA>ɫ<EFBFBD><C9AB><EFBFBD>ַ<EFBFBD>Ϊ<EFBFBD><CEAA>ɫ
printf("\x0c"); // <20><><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD>
memset(&g_cmdLine, 0, sizeof(CmdLine));
g_useQueue = 1; // = 0, <20><>ʹ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD>= 1<><31>ʹ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
InitHistory();
}
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժͼ<D4BA><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ConsoleCmdScan()
{
int ch;
if (g_cmdLine.pause != 0)
{
return;
}
ch = GETCHAR();
if (ch < 0)
{
g_cmdLine.cmdInCtrl = 0;
return;
}
// <20><><EFBFBD><EFBFBD><EEB4A6>
switch(ch)
{
case 0x00: // NUL (Null char)
case 0x01: // SOH (Start of Header) <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
case 0x02: // STX (Start of Text) <20>ı<EFBFBD><C4B1><EFBFBD>ʼ
ch = ch;
break;
case 0x03: // ETX (End of Text) <20>ı<EFBFBD>β
if (g_cmdLine.cmdExec == TRUE) // ctrl+C Ϊ<><CEAA>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
{
OutNewCmdLine();
g_cmdLine.cancel = 1;
}
break;
case 0x04: // EOT (End of Transmission) <20><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>
case 0x05: // ENQ (Enquiry)
case 0x06: // ACK (Acknowledgment) ȷ<><C8B7>
case 0x07: // BEL (Bell) <20><><EFBFBD><EFBFBD>
ch = ch;
break;
case 0x08: // BS (Backspace) <20>˸<EFBFBD>
if (g_cmdLine.cmdPointer != 0)
{
PUTCHAR(0x08); // <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
PUTCHAR(' '); // <20><><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD>
PUTCHAR(0x08); // <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
g_cmdLine.cmdPointer--;
}
break;
case 0x09: // HT (Horizontal Tab)
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ȫ......
break;
case 0x0A: // LF (Line Feed) <20><><EFBFBD><EFBFBD>
case 0x0B: // VT (Vertical Tab)
case 0x0C: // FF (Form Feed) <20><>ҳ/<2F><><EFBFBD><EFBFBD>
ch = ch;
break;
case 0x0D: // CR (Carriage Return) <20>س<EFBFBD>
{
if (g_cmdLine.newCmd == 0 && g_cmdLine.cmdExec == 0)
{
PUTCHAR(0x0D); // <20><><EFBFBD>ӻس<D3BB>
PUTCHAR(0x0A); // <20><><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>
g_cmdLine.cmdBuf[g_cmdLine.cmdPointer] = 0; // <20>ַ<EFBFBD><D6B7><EFBFBD>β
g_cmdLine.cmdLen = g_cmdLine.cmdPointer; // <20><><EFBFBD><EFBFBD>
strcpy(g_cmdLine.command, g_cmdLine.cmdBuf); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (g_cmdLine.cmdLen != 0) // 20220412 <20><><EFBFBD><EFBFBD>Ȳ<EFBFBD>Ϊ0,<2C>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
{
AddNewCmdToHistory(g_cmdLine.cmdBuf); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
g_cmdHisSer = g_cmdHisIdx; // 20220412
g_cursorNum = g_cmdHisNum;
g_cmdLine.newCmd = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
break;
}
case 0x0E: // SO (Shift Out)SHIFT <20>ɿ<EFBFBD>
case 0x0F: // SI (Shift In) <20><><EFBFBD><EFBFBD>
case 0x10: // DLE (Data Link Escape) <20><><EFBFBD><EFBFBD>
case 0x11: // DC1 (XON) (Device Control 1)
case 0x12: // DC2 (Device Control 2)
case 0x13: // DC3 (XOFF)(Device Control 3)
case 0x14: // DC4 (Device Control 4)
case 0x15: // NAK (Negative Acknowledgement)
case 0x16: // SYN (Synchronous Idle)
case 0x17: // ETB (End of Trans. Block)
case 0x18: // CAN (Cancel)
case 0x19: // EM (End of Medium)
case 0x1A: // SUB (Substitute) // pause <20><>
ch = ch;
break;
case 0x1B: // ESC (Escape) <20>˳<EFBFBD>
g_cmdLine.cmdInCtrl = 1;
break;
case 0x1C: // FS (File Separator)
case 0x1D: // GS (Group Separator)
case 0x1E: // RS (Request to Send/Record Separator)
case 0x1F: // US (Unit Separator)
ch = ch;
break;
case 0x7F:
if (g_cmdLine.cmdPointer != 0)
{
PUTCHAR(0x08); // <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
PUTCHAR(' '); // <20><><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD>
PUTCHAR(0x08); // <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
g_cmdLine.cmdPointer--;
if (g_cmdLine.cmdLen != 0)
{
g_cmdLine.cmdLen--;
}
}
break;
default:
break;
}
if (ch != 0x1B && g_cmdLine.cmdInCtrl != 0)
{
if (g_cmdLine.cmdInCtrl == 1 && ch == 0x5B)
{
ch = GETCHAR();
switch(ch)
{
case 0x41: // <20>Ϲ<EFBFBD><CFB9><EFBFBD>
ch = 'u';
// <20>Ϸ<EFBFBD><CFB7><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
UpCursorProc(); // 20220412
break;
case 0x42: // <20>¹<EFBFBD><C2B9><EFBFBD>
ch = 'd';
DownCursorProc(); // <20>·<EFBFBD><C2B7><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
break;
case 0x43: // <20>ҹ<EFBFBD><D2B9><EFBFBD>
ch = 'r';
break;
case 0x44: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ch = 'l';
break;
case 0x31:
{
ch = GETCHAR();
if (ch == 0x7E) // HOME <20><>
{
ch = 'h';
}
else if (ch == 0x31)
{
ch = GETCHAR();
if (ch == 0x7E) // F1 <20><>
{
ch = '1';
}
}
else if (ch == 0x32)
{
ch = GETCHAR();
if (ch == 0x7E) // F2 <20><>
{
ch = '2';
}
}
else if (ch == 0x33)
{
ch = GETCHAR();
if (ch == 0x7E) // F3 <20><>
{
ch = '3';
}
}
else if (ch == 0x34)
{
ch = GETCHAR();
if (ch == 0x7E) // F4 <20><>
{
ch = '4';
}
}
else if (ch == 0x35)
{
ch = GETCHAR();
if (ch == 0x7E) // F5 <20><>
{
ch = '5';
}
}
else if (ch == 0x37)
{
ch = GETCHAR();
if (ch == 0x7E) // F6 <20><>
{
ch = '6';
}
}
else if (ch == 0x38)
{
ch = GETCHAR();
if (ch == 0x7E) // F7 <20><>
{
ch = '7';
}
}
else if (ch == 0x39)
{
ch = GETCHAR();
if (ch == 0x7E) // F8 <20><>
{
ch = '8';
}
}
break;
}
case 0x32:
{
ch = GETCHAR();
if (ch == 0x7E) // INS <20><>
{
ch = 'i';
}
else if (ch == 0x30)
{
ch = GETCHAR();
if (ch == 0x7E) // F9 <20><>
{
ch = '9';
}
}
else if (ch == 0x31)
{
ch = GETCHAR();
if (ch == 0x7E) // F10 <20><>
{
ch = 'a';
}
}
else if (ch == 0x33)
{
ch = GETCHAR();
if (ch == 0x7E) // F11 <20><>
{
ch = 'b';
}
}
else if (ch == 0x34)
{
ch = GETCHAR();
if (ch == 0x7E) // F12 <20><>
{
ch = 'c';
}
}
break;
}
case 0x33:
ch = GETCHAR();
if (ch == 0x7E) // DEL <20><>
{
ch = 'd';
}
break;
case 0x34:
ch = GETCHAR();
if (ch == 0x7E) // END <20><>
{
ch = 'e';
}
break;
case 0x35:
ch = GETCHAR();
if (ch == 0x7E) // PAGE UP <20><>
{
ch = 'u';
}
break;
case 0x36:
ch = GETCHAR();
if (ch == 0x7E) // PAGE DOWN <20><>
{
ch = 'd';
}
break;
default:
g_cmdLine.cmdInCtrl = 0;
break;
}
}
else
{
g_cmdLine.cmdInCtrl = 0;
}
if (g_cmdLine.cmdInCtrl != 0)
{
ch = 0;
g_cmdLine.cmdInCtrl = 0;
}
}
if (g_cmdLine.cmdExec == 0 && g_cmdLine.newCmd == 0)
{
if (ch > 0x1F && ch < 0x7F) // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (g_cmdLine.cmdPointer < MAX_CMD_LINE-1)
{
PUTCHAR(ch); // <20><><EFBFBD><EFBFBD>ʾ
g_cmdLine.cmdBuf[g_cmdLine.cmdPointer] = ch;
g_cmdLine.cmdPointer++;
}
}
}
else
{
g_cmdLine.cmdPointer = 0;
g_cmdLine.cmdBuf[0] = 0;
}
}
int IsConsoleCancel(void)
{
int rslt = g_cmdLine.cancel;
g_cmdLine.cancel = 0;
return rslt;
}
// 20220412 <20>һ<E1B9A9><D2BB><EFBFBD>ⲿ<EFBFBD>ӿ<EFBFBD>,<2C><><EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
int GetHistoryCmd(int hisIdx, char * pch)
{
if (hisIdx < 0 || hisIdx > HISTORY_CMD_NUM || pch == NULL)
{
return -1;
}
strncpy(pch, &(g_cmdHistory[hisIdx][0]), MAX_CMD_LINE);
return 0;
}
int GetHistoryNum(void)
{
return g_cmdHisNum;
}
int GetHistoryMaxNum(void)
{
return HISTORY_CMD_NUM;
}
int GetHistoryIdx(void)
{
return g_cmdHisIdx;
}
//---------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------