Merge branch 'dev' of https://gitee.com/two_salted_eggs/xcmd into HEAD
Change-Id: I682f1f579844e62bfea7fe47c9073b3c00d4ab63
This commit is contained in:
commit
a415df3cca
|
@ -3,6 +3,7 @@
|
|||
*Output/
|
||||
*DebugConfig/
|
||||
*Listings/
|
||||
*OBJ/
|
||||
|
||||
#file
|
||||
xcmder
|
||||
|
|
19
README.md
19
README.md
|
@ -1,9 +1,12 @@
|
|||
# xcmd
|
||||
|
||||
#### 效果展示
|
||||

|
||||
|
||||
#### 介绍
|
||||
xcmd是一款单片机命令行工具,移植十分方便,并且对flash与ram占用很小,旨在为单片机提供一个能够快速搭建且占用资源很小的命令行工具,可以大大加快单片机程序调试工作,它有一下几个优点。
|
||||
1. **移植十分简单**
|
||||
2. **资源占用很少,最小约8K rom以及800多Byte ram**
|
||||
2. **资源占用约8K rom 1K ram**
|
||||
1. **支持历史记录**
|
||||
2. **支持命令自动补全**
|
||||
3. **支持注册快捷键**
|
||||
|
@ -154,9 +157,6 @@ void test_keys_init(void)
|
|||
xcmd_key_register(user_keys, sizeof(user_keys)/sizeof(xcmd_key_t));
|
||||
}
|
||||
```
|
||||
#### 效果展示
|
||||

|
||||
|
||||
#### 其他
|
||||
流程图需要使用drawio来打开,可以使用vscode drawio的插件来打开
|
||||
|
||||
|
@ -167,4 +167,13 @@ void test_keys_init(void)
|
|||
##### 添加终端颜色/字体控制扩展
|
||||
##### 修改xcmd_get_param函数(已完成)
|
||||
1. 替换strtok函数为其他可复用函数
|
||||
2. 增加对“”的支持
|
||||
2. 增加对“”的支持
|
||||
##### 增加socket相关扩展
|
||||
1. tcp client/service
|
||||
2. udp client/service
|
||||
3. udp 广播
|
||||
4. udp 组播
|
||||
|
||||
##### 增加操作系统支持
|
||||
1. linux (demo only for linux example)
|
||||
2. FreeRTOS (demo only for esp32)
|
|
@ -40,6 +40,10 @@ static void xcmd_udp_client(int argc ,char**argv)
|
|||
}
|
||||
close(udp);
|
||||
}
|
||||
else
|
||||
{
|
||||
xcmd_print("Usage: udp_client ip port msg");
|
||||
}
|
||||
}
|
||||
|
||||
void xcmd_udp_service(int argc, char** argv)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @Author: your name
|
||||
* @Date: 2021-09-22 22:33:17
|
||||
* @LastEditTime: 2021-09-22 23:17:02
|
||||
* @LastEditTime: 2021-09-29 22:35:29
|
||||
* @LastEditors: Please set LastEditors
|
||||
* @Description: In User Settings Edit
|
||||
* @FilePath: /xcmd/extensions/test/test.c
|
||||
|
@ -93,11 +93,24 @@ static void cmd_example(int argc, char* argv[])
|
|||
static void cmd_history(int argc, char* argv[])
|
||||
{
|
||||
uint16_t len = xcmd_history_len();
|
||||
xcmd_history_reset();
|
||||
|
||||
do
|
||||
{
|
||||
xcmd_print("%s\r\n", xcmd_history_next());
|
||||
xcmd_history_next();
|
||||
}while(len--);
|
||||
|
||||
while(1)
|
||||
{
|
||||
char *line = xcmd_history_prev();
|
||||
if(line)
|
||||
{
|
||||
xcmd_print("%s\r\n", line);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void cmd_delete_cmd(int argc, char* argv[])
|
||||
|
|
|
@ -150,7 +150,8 @@ char* xcmd_display_get(void);
|
|||
* @param {char*} 要现实的内容
|
||||
* @return 无
|
||||
*/
|
||||
void xcmd_display_set(const char *msg);
|
||||
void xcmd_display_print(const char *msg);
|
||||
void xcmd_display_write(const char* buf, uint16_t len);
|
||||
|
||||
/**
|
||||
* @description: 光标操作函数
|
||||
|
@ -207,7 +208,7 @@ char *xcmd_history_current(void);
|
|||
* @param {*}
|
||||
* @return 无
|
||||
*/
|
||||
void xcmd_history_reset(void);
|
||||
void xcmd_history_slider_reset(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
24
src/xcmd.c
24
src/xcmd.c
|
@ -4,6 +4,7 @@
|
|||
#include "xcmd_default_keys.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define CMD_IS_ENDLINE(c) ((c == '\n') || (c == '\r'))
|
||||
#define CMD_IS_PRINT(c) ((c >= 32) && (c <= 126))
|
||||
|
@ -53,7 +54,7 @@ struct
|
|||
}history_list;
|
||||
#endif
|
||||
|
||||
char display_line[XCMD_LINE_MAX_LENGTH]; /* 显示区的缓存 */
|
||||
char display_line[XCMD_LINE_MAX_LENGTH+1]; /* 显示区的缓存 */
|
||||
const char *prompt; /* 显示区的提示 */
|
||||
uint16_t byte_num; /* 当前行的字符个数 */
|
||||
uint16_t cursor; /* 光标所在位置 */
|
||||
|
@ -291,7 +292,7 @@ static char* xcmd_line_end(void)
|
|||
#endif
|
||||
g_xcmder.parser.byte_num = 0;
|
||||
g_xcmder.parser.cursor = 0;
|
||||
xcmd_history_reset();
|
||||
xcmd_history_slider_reset();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -339,16 +340,27 @@ void xcmd_print(const char *fmt, ...)
|
|||
return;
|
||||
}
|
||||
|
||||
void xcmd_display_set(const char *msg)
|
||||
void xcmd_display_write(const char* buf, uint16_t len)
|
||||
{
|
||||
xcmd_display_clear();
|
||||
uint16_t len = strlen(msg);
|
||||
strncpy(g_xcmder.parser.display_line, msg, XCMD_LINE_MAX_LENGTH);
|
||||
if(len > XCMD_LINE_MAX_LENGTH)
|
||||
{
|
||||
len = XCMD_LINE_MAX_LENGTH;
|
||||
}
|
||||
memcpy(g_xcmder.parser.display_line, buf, len);
|
||||
g_xcmder.parser.display_line[len] = '\0';
|
||||
xcmd_print(g_xcmder.parser.display_line);
|
||||
g_xcmder.parser.byte_num = len;
|
||||
g_xcmder.parser.cursor = len;
|
||||
}
|
||||
|
||||
void xcmd_display_print(const char *msg)
|
||||
{
|
||||
xcmd_display_write(msg, strlen(msg));
|
||||
}
|
||||
|
||||
|
||||
|
||||
char* xcmd_display_get(void)
|
||||
{
|
||||
char *line = g_xcmder.parser.display_line;
|
||||
|
@ -517,7 +529,7 @@ uint16_t xcmd_history_len(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
void xcmd_history_reset(void)
|
||||
void xcmd_history_slider_reset(void)
|
||||
{
|
||||
#if XCMD_HISTORY_MAX_NUM
|
||||
g_xcmder.parser.history_list.slider = g_xcmder.parser.history_list.head;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @Author: your name
|
||||
* @Date: 2021-09-15 00:11:50
|
||||
* @LastEditTime: 2021-09-17 23:18:12
|
||||
* @LastEditTime: 2021-09-29 22:00:26
|
||||
* @LastEditors: Please set LastEditors
|
||||
* @Description: In User Settings Edit
|
||||
* @FilePath: /xcmd/src/xcmd_default_keys.c
|
||||
|
@ -10,6 +10,19 @@
|
|||
#include "xcmd.h"
|
||||
#include "xcmd_default_keys.h"
|
||||
|
||||
static int xcmd_str_match(const char* str1, const char* str2)
|
||||
{
|
||||
int i=0;
|
||||
for(i=0; str1[i] && str2[i]; i++)
|
||||
{
|
||||
if(str1[i] != str2[i])
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
static int xcmd_del_char(void *pv)
|
||||
{
|
||||
xcmd_display_delete_char();
|
||||
|
@ -40,7 +53,7 @@ static int xcmd_history_dw(void *pv)
|
|||
char *line = xcmd_history_prev();
|
||||
if(line)
|
||||
{
|
||||
xcmd_display_set(line);
|
||||
xcmd_display_print(line);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -54,19 +67,18 @@ static int xcmd_history_up(void *pv)
|
|||
char *line = xcmd_history_next();
|
||||
if(line)
|
||||
{
|
||||
xcmd_display_set(line);
|
||||
xcmd_display_print(line);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int xcmd_auto_completion(void *pv)
|
||||
{
|
||||
xcmd_t *match_cmd = NULL;
|
||||
xcmd_t *match_cmd_first = NULL;
|
||||
uint16_t match_num = 0;
|
||||
uint16_t match_subscript_min = 0;
|
||||
xcmd_t *p = xcmd_cmdlist_get();
|
||||
char *display_line = xcmd_display_get();
|
||||
char display_backup[XCMD_LINE_MAX_LENGTH];
|
||||
strncpy(display_backup, display_line, XCMD_LINE_MAX_LENGTH);
|
||||
uint16_t cursor_pos = xcmd_display_cursor_get();
|
||||
while(p)
|
||||
{
|
||||
|
@ -74,11 +86,12 @@ static int xcmd_auto_completion(void *pv)
|
|||
{
|
||||
if(match_num == 0)
|
||||
{
|
||||
match_cmd = p;
|
||||
match_cmd_first = p;
|
||||
match_subscript_min = strlen(p->name);
|
||||
}
|
||||
else if(match_num == 1)
|
||||
{
|
||||
xcmd_print("\r\n%-15s%-15s", match_cmd->name, p->name);
|
||||
xcmd_print("\r\n%-15s%-15s", match_cmd_first->name, p->name);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -88,6 +101,11 @@ static int xcmd_auto_completion(void *pv)
|
|||
xcmd_print("\r\n");
|
||||
}
|
||||
}
|
||||
uint16_t subscript = xcmd_str_match(match_cmd_first->name, p->name);
|
||||
if( subscript < match_subscript_min)
|
||||
{
|
||||
match_subscript_min = subscript;
|
||||
}
|
||||
match_num++;
|
||||
}
|
||||
p = p->next;
|
||||
|
@ -95,17 +113,16 @@ static int xcmd_auto_completion(void *pv)
|
|||
|
||||
if(match_num == 1)
|
||||
{
|
||||
xcmd_display_set(match_cmd->name);
|
||||
xcmd_display_print(match_cmd_first->name);
|
||||
}
|
||||
else if(match_num > 1)
|
||||
{
|
||||
xcmd_print("\r\n");
|
||||
xcmd_display_set(display_backup);
|
||||
xcmd_display_write(match_cmd_first->name, match_subscript_min);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static xcmd_key_t default_keys[] =
|
||||
{
|
||||
{BACKSPACE, xcmd_del_char, "backspace", NULL},
|
||||
|
|
Loading…
Reference in New Issue