cli.c
来自「基于ARM和uC/OS-II实现的串口控制台」· C语言 代码 · 共 1,153 行 · 第 1/3 页
C
1,153 行
/*******************************************************************************
**
** File Name: CLI.c
** Author: Zhoudan
** Last Modified: 2007-05-09
** Last Version: 0.1
** Environment: LPC2214/RVDSv2.2
** Descriptions: Command Line Interface/Serial Port Console
**
*******************************************************************************/
#include "config.h"
BufInfo CliRxBuf; /* 命令BUFFER */
static OS_EVENT *sem_cmd; /* 命令处理信号量 */
uint8 CmdStatus; /* 命令状态 */
uint8 CmdHisBufUsage; /* 已使用的历史命令BUF条目数 */
uint8 CurCmdHisBuf; /* 当前使用的历史命令 */
static char CmdHisBuf[MAX_HIS_BUF][CMD_BUF_MAX];/* 历史命令记录BUFFER */
uint32 CLIConfigFile[1024]; /* RAM中的配置 */
/* 终端命令提示符 */
char *HOSTNAME;
const char *DefHostName = "\n\rConsole"; /* 默认主机名 */
const char *PROMPT = ">"; /* 用户模式提示符 */
const char *PROMPT_PRI = "#"; /* 特权模式提示符 */
const char *PROMPT_CONFIG = "(config)#"; /* 终端配置模式提示符 */
const char *PROMPT_CONF_LINE = "(config-line)#";/* 线路配置模式提示符 */
const char *PROMPT_CONF_IF = "(config-if)#"; /* 接口配置模式提示符 */
const char *BLANKROW = "\n\r"; /* 空白行 */
/* 命令错误提示信息 */
const char *CMD_ERR_INVALID = "\n\rInvalid Command!";
const char *CMD_ERR_INCOMPLETE = "\n\rIncomplete Command!";
const char *CMD_ERR_NOT_UNIQUE = "\n\rCommand Can't Req!";
/* 方向键状态机 */
uint8 FSMKey; /* 方向键状态机 */
#define DIRECTION_KEY_START 0x00 /* 方向键状态机开始 */
#define DIRECTION_KEY_ONE 0x01 /* 收到第一个字符 */
#define DIRECTION_KEY_TWO 0x02 /* 收到第二个字符 */
/* ASCII字符 */
#define ETX 0x03
#define SPACE 0x20
#define BEL 0x07
#define BS 0x08
#define TAB 0x09
#define LF 0x0a
#define CR 0x0d
#define ESC 0x1b
#define ANS 0x3f
#define UP 0x41
#define DOWN 0x42
#define RIGHT 0x43
#define LEFT 0x44
#define HOME 0x48
#define END 0x4b
static void KeyEnd(void);
static void KeyBackspace(void);
/*******************************************************************************
* Function: ConSplit()
* Description: 终端分屏显示
*******************************************************************************/
void ConSplit(void)
{
}
/*******************************************************************************
* Function: BufClean()
* Description: Clean the command buffer
*******************************************************************************/
void BufClean(void)
{
CliRxBuf.WrPtr = 0;
CliRxBuf.RdPtr = 0;
CliRxBuf.InsDelPtr = 0;
CliRxBuf.Cnt = 0;
}
/*******************************************************************************
* Function: CurPrompt()
* Description: 输出当前命令状态的终端提示符
*******************************************************************************/
void CurPrompt(void)
{
switch(GetCmdStatus())
{
case USER:
SendStr(HOSTNAME);
SendStr(PROMPT);
break;
case PRIVATE:
SendStr(HOSTNAME);
SendStr(PROMPT_PRI);
break;
case CONFIG:
SendStr(HOSTNAME);
SendStr(PROMPT_CONFIG);
break;
case CONFIG_IF:
SendStr(HOSTNAME);
SendStr(PROMPT_CONF_IF);
break;
case CONFIG_LINE:
SendStr(HOSTNAME);
SendStr(PROMPT_CONF_LINE);
default:
break;
}
}
/*******************************************************************************
* Function: PrintBuf()
* Description: 将当前命令BUF中的数据输出到控制台
*******************************************************************************/
void PrintBuf(void)
{
uint8 i;
for(i = 0; i < CliRxBuf.WrPtr; i++)
{
SendC(CliRxBuf.Buf[i]);
}
for(i = 0; i < CliRxBuf.WrPtr - CliRxBuf.InsDelPtr; i++)
{
SendC(BS);
}
}
/*******************************************************************************
* Function: WrBuf()
* Description: 向BUF中写入数据
* Calls: DisU0Int()
* Called By: InsBuf()
* Input: Data 要写入的数据
* Return: 无
*******************************************************************************/
static void WrBuf(char data)
{
if(CliRxBuf.Cnt == CMD_BUF_MAX)
{
CliRxBuf.Buf[CliRxBuf.WrPtr] = data;
return;
}
CliRxBuf.Buf[CliRxBuf.WrPtr++] = data;
CliRxBuf.InsDelPtr++;
CliRxBuf.Cnt++;
}
/*******************************************************************************
* Function: InsBuf()
* Description: 将字符插入到BUF和终端的对应位置
* Calls: SendC()/WrBuf()
* Called By: Cpy2Buf()/U0RxISR()
* Input: data 要插入的字符
* Return: 无
*******************************************************************************/
static void InsBuf(char data)
{
uint8 i;
if(CliRxBuf.InsDelPtr == CliRxBuf.WrPtr)
{
WrBuf(data);
SendC(data);
}
else
{
for(i = 0; i < CliRxBuf.WrPtr - CliRxBuf.InsDelPtr; i++)
{
CliRxBuf.Buf[CliRxBuf.WrPtr - i]
= CliRxBuf.Buf[CliRxBuf.WrPtr - i - 1];
}
CliRxBuf.Buf[CliRxBuf.InsDelPtr++] = data;
SendC(data);
CliRxBuf.WrPtr++;
for(i = 0; i < CliRxBuf.WrPtr - CliRxBuf.InsDelPtr; i++)
{
SendC(CliRxBuf.Buf[CliRxBuf.InsDelPtr + i]);
}
for(i = 0; i < CliRxBuf.WrPtr - CliRxBuf.InsDelPtr; i++)
{
SendC(BS);
}
}
}
/*******************************************************************************
* Function: Cpy2Buf()
* Description:
* Calls: strlen()/InsBuf()
* Called By: TabLastPara()/KeyTab()
* Input: str :
* Return: None
*******************************************************************************/
static void Cpy2Buf(char *str)
{
uint8 i;
for(i = 0; i < strlen(str); i++)
{
InsBuf(*(str + i));
}
}
/*******************************************************************************
* Function: CleanCurCmd()
* Description: Clean current line of console
*******************************************************************************/
static void CleanCurCmd(void)
{
KeyEnd();
while(CliRxBuf.Cnt > 0)
{
KeyBackspace();
}
}
/*******************************************************************************
* Function: KeyUp()
* Description: Behavior of UP key
*******************************************************************************/
static void KeyUp(void)
{
if(CurCmdHisBuf > 0)
{
CleanCurCmd();
BufClean();
Cpy2Buf(CmdHisBuf[CurCmdHisBuf - 1]);
CurCmdHisBuf--;
}
}
/*******************************************************************************
* Function: KeyDown()
* Description: Behavior of DOWN key
*******************************************************************************/
void KeyDown(void)
{
if(CmdHisBufUsage > CurCmdHisBuf)
{
CleanCurCmd();
BufClean();
Cpy2Buf(CmdHisBuf[CurCmdHisBuf]);
CurCmdHisBuf++;
}
}
/*******************************************************************************
* Function: KeyLeft()
* Description: Behavior of LEFT key
*******************************************************************************/
static void KeyLeft(void)
{
if(CliRxBuf.RdPtr < CliRxBuf.InsDelPtr)
{
CliRxBuf.InsDelPtr--;
SendC(BS);
}
}
/*******************************************************************************
* Function: KeyRight()
* Description: Behavior of RIGHT key
*******************************************************************************/
static void KeyRight(void)
{
if(CliRxBuf.InsDelPtr == CliRxBuf.WrPtr)
{
SendC(BEL);
}
else
{
SendC(CliRxBuf.Buf[CliRxBuf.InsDelPtr++]);
}
}
/*******************************************************************************
* Function: KeyHome()
* Description: Behavior of HOME key
*******************************************************************************/
static void KeyHome(void)
{
while(0 < CliRxBuf.InsDelPtr)
{
CliRxBuf.InsDelPtr--;
SendC(BS);
}
}
/*******************************************************************************
* Function: KeyEnd()
* Description: Behavior of END key
*******************************************************************************/
static void KeyEnd(void)
{
while(CliRxBuf.InsDelPtr != CliRxBuf.WrPtr)
{
SendC(CliRxBuf.Buf[CliRxBuf.InsDelPtr++]);
}
}
/*******************************************************************************
* Function: KeyEnter()
* Description: Behavior of ENTER key
* Calls: CurPrompt()/OSSemPost
* Called By: U0RxISR()
* Input: None
* Return: None
*******************************************************************************/
static void KeyEnter(void)
{
if(CliRxBuf.WrPtr == 0)
{
CurPrompt();
}
else
{
OSSemPost(sem_cmd);
}
}
/*******************************************************************************
* Function: TabLastPara()
* Description:
* Calls: GetCmd()/BufClean()/Cpy2Buf()
* Called By:
*******************************************************************************/
static void TabLastPara(char *InsPara)
{
char CurCmdBuf[256];
static uint8 offset, flag;
uint8 i = 0;
offset = flag = 0;
GetCmd(CurCmdBuf);
for(offset = 0; offset < 256; offset++)
{
if(CurCmdBuf[offset] == '\0')
{
offset--;
while(1)
{
if(CurCmdBuf[offset] == SPACE && flag == 0)
{
offset--;
}
else
{
flag = 1;
offset--;
if(CurCmdBuf[offset] == SPACE)
{
offset++;
goto OUT;
}
}
}
}
}
OUT:
while(*(InsPara + i) != '\0')
{
CurCmdBuf[offset + i] = *(InsPara + i);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?