1. 完善回调的时候添加要延后
This commit is contained in:
parent
e76325dd2e
commit
55e0793377
@ -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);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user