更新模板到最新状态
This commit is contained in:
@@ -25,11 +25,11 @@
|
||||
#define _TYPE_FLAG_FLOAT (1 << 2)
|
||||
#define _TYPE_FLAG_STRING (1 << 3)
|
||||
|
||||
#define _PARAM_CB() \
|
||||
do \
|
||||
{ \
|
||||
if (param->cb) \
|
||||
param->cb(s_sh_hdl, &value); \
|
||||
#define _PARAM_CB() \
|
||||
do \
|
||||
{ \
|
||||
if (cb) \
|
||||
cb(s_sh_hdl, &value); \
|
||||
} while (0)
|
||||
|
||||
static sh_t *s_sh_hdl;
|
||||
@@ -40,19 +40,19 @@ static const sh_vset_param_t *_find_option(const char *input, const sh_vset_para
|
||||
static bool _do_completing_option(sh_t *sh_hdl, int argc, const char *argv[], const sh_vset_param_t *p, unsigned size);
|
||||
static bool _do_completing_enum(const char *option, const sh_vset_param_t *p, unsigned size);
|
||||
|
||||
static int _set_dest_unsigned(const __vset_param_t *param, unsigned int value, unsigned int low, unsigned int high);
|
||||
static int _set_dest_integer(const __vset_param_t *param, signed int value, signed int low, signed int high);
|
||||
static int _set_dest_float(const __vset_param_t *param, float value, float low, float high);
|
||||
static int _set_dest_string(const __vset_param_t *param, const char *str, unsigned bufsize);
|
||||
static int _set_dest_enum(const __vset_param_t *param, const char *value, int type_flag);
|
||||
static int _set_dest_unsigned(void *dest, __type_attr_t attr, vset_cb cb, unsigned int value, unsigned int low, unsigned int high);
|
||||
static int _set_dest_integer(void *dest, __type_attr_t attr, vset_cb cb, signed int value, signed int low, signed int high);
|
||||
static int _set_dest_float(void *dest, __type_attr_t attr, vset_cb cb, float value, float low, float high);
|
||||
static int _set_dest_string(void *dest, __type_attr_t attr, vset_cb cb, const char *str, unsigned bufsize);
|
||||
static int _set_dest_enum(void *dest, __type_attr_t attr, vset_cb cb, const char *value, int type_flag);
|
||||
|
||||
static unsigned int _get_unsigned(const __vset_param_t *param);
|
||||
static signed int _get_integer(const __vset_param_t *param);
|
||||
static float _get_float(const __vset_param_t *param);
|
||||
static char *_get_string(const __vset_param_t *param);
|
||||
static unsigned int _get_unsigned(void *dest, __type_attr_t attr);
|
||||
static signed int _get_integer(void *dest, __type_attr_t attr);
|
||||
static float _get_float(void *dest, __type_attr_t attr);
|
||||
static char *_get_string(void *dest, __type_attr_t attr);
|
||||
static int _enum_format(char *enum_buf, int buf_len, const char *enum_str);
|
||||
static int _get_enum_by_key(const char *key, char **match_value, char *enum_buf);
|
||||
static int _get_enum_by_param(const __vset_param_t *param, char **match_key, char **match_value, char *enum_buf, bool print_list, bool print_cp);
|
||||
static int _get_enum_by_param(void *dest, __type_attr_t attr, char **match_key, char **match_value, char *enum_buf, bool print_list, bool print_cp);
|
||||
|
||||
/**
|
||||
* @brief s_attr_to_type_tbl
|
||||
@@ -78,12 +78,12 @@ static int const s_attr_to_type_tbl[] = {
|
||||
* @brief 初始化设置
|
||||
*
|
||||
* @param sh_hdl 设置 shell 的句柄
|
||||
* @param cb 当任意一个值被修改时回调此函数,可设为 NULL
|
||||
* @param global_cb 当任意一个值被修改时回调此函数,可设为 NULL
|
||||
*/
|
||||
void vset_init(sh_t *sh_hdl, vset_global_cb cb)
|
||||
void vset_init(sh_t *sh_hdl, vset_global_cb global_cb)
|
||||
{
|
||||
s_sh_hdl = sh_hdl;
|
||||
s_global_cb = cb;
|
||||
s_global_cb = global_cb;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -92,10 +92,10 @@ void vset_init(sh_t *sh_hdl, vset_global_cb cb)
|
||||
*/
|
||||
void vset_force_cb(void)
|
||||
{
|
||||
vset_global_cb cb = s_global_cb;
|
||||
if (cb)
|
||||
vset_global_cb global_cb = s_global_cb;
|
||||
if (global_cb)
|
||||
{
|
||||
cb(s_sh_hdl);
|
||||
global_cb(s_sh_hdl);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,6 +147,10 @@ int vset_option_set(sh_t *sh_hdl, int *argc, const char *argv[], const sh_vset_p
|
||||
{
|
||||
flag = true;
|
||||
sh_echo(s_sh_hdl, "选项: %s\r\n", pset->option);
|
||||
if (pset->help)
|
||||
{
|
||||
sh_echo(s_sh_hdl, "说明: %s\r\n", pset->help);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -235,22 +239,22 @@ bool vset_option_cp(sh_t *sh_hdl, int argc, const char *argv[], bool flag, const
|
||||
}
|
||||
}
|
||||
|
||||
int vset_unsigned(const __vset_param_t *param, const char *argv[], unsigned int low, unsigned int high)
|
||||
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() 初始化");
|
||||
SYS_ASSERT(param->attr < __ARR_SIZE(s_attr_to_type_tbl), "param->attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[param->attr] == _PARSE_TYPE_UNSIGNED, "待设置的参数类型不是正整数");
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[attr] == _PARSE_TYPE_UNSIGNED, "待设置的参数类型不是正整数");
|
||||
|
||||
if (s_sh_hdl == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if (param->attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
if (attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
{
|
||||
sh_echo(s_sh_hdl, "param->attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
sh_echo(s_sh_hdl, "attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
return -1;
|
||||
}
|
||||
if (s_attr_to_type_tbl[param->attr] != _PARSE_TYPE_UNSIGNED)
|
||||
if (s_attr_to_type_tbl[attr] != _PARSE_TYPE_UNSIGNED)
|
||||
{
|
||||
sh_echo(s_sh_hdl, "待设置的参数类型不是正整数\r\n");
|
||||
return -1;
|
||||
@@ -271,7 +275,7 @@ int vset_unsigned(const __vset_param_t *param, const char *argv[], unsigned int
|
||||
low ^= high;
|
||||
}
|
||||
sh_echo(s_sh_hdl, "有效范围: %d .. %d\r\n", low, high);
|
||||
sh_echo(s_sh_hdl, "当前值: %u\r\n", _get_unsigned(param));
|
||||
sh_echo(s_sh_hdl, "当前值: %u\r\n", _get_unsigned(dest, attr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -279,7 +283,7 @@ int vset_unsigned(const __vset_param_t *param, const char *argv[], unsigned int
|
||||
switch (pv.type)
|
||||
{
|
||||
case _PARSE_TYPE_UNSIGNED: // 解析出的参数格式是无符号整型
|
||||
return _set_dest_unsigned(param, pv.value.val_unsigned, low, high);
|
||||
return _set_dest_unsigned(dest, attr, cb, pv.value.val_unsigned, low, high);
|
||||
|
||||
default:
|
||||
sh_echo(s_sh_hdl, "参数 '%s' 格式错误, 请输入正整数\r\n", argv[0]);
|
||||
@@ -287,22 +291,22 @@ int vset_unsigned(const __vset_param_t *param, const char *argv[], unsigned int
|
||||
}
|
||||
}
|
||||
|
||||
int vset_integer(const __vset_param_t *param, const char *argv[], signed int low, signed int high)
|
||||
int vset_integer(void *dest, __type_attr_t attr, vset_cb cb, const char *argv[], signed int low, signed int high)
|
||||
{
|
||||
SYS_ASSERT(s_sh_hdl, "未使用 vset_init() 初始化");
|
||||
SYS_ASSERT(param->attr < __ARR_SIZE(s_attr_to_type_tbl), "param->attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[param->attr] == _PARSE_TYPE_INTEGER, "待设置的参数类型不是带符号整数");
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[attr] == _PARSE_TYPE_INTEGER, "待设置的参数类型不是带符号整数");
|
||||
|
||||
if (s_sh_hdl == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if (param->attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
if (attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
{
|
||||
sh_echo(s_sh_hdl, "param->attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
sh_echo(s_sh_hdl, "attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
return -1;
|
||||
}
|
||||
if (s_attr_to_type_tbl[param->attr] != _PARSE_TYPE_INTEGER)
|
||||
if (s_attr_to_type_tbl[attr] != _PARSE_TYPE_INTEGER)
|
||||
{
|
||||
sh_echo(s_sh_hdl, "待设置的参数类型不是带符号整数\r\n");
|
||||
return -1;
|
||||
@@ -323,7 +327,7 @@ int vset_integer(const __vset_param_t *param, const char *argv[], signed int low
|
||||
low ^= high;
|
||||
}
|
||||
sh_echo(s_sh_hdl, "有效范围: %d .. %d\r\n", low, high);
|
||||
sh_echo(s_sh_hdl, "当前值: %d\r\n", _get_integer(param));
|
||||
sh_echo(s_sh_hdl, "当前值: %d\r\n", _get_integer(dest, attr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -331,7 +335,7 @@ int vset_integer(const __vset_param_t *param, const char *argv[], signed int low
|
||||
switch (pv.type)
|
||||
{
|
||||
case _PARSE_TYPE_INTEGER: // 解析出的参数格式是带符号整型
|
||||
return _set_dest_integer(param, pv.value.val_integer, low, high);
|
||||
return _set_dest_integer(dest, attr, cb, pv.value.val_integer, low, high);
|
||||
|
||||
case _PARSE_TYPE_UNSIGNED: // 解析出的参数格式是无符号整型
|
||||
if (pv.value.val_unsigned > (1u << (sizeof(pv.value.val_unsigned) * 8 - 1)) - 1)
|
||||
@@ -339,7 +343,7 @@ int vset_integer(const __vset_param_t *param, const char *argv[], signed int low
|
||||
sh_echo(s_sh_hdl, "参数 %u 溢出\r\n", pv.value.val_unsigned);
|
||||
return -1;
|
||||
}
|
||||
return _set_dest_integer(param, pv.value.val_unsigned, low, high);
|
||||
return _set_dest_integer(dest, attr, cb, pv.value.val_unsigned, low, high);
|
||||
|
||||
default:
|
||||
sh_echo(s_sh_hdl, "参数 '%s' 格式错误, 请输入整数\r\n", argv[0]);
|
||||
@@ -347,22 +351,22 @@ int vset_integer(const __vset_param_t *param, const char *argv[], signed int low
|
||||
}
|
||||
}
|
||||
|
||||
int vset_float(const __vset_param_t *param, const char *argv[], float low, float high)
|
||||
int vset_float(void *dest, __type_attr_t attr, vset_cb cb, const char *argv[], float low, float high)
|
||||
{
|
||||
SYS_ASSERT(s_sh_hdl, "未使用 vset_init() 初始化");
|
||||
SYS_ASSERT(param->attr < __ARR_SIZE(s_attr_to_type_tbl), "param->attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[param->attr] == _PARSE_TYPE_FLOAT, "待设置的参数类型不是浮点数");
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[attr] == _PARSE_TYPE_FLOAT, "待设置的参数类型不是浮点数");
|
||||
|
||||
if (s_sh_hdl == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if (param->attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
if (attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
{
|
||||
sh_echo(s_sh_hdl, "param->attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
sh_echo(s_sh_hdl, "attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
return -1;
|
||||
}
|
||||
if (s_attr_to_type_tbl[param->attr] != _PARSE_TYPE_FLOAT)
|
||||
if (s_attr_to_type_tbl[attr] != _PARSE_TYPE_FLOAT)
|
||||
{
|
||||
sh_echo(s_sh_hdl, "待设置的参数类型不是浮点数\r\n");
|
||||
return -1;
|
||||
@@ -383,7 +387,7 @@ int vset_float(const __vset_param_t *param, const char *argv[], float low, float
|
||||
high = tmp;
|
||||
}
|
||||
sh_echo(s_sh_hdl, "有效范围: %f .. %f\r\n", low, high);
|
||||
sh_echo(s_sh_hdl, "当前值: %f\r\n", _get_float(param));
|
||||
sh_echo(s_sh_hdl, "当前值: %f\r\n", _get_float(dest, attr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -391,13 +395,13 @@ int vset_float(const __vset_param_t *param, const char *argv[], float low, float
|
||||
switch (pv.type)
|
||||
{
|
||||
case _PARSE_TYPE_INTEGER: // 解析出的参数格式是带符号整型
|
||||
return _set_dest_float(param, pv.value.val_integer, low, high);
|
||||
return _set_dest_float(dest, attr, cb, pv.value.val_integer, low, high);
|
||||
|
||||
case _PARSE_TYPE_UNSIGNED: // 解析出的参数格式是无符号整型
|
||||
return _set_dest_float(param, pv.value.val_unsigned, low, high);
|
||||
return _set_dest_float(dest, attr, cb, pv.value.val_unsigned, low, high);
|
||||
|
||||
case _PARSE_TYPE_FLOAT: // 解析出的参数格式是浮点数
|
||||
return _set_dest_float(param, pv.value.val_float, low, high);
|
||||
return _set_dest_float(dest, attr, cb, pv.value.val_float, low, high);
|
||||
|
||||
default:
|
||||
sh_echo(s_sh_hdl, "参数 '%s' 格式错误, 请输入数值\r\n", argv[0]);
|
||||
@@ -405,22 +409,22 @@ int vset_float(const __vset_param_t *param, const char *argv[], float low, float
|
||||
}
|
||||
}
|
||||
|
||||
int vset_str(const __vset_param_t *param, const char *argv[], unsigned bufsize)
|
||||
int vset_str(void *dest, __type_attr_t attr, vset_cb cb, const char *argv[], unsigned bufsize)
|
||||
{
|
||||
SYS_ASSERT(s_sh_hdl, "未使用 vset_init() 初始化");
|
||||
SYS_ASSERT(param->attr < __ARR_SIZE(s_attr_to_type_tbl), "param->attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[param->attr] == _PARSE_TYPE_STRING, "待设置的参数类型不是字符串");
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[attr] == _PARSE_TYPE_STRING, "待设置的参数类型不是字符串");
|
||||
|
||||
if (s_sh_hdl == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if (param->attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
if (attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
{
|
||||
sh_echo(s_sh_hdl, "param->attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
sh_echo(s_sh_hdl, "attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
return -1;
|
||||
}
|
||||
if (s_attr_to_type_tbl[param->attr] != _PARSE_TYPE_STRING)
|
||||
if (s_attr_to_type_tbl[attr] != _PARSE_TYPE_STRING)
|
||||
{
|
||||
sh_echo(s_sh_hdl, "待设置的参数类型不是字符串\r\n");
|
||||
return -1;
|
||||
@@ -435,7 +439,7 @@ int vset_str(const __vset_param_t *param, const char *argv[], unsigned bufsize)
|
||||
if (strcmp(argv[0], "?") == 0)
|
||||
{
|
||||
sh_echo(s_sh_hdl, "最大长度: %d\r\n", bufsize - 1);
|
||||
sh_echo(s_sh_hdl, "当前值: %s\r\n", _get_string(param));
|
||||
sh_echo(s_sh_hdl, "当前值: %s\r\n", _get_string(dest, attr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -445,21 +449,21 @@ int vset_str(const __vset_param_t *param, const char *argv[], unsigned bufsize)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return _set_dest_string(param, argv[0], bufsize);
|
||||
return _set_dest_string(dest, attr, cb, argv[0], bufsize);
|
||||
}
|
||||
|
||||
int vset_enum(const __vset_param_t *param, const char *argv[], const char *enum_str)
|
||||
int vset_enum(void *dest, __type_attr_t attr, vset_cb cb, const char *argv[], const char *enum_str)
|
||||
{
|
||||
SYS_ASSERT(s_sh_hdl, "未使用 vset_init() 初始化");
|
||||
SYS_ASSERT(param->attr < __ARR_SIZE(s_attr_to_type_tbl), "param->attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
|
||||
if (s_sh_hdl == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if (param->attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
if (attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
{
|
||||
sh_echo(s_sh_hdl, "param->attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
sh_echo(s_sh_hdl, "attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -484,7 +488,7 @@ int vset_enum(const __vset_param_t *param, const char *argv[], const char *enum_
|
||||
if (strcmp(argv[0], "?") == 0)
|
||||
{
|
||||
sh_echo(s_sh_hdl, "可选值:\r\n");
|
||||
_get_enum_by_param(param, &match_key, &match_value, enum_buf, true, false);
|
||||
_get_enum_by_param(dest, attr, &match_key, &match_value, enum_buf, true, false);
|
||||
if (match_value)
|
||||
{
|
||||
sh_echo(s_sh_hdl, "当前值:\t%s\r\n", match_key);
|
||||
@@ -504,7 +508,7 @@ int vset_enum(const __vset_param_t *param, const char *argv[], const char *enum_
|
||||
return -1;
|
||||
}
|
||||
|
||||
return _set_dest_enum(param, match_value, type_flag);
|
||||
return _set_dest_enum(dest, attr, cb, match_value, type_flag);
|
||||
}
|
||||
|
||||
void vset_cp_enum(int argc, bool flag, const char *enum_str)
|
||||
@@ -528,15 +532,10 @@ void vset_cp_enum(int argc, bool flag, const char *enum_str)
|
||||
return;
|
||||
}
|
||||
|
||||
__vset_param_t param = {
|
||||
.dest = enum_buf,
|
||||
.attr = __GENERIC_ATTR(enum_buf),
|
||||
};
|
||||
|
||||
/* 分割字符串 str_buf 并穷举匹配到的值,输出 match_key, match_value, type_flag */
|
||||
char *match_key = NULL;
|
||||
char *match_value = NULL;
|
||||
_get_enum_by_param(¶m, &match_key, &match_value, enum_buf, false, true);
|
||||
_get_enum_by_param(enum_buf, __GENERIC_ATTR(enum_buf), &match_key, &match_value, enum_buf, false, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -667,11 +666,9 @@ static bool _do_completing_enum(const char *option, const sh_vset_param_t *p, un
|
||||
return false;
|
||||
}
|
||||
|
||||
static int _set_dest_unsigned(const __vset_param_t *param, unsigned int value, unsigned int low, unsigned int high)
|
||||
static int _set_dest_unsigned(void *dest, __type_attr_t attr, vset_cb cb, unsigned int value, unsigned int low, unsigned int high)
|
||||
{
|
||||
void *dest = param->dest;
|
||||
__type_attr_t attr = param->attr;
|
||||
vset_global_cb cb = NULL;
|
||||
vset_global_cb global_cb = NULL;
|
||||
int ret = -1;
|
||||
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
@@ -703,7 +700,7 @@ static int _set_dest_unsigned(const __vset_param_t *param, unsigned int value, u
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((uint8_t *)dest) = value;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -721,7 +718,7 @@ static int _set_dest_unsigned(const __vset_param_t *param, unsigned int value, u
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((uint16_t *)dest) = value;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -733,7 +730,7 @@ static int _set_dest_unsigned(const __vset_param_t *param, unsigned int value, u
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((uint32_t *)dest) = value;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -745,7 +742,7 @@ static int _set_dest_unsigned(const __vset_param_t *param, unsigned int value, u
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((uint64_t *)dest) = value;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -755,23 +752,21 @@ static int _set_dest_unsigned(const __vset_param_t *param, unsigned int value, u
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (cb)
|
||||
if (global_cb)
|
||||
{
|
||||
cb(s_sh_hdl);
|
||||
global_cb(s_sh_hdl);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int _set_dest_integer(const __vset_param_t *param, signed int value, signed int low, signed int high)
|
||||
static int _set_dest_integer(void *dest, __type_attr_t attr, vset_cb cb, signed int value, signed int low, signed int high)
|
||||
{
|
||||
#define _MAX_S8 127
|
||||
#define _MIN_S8 -128
|
||||
#define _MAX_S16 32767
|
||||
#define _MIN_S16 -32768
|
||||
|
||||
void *dest = param->dest;
|
||||
__type_attr_t attr = param->attr;
|
||||
vset_global_cb cb = NULL;
|
||||
vset_global_cb global_cb = NULL;
|
||||
int ret = -1;
|
||||
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
@@ -803,7 +798,7 @@ static int _set_dest_integer(const __vset_param_t *param, signed int value, sign
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((char *)dest) = data;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -821,7 +816,7 @@ static int _set_dest_integer(const __vset_param_t *param, signed int value, sign
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((bool *)dest) = data;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -841,7 +836,7 @@ static int _set_dest_integer(const __vset_param_t *param, signed int value, sign
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((int8_t *)dest) = value;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -861,7 +856,7 @@ static int _set_dest_integer(const __vset_param_t *param, signed int value, sign
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((int16_t *)dest) = value;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -873,7 +868,7 @@ static int _set_dest_integer(const __vset_param_t *param, signed int value, sign
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((int32_t *)dest) = value;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -885,7 +880,7 @@ static int _set_dest_integer(const __vset_param_t *param, signed int value, sign
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((int64_t *)dest) = value;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -895,18 +890,16 @@ static int _set_dest_integer(const __vset_param_t *param, signed int value, sign
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (cb)
|
||||
if (global_cb)
|
||||
{
|
||||
cb(s_sh_hdl);
|
||||
global_cb(s_sh_hdl);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int _set_dest_float(const __vset_param_t *param, float value, float low, float high)
|
||||
static int _set_dest_float(void *dest, __type_attr_t attr, vset_cb cb, float value, float low, float high)
|
||||
{
|
||||
void *dest = param->dest;
|
||||
__type_attr_t attr = param->attr;
|
||||
vset_global_cb cb = NULL;
|
||||
vset_global_cb global_cb = NULL;
|
||||
int ret = -1;
|
||||
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
@@ -932,7 +925,7 @@ static int _set_dest_float(const __vset_param_t *param, float value, float low,
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((float *)dest) = value;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -943,7 +936,7 @@ static int _set_dest_float(const __vset_param_t *param, float value, float low,
|
||||
{
|
||||
_PARAM_CB();
|
||||
*((double *)dest) = value;
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -953,19 +946,17 @@ static int _set_dest_float(const __vset_param_t *param, float value, float low,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (cb)
|
||||
if (global_cb)
|
||||
{
|
||||
cb(s_sh_hdl);
|
||||
global_cb(s_sh_hdl);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int _set_dest_string(const __vset_param_t *param, const char *str, unsigned bufsize)
|
||||
static int _set_dest_string(void *dest, __type_attr_t attr, vset_cb cb, const char *str, unsigned bufsize)
|
||||
{
|
||||
void *dest = param->dest;
|
||||
int str_size = strlen(str) + 1;
|
||||
__type_attr_t attr = param->attr;
|
||||
vset_global_cb cb = NULL;
|
||||
vset_global_cb global_cb = NULL;
|
||||
int ret = -1;
|
||||
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
@@ -974,6 +965,7 @@ static int _set_dest_string(const __vset_param_t *param, const char *str, unsign
|
||||
if (str_size > bufsize)
|
||||
{
|
||||
sh_echo(s_sh_hdl, "注意: '%s' 大于最大长度 %d\r\n", str, bufsize - 1);
|
||||
str_size = bufsize;
|
||||
}
|
||||
|
||||
switch (attr)
|
||||
@@ -982,14 +974,15 @@ static int _set_dest_string(const __vset_param_t *param, const char *str, unsign
|
||||
memset(dest, 0, bufsize);
|
||||
if (memcmp(dest, str, str_size))
|
||||
{
|
||||
if (param->cb)
|
||||
if (cb)
|
||||
{
|
||||
char value[0x100];
|
||||
memcpy(dest, str, str_size);
|
||||
char value[str_size + 1];
|
||||
memset(value, 0, str_size + 1);
|
||||
memcpy(value, str, str_size);
|
||||
_PARAM_CB();
|
||||
}
|
||||
memcpy(dest, str, str_size);
|
||||
cb = s_global_cb;
|
||||
global_cb = s_global_cb;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -998,17 +991,17 @@ static int _set_dest_string(const __vset_param_t *param, const char *str, unsign
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (cb)
|
||||
if (global_cb)
|
||||
{
|
||||
cb(s_sh_hdl);
|
||||
global_cb(s_sh_hdl);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int _set_dest_enum(const __vset_param_t *param, const char *value, int type_flag)
|
||||
static int _set_dest_enum(void *dest, __type_attr_t attr, vset_cb cb, const char *value, int type_flag)
|
||||
{
|
||||
sh_parse_t pv = sh_parse_value(value);
|
||||
switch (s_attr_to_type_tbl[param->attr])
|
||||
switch (s_attr_to_type_tbl[attr])
|
||||
{
|
||||
case _PARSE_TYPE_UNSIGNED: // 待设置的参数格式是无符号整型
|
||||
{
|
||||
@@ -1020,7 +1013,7 @@ static int _set_dest_enum(const __vset_param_t *param, const char *value, int ty
|
||||
switch (pv.type)
|
||||
{
|
||||
case _PARSE_TYPE_UNSIGNED: // 当前匹配的参数格式是无符号整型
|
||||
return _set_dest_unsigned(param, pv.value.val_unsigned, pv.value.val_unsigned, pv.value.val_unsigned);
|
||||
return _set_dest_unsigned(dest, attr, cb, pv.value.val_unsigned, pv.value.val_unsigned, pv.value.val_unsigned);
|
||||
|
||||
default:
|
||||
return -1;
|
||||
@@ -1038,10 +1031,10 @@ static int _set_dest_enum(const __vset_param_t *param, const char *value, int ty
|
||||
switch (pv.type)
|
||||
{
|
||||
case _PARSE_TYPE_INTEGER: // 当前匹配的参数格式是带符号整型
|
||||
return _set_dest_integer(param, pv.value.val_integer, pv.value.val_integer, pv.value.val_integer);
|
||||
return _set_dest_integer(dest, attr, cb, pv.value.val_integer, pv.value.val_integer, pv.value.val_integer);
|
||||
|
||||
case _PARSE_TYPE_UNSIGNED: // 当前匹配的参数格式是无符号整型
|
||||
return _set_dest_integer(param, pv.value.val_unsigned, pv.value.val_unsigned, pv.value.val_unsigned);
|
||||
return _set_dest_integer(dest, attr, cb, pv.value.val_unsigned, pv.value.val_unsigned, pv.value.val_unsigned);
|
||||
|
||||
default:
|
||||
return -1;
|
||||
@@ -1059,13 +1052,13 @@ static int _set_dest_enum(const __vset_param_t *param, const char *value, int ty
|
||||
switch (pv.type)
|
||||
{
|
||||
case _PARSE_TYPE_INTEGER: // 当前匹配的参数格式是带符号整型
|
||||
return _set_dest_float(param, pv.value.val_integer, pv.value.val_integer, pv.value.val_integer);
|
||||
return _set_dest_float(dest, attr, cb, pv.value.val_integer, pv.value.val_integer, pv.value.val_integer);
|
||||
|
||||
case _PARSE_TYPE_UNSIGNED: // 当前匹配的参数格式是无符号整型
|
||||
return _set_dest_float(param, pv.value.val_unsigned, pv.value.val_unsigned, pv.value.val_unsigned);
|
||||
return _set_dest_float(dest, attr, cb, pv.value.val_unsigned, pv.value.val_unsigned, pv.value.val_unsigned);
|
||||
|
||||
case _PARSE_TYPE_FLOAT: // 当前匹配的参数格式是浮点数
|
||||
return _set_dest_float(param, pv.value.val_float, pv.value.val_float, pv.value.val_float);
|
||||
return _set_dest_float(dest, attr, cb, pv.value.val_float, pv.value.val_float, pv.value.val_float);
|
||||
|
||||
default:
|
||||
return -1;
|
||||
@@ -1075,96 +1068,96 @@ static int _set_dest_enum(const __vset_param_t *param, const char *value, int ty
|
||||
|
||||
case _PARSE_TYPE_STRING: // 待设置的参数格式是字符串
|
||||
{
|
||||
return _set_dest_string(param, value, strlen(value) + 1);
|
||||
return _set_dest_string(dest, attr, cb, value, strlen(value) + 1);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
sh_echo(s_sh_hdl, "param->attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
sh_echo(s_sh_hdl, "attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static signed int _get_integer(const __vset_param_t *param)
|
||||
static signed int _get_integer(void *dest, __type_attr_t attr)
|
||||
{
|
||||
SYS_ASSERT(s_sh_hdl, "未使用 vset_init() 初始化");
|
||||
SYS_ASSERT(param->attr < __ARR_SIZE(s_attr_to_type_tbl), "param->attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[param->attr] == _PARSE_TYPE_INTEGER, "待设置的参数类型不是带符号整数");
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[attr] == _PARSE_TYPE_INTEGER, "待设置的参数类型不是带符号整数");
|
||||
|
||||
switch (param->attr)
|
||||
switch (attr)
|
||||
{
|
||||
case __TYPE_ATTR_CHR:
|
||||
return *((char *)param->dest);
|
||||
return *((char *)dest);
|
||||
|
||||
case __TYPE_ATTR_BOOL:
|
||||
return *((bool *)param->dest);
|
||||
return *((bool *)dest);
|
||||
|
||||
case __TYPE_ATTR_S8:
|
||||
return *((int8_t *)param->dest);
|
||||
return *((int8_t *)dest);
|
||||
|
||||
case __TYPE_ATTR_S16:
|
||||
return *((int16_t *)param->dest);
|
||||
return *((int16_t *)dest);
|
||||
|
||||
case __TYPE_ATTR_S32:
|
||||
return *((int32_t *)param->dest);
|
||||
return *((int32_t *)dest);
|
||||
|
||||
case __TYPE_ATTR_S64:
|
||||
return *((int64_t *)param->dest);
|
||||
return *((int64_t *)dest);
|
||||
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static float _get_float(const __vset_param_t *param)
|
||||
static float _get_float(void *dest, __type_attr_t attr)
|
||||
{
|
||||
SYS_ASSERT(s_sh_hdl, "未使用 vset_init() 初始化");
|
||||
SYS_ASSERT(param->attr < __ARR_SIZE(s_attr_to_type_tbl), "param->attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[param->attr] == _PARSE_TYPE_FLOAT, "待设置的参数类型不是浮点数");
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[attr] == _PARSE_TYPE_FLOAT, "待设置的参数类型不是浮点数");
|
||||
|
||||
switch (param->attr)
|
||||
switch (attr)
|
||||
{
|
||||
case __TYPE_ATTR_FLOAT:
|
||||
return *((float *)param->dest);
|
||||
return *((float *)dest);
|
||||
|
||||
case __TYPE_ATTR_DOUBLE:
|
||||
return *((double *)param->dest);
|
||||
return *((double *)dest);
|
||||
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static char *_get_string(const __vset_param_t *param)
|
||||
static char *_get_string(void *dest, __type_attr_t attr)
|
||||
{
|
||||
SYS_ASSERT(s_sh_hdl, "未使用 vset_init() 初始化");
|
||||
SYS_ASSERT(param->attr < __ARR_SIZE(s_attr_to_type_tbl), "param->attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[param->attr] == _PARSE_TYPE_STRING, "待设置的参数类型不是字符串");
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[attr] == _PARSE_TYPE_STRING, "待设置的参数类型不是字符串");
|
||||
|
||||
return param->dest;
|
||||
return dest;
|
||||
}
|
||||
|
||||
static unsigned int _get_unsigned(const __vset_param_t *param)
|
||||
static unsigned int _get_unsigned(void *dest, __type_attr_t attr)
|
||||
{
|
||||
SYS_ASSERT(s_sh_hdl, "未使用 vset_init() 初始化");
|
||||
SYS_ASSERT(param->attr < __ARR_SIZE(s_attr_to_type_tbl), "param->attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[param->attr] == _PARSE_TYPE_UNSIGNED, "待设置的参数类型不是正整数");
|
||||
SYS_ASSERT(attr < __ARR_SIZE(s_attr_to_type_tbl), "attr 的值不在 __type_attr_t 所定义的范围");
|
||||
SYS_ASSERT(s_attr_to_type_tbl[attr] == _PARSE_TYPE_UNSIGNED, "待设置的参数类型不是正整数");
|
||||
|
||||
switch (param->attr)
|
||||
switch (attr)
|
||||
{
|
||||
case __TYPE_ATTR_U8:
|
||||
return *((uint8_t *)param->dest);
|
||||
return *((uint8_t *)dest);
|
||||
|
||||
case __TYPE_ATTR_U16:
|
||||
return *((uint16_t *)param->dest);
|
||||
return *((uint16_t *)dest);
|
||||
|
||||
case __TYPE_ATTR_U32:
|
||||
return *((uint32_t *)param->dest);
|
||||
return *((uint32_t *)dest);
|
||||
|
||||
case __TYPE_ATTR_U64:
|
||||
return *((uint64_t *)param->dest);
|
||||
return *((uint64_t *)dest);
|
||||
|
||||
default:
|
||||
return -1;
|
||||
@@ -1318,37 +1311,37 @@ static int _get_enum_by_key(const char *key, char **match_value, char *enum_buf)
|
||||
* _TYPE_FLAG_FLOAT 掩码表示在 enum_buf 中包含浮点数
|
||||
* _TYPE_FLAG_STRING 掩码表示在 enum_buf 中包含字符串
|
||||
*/
|
||||
static int _get_enum_by_param(const __vset_param_t *param, char **match_key, char **match_value, char *enum_buf, bool print_list, bool print_cp)
|
||||
static int _get_enum_by_param(void *dest, __type_attr_t attr, char **match_key, char **match_value, char *enum_buf, bool print_list, bool print_cp)
|
||||
{
|
||||
char param_value_str[0x100];
|
||||
int type_flag = 0; // 在 match_value 中出现过的数据类型
|
||||
|
||||
if (param->attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
if (attr >= __ARR_SIZE(s_attr_to_type_tbl))
|
||||
{
|
||||
sh_echo(s_sh_hdl, "param->attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
sh_echo(s_sh_hdl, "attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (s_attr_to_type_tbl[param->attr])
|
||||
switch (s_attr_to_type_tbl[attr])
|
||||
{
|
||||
case _PARSE_TYPE_INTEGER: // 待设置的参数格式是带符号整型
|
||||
SYS_SNPRINT(param_value_str, sizeof(param_value_str), "%d", _get_integer(param));
|
||||
SYS_SNPRINT(param_value_str, sizeof(param_value_str), "%d", _get_integer(dest, attr));
|
||||
break;
|
||||
|
||||
case _PARSE_TYPE_UNSIGNED: // 待设置的参数格式是无符号整型
|
||||
SYS_SNPRINT(param_value_str, sizeof(param_value_str), "%u", _get_unsigned(param));
|
||||
SYS_SNPRINT(param_value_str, sizeof(param_value_str), "%u", _get_unsigned(dest, attr));
|
||||
break;
|
||||
|
||||
case _PARSE_TYPE_FLOAT: // 待设置的参数格式是浮点数
|
||||
SYS_SNPRINT(param_value_str, sizeof(param_value_str), "%f", _get_float(param));
|
||||
SYS_SNPRINT(param_value_str, sizeof(param_value_str), "%f", _get_float(dest, attr));
|
||||
break;
|
||||
|
||||
case _PARSE_TYPE_STRING: // 待设置的参数格式是字符串
|
||||
SYS_SNPRINT(param_value_str, sizeof(param_value_str), "%s", _get_string(param));
|
||||
SYS_SNPRINT(param_value_str, sizeof(param_value_str), "%s", _get_string(dest, attr));
|
||||
break;
|
||||
|
||||
default:
|
||||
sh_echo(s_sh_hdl, "param->attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
sh_echo(s_sh_hdl, "attr 的值不在 __type_attr_t 所定义的范围\r\n");
|
||||
return -1;
|
||||
}
|
||||
param_value_str[__ARR_SIZE(param_value_str) - 1] = '\0';
|
||||
@@ -1378,7 +1371,7 @@ static int _get_enum_by_param(const __vset_param_t *param, char **match_key, cha
|
||||
type_flag |= _TYPE_FLAG_UNSIGNED;
|
||||
if (*match_key == NULL)
|
||||
{
|
||||
switch (s_attr_to_type_tbl[param->attr])
|
||||
switch (s_attr_to_type_tbl[attr])
|
||||
{
|
||||
case _PARSE_TYPE_UNSIGNED: // 待设置的参数格式是无符号整型
|
||||
SYS_SNPRINT(key_value_str, sizeof(key_value_str), "%u", pv.value.val_unsigned);
|
||||
@@ -1402,7 +1395,7 @@ static int _get_enum_by_param(const __vset_param_t *param, char **match_key, cha
|
||||
type_flag |= _TYPE_FLAG_INTEGER;
|
||||
if (*match_key == NULL)
|
||||
{
|
||||
switch (s_attr_to_type_tbl[param->attr])
|
||||
switch (s_attr_to_type_tbl[attr])
|
||||
{
|
||||
case _PARSE_TYPE_INTEGER: // 待设置的参数格式是带符号整型
|
||||
SYS_SNPRINT(key_value_str, sizeof(key_value_str), "%d", pv.value.val_integer);
|
||||
@@ -1423,7 +1416,7 @@ static int _get_enum_by_param(const __vset_param_t *param, char **match_key, cha
|
||||
type_flag |= _TYPE_FLAG_FLOAT;
|
||||
if (*match_key == NULL)
|
||||
{
|
||||
switch (s_attr_to_type_tbl[param->attr])
|
||||
switch (s_attr_to_type_tbl[attr])
|
||||
{
|
||||
case _PARSE_TYPE_FLOAT: // 待设置的参数格式是浮点数
|
||||
SYS_SNPRINT(key_value_str, sizeof(key_value_str), "%f", (float)pv.value.val_float);
|
||||
@@ -1481,7 +1474,7 @@ static int _get_enum_by_param(const __vset_param_t *param, char **match_key, cha
|
||||
token = strtok_r(NULL, ",", &save_token);
|
||||
}
|
||||
|
||||
switch (s_attr_to_type_tbl[param->attr])
|
||||
switch (s_attr_to_type_tbl[attr])
|
||||
{
|
||||
case _PARSE_TYPE_UNSIGNED: // 待设置的参数格式是无符号整型
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user