From abcd0be41c4f1a40f7f2eec76072ef77c280d032 Mon Sep 17 00:00:00 2001 From: constzpc <66413177+constzpc@users.noreply.github.com> Date: Fri, 15 Dec 2023 23:17:09 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20feat:=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8F=AF=E5=8F=98=E5=8F=82=E7=9A=84=E6=96=B9=E5=BC=8F=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E4=B8=8D=E5=90=8C=E7=B1=BB=E5=9E=8B=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8E=A5=E5=8F=A3=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cot_param.c | 133 +++++++++++++++++++++++++++++++- cot_param.h | 5 ++ examples/cmd_shell/demo.c | 7 ++ examples/cmd_shell/param_demo.c | 11 +++ examples/cmd_shell/param_demo.h | 1 + test/param_test.c | 22 ++++++ 6 files changed, 178 insertions(+), 1 deletion(-) diff --git a/cot_param.c b/cot_param.c index 1a081a2..be9d4ab 100644 --- a/cot_param.c +++ b/cot_param.c @@ -446,7 +446,7 @@ const cotParamInfo_t *cotParam_FindParamByParamPtr(const cotParamManager_t *pMan { cotParamInfo_t *pInfo; - if (pManager != NULL) + if (pManager != NULL || pCurParam != NULL) { pInfo = FindParamByParamPtr(pManager, pCurParam); @@ -1354,4 +1354,135 @@ int cotParam_Deserialization(const cotParamManager_t* pManager, const uint8_t *p return 0; } +/** + * @brief 修改参数值,新值校验不通过则不修改 + * + * @note 该函数主要是方便进行二次函数封装,隐藏参数表管理句柄入参,可参考 cotParam_SingleParamChange 的实现 + * @param pManager 参数表管理句柄 + * @param pCurParam 当前参数数据指针 + * @param paramList 可变参数列表 + * @return 0,成功; -1,失败; + */ +int cotParam_SingleParamChangeImpl(const cotParamManager_t* pManager, const void *pCurParam, va_list paramList) +{ + const cotParamInfo_t *pParam = cotParam_FindParamByParamPtr(pManager, pCurParam); + + if (pParam == NULL) + { + return -1; + } + + switch (pParam->type) + { + case COT_PARAM_INT8: + { + COT_PARAM_INT8_T val = (COT_PARAM_INT8_T)va_arg(paramList, COT_PARAM_INT32_T); + cotParam_SingleParamUpdate(pParam, &val, COT_PARAM_RESET_NONE); + } + break; + + case COT_PARAM_INT16: + { + COT_PARAM_INT16_T val = (COT_PARAM_INT16_T)va_arg(paramList, COT_PARAM_INT32_T); + cotParam_SingleParamUpdate(pParam, &val, COT_PARAM_RESET_NONE); + } + break; + + case COT_PARAM_INT32: + { + COT_PARAM_INT32_T val = (COT_PARAM_INT32_T)va_arg(paramList, COT_PARAM_INT32_T); + cotParam_SingleParamUpdate(pParam, &val, COT_PARAM_RESET_NONE); + } + break; +#if COT_PARAM_USE_64_BIT_LENGTH + case COT_PARAM_INT64: + { + COT_PARAM_INT64_T val = (COT_PARAM_INT64_T)va_arg(paramList, COT_PARAM_INT64_T); + cotParam_SingleParamUpdate(pParam, &val, COT_PARAM_RESET_NONE); + } + break; +#endif + case COT_PARAM_UINT8: + { + COT_PARAM_UINT8_T val = (COT_PARAM_UINT8_T)va_arg(paramList, COT_PARAM_UINT32_T); + cotParam_SingleParamUpdate(pParam, &val, COT_PARAM_RESET_NONE); + } + break; + + case COT_PARAM_UINT16: + { + COT_PARAM_UINT16_T val = (COT_PARAM_UINT16_T)va_arg(paramList, COT_PARAM_UINT32_T); + cotParam_SingleParamUpdate(pParam, &val, COT_PARAM_RESET_NONE); + } + break; + + case COT_PARAM_UINT32: + { + COT_PARAM_UINT32_T val = (COT_PARAM_UINT32_T)va_arg(paramList, COT_PARAM_UINT32_T); + cotParam_SingleParamUpdate(pParam, &val, COT_PARAM_RESET_NONE); + } + break; +#if COT_PARAM_USE_64_BIT_LENGTH + case COT_PARAM_UINT64: + { + COT_PARAM_UINT64_T val = (COT_PARAM_UINT64_T)va_arg(paramList, COT_PARAM_UINT64_T); + cotParam_SingleParamUpdate(pParam, &val, COT_PARAM_RESET_NONE); + } + break; +#endif + case COT_PARAM_FLOAT: + { + COT_PARAM_FLOAT_T val = (COT_PARAM_FLOAT_T)va_arg(paramList, COT_PARAM_DOUBLE_T); + cotParam_SingleParamUpdate(pParam, &val, COT_PARAM_RESET_NONE); + } + break; +#if COT_PARAM_USE_64_BIT_LENGTH + case COT_PARAM_DOUBLE: + { + COT_PARAM_DOUBLE_T val = (COT_PARAM_DOUBLE_T)va_arg(paramList, COT_PARAM_DOUBLE_T); + cotParam_SingleParamUpdate(pParam, &val, COT_PARAM_RESET_NONE); + } + break; +#endif +#if COT_PARAM_USE_STRING_TYPE + case COT_PARAM_STRING: + { + char *pszString = (char *)va_arg(paramList, char *); + char szString[COT_PARAM_STRING_MAX_LENGTH] = {0}; + + memcpy(szString, pszString, strlen(pszString) >= COT_PARAM_STRING_MAX_LENGTH ? + (COT_PARAM_STRING_MAX_LENGTH - 1) : strlen(pszString)); + cotParam_SingleParamUpdate(pParam, szString, COT_PARAM_RESET_NONE); + } + break; +#endif + default: + return -1; + } + + return 0; +} + +/** + * @brief 修改参数值,新值校验不通过则不修改 + * + * @code 如:cotParam_SingleParamChange(&sg_tParamManager, &g_test_u16, 60) + * @param pManager 参数表管理句柄 + * @param pCurParam 当前参数数据指针 + * @param ... 新值(只有一个参数) + * @return 0,成功; -1,失败; + */ +int cotParam_SingleParamChange(const cotParamManager_t* pManager, const void *pCurParam, ...) +{ + int ret = 0; + va_list paramList; + + va_start(paramList, pCurParam); + + ret = cotParam_SingleParamChangeImpl(pManager, pCurParam, paramList); + + va_end(paramList); + + return ret; +} diff --git a/cot_param.h b/cot_param.h index 927ce62..4a57dc4 100644 --- a/cot_param.h +++ b/cot_param.h @@ -16,6 +16,8 @@ /* Includes ----------------------------------------------------------------------------------------------------------*/ #include "cot_param_type.h" +#include + #ifdef __cplusplus extern "C" { #endif @@ -159,6 +161,9 @@ extern int cotParam_SingleParamResetDefValue(const cotParamInfo_t *pParam); extern int cotParam_SingleParamResetMinValue(const cotParamInfo_t *pParam); extern int cotParam_SingleParamResetMaxValue(const cotParamInfo_t *pParam); +extern int cotParam_SingleParamChangeImpl(const cotParamManager_t* pManager, const void *pCurParam, va_list paramList); +extern int cotParam_SingleParamChange(const cotParamManager_t* pManager, const void *pCurParam, ...); + #ifdef __cplusplus } #endif diff --git a/examples/cmd_shell/demo.c b/examples/cmd_shell/demo.c index b71238f..645f83d 100644 --- a/examples/cmd_shell/demo.c +++ b/examples/cmd_shell/demo.c @@ -30,6 +30,13 @@ int main() // g_test_3 = -20.5; sprintf(g_szString, "sd"); + SingleParamChange(&g_tTestVal.uiValue, 1500); + + SingleParamChange(&g_tTestVal.uiValue, 800); // 修改无效 + + SingleParamChange(g_tTestVal.szString_1, "wwww.bau"); + SingleParamChange(g_tTestVal.szString_1, "ww"); // 修改无效 + SaveParam(true); ReloadParam(true); diff --git a/examples/cmd_shell/param_demo.c b/examples/cmd_shell/param_demo.c index 1d665b6..7f80a89 100644 --- a/examples/cmd_shell/param_demo.c +++ b/examples/cmd_shell/param_demo.c @@ -509,3 +509,14 @@ void ShowAllParam(void) printf("\n"); } +void SingleParamChange(const void *pCurParam, ...) +{ + va_list paramList; + + va_start(paramList, pCurParam); + + cotParam_SingleParamChangeImpl(&sg_tParamManager, pCurParam, paramList); + + va_end(paramList); +} + diff --git a/examples/cmd_shell/param_demo.h b/examples/cmd_shell/param_demo.h index 3b93d0a..638a5ed 100644 --- a/examples/cmd_shell/param_demo.h +++ b/examples/cmd_shell/param_demo.h @@ -35,6 +35,7 @@ cotParamCheckRet_e SingleParamCheck(const void *pCurParam, const void *pCheckVal cotParamCheckRet_e SingleParamSelfCheck(const void *pCurParam); void SingleParamResetResetDefValue(const void *pCurParam); +void SingleParamChange(const void *pCurParam, ...); void ShowAllParam(void); #endif diff --git a/test/param_test.c b/test/param_test.c index bca5e9d..62fd297 100644 --- a/test/param_test.c +++ b/test/param_test.c @@ -566,6 +566,27 @@ void test_ResetValue(void) TEST_ASSERT_EQUAL_UINT(3000, g_test_u16); } +void test_ChangeValue(void) +{ + g_test_u16 = 200; + TEST_ASSERT_EQUAL_INT(0, cotParam_SingleParamChange(&sg_tParamManager, &g_test_u16, 60)); + TEST_ASSERT_EQUAL_UINT(200, g_test_u16); + TEST_ASSERT_EQUAL_INT(0, cotParam_SingleParamChange(&sg_tParamManager, &g_test_u16, 120)); + TEST_ASSERT_EQUAL_UINT(120, g_test_u16); + TEST_ASSERT_EQUAL_INT(0, cotParam_SingleParamChange(&sg_tParamManager, &g_test_u16, 4000)); + TEST_ASSERT_EQUAL_UINT(120, g_test_u16); + +#if COT_PARAM_USE_STRING_TYPE + strcpy(g_test_str, "123456"); + TEST_ASSERT_EQUAL_INT(0, cotParam_SingleParamChange(&sg_tParamManager, g_test_str, "ABCDEF")); + TEST_ASSERT_EQUAL_STRING("ABCDEF", g_test_str); + TEST_ASSERT_EQUAL_INT(0, cotParam_SingleParamChange(&sg_tParamManager, g_test_str, "ABCD")); + TEST_ASSERT_EQUAL_STRING("ABCDEF", g_test_str); + TEST_ASSERT_EQUAL_INT(0, cotParam_SingleParamChange(&sg_tParamManager, g_test_str, "ABCDEF123456")); + TEST_ASSERT_EQUAL_STRING("ABCDEF", g_test_str); +#endif +} + // Run the test suite int main(void) { @@ -580,6 +601,7 @@ int main(void) RUN_TEST(test_CheckCustomWay); RUN_TEST(test_SetNewValue); RUN_TEST(test_ResetValue); + RUN_TEST(test_ChangeValue); UNITY_END(); From 8a7764eb056fac029491bd07e65943afa9f3ae71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E6=A9=99=E5=AD=90=E7=96=AF?= Date: Wed, 31 Jan 2024 01:13:44 +0000 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E5=8F=82=E6=95=B0=E5=9C=A8=E6=A0=A1=E9=AA=8C=E6=97=B6?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E5=AF=BC=E8=87=B4=E5=86=85=E5=AD=98=E6=BA=A2?= =?UTF-8?q?=E5=87=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 大橙子疯 --- cot_param.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cot_param.c b/cot_param.c index be9d4ab..ae7e8ec 100644 --- a/cot_param.c +++ b/cot_param.c @@ -3,8 +3,8 @@ * @file cot_param.c * @brief 该文件提供参数管理框架功能 * @author const_zpc any question please send mail to const_zpc@163.com - * @version V2.0 - * @date 2023-12-10 + * @version V2.1 + * @date 2024-1-31 * * @details 功能详细说明: * + 参数修改和重置管理 @@ -603,6 +603,8 @@ static cotParamCheckRet_e ValidateRangeByVoid(const cotParamInfo_t *pParam, cons { Value_u uValue; + memset(&uValue, 0, sizeof(uValue)); + switch (pParam->type) { case COT_PARAM_INT8: @@ -647,8 +649,7 @@ static cotParamCheckRet_e ValidateRangeByVoid(const cotParamInfo_t *pParam, cons #endif #if COT_PARAM_USE_STRING_TYPE case COT_PARAM_STRING: - memcpy(uValue.str, pval, strlen(pval) > COT_PARAM_STRING_MAX_LENGTH ? COT_PARAM_STRING_MAX_LENGTH + 2 : strlen(pval) + 1); - uValue.str[COT_PARAM_STRING_MAX_LENGTH + 2] = '\0'; + memcpy(uValue.str, pval, strlen(pval) >= COT_PARAM_STRING_MAX_LENGTH ? COT_PARAM_STRING_MAX_LENGTH - 1 : strlen(pval)); break; #endif default: From 270b38ca34a05688a6813aa25217901b99e7bd47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E6=A9=99=E5=AD=90=E7=96=AF?= Date: Sat, 3 Feb 2024 15:32:49 +0000 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E5=86=85=E5=AD=98=E5=8D=A0=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 大橙子疯 --- cot_param.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cot_param.c b/cot_param.c index ae7e8ec..6f2ff86 100644 --- a/cot_param.c +++ b/cot_param.c @@ -33,7 +33,7 @@ typedef union int64_t s64val; double fVal; #if COT_PARAM_USE_STRING_TYPE - char str[COT_PARAM_STRING_MAX_LENGTH + 2]; + char str[COT_PARAM_STRING_MAX_LENGTH]; #endif } Value_u;