From 7cbcef238e38e3d926cd5d1c749dec0e40299aa1 Mon Sep 17 00:00:00 2001 From: coffee Date: Wed, 5 Nov 2025 18:28:37 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=94=AF=E6=8C=81=E6=8C=81=E7=BB=AD=E7=BB=91?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/HDRPC.h | 8 ++++---- include/HProtocolBind.h | 17 +++++++++++++++-- src/HDRPC.c | 4 ++-- src/HProtocolBind.c | 30 +++++++++++++++++++++++++++--- 4 files changed, 48 insertions(+), 11 deletions(-) diff --git a/include/HDRPC.h b/include/HDRPC.h index dc24e3e..ebb90b0 100644 --- a/include/HDRPC.h +++ b/include/HDRPC.h @@ -250,11 +250,11 @@ uint8_t __HDRPCCheckArgs(HDRPCSession *session, int len, ...); * @return 参数 */ HDRPCValue_t _HDRPCGetValue(HDRPCSession *session, uint8_t type, uint8_t index); -#define HDRPCGetValueU8(session, index) _HDRPCGetValue(session, kHDRPCU8, index) -#define HDRPCGetValueU16(session, index) _HDRPCGetValue(session, kHDRPCU16, index) -#define HDRPCGetValueU32(session, index) _HDRPCGetValue(session, kHDRPCU32, index) +#define HDRPCGetValueU8(session, index) (uint8_t)_HDRPCGetValue(session, kHDRPCU8, index) +#define HDRPCGetValueU16(session, index) (uint16_t)_HDRPCGetValue(session, kHDRPCU16, index) +#define HDRPCGetValueU32(session, index) (uint32_t)_HDRPCGetValue(session, kHDRPCU32, index) #ifdef HDRPC_USE_64 -#define HDRPCGetValueU64(session, index) _HDRPCGetValue(session, kHDRPCU64, index) +#define HDRPCGetValueU64(session, index) (uint64_t)_HDRPCGetValue(session, kHDRPCU64, index) #endif /** diff --git a/include/HProtocolBind.h b/include/HProtocolBind.h index 8fbf471..3628603 100644 --- a/include/HProtocolBind.h +++ b/include/HProtocolBind.h @@ -20,6 +20,11 @@ #define HPROTOCOL_BIND_INVALID (-1) #endif +// 协议绑定默认超时时间 +#ifndef HPROTOCOL_BIND_TIMEOUT +#define HPROTOCOL_BIND_TIMEOUT (3000) +#endif + ///< 协议绑定索引 typedef int16_t HProtocolBind_t; @@ -40,6 +45,7 @@ typedef struct HProtocolBindInfo uint32_t enable : 2; ///< 是否启用 uint32_t delayMs : 20; ///< 超时时间(ms) uint32_t isTimeout : 1; ///< 是否超时 + uint32_t keepAlive : 1; ///< 是否保持会话 HProtocolBindFunc_t func; ///< 功能码 uint32_t lastTime; ///< 发送时间 HProtocolBindCallback callback; ///< 回调, 超时时执行的数据和长度为空 @@ -58,10 +64,17 @@ uint8_t HProtocolBindRegister(uint8_t id, HProtocolBindInfo *info, uint8_t infoL * @param id 协议ID * @param func 功能码 * @param callback 回调 - * @param delayMs 超时时间(ms) + * @param keepAlive 是否保持会话, 保持会话则不超时 * @return HProtocolBind_t -1失败 */ -HProtocolBind_t HProtocolBindAddTask(HProtocolBindId_t id, HProtocolBindFunc_t func, HProtocolBindCallback callback, uint32_t delayMs); +HProtocolBind_t HProtocolBindAddTask(HProtocolBindId_t id, HProtocolBindFunc_t func, HProtocolBindCallback callback, uint8_t keepAlive); + +/** + * @brief 设置超时时间 + * @param index 绑定索引 + * @param delayMs 超时时间 + */ +void HProtocolBindSetTimeout(HProtocolBind_t index, uint32_t delayMs); /** * @brief 删除协议绑定 diff --git a/src/HDRPC.c b/src/HDRPC.c index 1977dd2..93c14e9 100644 --- a/src/HDRPC.c +++ b/src/HDRPC.c @@ -64,7 +64,7 @@ static void UpdateTimeout(uint8_t index, HDRPCCallBuffer *callBuff) { callBuff->isTimeout = 1; ++sInfo.timeoutCallLen; - LogD("Call[%s] Timeout, buffLen[%d]", callBuff->name, sInfo.timeoutCallLen); + LogD("Call[%s] code[0x%x] Timeout, buffLen[%d]", callBuff->name, callBuff->funcCode, sInfo.timeoutCallLen); // 如果超时函数有效, 则超时后释放 if (callBuff->timeout) { @@ -520,7 +520,7 @@ uint8_t HDRPCParseArgs(void *data, uint16_t len, HDRPCSession *session) while (index < len) { const uint8_t type = d[index++]; if (index >= len) { - LogD("func[%x], type[0x%x], index[%d] len[%d] error", session->func, type, index, len); + LogD("func[0x%x], type[0x%x], index[%d] len[%d] error", session->func, type, index, len); return 0; } diff --git a/src/HProtocolBind.c b/src/HProtocolBind.c index bf93a99..b1b7bd1 100644 --- a/src/HProtocolBind.c +++ b/src/HProtocolBind.c @@ -70,7 +70,7 @@ uint8_t HProtocolBindRegister(uint8_t id, HProtocolBindInfo *info, uint8_t infoL return 1; } -HProtocolBind_t HProtocolBindAddTask(HProtocolBindId_t id, HProtocolBindFunc_t func, HProtocolBindCallback callback, uint32_t delayMs) { +HProtocolBind_t HProtocolBindAddTask(HProtocolBindId_t id, HProtocolBindFunc_t func, HProtocolBindCallback callback, uint8_t keepAlive) { if (id >= HPROTOCOL_BIND_MAX) { LogD("error id[%d], max[%d]", id, HPROTOCOL_BIND_MAX); return HPROTOCOL_BIND_INVALID; @@ -99,11 +99,12 @@ HProtocolBind_t HProtocolBindAddTask(HProtocolBindId_t id, HProtocolBindFunc_t f ++sBindRegisters[id].useLen; sBindRegisters[id].binds[i].enable = kEnable; - sBindRegisters[id].binds[i].delayMs = delayMs; + sBindRegisters[id].binds[i].delayMs = HPROTOCOL_BIND_TIMEOUT; sBindRegisters[id].binds[i].isTimeout = 0; sBindRegisters[id].binds[i].func = func; sBindRegisters[id].binds[i].lastTime = HDLogGetTime(); sBindRegisters[id].binds[i].callback = callback; + sBindRegisters[id].binds[i].keepAlive = keepAlive; // 当前在回调, 需要延迟使能 if (sBindRegisters[id].curr) { @@ -118,6 +119,23 @@ HProtocolBind_t HProtocolBindAddTask(HProtocolBindId_t id, HProtocolBindFunc_t f return HPROTOCOL_BIND_INVALID; } +void HProtocolBindSetTimeout(HProtocolBind_t index, uint32_t delayMs) +{ + const uint8_t id = GET_ID(index); + index = GET_INDEX(index); + if (id >= HPROTOCOL_BIND_MAX) { + LogD("error id[%d], max[%d]", id, HPROTOCOL_BIND_MAX); + return ; + } + + if (index < 0 || index >= sBindRegisters[id].len) { + LogD("error index[%d], len[%d]", index, sBindRegisters[id].len); + return ; + } + + sBindRegisters[id].binds[index].delayMs = delayMs; +} + void HProtocolBindRemoveTask(HProtocolBind_t index) { const uint8_t id = GET_ID(index); index = GET_INDEX(index); @@ -187,7 +205,9 @@ void HProtocolBindUpdateData(HProtocolBindId_t id, HProtocolBindFunc_t func, voi } // 回调后立即释放 - FreeItem(id, i); + if (sBindRegisters[id].binds[i].keepAlive == 0) { + FreeItem(id, i); + } } } @@ -213,6 +233,10 @@ void HProtocolBindRun(HProtocolBindId_t id) continue; } + if (sBindRegisters[id].binds[i].keepAlive) { + continue; + } + if (sBindRegisters[id].binds[i].isTimeout) { continue; }