轻量级参数管理框架(C语言)
扫描二维码
随时随地手机看文章
前言
继上一版参数管理发布后,在实际使用中使用起来感觉还是有些繁琐,而且定义参数后无形中多了很多参数枚举定义,在添加参数时也需要根据不同参数要求使用不同的宏,使用起来依然不便捷。
针对上述问题又重新优化了一版,根据不同参数要求可以使用相同的宏即可,因此整体在使用的感受上,简化了使用方式。
利用了”多层宏替换“和”可变参数宏“等方式实现,完成了只需要一两个宏即可添加不同类型或者不同要求(是否有默认值、最大最小值等)的参数。
介绍
-
通过将已定义变量(全局变量)添加到参数表进行参数的统一管理,单个参数包括了当前值、缺省值、最小值、最大值、参数名和属性等信息。
-
根据不同的场景添加不同要求的参数
无缺省值、最小值和最大值限制,适合于记录类型的参数,比如状态数据或历史数据等
有缺省值,但无最小值和最大值限制,适合于配置类型的参数
有缺省值,最小值和最大值限制,适合于关键性类型的参数,比如用户参数或者关键的状态数据等
-
同时若单个参数表无法满足参数数目或者参数分类管理,可定义多张参数表
每张参数表中的参数ID唯一,不可重复;不同参数表ID可以重复定义
-
支持两种参数类型
数值类型:int、float、double等基本类型的参数
字符串类型:char定义用来储存字符串的数组
-
支持参数校验
范围校验:根据参数的最大和最小值进行判断,数值类型的参数则根据数值超出范围判断。而字符串则是根据字符串长度超出范围判断。
自定义校验:提供回调函数,每个参数可设置自定义的校验方式,比如某个参数需要设置为多少的倍数,或者根据其他参数决定当前参数的取值范围等。
-
向下兼容(键值对)
每个参数都需要指定唯一的ID,在后期版本迭代对参数表删除、插入或添加参数时也能向下兼容,不会影响其他参数。
启用键值对后序列化的数据长度也会比较大,因为每个参数序列化时包含了ID和长度信息。
-
可裁剪
根据不同的平台,可以对部分功能裁剪,或者修改配置适用于不同容量的芯片进行开发。
使用说明
以代码进行展示,如何快速上手使用。
typedef struct { uint16_t usValue; uint8_t ucValue; uint32_t uiValue; float fValue; char szString_1[12]; double dValue; int16_t sValue; int8_t cValue; int32_t iValue; char szString_2[10]; }ParamDemo_t; ParamDemo_t g_tTestVal = { .usValue = 20, .ucValue = 10, .uiValue = 1000, .fValue = 3.14, .szString_1 = "abcd", .dValue = 5.12, .sValue = -100, .cValue = -2, .iValue = 300, .szString_2 = "12234", }; int8_t g_cTest = 50; char g_szString[10] = "qwer"; static int CheckSValue(const void *pCurParam); cotParamInfo_t sg_ParamTable[] = { COT_PARAM_ITEM_BIND(1, g_tTestVal.usValue, COT_PARAM_UINT16, COT_PARAM_ATTR_WR), COT_PARAM_ITEM_BIND(2, g_tTestVal.ucValue, COT_PARAM_UINT8, COT_PARAM_ATTR_WR, 20), COT_PARAM_ITEM_BIND(3, g_tTestVal.uiValue, COT_PARAM_UINT32, COT_PARAM_ATTR_WR, 1000, 1000, 10000), COT_PARAM_ITEM_BIND(4, g_tTestVal.fValue, COT_PARAM_FLOAT, COT_PARAM_ATTR_WR, 10, -10.5, 10.5), COT_PARAM_ITEM_BIND(5, g_tTestVal.szString_1, COT_PARAM_STRING, COT_PARAM_ATTR_WR, "abcd", 3, sizeof(g_tTestVal.szString_1)), COT_PARAM_ITEM_BIND(6, g_tTestVal.dValue, COT_PARAM_DOUBLE, COT_PARAM_ATTR_WR, 0, -90.10, 100.10), COT_PARAM_ITEM_BIND(7, g_tTestVal.sValue, COT_PARAM_INT16, COT_PARAM_ATTR_WR, 100, -200, 200, CheckSValue), // 添加自定义校验 COT_PARAM_ITEM_BIND_WITH_NAME(8, "g_cTest", g_cTest, COT_PARAM_INT8, COT_PARAM_ATTR_WR, 50, -100, 100), // 另取参数名 COT_PARAM_ITEM_BIND(9, g_szString, COT_PARAM_STRING, COT_PARAM_ATTR_WR, "XXX", 3, 6), }; static int CheckSValue(const void *pCurParam) { const int16_t *p_sValue = (const int16_t *)pCurParam; if ((*p_sValue) % 2 != 0) { return -1; } return 0; } int main() { cotParam_Init(&sg_tParamManager, sg_ParamTable, COT_PARAM_TABLE_SIZE(sg_ParamTable)); // 对某个变量当前参数进行范围校验,得到校验结果后自行处理 cotParam_SingleParamSelfCheck(cotParam_FindParamByParamPtr(&sg_tParamManager, &g_test_3), &eCheckResult); if (eCheckResult != COT_PARAM_CHECK_OK) // 修改后检查 { cotParam_SingleParamResetDefValue(cotParam_FindParamByParamPtr(&sg_tParamManager, &g_test_3)); // 如果校验失败,则恢复为默认值 } // 对某个变量参数变更后(当前值已经变化)进行校验处理,若超出范围则恢复默认 g_test_3 = 1000; cotParam_SingleParamCheckProcess(cotParam_FindParamByParamPtr(&sg_tParamManager, &g_test_3), COT_PARAM_RESET_DEF); // 对某个变量参数在需要变更前(当前值没有变化)进行校验处理,得到校验结果后自行处理 double tmp = 1000; cotParam_SingleParamCheckInput(cotParam_FindParamByParamPtr(&sg_tParamManager, &g_test_3), &tmp, &eCheckResult); if (eCheckResult == COT_PARAM_CHECK_OK) { g_test_3 = tmp;// 如果校验成功,则修改 } // 对某个变量参数在需要变更前(当前值没有变化)进行校验处理,若新的值超出范围则不更新变量参数当前的值 double tmp = 1000; cotParam_SingleParamUpdate(cotParam_FindParamByParamPtr(&sg_tParamManager, &g_test_3), &tmp, COT_PARAM_RESET_NONE) }
下载链接
下载链接(点击阅读原文),或更新内容可看:
https://gitee.com/cot_package/cot_param





