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