#ifndef __INCLUDE_CONSOLE_H
#define	__INCLUDE_CONSOLE_H

#define BS_KEY      	0x08		/*Back Space */
#define ENTER_KEY		0x0d		/*Enter*/
#define SPACE_KEY   	0x20		/*Space */
#define DEL_KEY     	0x7F		/*Delete */

#define UPARROW_KEY 				0x1b5b41
#define DOWNARROW_KEY 				0x1b5b42
#define LEFTARROW_KEY 				0x1b5b44
#define RIGHTARROW_KEY 				0x1b5b43
#define ESC_KEY						0x1b
	

#define CMD_PASS_CHAR(c) (((c)>=UPARROW_KEY)&&((c)<=LEFTARROW_KEY))
#define CMD_KEY_WORD(c) (((c)>='a') && ((c)<='z'))


#define	CMD_PROMPT	"GoldenBeans#"
#define UNKNOWNCMD	"Unknown commond\r\n"

typedef enum E_CONSOLE_FSM_ENUM
{
	E_CONSOLE_FSM_NONE 			= 1,
	E_CONSOLE_FSM_GETING_CMD 	= 2,
	E_CONSOLE_FSM_GOT_CMD 		= 3,
	E_CONSOLE_FSM_GETING_PARAM 	= 4,
	E_CONSOLE_FSM_GOT_PARAM 	= 5,
}E_CONSOLE_FSM;


#define	CMD_LINE_LEN_MAX			64	/*命令行最大长度,包含参数*/
#define	CMD_DESCRIPTION_LEN_MAX		64	/*命令行帮助信息最大长度*/
#define CMD_PARAM_NUM_MAX			8	/*命令行中参数的最大数目，包括命令字*/

#ifndef CMD_MAX_NUM	
#define CMD_MAX_NUM	100
#endif

#define CMD_ESC_TIMOUT				100	/*组合键的超时时间*/


typedef struct _console_cmd_info
{
	int		escpressed;
	u8 	cmdLineLen;
	char 	cmdLine[CMD_LINE_LEN_MAX];
	u8 	curentpos;
}console_cmd_info;

typedef u8  CMDNODE;

typedef struct _cmd_node_element
{
	CMDNODE cmdnode;
	
}cmd_node_element;



typedef struct S_CLI_CMD_LIST_STRUCT
{
	u8	num;
	u32	cmd[CMD_MAX_NUM];
}S_CLI_CMD_LIST;


typedef int (*console_func)(u8	argc,char **argv);


typedef struct S_CLI_CMD_STRUCT
{
	char			*cmd;
	char        	*description;
	console_func		func;	
}S_CLI_CMD;

#define DEFCLICMD(funcname, cmdname, cmdstr, helpstr) \
int funcname (u8,char **); \
const S_CLI_CMD cmdname = \
{\
	cmdstr,\
	helpstr,\
	funcname\
};\
int funcname(u8 argc,char **argv)


typedef S_CLI_CMD *PS_CLI_CMD;
typedef const S_CLI_CMD *CPS_CLI_CMD;

/*存储console使用的串口ID*/
extern u8 Console_UID;

/*******************************************************
函数定义
********************************************************/

/************************************************************
*cmd_install --命令行安装命令函数
*
*Input:	
*	待安装的命令行结构
*Output:
*	Noen
*Return:
*	0		--安装成功
*	-1	--安装失败
*/
int cmd_install(CPS_CLI_CMD pcmdelement);


/****************************************************************************
*cmd_init    --命令行的初始化函数，完成命令行数据结构的初始化工作
*
*Input:
*	uartid	--命令行使用的串口编号，0，1；
*Output:
*	None
*Return:
*	None
*/
int cmd_init(u8 uartid);

#endif


