Compare commits

..

No commits in common. "cc177be0ebf2ecd83e0738661e9c13673a8325d5" and "e76325dd2ea6251a08685c67204f2c33dcddc062" have entirely different histories.

3 changed files with 16 additions and 58 deletions

View File

@ -72,7 +72,7 @@ void HTimerRun(uint8_t id);
HTimer_t HTimerAdd(uint8_t id, uint32_t ms, HTimerCallType call, eHTimerFlags flags);
///< 移除一个定时任务
void HTimerRemove(HTimer_t index);
void HTimerRemove(uint8_t id, HTimer_t index);
///< 在定时器回调任务中获取当前定时器ID
uint8_t HTimerGetCurrentId();

View File

@ -9,50 +9,25 @@
#endif
#define CREATE_INDEX(id, index) ((id << 8) | index)
#define GET_ID(index) ((index >> 8) & 0xFF)
#define GET_INDEX(index) (index & 0xFF)
enum eEnableStatus
{
kNotEnable, ///< 未使能
kWaitEnable, ///< 等待使能
kEnable, ///< 使能
kCallEnable, ///< 回调时使能, 需要延迟使能
};
#define GET_ID(index) ((index >> 8) & 0xFF)
#define GET_INDEX(index) (index & 0xFF)
struct __attribute__((packed)) BindInfo
{
uint32_t enable : 1; ///< 绑定使能
uint32_t curr : 1; ///< 当前绑定
uint32_t isCallAdd : 1; ///< 在回调的时候添加
uint32_t useLen : 8; ///< 使用长度, 减少扫描次数
uint32_t len : 8; ///< 绑定个数
uint32_t enable : 1; ///< 绑定使能
uint32_t curr : 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) {
if (sBindRegisters[id].enable) {
--sBindRegisters[id].useLen;
}
--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);
@ -92,25 +67,19 @@ HProtocolBind_t HProtocolBindAddTask(HProtocolBindId_t id, HProtocolBindFunc_t f
}
// 防中断导致数据重叠
sBindRegisters[id].binds[i].enable = kWaitEnable;
sBindRegisters[id].binds[i].enable = 1;
if (sBindRegisters[id].binds[i].enable != 1) {
continue;
}
++sBindRegisters[id].useLen;
sBindRegisters[id].binds[i].enable = kEnable;
sBindRegisters[id].binds[i].enable = 2;
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);
}
@ -167,7 +136,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 == kNotEnable || sBindRegisters[id].binds[i].enable == kCallEnable) {
if (sBindRegisters[id].binds[i].enable == 0) {
continue;
}
@ -181,9 +150,7 @@ 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;
}
// 回调后立即释放
@ -209,7 +176,7 @@ void HProtocolBindRun(HProtocolBindId_t id)
}
for (uint16_t i = 0; i < sBindRegisters[id].len; ++i) {
if (sBindRegisters[id].binds[i].enable == kNotEnable || sBindRegisters[id].binds[i].enable == kCallEnable) {
if (sBindRegisters[id].binds[i].enable == 0) {
continue;
}
@ -223,15 +190,11 @@ 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);
}

View File

@ -11,10 +11,7 @@
static uint32_t (*GetCurrentMs)(void);
#define CHECK_VALUE (0x0FFFFFFF)
#define CREATE_INDEX(id, index) ((id << 8) | index)
#define GET_ID(index) ((index >> 8) & 0xFF)
#define GET_INDEX(index) (index & 0xFF)
#define CHECK_VALUE (0x0FFFFFFF)
struct __attribute__((packed)) TimeRegisterInfo {
@ -87,7 +84,7 @@ static int16_t AddTimerData(uint8_t id, uint32_t duration, HTimerCallType call,
sTimeRegisters[id].timers[i].lastTime = GetCurrentMs();
sTimeRegisters[id].timers[i].call = call;
sTimeRegisters[id].timers[i].flags = flags;
return CREATE_INDEX(id, i);
return i;
}
LogD("timers full, id[%d], duration[%d], flags[%d]", id, duration, flags);
@ -185,9 +182,7 @@ HTimer_t HTimerAdd(uint8_t id, uint32_t ms, HTimerCallType call, eHTimerFlags fl
#endif
}
void HTimerRemove(HTimer_t index) {
const uint8_t id = GET_ID(index);
index = GET_INDEX(index);
void HTimerRemove(uint8_t id, HTimer_t index) {
if (id >= HTIMER_REGISTER_MAX) {
LogD("error id[%d]", id);
return ;
@ -222,7 +217,7 @@ HTimer_t HTimerGetCurrentCaller(uint8_t id) {
for (uint16_t i = 0; i < sTimeRegisters[id].len; ++i) {
if (sTimeRegisters[id].timers[i].curr == 1) {
return CREATE_INDEX(id, i);
return i;
}
}