修改了key的处理方式

This commit is contained in:
hqm 2021-10-08 21:16:11 +08:00
parent a415df3cca
commit 17c76ec5a4
8 changed files with 200 additions and 165 deletions

View File

@ -1,7 +1,7 @@
/* /*
* @Author: your name * @Author: your name
* @Date: 2021-09-14 23:58:24 * @Date: 2021-09-14 23:58:24
* @LastEditTime: 2021-09-22 23:13:05 * @LastEditTime: 2021-10-08 21:51:36
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @FilePath: /xcmd/example/linux/linux_main.c * @FilePath: /xcmd/example/linux/linux_main.c
@ -16,6 +16,7 @@
#include "ex_cmds.h" #include "ex_cmds.h"
#include "socket_cmds.h" #include "socket_cmds.h"
int getch(void) int getch(void)
{ {
struct termios tm, tm_old; struct termios tm, tm_old;
@ -59,7 +60,7 @@ static int key_ctr_c(void* pv)
static xcmd_key_t keys[] = static xcmd_key_t keys[] =
{ {
{CTR_C, key_ctr_c, "ctr+c", NULL}, {KEY_CTR_C, key_ctr_c, "ctr+c", NULL},
}; };
void user_keys_init(void) void user_keys_init(void)

View File

@ -49,11 +49,11 @@ static int xcmd_ctr_l(void *pv)
static xcmd_key_t ex_keys[] = static xcmd_key_t ex_keys[] =
{ {
{CTR_A, xcmd_ctr_a, "ctr+a", NULL}, {KEY_CTR_A, xcmd_ctr_a, "ctr+a", NULL},
{CTR_E, xcmd_ctr_e, "ctr+e", NULL}, {KEY_CTR_E, xcmd_ctr_e, "ctr+e", NULL},
{CTR_U, xcmd_ctr_u, "ctr+u", NULL}, {KEY_CTR_U, xcmd_ctr_u, "ctr+u", NULL},
{CTR_K, xcmd_ctr_k, "ctr+k", NULL}, {KEY_CTR_K, xcmd_ctr_k, "ctr+k", NULL},
{CTR_L, xcmd_ctr_l, "ctr+l", NULL}, {KEY_CTR_L, xcmd_ctr_l, "ctr+l", NULL},
}; };

View File

@ -154,7 +154,7 @@ static int cmd_ctr_q(void* pv)
static xcmd_t cmds[] = static xcmd_t cmds[] =
{ {
{"echo", cmd_echo, "echo anything", NULL}, {"echo", cmd_echo, "echo [msg]", NULL},
{"history", cmd_history, "show history list", NULL}, {"history", cmd_history, "show history list", NULL},
{"example", cmd_example, "example [-f|-i|-s] [val]", NULL}, {"example", cmd_example, "example [-f|-i|-s] [val]", NULL},
{"delcmd", cmd_delete_cmd, "delete cmd [val]", NULL}, {"delcmd", cmd_delete_cmd, "delete cmd [val]", NULL},
@ -163,7 +163,7 @@ static xcmd_t cmds[] =
static xcmd_key_t keys[] = static xcmd_key_t keys[] =
{ {
{CTR_Q, cmd_ctr_q, "ctr+q", NULL}, {KEY_CTR_Q, cmd_ctr_q, "ctr+q", NULL},
}; };
void test_cmd_init(void) void test_cmd_init(void)

View File

@ -27,7 +27,7 @@ typedef struct __cmd
typedef struct __key typedef struct __key
{ {
XCMD_KEY_T key; char* key;
cmd_key_func_t func; cmd_key_func_t func;
char* help; char* help;
struct __key *next; struct __key *next;
@ -153,6 +153,13 @@ char* xcmd_display_get(void);
void xcmd_display_print(const char *msg); void xcmd_display_print(const char *msg);
void xcmd_display_write(const char* buf, uint16_t len); void xcmd_display_write(const char* buf, uint16_t len);
/**
* @description:
* @param {*}
* @return {*}
*/
char* xcmd_display_line_end(void);
/** /**
* @description: * @description:
* @param {*} * @param {*}
@ -167,6 +174,14 @@ uint16_t xcmd_display_cursor_get(void);
* @return {*} * @return {*}
*/ */
void xcmd_set_prompt(const char* prompt); void xcmd_set_prompt(const char* prompt);
const char* xcmd_get_prompt(void);
/**
* @description:
* @param {func_p} 01
* @return {*}
*/
void xcmd_register_rcv_hook_func(uint8_t(*func_p)(char*));
/** /**
* @description: * @description:

View File

@ -1,7 +1,7 @@
/* /*
* @Author: your name * @Author: your name
* @Date: 2021-09-17 23:03:06 * @Date: 2021-09-17 23:03:06
* @LastEditTime: 2021-09-22 21:59:50 * @LastEditTime: 2021-10-08 21:52:29
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @FilePath: /xcmd/inc/xcmd_confg.h * @FilePath: /xcmd/inc/xcmd_confg.h

View File

@ -14,80 +14,87 @@
extern "C" { extern "C" {
#endif #endif
typedef enum #define KEY_CTR_A "\x01"
{ #define KEY_CTR_B "\x02"
CTR_A = 1, #define KEY_CTR_C "\x03"
CTR_B = 2, #define KEY_CTR_D "\x04"
CTR_C = 3, #define KEY_CTR_E "\x05"
CTR_D = 4, #define KEY_CTR_F "\x06"
CTR_E = 5, #define KEY_CTR_G "\x07"
CTR_F = 6, #define KEY_CTR_H "\x08"
CTR_G = 7, #define KEY_CTR_I "\x09"
CTR_H = 8, #define KEY_TAB "\x09"
BACKSPACE = 8, #define KEY_CTR_J "\x0A"
CTR_I = 9, #define KEY_CTR_K "\x0B"
LF = 9, #define KEY_CTR_L "\x0C"
TAB = 9, #define KEY_CTR_M "\x0D"
CTR_J = 10, #define KEY_CTR_N "\x0E"
CTR_K = 11, #define KEY_CTR_O "\x0F"
CTR_L = 12, #define KEY_CTR_P "\x10"
CTR_M = 13, #define KEY_CTR_Q "\x11"
CR = 13, #define KEY_CTR_R "\x12"
CTR_N = 14, #define KEY_CTR_S "\x13"
CTR_O = 15, #define KEY_CTR_T "\x14"
CTR_P = 16, #define KEY_CTR_U "\x15"
CTR_Q = 17, #define KEY_CTR_V "\x16"
CTR_R = 18, #define KEY_CTR_W "\x17"
CTR_S = 19, #define KEY_CTR_X "\x18"
CTR_T = 20, #define KEY_CTR_Y "\x19"
CTR_U = 21, #define KEY_CTR_Z "\x1A"
CTR_V = 22, #define KEY_PAUSE "\x1A"
CTR_W = 23, #define KEY_ESC "\x1B"
CTR_X = 24, #define KEY_BACKSPACE "\x7F"
CTR_Y = 25, #define KEY_UP "\x1B[A"
CTR_Z = 26, #define KEY_DW "\x1B[B"
ESC = 27, #define KEY_RIGHT "\x1B[C"
FS = 28, #define KEY_LEFT "\x1B[D"
GS = 29, #define KEY_HOME "\x1B[H"
RS = 30, #define KEY_EMD "\x1B[F"
US = 31, #define KEY_CTR_UP "\x1B[1;5A"
L_DELETE = 127, #define KEY_CTR_DW "\x1B[1;5B"
UP = 0x00415B1B, #define KEY_CTR_RIGHT "\x1B[1;5C"
DW = 0x00425B1B, #define KEY_CTR_LEFT "\x1B[1;5D"
RIGHT = 0x00435B1B, #define KEY_INSERT "\x1B[2~"
LEFT = 0x00445B1B, #define KEY_DELETE "\x1B[3~"
END = 0x00465B1B, #define KEY_PAGE_UP "\x1B[5~"
HOME = 0x00485B1B, #define KEY_PAGE_DOWN "\x1B[6~"
INSERT = 0x7E325B1B, #define KEY_F1 "\x1BOP"
R_DELETE = 0x7E335B1B, #define KEY_F2 "\x1BOQ"
PGUP = 0x7E355B1B, #define KEY_F3 "\x1BOR"
PGDW = 0x7E365B1B, #define KEY_F4 "\x1BOS"
}XCMD_KEY_T; #define KEY_F5 "\x1B[15~"
#define KEY_F6 "\x1B[17~"
#define KEY_F7 "\x1B[18~"
#define KEY_F8 "\x1B[19~"
#define KEY_F9 "\x1B[20~"
#define KEY_F10 "\x1B[21~"
#define KEY_F11 "\x1B[23~"
#define KEY_F12 "\x1B[24~"
/*光标操作符其中0x1B是ESC只适用于xcmd_print函数*/ /*光标操作符其中0x1B是ESC只适用于xcmd_print函数*/
#define CUU(n) "\x1B[%dA",n /* 光标向上 光标向上 <n> 行 */ #define CUU(n) "\x1B[%dA",n /* 光标向上 光标向上 <n> 行 */
#define CUD(n) "\x1B[%dB",n /* 光标向下 光标向下 <n> 行 */ #define CUD(n) "\x1B[%dB",n /* 光标向下 光标向下 <n> 行 */
#define CUF(n) "\x1B[%dC",n /* 光标向前 光标向前(右)<n> 行 */ #define CUF(n) "\x1B[%dC",n /* 光标向前 光标向前(右)<n> 行 */
#define CUB(n) "\x1B[%dD",n /* 光标向后 光标向后(左)<n> 行 */ #define CUB(n) "\x1B[%dD",n /* 光标向后 光标向后(左)<n> 行 */
#define CNL(n) "\x1B[%dE",n /* 光标下一行 光标从当前位置向下 <n> 行 */ #define CNL(n) "\x1B[%dE",n /* 光标下一行 光标从当前位置向下 <n> 行 */
#define CPL(n) "\x1B[%dF",n /* 光标当前行 光标从当前位置向上 <n> 行 */ #define CPL(n) "\x1B[%dF",n /* 光标当前行 光标从当前位置向上 <n> 行 */
#define CHA(n) "\x1B[%dG",n /* 绝对光标水平 光标在当前行中水平移动到第 <n> 个位置 */ #define CHA(n) "\x1B[%dG",n /* 绝对光标水平 光标在当前行中水平移动到第 <n> 个位置 */
#define VPA(n) "\x1B[%dd",n /* 绝对垂直行位置 光标在当前列中垂直移动到第 <n> 个位置 */ #define VPA(n) "\x1B[%dd",n /* 绝对垂直行位置 光标在当前列中垂直移动到第 <n> 个位置 */
#define CUP(y,x) "\x1B[%d;%dH",y,x /* 光标位置 *光标移动到视区中的 <x>; <y> 坐标,其中 <x> 是 <y> 行的列 */ #define CUP(y,x) "\x1B[%d;%dH",y,x /* 光标位置 *光标移动到视区中的 <x>; <y> 坐标,其中 <x> 是 <y> 行的列 */
#define HVP(y,x) "\x1B[%d;%df",y,x /* 水平垂直位置 *光标移动到视区中的 <x>; <y> 坐标,其中 <x> 是 <y> 行的列 */ #define HVP(y,x) "\x1B[%d;%df",y,x /* 水平垂直位置 *光标移动到视区中的 <x>; <y> 坐标,其中 <x> 是 <y> 行的列 */
/*光标可见性*/ /*光标可见性*/
#define CU_START_BL "\x1B[?12h" /* ATT160 文本光标启用闪烁 开始光标闪烁 */ #define CU_START_BL "\x1B[?12h" /* ATT160 文本光标启用闪烁 开始光标闪烁 */
#define CU_STOP_BL "\x1B[?12l" /* ATT160 文本光标禁用闪烁 停止闪烁光标 */ #define CU_STOP_BL "\x1B[?12l" /* ATT160 文本光标禁用闪烁 停止闪烁光标 */
#define CU_SHOW "\x1B[?25h" /* DECTCEM 文本光标启用模式显示 显示光标 */ #define CU_SHOW "\x1B[?25h" /* DECTCEM 文本光标启用模式显示 显示光标 */
#define CU_HIDE "\x1B[?25l" /* DECTCEM 文本光标启用模式隐藏 隐藏光标 */ #define CU_HIDE "\x1B[?25l" /* DECTCEM 文本光标启用模式隐藏 隐藏光标 */
/* 字符操作 */ /* 字符操作 */
#define ICH(n) "\x1B[%d@",n /* 插入字符 在当前光标位置插入 <n> 个空格,这会将所有现有文本移到右侧。 向右溢出屏幕的文本会被删除。*/ #define ICH(n) "\x1B[%d@",n /* 插入字符 在当前光标位置插入 <n> 个空格,这会将所有现有文本移到右侧。 向右溢出屏幕的文本会被删除。*/
#define DCH(n) "\x1B[%dP",n /* 删除字符 删除当前光标位置的 <n> 个字符,这会从屏幕右边缘以空格字符移动。*/ #define DCH(n) "\x1B[%dP",n /* 删除字符 删除当前光标位置的 <n> 个字符,这会从屏幕右边缘以空格字符移动。*/
#define ECH(n) "\x1B[%dX",n /* 擦除字符 擦除当前光标位置的 <n> 个字符,方法是使用空格字符覆盖它们。*/ #define ECH(n) "\x1B[%dX",n /* 擦除字符 擦除当前光标位置的 <n> 个字符,方法是使用空格字符覆盖它们。*/
#define IL(n) "\x1B[%dL",n /* 插入行 将 <n> 行插入光标位置的缓冲区。 光标所在的行及其下方的行将向下移动。*/ #define IL(n) "\x1B[%dL",n /* 插入行 将 <n> 行插入光标位置的缓冲区。 光标所在的行及其下方的行将向下移动。*/
#define DL(n) "\x1B[%dM",n /* 删除行 从缓冲区中删除 <n> 行,从光标所在的行开始。*/ #define DL(n) "\x1B[%dM",n /* 删除行 从缓冲区中删除 <n> 行,从光标所在的行开始。*/
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -7,6 +7,9 @@
#include <string.h> #include <string.h>
#define CMD_IS_ENDLINE(c) ((c == '\n') || (c == '\r')) #define CMD_IS_ENDLINE(c) ((c == '\n') || (c == '\r'))
#define CMD_IS_END_KEY(c) ( ((c >= 'A') && (c <= 'D')) || ((c >= 'P') && (c <= 'S')) || \
(c == '~') || (c == 'H') || (c == 'F'))
#define CMD_IS_PRINT(c) ((c >= 32) && (c <= 126)) #define CMD_IS_PRINT(c) ((c >= 32) && (c <= 126))
typedef struct __history typedef struct __history
@ -59,11 +62,14 @@ struct
uint16_t byte_num; /* 当前行的字符个数 */ uint16_t byte_num; /* 当前行的字符个数 */
uint16_t cursor; /* 光标所在位置 */ uint16_t cursor; /* 光标所在位置 */
uint8_t encode_case_stu; uint8_t encode_case_stu;
char encode_buf[7];
uint8_t encode_count;
uint32_t key_val; uint32_t key_val;
uint16_t param_len; uint16_t param_len;
uint8_t (*recv_hook_func)(char*); /* 解释器接收钩子函数返回0则接收到的数据会返回给解释器返回1则不会 */
}parser; }parser;
uint8_t _initOK; uint8_t _initOK;
} g_xcmder; } g_xcmder = {0};
static char *xcmd_strpbrk(char*s, const char *delim) //返回s1中第一个满足条件的字符的指针, 并且保留""号内的源格式 static char *xcmd_strpbrk(char*s, const char *delim) //返回s1中第一个满足条件的字符的指针, 并且保留""号内的源格式
{ {
@ -192,12 +198,12 @@ static void xcmd_cmd_match(int argc, char*argv[])
} }
} }
static void xcmd_key_match(XCMD_KEY_T key) static void xcmd_key_match(char* key)
{ {
xcmd_key_t *p = g_xcmder.key_list.head; xcmd_key_t *p = g_xcmder.key_list.head;
while(p) while(p)
{ {
if(p->key == key) if(strcmp(key, p->key) == 0)
{ {
p->func(&g_xcmder); p->func(&g_xcmder);
break; break;
@ -206,72 +212,56 @@ static void xcmd_key_match(XCMD_KEY_T key)
} }
} }
static void xcmd_key_exec(XCMD_KEY_T key) static void xcmd_key_exec(char* key)
{ {
xcmd_key_match(key); xcmd_key_match(key);
} }
static uint8_t xcmd_rcv_encode(uint8_t byte)
static uint32_t xcmd_bytes_encode(uint8_t byte)
{ {
uint32_t ret = byte; uint8_t ret = 0;
switch(g_xcmder.parser.encode_case_stu)
{
case 0:
if(byte==0x1B) //1~2
{
g_xcmder.parser.encode_case_stu = 1;
g_xcmder.parser.key_val = byte;
ret = 0;
}
break;
case 1:
if(byte==0x5B)
{
g_xcmder.parser.encode_case_stu++;
g_xcmder.parser.key_val |= (uint32_t)byte<<8;
ret = 0;
}
else
{
g_xcmder.parser.encode_case_stu = 0;
}
break;
case 2:
if(byte >= 0x41)
{
g_xcmder.parser.encode_case_stu = 0;
g_xcmder.parser.key_val |= (uint32_t)byte<<16;
ret = g_xcmder.parser.key_val;
}
else
{
g_xcmder.parser.encode_case_stu++;
g_xcmder.parser.key_val |= (uint32_t)byte<<16;
ret = 0;
}
break;
case 3:
if(byte == 0x7E)
{
g_xcmder.parser.encode_case_stu = 0;
g_xcmder.parser.key_val |= (uint32_t)byte<<24;
ret = g_xcmder.parser.key_val;
}
else
{
g_xcmder.parser.encode_case_stu = 0;
}
break;
default:
break;
}
return ret; switch (g_xcmder.parser.encode_case_stu)
{
case 0:
g_xcmder.parser.encode_count = 0;
if (byte == 0x1B) //ESC
{
g_xcmder.parser.encode_case_stu = 1;
g_xcmder.parser.key_val = byte;
}
else
{
g_xcmder.parser.encode_buf[g_xcmder.parser.encode_count++] = byte;
g_xcmder.parser.encode_buf[g_xcmder.parser.encode_count] = '\0';
ret = 1;
}
break;
case 1:
if (CMD_IS_END_KEY(byte))
{
g_xcmder.parser.encode_buf[g_xcmder.parser.encode_count++] = byte;
g_xcmder.parser.encode_buf[g_xcmder.parser.encode_count] = '\0';
ret = g_xcmder.parser.encode_count;
g_xcmder.parser.encode_case_stu = 0;
}
else
{
g_xcmder.parser.encode_buf[g_xcmder.parser.encode_count++] = byte;
if (g_xcmder.parser.encode_count >= 6)
{
g_xcmder.parser.encode_case_stu = 0;
ret = 0;
}
}
break;
default:
break;
}
return ret;
} }
static char* xcmd_line_end(void) char* xcmd_display_line_end(void)
{ {
char* ret = g_xcmder.parser.display_line; char* ret = g_xcmder.parser.display_line;
if(g_xcmder.parser.byte_num) if(g_xcmder.parser.byte_num)
@ -299,30 +289,28 @@ static char* xcmd_line_end(void)
static void xcmd_parser(uint8_t byte) static void xcmd_parser(uint8_t byte)
{ {
uint32_t c = 0; uint32_t num = 0;
c = xcmd_bytes_encode(byte); num = xcmd_rcv_encode(byte);
if(CMD_IS_PRINT(c)) if(num > 0)
{ {
xcmd_display_insert_char(c); if(num == 1)
}
else if(CMD_IS_ENDLINE(c))
{
char *cmd = xcmd_line_end();
xcmd_print("\n\r");
if(cmd[0])
{ {
xcmd_exec(cmd); if( !(g_xcmder.parser.recv_hook_func && g_xcmder.parser.recv_hook_func(g_xcmder.parser.encode_buf)) )
cmd[0] = '\0'; {
if(CMD_IS_PRINT(g_xcmder.parser.encode_buf[0]))
{
xcmd_display_insert_char(g_xcmder.parser.encode_buf[0]);
return;
}
else
{
xcmd_key_exec(g_xcmder.parser.encode_buf);
}
}
} }
xcmd_print("%s", g_xcmder.parser.prompt);
} }
else
{
xcmd_key_exec((XCMD_KEY_T)c);
}
fflush(stdout);
} }
void xcmd_print(const char *fmt, ...) void xcmd_print(const char *fmt, ...)
@ -646,6 +634,16 @@ void xcmd_set_prompt(const char* prompt)
} }
} }
const char* xcmd_get_prompt(void)
{
return g_xcmder.parser.prompt;
}
void xcmd_register_rcv_hook_func(uint8_t(*func_p)(char*))
{
g_xcmder.parser.recv_hook_func = func_p;
}
void xcmd_init( int (*get_c)(uint8_t*), int (*put_c)(uint8_t)) void xcmd_init( int (*get_c)(uint8_t*), int (*put_c)(uint8_t))
{ {
if(get_c && put_c) if(get_c && put_c)

View File

@ -29,6 +29,19 @@ static int xcmd_del_char(void *pv)
return 0; return 0;
} }
static int xcmd_enter(void *pv)
{
char *cmd = xcmd_display_line_end();
xcmd_print("\n\r");
if(cmd[0])
{
xcmd_exec(cmd);
cmd[0] = '\0';
}
xcmd_print("%s", xcmd_get_prompt());
return 0;
}
static int xcmd_cursor_left(void *pv) static int xcmd_cursor_left(void *pv)
{ {
uint16_t pos = xcmd_display_cursor_get(); uint16_t pos = xcmd_display_cursor_get();
@ -125,14 +138,15 @@ static int xcmd_auto_completion(void *pv)
static xcmd_key_t default_keys[] = static xcmd_key_t default_keys[] =
{ {
{BACKSPACE, xcmd_del_char, "backspace", NULL}, {KEY_CTR_M, xcmd_enter, "enter", NULL},
{L_DELETE, xcmd_del_char, "left delete", NULL}, {KEY_CTR_H, xcmd_del_char, "backspace", NULL},
{LEFT, xcmd_cursor_left, "left", NULL}, {KEY_BACKSPACE, xcmd_del_char, "delete", NULL},
{RIGHT, xcmd_cursor_right, "right", NULL}, {KEY_LEFT, xcmd_cursor_left, "left", NULL},
{TAB, xcmd_auto_completion, "tab", NULL}, {KEY_RIGHT, xcmd_cursor_right, "right", NULL},
{KEY_TAB, xcmd_auto_completion, "tab", NULL},
#if XCMD_HISTORY_MAX_NUM #if XCMD_HISTORY_MAX_NUM
{DW, xcmd_history_dw, "down", NULL}, {KEY_DW, xcmd_history_dw, "down", NULL},
{UP, xcmd_history_up, "up", NULL}, {KEY_UP, xcmd_history_up, "up", NULL},
#endif #endif
}; };