121 lines
2.6 KiB
C
121 lines
2.6 KiB
C
|
|
#include "event.h"
|
|||
|
|
|
|||
|
|
/* =========================================================================
|
|||
|
|
* 事件队列内部变量
|
|||
|
|
* ========================================================================= */
|
|||
|
|
|
|||
|
|
// 环形缓冲区存储数组
|
|||
|
|
static SystemEvent event_queue[EVENT_QUEUE_DEPTH];
|
|||
|
|
|
|||
|
|
// 队列读写指针
|
|||
|
|
static u8 queue_head = 0; // 读指针:指向即将读取的位置
|
|||
|
|
static u8 queue_tail = 0; // 写指针:指向即将写入的位置
|
|||
|
|
static u8 queue_count = 0; // 当前队列中的事件数量
|
|||
|
|
|
|||
|
|
// 队列锁标志(用于中断保护)
|
|||
|
|
static bit queue_locked = 0;
|
|||
|
|
|
|||
|
|
/* =========================================================================
|
|||
|
|
* 事件队列核心实现
|
|||
|
|
* ========================================================================= */
|
|||
|
|
|
|||
|
|
void EventQueue_Init(void)
|
|||
|
|
{
|
|||
|
|
queue_head = 0;
|
|||
|
|
queue_tail = 0;
|
|||
|
|
queue_count = 0;
|
|||
|
|
queue_locked = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bit EventQueue_IsEmpty(void)
|
|||
|
|
{
|
|||
|
|
return (queue_count == 0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bit EventQueue_IsFull(void)
|
|||
|
|
{
|
|||
|
|
return (queue_count >= EVENT_QUEUE_DEPTH);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
u8 EventQueue_GetCount(void)
|
|||
|
|
{
|
|||
|
|
return queue_count;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bit EventQueue_Push(SystemEvent evt)
|
|||
|
|
{
|
|||
|
|
// 队列已满,丢弃事件
|
|||
|
|
if (EventQueue_IsFull())
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 禁用中断保护队列操作
|
|||
|
|
EA = 0;
|
|||
|
|
|
|||
|
|
// 将事件写入环形缓冲区
|
|||
|
|
event_queue[queue_tail] = evt;
|
|||
|
|
|
|||
|
|
// 更新写指针(循环递增)
|
|||
|
|
queue_tail++;
|
|||
|
|
if (queue_tail >= EVENT_QUEUE_DEPTH)
|
|||
|
|
{
|
|||
|
|
queue_tail = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新事件计数
|
|||
|
|
queue_count++;
|
|||
|
|
|
|||
|
|
// 恢复中断
|
|||
|
|
EA = 1;
|
|||
|
|
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SystemEvent EventQueue_Pop(void)
|
|||
|
|
{
|
|||
|
|
SystemEvent evt;
|
|||
|
|
|
|||
|
|
// 初始化返回的空事件
|
|||
|
|
evt.key_event = KEY_EVENT_NONE;
|
|||
|
|
evt.priority = EVENT_PRIORITY_LOW;
|
|||
|
|
evt.extra_data = 0;
|
|||
|
|
evt.extra_size = 0;
|
|||
|
|
|
|||
|
|
// 队列为空,返回空事件
|
|||
|
|
if (EventQueue_IsEmpty())
|
|||
|
|
{
|
|||
|
|
return evt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 禁用中断保护队列操作
|
|||
|
|
EA = 0;
|
|||
|
|
|
|||
|
|
// 从队列头部读取事件
|
|||
|
|
evt = event_queue[queue_head];
|
|||
|
|
|
|||
|
|
// 更新读指针(循环递增)
|
|||
|
|
queue_head++;
|
|||
|
|
if (queue_head >= EVENT_QUEUE_DEPTH)
|
|||
|
|
{
|
|||
|
|
queue_head = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新事件计数
|
|||
|
|
queue_count--;
|
|||
|
|
|
|||
|
|
// 恢复中断
|
|||
|
|
EA = 1;
|
|||
|
|
|
|||
|
|
return evt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 外部声明:应用管理器的事件分发函数
|
|||
|
|
extern void AppManager_DispatchEvent(SystemEvent evt);
|
|||
|
|
|
|||
|
|
void EventQueue_EmergencyDispatch(SystemEvent evt)
|
|||
|
|
{
|
|||
|
|
// 紧急事件直接调用应用管理器分发,跳过队列
|
|||
|
|
// 这种方式用于SOS等最高优先级事件,确保立即响应
|
|||
|
|
AppManager_DispatchEvent(evt);
|
|||
|
|
}
|