1. 完善回调的时候添加要延后

This commit is contained in:
coffee 2025-10-21 17:35:12 +08:00
parent e76325dd2e
commit 55e0793377

View File

@ -12,22 +12,47 @@
#define GET_ID(index) ((index >> 8) & 0xFF) #define GET_ID(index) ((index >> 8) & 0xFF)
#define GET_INDEX(index) (index & 0xFF) #define GET_INDEX(index) (index & 0xFF)
enum eEnableStatus
{
kNotEnable, ///< 未使能
kWaitEnable, ///< 等待使能
kEnable, ///< 使能
kCallEnable, ///< 回调时使能, 需要延迟使能
};
struct __attribute__((packed)) BindInfo struct __attribute__((packed)) BindInfo
{ {
uint32_t enable : 1; ///< 绑定使能 uint32_t enable : 1; ///< 绑定使能
uint32_t curr : 1; ///< 当前绑定 uint32_t curr : 1; ///< 当前绑定
uint32_t useLen : 8; ///< 使用长度, 减少扫描次数 uint32_t isCallAdd : 1; ///< 在回调的时候添加
uint32_t len : 8; ///< 绑定个数 uint32_t useLen : 8; ///< 使用长度, 减少扫描次数
uint32_t len : 8; ///< 绑定个数
HProtocolBindInfo *binds; ///< 绑定 HProtocolBindInfo *binds; ///< 绑定
}; };
static struct BindInfo sBindRegisters[HPROTOCOL_BIND_MAX]; static struct BindInfo sBindRegisters[HPROTOCOL_BIND_MAX];
static void FreeItem(uint8_t id, HProtocolBind_t index) { static void FreeItem(uint8_t id, HProtocolBind_t index) {
--sBindRegisters[id].useLen; if (sBindRegisters[id].enable) {
--sBindRegisters[id].useLen;
}
memset(&sBindRegisters[id].binds[index], 0, sizeof(HProtocolBindInfo)); memset(&sBindRegisters[id].binds[index], 0, sizeof(HProtocolBindInfo));
} }
static void ResetEnable(uint8_t id) {
if (sBindRegisters[id].isCallAdd == 0) {
return ;
}
sBindRegisters[id].isCallAdd = 0;
for (uint16_t i = 0; i < sBindRegisters[id].len; ++i) {
if (sBindRegisters[id].binds[i].enable == kCallEnable) {
sBindRegisters[id].binds[i].enable = kEnable;
}
}
}
uint8_t HProtocolBindRegister(uint8_t id, HProtocolBindInfo *info, uint8_t infoLen) { uint8_t HProtocolBindRegister(uint8_t id, HProtocolBindInfo *info, uint8_t infoLen) {
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);
@ -67,19 +92,25 @@ HProtocolBind_t HProtocolBindAddTask(HProtocolBindId_t id, HProtocolBindFunc_t f
} }
// 防中断导致数据重叠 // 防中断导致数据重叠
sBindRegisters[id].binds[i].enable = 1; sBindRegisters[id].binds[i].enable = kWaitEnable;
if (sBindRegisters[id].binds[i].enable != 1) { if (sBindRegisters[id].binds[i].enable != 1) {
continue; continue;
} }
++sBindRegisters[id].useLen; ++sBindRegisters[id].useLen;
sBindRegisters[id].binds[i].enable = 2; sBindRegisters[id].binds[i].enable = kEnable;
sBindRegisters[id].binds[i].delayMs = delayMs; sBindRegisters[id].binds[i].delayMs = delayMs;
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;
// 当前在回调, 需要延迟使能
if (sBindRegisters[id].curr) {
sBindRegisters[id].binds[i].enable = kCallEnable;
sBindRegisters[id].isCallAdd = 1;
}
return CREATE_INDEX(id, i); return CREATE_INDEX(id, i);
} }
@ -136,7 +167,7 @@ void HProtocolBindUpdateData(HProtocolBindId_t id, HProtocolBindFunc_t func, voi
} }
for (uint16_t i = 0; i < sBindRegisters[id].len; ++i) { for (uint16_t i = 0; i < sBindRegisters[id].len; ++i) {
if (sBindRegisters[id].binds[i].enable == 0) { if (sBindRegisters[id].binds[i].enable == kNotEnable || sBindRegisters[id].binds[i].enable == kCallEnable) {
continue; continue;
} }
@ -150,7 +181,9 @@ void HProtocolBindUpdateData(HProtocolBindId_t id, HProtocolBindFunc_t func, voi
// 可能是同一个功能码绑定多个回调 // 可能是同一个功能码绑定多个回调
if (sBindRegisters[id].binds[i].callback) { if (sBindRegisters[id].binds[i].callback) {
sBindRegisters[id].curr = 1;
sBindRegisters[id].binds[i].callback(CREATE_INDEX(id, i), (uint8_t*)data, len); sBindRegisters[id].binds[i].callback(CREATE_INDEX(id, i), (uint8_t*)data, len);
sBindRegisters[id].curr = 0;
} }
// 回调后立即释放 // 回调后立即释放
@ -176,7 +209,7 @@ void HProtocolBindRun(HProtocolBindId_t id)
} }
for (uint16_t i = 0; i < sBindRegisters[id].len; ++i) { for (uint16_t i = 0; i < sBindRegisters[id].len; ++i) {
if (sBindRegisters[id].binds[i].enable == 0) { if (sBindRegisters[id].binds[i].enable == kNotEnable || sBindRegisters[id].binds[i].enable == kCallEnable) {
continue; continue;
} }
@ -190,11 +223,15 @@ void HProtocolBindRun(HProtocolBindId_t id)
// 可能是同一个功能码绑定多个回调 // 可能是同一个功能码绑定多个回调
if (sBindRegisters[id].binds[i].callback) { if (sBindRegisters[id].binds[i].callback) {
sBindRegisters[id].curr = 1;
sBindRegisters[id].binds[i].callback(CREATE_INDEX(id, i), NULL, 0); sBindRegisters[id].binds[i].callback(CREATE_INDEX(id, i), NULL, 0);
sBindRegisters[id].curr = 0;
} }
// 回调后立即释放 // 回调后立即释放
FreeItem(id, i); FreeItem(id, i);
} }
ResetEnable(id);
} }