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
*/
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
/**

View File

@ -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

View File

@ -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;
}

View File

@ -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,9 +205,11 @@ void HProtocolBindUpdateData(HProtocolBindId_t id, HProtocolBindFunc_t func, voi
}
// 回调后立即释放
if (sBindRegisters[id].binds[i].keepAlive == 0) {
FreeItem(id, i);
}
}
}
void HProtocolBindRun(HProtocolBindId_t id)
{
@ -213,6 +233,10 @@ void HProtocolBindRun(HProtocolBindId_t id)
continue;
}
if (sBindRegisters[id].binds[i].keepAlive) {
continue;
}
if (sBindRegisters[id].binds[i].isTimeout) {
continue;
}