Compare commits
2 Commits
e76325dd2e
...
cc177be0eb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc177be0eb | ||
|
|
55e0793377 |
@ -72,7 +72,7 @@ void HTimerRun(uint8_t id);
|
||||
HTimer_t HTimerAdd(uint8_t id, uint32_t ms, HTimerCallType call, eHTimerFlags flags);
|
||||
|
||||
///< 移除一个定时任务
|
||||
void HTimerRemove(uint8_t id, HTimer_t index);
|
||||
void HTimerRemove(HTimer_t index);
|
||||
|
||||
///< 在定时器回调任务中获取当前定时器ID
|
||||
uint8_t HTimerGetCurrentId();
|
||||
|
||||
@ -9,25 +9,50 @@
|
||||
#endif
|
||||
|
||||
#define CREATE_INDEX(id, index) ((id << 8) | index)
|
||||
#define GET_ID(index) ((index >> 8) & 0xFF)
|
||||
#define GET_INDEX(index) (index & 0xFF)
|
||||
#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);
|
||||
}
|
||||
|
||||
|
||||
13
src/HTimer.c
13
src/HTimer.c
@ -11,7 +11,10 @@
|
||||
|
||||
static uint32_t (*GetCurrentMs)(void);
|
||||
|
||||
#define CHECK_VALUE (0x0FFFFFFF)
|
||||
#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)
|
||||
|
||||
|
||||
struct __attribute__((packed)) TimeRegisterInfo {
|
||||
@ -84,7 +87,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 i;
|
||||
return CREATE_INDEX(id, i);
|
||||
}
|
||||
|
||||
LogD("timers full, id[%d], duration[%d], flags[%d]", id, duration, flags);
|
||||
@ -182,7 +185,9 @@ HTimer_t HTimerAdd(uint8_t id, uint32_t ms, HTimerCallType call, eHTimerFlags fl
|
||||
#endif
|
||||
}
|
||||
|
||||
void HTimerRemove(uint8_t id, HTimer_t index) {
|
||||
void HTimerRemove(HTimer_t index) {
|
||||
const uint8_t id = GET_ID(index);
|
||||
index = GET_INDEX(index);
|
||||
if (id >= HTIMER_REGISTER_MAX) {
|
||||
LogD("error id[%d]", id);
|
||||
return ;
|
||||
@ -217,7 +222,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 i;
|
||||
return CREATE_INDEX(id, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user