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 + -
显示快捷键?