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);
|
||
} |