Change-Id: I682f1f579844e62bfea7fe47c9073b3c00d4ab63
This commit is contained in:
weidonglin 2021-10-05 18:20:37 +08:00
commit a415df3cca
7 changed files with 84 additions and 27 deletions

1
.gitignore vendored
View File

@ -3,6 +3,7 @@
*Output/
*DebugConfig/
*Listings/
*OBJ/
#file
xcmder

View File

@ -1,9 +1,12 @@
# xcmd
#### 效果展示
![输入图片说明](https://images.gitee.com/uploads/images/2021/0922/220957_66faa768_1680380.gif "演示1.gif")
#### 介绍
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));
}
```
#### 效果展示
![输入图片说明](https://images.gitee.com/uploads/images/2021/0922/220957_66faa768_1680380.gif "演示1.gif")
#### 其他
流程图需要使用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)

View File

@ -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)

View File

@ -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[])

View File

@ -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
}

View File

@ -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;

View File

@ -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},