From 55e0793377b1e675465686775b94dc93af5e47dd Mon Sep 17 00:00:00 2001 From: coffee Date: Tue, 21 Oct 2025 17:35:12 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=AE=8C=E5=96=84=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E6=B7=BB=E5=8A=A0=E8=A6=81=E5=BB=B6?= =?UTF-8?q?=E5=90=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/HProtocolBind.c | 55 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/src/HProtocolBind.c b/src/HProtocolBind.c index 11b271b..ed497a9 100644 --- a/src/HProtocolBind.c +++ b/src/HProtocolBind.c @@ -12,22 +12,47 @@ #define GET_ID(index) ((index >> 8) & 0xFF) #define GET_INDEX(index) (index & 0xFF) +enum eEnableStatus +{ + kNotEnable, ///< 未使能 + kWaitEnable, ///< 等待使能 + kEnable, ///< 使能 + kCallEnable, ///< 回调时使能, 需要延迟使能 +}; + struct __attribute__((packed)) BindInfo { - uint32_t enable : 1; ///< 绑定使能 - uint32_t curr : 1; ///< 当前绑定 - uint32_t useLen : 8; ///< 使用长度, 减少扫描次数 - uint32_t len : 8; ///< 绑定个数 + uint32_t enable : 1; ///< 绑定使能 + uint32_t curr : 1; ///< 当前绑定 + uint32_t isCallAdd : 1; ///< 在回调的时候添加 + uint32_t useLen : 8; ///< 使用长度, 减少扫描次数 + uint32_t len : 8; ///< 绑定个数 HProtocolBindInfo *binds; ///< 绑定 }; static struct BindInfo sBindRegisters[HPROTOCOL_BIND_MAX]; 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)); } +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) { if (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) { continue; } ++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].isTimeout = 0; sBindRegisters[id].binds[i].func = func; sBindRegisters[id].binds[i].lastTime = HDLogGetTime(); 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); } @@ -136,7 +167,7 @@ void HProtocolBindUpdateData(HProtocolBindId_t id, HProtocolBindFunc_t func, voi } 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; } @@ -150,7 +181,9 @@ void HProtocolBindUpdateData(HProtocolBindId_t id, HProtocolBindFunc_t func, voi // 可能是同一个功能码绑定多个回调 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].curr = 0; } // 回调后立即释放 @@ -176,7 +209,7 @@ void HProtocolBindRun(HProtocolBindId_t id) } 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; } @@ -190,11 +223,15 @@ void HProtocolBindRun(HProtocolBindId_t id) // 可能是同一个功能码绑定多个回调 if (sBindRegisters[id].binds[i].callback) { + sBindRegisters[id].curr = 1; sBindRegisters[id].binds[i].callback(CREATE_INDEX(id, i), NULL, 0); + sBindRegisters[id].curr = 0; } // 回调后立即释放 FreeItem(id, i); } + + ResetEnable(id); }