1. 增加绑定数据支持持续绑定

This commit is contained in:
coffee 2025-11-05 18:28:37 +08:00
parent 808e05cd07
commit 7cbcef238e
4 changed files with 48 additions and 11 deletions

View File

@ -250,11 +250,11 @@ uint8_t __HDRPCCheckArgs(HDRPCSession *session, int len, ...);
* @return * @return
*/ */
HDRPCValue_t _HDRPCGetValue(HDRPCSession *session, uint8_t type, uint8_t index); HDRPCValue_t _HDRPCGetValue(HDRPCSession *session, uint8_t type, uint8_t index);
#define HDRPCGetValueU8(session, index) _HDRPCGetValue(session, kHDRPCU8, index) #define HDRPCGetValueU8(session, index) (uint8_t)_HDRPCGetValue(session, kHDRPCU8, index)
#define HDRPCGetValueU16(session, index) _HDRPCGetValue(session, kHDRPCU16, index) #define HDRPCGetValueU16(session, index) (uint16_t)_HDRPCGetValue(session, kHDRPCU16, index)
#define HDRPCGetValueU32(session, index) _HDRPCGetValue(session, kHDRPCU32, index) #define HDRPCGetValueU32(session, index) (uint32_t)_HDRPCGetValue(session, kHDRPCU32, index)
#ifdef HDRPC_USE_64 #ifdef HDRPC_USE_64
#define HDRPCGetValueU64(session, index) _HDRPCGetValue(session, kHDRPCU64, index) #define HDRPCGetValueU64(session, index) (uint64_t)_HDRPCGetValue(session, kHDRPCU64, index)
#endif #endif
/** /**

View File

@ -20,6 +20,11 @@
#define HPROTOCOL_BIND_INVALID (-1) #define HPROTOCOL_BIND_INVALID (-1)
#endif #endif
// 协议绑定默认超时时间
#ifndef HPROTOCOL_BIND_TIMEOUT
#define HPROTOCOL_BIND_TIMEOUT (3000)
#endif
///< 协议绑定索引 ///< 协议绑定索引
typedef int16_t HProtocolBind_t; typedef int16_t HProtocolBind_t;
@ -40,6 +45,7 @@ typedef struct HProtocolBindInfo
uint32_t enable : 2; ///< 是否启用 uint32_t enable : 2; ///< 是否启用
uint32_t delayMs : 20; ///< 超时时间(ms) uint32_t delayMs : 20; ///< 超时时间(ms)
uint32_t isTimeout : 1; ///< 是否超时 uint32_t isTimeout : 1; ///< 是否超时
uint32_t keepAlive : 1; ///< 是否保持会话
HProtocolBindFunc_t func; ///< 功能码 HProtocolBindFunc_t func; ///< 功能码
uint32_t lastTime; ///< 发送时间 uint32_t lastTime; ///< 发送时间
HProtocolBindCallback callback; ///< 回调, 超时时执行的数据和长度为空 HProtocolBindCallback callback; ///< 回调, 超时时执行的数据和长度为空
@ -58,10 +64,17 @@ uint8_t HProtocolBindRegister(uint8_t id, HProtocolBindInfo *info, uint8_t infoL
* @param id ID * @param id ID
* @param func * @param func
* @param callback * @param callback
* @param delayMs (ms) * @param keepAlive ,
* @return HProtocolBind_t -1 * @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 * @brief

View File

@ -64,7 +64,7 @@ static void UpdateTimeout(uint8_t index, HDRPCCallBuffer *callBuff) {
callBuff->isTimeout = 1; callBuff->isTimeout = 1;
++sInfo.timeoutCallLen; ++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) { if (callBuff->timeout) {
@ -520,7 +520,7 @@ uint8_t HDRPCParseArgs(void *data, uint16_t len, HDRPCSession *session)
while (index < len) { while (index < len) {
const uint8_t type = d[index++]; const uint8_t type = d[index++];
if (index >= len) { 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; return 0;
} }

View File

@ -70,7 +70,7 @@ uint8_t HProtocolBindRegister(uint8_t id, HProtocolBindInfo *info, uint8_t infoL
return 1; 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) { if (id >= HPROTOCOL_BIND_MAX) {
LogD("error id[%d], max[%d]", id, HPROTOCOL_BIND_MAX); LogD("error id[%d], max[%d]", id, HPROTOCOL_BIND_MAX);
return HPROTOCOL_BIND_INVALID; return HPROTOCOL_BIND_INVALID;
@ -99,11 +99,12 @@ HProtocolBind_t HProtocolBindAddTask(HProtocolBindId_t id, HProtocolBindFunc_t f
++sBindRegisters[id].useLen; ++sBindRegisters[id].useLen;
sBindRegisters[id].binds[i].enable = kEnable; 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].isTimeout = 0;
sBindRegisters[id].binds[i].func = func; sBindRegisters[id].binds[i].func = func;
sBindRegisters[id].binds[i].lastTime = HDLogGetTime(); sBindRegisters[id].binds[i].lastTime = HDLogGetTime();
sBindRegisters[id].binds[i].callback = callback; sBindRegisters[id].binds[i].callback = callback;
sBindRegisters[id].binds[i].keepAlive = keepAlive;
// 当前在回调, 需要延迟使能 // 当前在回调, 需要延迟使能
if (sBindRegisters[id].curr) { if (sBindRegisters[id].curr) {
@ -118,6 +119,23 @@ HProtocolBind_t HProtocolBindAddTask(HProtocolBindId_t id, HProtocolBindFunc_t f
return HPROTOCOL_BIND_INVALID; 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) { void HProtocolBindRemoveTask(HProtocolBind_t index) {
const uint8_t id = GET_ID(index); const uint8_t id = GET_ID(index);
index = GET_INDEX(index); index = GET_INDEX(index);
@ -187,9 +205,11 @@ void HProtocolBindUpdateData(HProtocolBindId_t id, HProtocolBindFunc_t func, voi
} }
// 回调后立即释放 // 回调后立即释放
if (sBindRegisters[id].binds[i].keepAlive == 0) {
FreeItem(id, i); FreeItem(id, i);
} }
} }
}
void HProtocolBindRun(HProtocolBindId_t id) void HProtocolBindRun(HProtocolBindId_t id)
{ {
@ -213,6 +233,10 @@ void HProtocolBindRun(HProtocolBindId_t id)
continue; continue;
} }
if (sBindRegisters[id].binds[i].keepAlive) {
continue;
}
if (sBindRegisters[id].binds[i].isTimeout) { if (sBindRegisters[id].binds[i].isTimeout) {
continue; continue;
} }