1. 增加绑定数据支持持续绑定
This commit is contained in:
parent
808e05cd07
commit
7cbcef238e
@ -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
|
||||
|
||||
/**
|
||||
|
||||
@ -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 删除协议绑定
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user