From c85431dc96ff7d66a9857297b12db5c0c561ec7e Mon Sep 17 00:00:00 2001 From: hqm <13720409820@163.com> Date: Mon, 20 Sep 2021 20:40:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E8=AD=A6=E5=91=8A=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AAxcmd=5Fdefine.h=E5=A4=B4=E6=96=87=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80=E4=B8=AA=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E7=9A=84API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 14 ++++-- inc/xcmd.h | 66 ++++++---------------------- inc/xcmd_confg.h | 2 +- inc/xcmd_default_cmds.h | 2 +- inc/xcmd_default_keys.h | 2 +- inc/xcmd_define.h | 95 +++++++++++++++++++++++++++++++++++++++++ src/xcmd.c | 37 +++++----------- src/xcmd_default_keys.c | 2 +- 8 files changed, 134 insertions(+), 86 deletions(-) create mode 100644 inc/xcmd_define.h diff --git a/.gitignore b/.gitignore index 25c760f..edc39fb 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,11 @@ -example/linux/build -example/linux/xcmder -*.map \ No newline at end of file +#dir +*build/ +*Output/ +*DebugConfig/ +*Listings/ + +#file +xcmder +*.map +*.uvoptx +*.uvguix* \ No newline at end of file diff --git a/inc/xcmd.h b/inc/xcmd.h index c5a863b..15cb57b 100755 --- a/inc/xcmd.h +++ b/inc/xcmd.h @@ -8,65 +8,15 @@ #include #include #include +#include "xcmd_define.h" #ifdef __cplusplus extern "C" { #endif - typedef void(*cmd_func_t)(int argv, char* argc[]); typedef int(*cmd_key_func_t)(void *data); -typedef enum -{ - CTR_A = 1, - CTR_B = 2, - CTR_C = 3, - CTR_D = 4, - CTR_E = 5, - CTR_F = 6, - CTR_G = 7, - CTR_H = 8, - BACKSPACE = 8, - CTR_I = 9, - LF = 9, - TAB = 9, - CTR_J = 10, - CTR_K = 11, - CTR_L = 12, - CTR_M = 13, - CR = 13, - CTR_N = 14, - CTR_O = 15, - CTR_P = 16, - CTR_Q = 17, - CTR_R = 18, - CTR_S = 19, - CTR_T = 20, - CTR_U = 21, - CTR_V = 22, - CTR_W = 23, - CTR_X = 24, - CTR_Y = 25, - CTR_Z = 26, - ESC = 27, - FS = 28, - GS = 29, - RS = 30, - US = 31, - L_DELETE = 127, - UP = 0x00415B1B, - DW = 0x00425B1B, - RIGHT = 0x00435B1B, - LEFT = 0x00445B1B, - END = 0x00465B1B, - HOME = 0x00485B1B, - INSERT = 0x7E325B1B, - R_DELETE = 0x7E335B1B, - PGUP = 0x7E355B1B, - PGDW = 0x7E365B1B, -}XCMD_KEY_T; - typedef struct __cmd { char* name; @@ -82,6 +32,7 @@ typedef struct __key struct __key *next; }xcmd_key_t; + /** * @description: 接时期初始化 * @param {func*} get_c:获取一个字符的函数 @@ -179,10 +130,21 @@ char* xcmd_display_get(void); */ void xcmd_display_set(const char *msg); +/** + * @description: 光标操作函数 + * @param {*} + * @return {*} + */ void xcmd_display_cursor_set(uint16_t pos); - uint16_t xcmd_display_cursor_get(void); +/** + * @description: 设置命令行提示字符串,此函数并不拷贝字符串,只是记住了传入的指针 + * @param {char*} prompt + * @return {*} + */ +void xcmd_set_prompt(const char* prompt); + /** * @description: 获取历史记录的个数 * @param {*} diff --git a/inc/xcmd_confg.h b/inc/xcmd_confg.h index 6d289db..b1abf86 100755 --- a/inc/xcmd_confg.h +++ b/inc/xcmd_confg.h @@ -23,4 +23,4 @@ extern "C" { } #endif -#endif /* XCMD_CONFG_H */ \ No newline at end of file +#endif /* XCMD_CONFG_H */ diff --git a/inc/xcmd_default_cmds.h b/inc/xcmd_default_cmds.h index 75834ec..fa389c0 100755 --- a/inc/xcmd_default_cmds.h +++ b/inc/xcmd_default_cmds.h @@ -20,4 +20,4 @@ void default_cmds_init(void); } #endif -#endif /*XCMMD_DEFAULT_CMDS_H*/ \ No newline at end of file +#endif /*XCMMD_DEFAULT_CMDS_H*/ diff --git a/inc/xcmd_default_keys.h b/inc/xcmd_default_keys.h index 083d681..a11ab74 100755 --- a/inc/xcmd_default_keys.h +++ b/inc/xcmd_default_keys.h @@ -19,4 +19,4 @@ void default_keys_init(void); } #endif -#endif /* XCMD_DEFAULT_KEYS_H */ \ No newline at end of file +#endif /* XCMD_DEFAULT_KEYS_H */ diff --git a/inc/xcmd_define.h b/inc/xcmd_define.h new file mode 100644 index 0000000..0a471aa --- /dev/null +++ b/inc/xcmd_define.h @@ -0,0 +1,95 @@ +/* + * @Author: your name + * @Date: 2021-09-20 19:59:05 + * @LastEditTime: 2021-09-20 20:07:50 + * @LastEditors: Please set LastEditors + * @Description: In User Settings Edit + * @FilePath: /xcmd/inc/xcmd_define.h + */ + +#ifndef XCMD_DEFINE_H +#define XCMD_DEFINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum +{ + CTR_A = 1, + CTR_B = 2, + CTR_C = 3, + CTR_D = 4, + CTR_E = 5, + CTR_F = 6, + CTR_G = 7, + CTR_H = 8, + BACKSPACE = 8, + CTR_I = 9, + LF = 9, + TAB = 9, + CTR_J = 10, + CTR_K = 11, + CTR_L = 12, + CTR_M = 13, + CR = 13, + CTR_N = 14, + CTR_O = 15, + CTR_P = 16, + CTR_Q = 17, + CTR_R = 18, + CTR_S = 19, + CTR_T = 20, + CTR_U = 21, + CTR_V = 22, + CTR_W = 23, + CTR_X = 24, + CTR_Y = 25, + CTR_Z = 26, + ESC = 27, + FS = 28, + GS = 29, + RS = 30, + US = 31, + L_DELETE = 127, + UP = 0x00415B1B, + DW = 0x00425B1B, + RIGHT = 0x00435B1B, + LEFT = 0x00445B1B, + END = 0x00465B1B, + HOME = 0x00485B1B, + INSERT = 0x7E325B1B, + R_DELETE = 0x7E335B1B, + PGUP = 0x7E355B1B, + PGDW = 0x7E365B1B, +}XCMD_KEY_T; + +/*光标操作符,其中0x1B是ESC,只适用于xcmd_print函数*/ +#define CUU(n) "\x1B[%dA",n /* 光标向上 光标向上 行 */ +#define CUD(n) "\x1B[%dB",n /* 光标向下 光标向下 行 */ +#define CUF(n) "\x1B[%dC",n /* 光标向前 光标向前(右) 行 */ +#define CUB(n) "\x1B[%dD",n /* 光标向后 光标向后(左) 行 */ +#define CNL(n) "\x1B[%dE",n /* 光标下一行 光标从当前位置向下 行 */ +#define CPL(n) "\x1B[%dF",n /* 光标当前行 光标从当前位置向上 行 */ +#define CHA(n) "\x1B[%dG",n /* 绝对光标水平 光标在当前行中水平移动到第 个位置 */ +#define VPA(n) "\x1B[%dd",n /* 绝对垂直行位置 光标在当前列中垂直移动到第 个位置 */ +#define CUP(y,x) "\x1B[%d;%dH",y,x /* 光标位置 *光标移动到视区中的 ; 坐标,其中 行的列 */ +#define HVP(y,x) "\x1B[%d;%df",y,x /* 水平垂直位置 *光标移动到视区中的 ; 坐标,其中 行的列 */ + +/*光标可见性*/ +#define CU_START_BL "\x1B[?12h" /* ATT160 文本光标启用闪烁 开始光标闪烁 */ +#define CU_STOP_BL "\x1B[?12l" /* ATT160 文本光标禁用闪烁 停止闪烁光标 */ +#define CU_SHOW "\x1B[?25h" /* DECTCEM 文本光标启用模式显示 显示光标 */ +#define CU_HIDE "\x1B[?25l" /* DECTCEM 文本光标启用模式隐藏 隐藏光标 */ + +/* 字符操作 */ +#define ICH(n) "\x1B[%d@",n /* 插入字符 在当前光标位置插入 个空格,这会将所有现有文本移到右侧。 向右溢出屏幕的文本会被删除。*/ +#define DCH(n) "\x1B[%dP",n /* 删除字符 删除当前光标位置的 个字符,这会从屏幕右边缘以空格字符移动。*/ +#define ECH(n) "\x1B[%dX",n /* 擦除字符 擦除当前光标位置的 个字符,方法是使用空格字符覆盖它们。*/ +#define IL(n) "\x1B[%dL",n /* 插入行 将 行插入光标位置的缓冲区。 光标所在的行及其下方的行将向下移动。*/ +#define DL(n) "\x1B[%dM",n /* 删除行 从缓冲区中删除 行,从光标所在的行开始。*/ + +#ifdef __cplusplus + } +#endif +#endif /*XCMD_DEFINE_H*/ diff --git a/src/xcmd.c b/src/xcmd.c index 1f4bd4b..cabfd22 100755 --- a/src/xcmd.c +++ b/src/xcmd.c @@ -5,31 +5,6 @@ #include #include -/*光标操作符,其中0x1B是ESC,只适用于xcmd_print函数*/ -#define CUU(n) "\x1B[%dA",n /* 光标向上 光标向上 行 */ -#define CUD(n) "\x1B[%dB",n /* 光标向下 光标向下 行 */ -#define CUF(n) "\x1B[%dC",n /* 光标向前 光标向前(右) 行 */ -#define CUB(n) "\x1B[%dD",n /* 光标向后 光标向后(左) 行 */ -#define CNL(n) "\x1B[%dE",n /* 光标下一行 光标从当前位置向下 行 */ -#define CPL(n) "\x1B[%dF",n /* 光标当前行 光标从当前位置向上 行 */ -#define CHA(n) "\x1B[%dG",n /* 绝对光标水平 光标在当前行中水平移动到第 个位置 */ -#define VPA(n) "\x1B[%dd",n /* 绝对垂直行位置 光标在当前列中垂直移动到第 个位置 */ -#define CUP(y,x) "\x1B[%d;%dH",y,x /* 光标位置 *光标移动到视区中的 ; 坐标,其中 行的列 */ -#define HVP(y,x) "\x1B[%d;%df",y,x /* 水平垂直位置 *光标移动到视区中的 ; 坐标,其中 行的列 */ - -/*光标可见性*/ -#define CU_START_BL "\x1B[?12h" /* ATT160 文本光标启用闪烁 开始光标闪烁 */ -#define CU_STOP_BL "\x1B[?12l" /* ATT160 文本光标禁用闪烁 停止闪烁光标 */ -#define CU_SHOW "\x1B[?25h" /* DECTCEM 文本光标启用模式显示 显示光标 */ -#define CU_HIDE "\x1B[?25l" /* DECTCEM 文本光标启用模式隐藏 隐藏光标 */ - -/* 字符操作 */ -#define ICH(n) "\x1B[%d@",n /* 插入字符 在当前光标位置插入 个空格,这会将所有现有文本移到右侧。 向右溢出屏幕的文本会被删除。*/ -#define DCH(n) "\x1B[%dP",n /* 删除字符 删除当前光标位置的 个字符,这会从屏幕右边缘以空格字符移动。*/ -#define ECH(n) "\x1B[%dX",n /* 擦除字符 擦除当前光标位置的 个字符,方法是使用空格字符覆盖它们。*/ -#define IL(n) "\x1B[%dL",n /* 插入行 将 行插入光标位置的缓冲区。 光标所在的行及其下方的行将向下移动。*/ -#define DL(n) "\x1B[%dM",n /* 删除行 从缓冲区中删除 行,从光标所在的行开始。*/ - #define CMD_IS_ENDLINE(c) ((c == '\n') || (c == '\r')) #define CMD_IS_PRINT(c) ((c >= 32) && (c <= 126)) @@ -79,7 +54,7 @@ struct #endif char display_line[XCMD_LINE_MAX_LENGTH]; /* 显示区的缓存 */ - char *prompt; /* 显示区的提示 */ + const char *prompt; /* 显示区的提示 */ uint16_t byte_num; /* 当前行的字符个数 */ uint16_t cursor; /* 光标所在位置 */ uint8_t encode_case_stu; @@ -264,7 +239,7 @@ static void xcmd_parser(uint8_t byte) } else { - xcmd_key_exec(c); + xcmd_key_exec((XCMD_KEY_T)c); } fflush(stdout); } @@ -525,6 +500,14 @@ xcmd_t *xcmd_cmdlist_get(void) return g_xcmder.cmd_list.head; } +void xcmd_set_prompt(const char* prompt) +{ + if(prompt) + { + g_xcmder.parser.prompt = prompt; + } +} + void xcmd_init( int (*get_c)(uint8_t*), int (*put_c)(uint8_t)) { if(get_c && put_c) diff --git a/src/xcmd_default_keys.c b/src/xcmd_default_keys.c index f03f6af..d3ed491 100755 --- a/src/xcmd_default_keys.c +++ b/src/xcmd_default_keys.c @@ -122,4 +122,4 @@ static xcmd_key_t default_keys[] = void default_keys_init(void) { xcmd_key_register(default_keys, sizeof(default_keys)/sizeof(xcmd_key_t)); -} \ No newline at end of file +}