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