增强命令参数输出的颜色显示,添加变量自动补全提示功能
This commit is contained in:
@@ -3131,7 +3131,7 @@ SH_CMD_FN(_cmd_tree)
|
||||
// 打印收到的参数
|
||||
for (int i = 0; i < argc; i++)
|
||||
{
|
||||
sh_echo(sh_hdl, "%s%s%s", i ? "" : "'", argv[i], i + 1 < argc ? " " : "'\r\n");
|
||||
sh_echo(sh_hdl, "%s" _COLOR_Y "%s" _COLOR_END "%s", i ? "" : "'", argv[i], i + 1 < argc ? " " : "'\r\n");
|
||||
}
|
||||
|
||||
// 打印命令树
|
||||
|
||||
@@ -239,6 +239,22 @@ bool vset_option_cp(sh_t *sh_hdl, int argc, const char *argv[], bool flag, const
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 对应 SET_VAR 所设置的变量的可用自动补全函数,默认补全一个 '?' 号
|
||||
*
|
||||
* @param sh_hdl 原参数
|
||||
* @param argc 原参数
|
||||
* @param argv 原参数指针值,可能被更新
|
||||
* @param flag 原参数
|
||||
*/
|
||||
void vset_cp_hint(sh_t *sh_hdl, int argc, const char *argv[], bool flag)
|
||||
{
|
||||
if (argc + flag == 1)
|
||||
{
|
||||
sh_completion_resource(sh_hdl, NULL, "? ", NULL);
|
||||
}
|
||||
}
|
||||
|
||||
int vset_unsigned(void *dest, __type_attr_t attr, vset_cb cb, const char *argv[], unsigned int low, unsigned int high)
|
||||
{
|
||||
SYS_ASSERT(s_sh_hdl, "未使用 vset_init() 初始化");
|
||||
@@ -971,7 +987,6 @@ static int _set_dest_string(void *dest, __type_attr_t attr, vset_cb cb, const ch
|
||||
switch (attr)
|
||||
{
|
||||
case __TYPE_ATTR_STR:
|
||||
memset(dest, 0, bufsize);
|
||||
if (memcmp(dest, str, str_size))
|
||||
{
|
||||
if (cb)
|
||||
@@ -981,6 +996,7 @@ static int _set_dest_string(void *dest, __type_attr_t attr, vset_cb cb, const ch
|
||||
memcpy(value, str, str_size);
|
||||
_PARAM_CB();
|
||||
}
|
||||
memset(dest, 0, bufsize);
|
||||
memcpy(dest, str, str_size);
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
|
||||
@@ -172,6 +172,83 @@ void vset_init(sh_t *sh_hdl, vset_global_cb global_cb);
|
||||
|
||||
void vset_force_cb(void);
|
||||
|
||||
/** 定义设置变量的简化形式 ***************************************************************************************/
|
||||
|
||||
/* 对应 SET_VAR 所设置的变量的可用自动补全函数,默认补全一个 '?' 号 */
|
||||
void vset_cp_hint(sh_t *sh_hdl, int argc, const char *argv[], bool flag);
|
||||
|
||||
/**
|
||||
* @brief 实例化一个变量的设置函数。
|
||||
* @param NAME 函数名称
|
||||
* @param VAR 静态变量地址,支持的类型有:无符号整形、带符号整型、单精度的浮点数
|
||||
* @param LOW 变量的最小值。变量值可用
|
||||
* @param HIGH 变量的最大值。变量值可用
|
||||
* @param CB 设置变量的回调函数。注意:只有在设置变量的值合法并且新的值与原值不相等时才会被调用。也可取值为 NULL
|
||||
*/
|
||||
#define VSET_VAR(NAME, VAR, LOW, HIGH, CB) \
|
||||
SH_CMD_FN(NAME) { return SET_VAR_CB(VAR, LOW, HIGH, CB); } \
|
||||
SH_CMD_CP_FN(_SH_CONCAT(NAME, _tab)) { vset_cp_hint(sh_hdl, argc, argv, flag); }
|
||||
|
||||
/**
|
||||
* @brief 实例化一个字符串的设置函数。
|
||||
* @param NAME 函数名称
|
||||
* @param VAR 静态字符串数组的地址
|
||||
* @param CB 设置变量的回调函数。注意:只有在设置变量的值合法并且新的值与原值不相等时才会被调用。也可取值为 NULL
|
||||
*/
|
||||
#define VSET_STR(NAME, VAR, CB) \
|
||||
SH_CMD_FN(NAME) { return SET_VAR_CB(VAR, 0, 0, CB); } \
|
||||
SH_CMD_CP_FN(_SH_CONCAT(NAME, _tab)) { vset_cp_hint(sh_hdl, argc, argv, flag); }
|
||||
|
||||
/**
|
||||
* @brief 实例化一个枚举型变量的设置函数。
|
||||
* @param NAME 函数名称
|
||||
* @param VAR 静态变量地址,支持的类型有:无符号整形、带符号整型,不支持浮点数
|
||||
* @param ENUM_STR 枚举型变量的可选值
|
||||
* @param CB 设置变量的回调函数。注意:只有在设置变量的值合法并且新的值与原值不相等时才会被调用。也可取值为 NULL
|
||||
*/
|
||||
#define VSET_ENUM(NAME, VAR, ENUM, CB) \
|
||||
SH_CMD_FN(NAME) { return SET_ENUM_CB(VAR, ENUM, CB); } \
|
||||
SH_CMD_CP_FN(_SH_CONCAT(NAME, _tab)) { SET_CP_ENUM(ENUM); }
|
||||
|
||||
/**
|
||||
* @brief 实例化一个选项的设置函数。
|
||||
* @param NAME 函数名称
|
||||
* @param ... 可变参数,选项描述结构体的数组。成员格式: {"选项", "选项的帮助信息", 设置函数, 枚举型变量的可选值 }
|
||||
* @example
|
||||
* @code
|
||||
* static int _vset_int(const char *argv[]) { return SET_VAR_CB(&g_int32, -10, 10, _vset_cb_int32); }
|
||||
* static int _vset_str(const char *argv[]) { return SET_VAR_CB(&g_str, 0, 0, _vset_cb_char); }
|
||||
* static int _vset_enum(const char *argv[]) { return SET_ENUM_CB(&g_int32, s_enum_str, _vset_cb_int32); }
|
||||
* VSET_OPTION(
|
||||
* _example,
|
||||
* {"--int32", "int32_t 类型的变量", _vset_int, NULL},
|
||||
* {"--str", "字符串 类型的变量", _vset_str, NULL},
|
||||
* {"--enum", "枚举类型的变量", _vset_enum, s_enum_str})
|
||||
* @endcode
|
||||
*/
|
||||
#define VSET_OPTION(NAME, ...) \
|
||||
static sh_vset_param_t const _SH_CONCAT(_opts_, NAME)[] = { \
|
||||
__VA_ARGS__}; \
|
||||
SH_CMD_FN(NAME) { return PSET_FN(_SH_CONCAT(_opts_, NAME)); } \
|
||||
SH_CMD_CP_FN(_SH_CONCAT(NAME, _tab)) { PSET_CP(_SH_CONCAT(_opts_, NAME)); }
|
||||
|
||||
/**
|
||||
* @brief 可替代 SH_SETUP_CMD 定义命令列表 SH_REGISTER_CMD 或 SH_DEF_SUB_CMD 中的成员
|
||||
* @param CMD 命令(字符串,不要有空格)
|
||||
* @param HELP 命令的帮助信息(字符串)
|
||||
* @param FUNC 由 VSET_VAR()、VSET_STR()、VSET_ENUM()、VSET_OPTION() 定义的函数
|
||||
* @example
|
||||
* @code
|
||||
* SH_DEF_SUB_CMD(_register_sample,
|
||||
* VSET_SETUP_CMD("ex1", "设置单个 数值 变量", _ex1), // ex1 <数值>
|
||||
* VSET_SETUP_CMD("ex2", "设置单个 字符串 变量", _ex2), // ex2 <字符串>
|
||||
* VSET_SETUP_CMD("ex3", "设置单个 枚举 变量", _ex3), // ex3 <枚举>
|
||||
* VSET_SETUP_CMD("ex4", "设置有多个选项的变量", _ex4), // ex4 [选项<值>] [选项<值>] ...
|
||||
* );
|
||||
* @endcode
|
||||
*/
|
||||
#define VSET_SETUP_CMD(CMD, HELP, FUNC) SH_SETUP_CMD(CMD, HELP, FUNC, FUNC##_tab)
|
||||
|
||||
/**
|
||||
* @note 对本函数的进一步说明。
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user