From 3fb9057dd93a1f6200737237d754b70ba74d5f23 Mon Sep 17 00:00:00 2001 From: coffee Date: Tue, 26 May 2026 16:29:55 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0RPC=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/HDRPC.h | 25 ++++++++++++++++++++++++ src/HDRPC.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/include/HDRPC.h b/include/HDRPC.h index 8f28ef6..7641b48 100644 --- a/include/HDRPC.h +++ b/include/HDRPC.h @@ -215,6 +215,31 @@ uint8_t _HDRPCAddArgs(HDRPCSession *session, uint8_t type, const void *args, uin // 注: 如果需要用户数据, 要求用户数据添加到所有参数后面 #define HDRPCAddUserData(session, data, len) _HDRPCAddArgs((session), kHDRPCUserData, (data), (len)) +/** + * @brief 修改session指定索引的参数 + * @param session RPC参数会话 + * @param index 参数索引 + * @param type 数据类型 + * @param args 数据 + * @param len 数据长度 + * @return 1成功, 0失败 + */ +uint8_t _HDRPCModifyArgs(HDRPCSession *session, uint8_t index, uint8_t type, const void *args, uint8_t len); + +/** + * @brief 修改指定索引的参数 + */ +#define HDRPCModifyU8(session, idx, val) do { uint8_t __v = (val); _HDRPCModifyArgs((session), (idx), kHDRPCU8, &__v, 1); } while (0) +#define HDRPCModifyU16(session, idx, val) do { uint16_t __v = (val); _HDRPCModifyArgs((session), (idx), kHDRPCU16, &__v, 1); } while (0) +#define HDRPCModifyU32(session, idx, val) do { uint32_t __v = (val); _HDRPCModifyArgs((session), (idx), kHDRPCU32, &__v, 1); } while (0) +#ifdef HDRPC_USE_64 +#define HDRPCModifyU64(session, idx, val) do { uint64_t __v = (val); _HDRPCModifyArgs((session), (idx), kHDRPCU64, &__v, 1); } while (0) +#endif +#define HDRPCModifyException(session, idx, val) do { uint16_t __v = (val); _HDRPCModifyArgs((session), (idx), kHDRPCException, &__v, 1); } while (0) +#define HDRPCModifyBuffer(session, idx, data, len) _HDRPCModifyArgs((session), (idx), kHDRPCBuffer, (data), (len)) +#define HDRPCModifyString(session, idx, data, len) _HDRPCModifyArgs((session), (idx), kHDRPCString, (data), (len) * 2) +#define HDRPCModifyUserData(session, idx, data, len) _HDRPCModifyArgs((session), (idx), kHDRPCUserData, (data), (len)) + /** * @brief 添加参数到会话, 方便添加用户数据到会话 * @param session 参数会话 diff --git a/src/HDRPC.c b/src/HDRPC.c index 113dac2..99a3712 100644 --- a/src/HDRPC.c +++ b/src/HDRPC.c @@ -479,6 +479,54 @@ uint8_t _HDRPCAddArgs(HDRPCSession *session, uint8_t type, const void *args, uin return 1; } +uint8_t _HDRPCModifyArgs(HDRPCSession *session, uint8_t index, uint8_t type, const void *args, uint8_t len) +{ + if (session == NULL) { + LogD("Session is nullptr"); + return 0; + } + + if (index >= session->index) { + LogD("Modify index[%d] session->index[%d] error", index, session->index); + return 0; + } + + if (len == 0) { + LogD("type[0x%x], args len is 0", type); + return 0; + } + + session->args[index].type = type; + switch (type) { + case kHDRPCU8: + session->args[index].dataU8 = *((uint8_t *)args); + break; + case kHDRPCException: + case kHDRPCU16: + session->args[index].dataU16 = *((uint16_t *)args); + break; + case kHDRPCU32: + session->args[index].dataU32 = *((uint32_t *)args); + break; +#ifdef HDRPC_USE_64 + case kHDRPCU64: + session->args[index].dataU64 = *((uint64_t *)args); + break; +#endif + case kHDRPCUserData: + case kHDRPCBuffer: + case kHDRPCString: + session->args[index].buffer.data = (uint8_t *)args; + session->args[index].buffer.len = len; + return 1; + default: + LogD("Not support type[0x%x]", type); + return 0; + } + + return 1; +} + uint8_t HDRPCAddArgs(HDRPCSession *session, HDRPCArgs *args) { if (session == NULL || args == NULL) { @@ -536,12 +584,12 @@ uint8_t _HDRPCCheckArgs(HDRPCSession *session, uint8_t *type, uint8_t index, uin { for (uint8_t i = index; i < len; ++i) { if (i >= session->index) { - LogD("Check type[%d] index[%d] len[%d] error", type[i], i, session->index); + LogD("Check code[0x%x], type[%d] index[%d] len[%d] error", session->func, type[i], i, session->index); return 0; } if (session->args[i].type != type[i]) { - LogD("Check index[%d] Type[0x%x][0x%x] faild", i, session->args[i].type, type[i]); + LogD("Check code[0x%x], index[%d] Type[0x%x][0x%x] faild", session->func, i, session->args[i].type, type[i]); return 0; } }