2026-07-15 16:14:30 +08:00
|
|
|
|
#ifndef __EVENT_H__
|
|
|
|
|
|
#define __EVENT_H__
|
|
|
|
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
/* ====== 事件环形缓冲区 (队列) 接口 ====== */
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 初始化事件队列
|
|
|
|
|
|
* @details 将队列的头指针、尾指针以及当前事件计数器全部归零,清空缓冲区。
|
|
|
|
|
|
*/
|
2026-07-15 16:14:30 +08:00
|
|
|
|
void EventQueue_Init(void);
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 将一个普通事件压入队列的末尾 (入队)
|
|
|
|
|
|
* @param evt 要入队的系统事件实例
|
|
|
|
|
|
* @return bit 1-入队成功,0-队列已满 (入队失败,丢弃事件)
|
|
|
|
|
|
* @note 此函数操作时会自动禁用全局中断 (EA = 0),操作完成后恢复以防止重入冲突。
|
|
|
|
|
|
*/
|
2026-07-15 16:14:30 +08:00
|
|
|
|
bit EventQueue_Push(SystemEvent evt);
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 将一个紧急/高优先级事件强行插入到队列的首部 (插队)
|
|
|
|
|
|
* @param evt 要优先处理的系统事件
|
|
|
|
|
|
* @return bit 1-插队成功,0-队列已满 (插队失败)
|
|
|
|
|
|
* @note 用于处理如 SOS 紧急求救和无线防区报警等需要立即响应的事件。操作受全局中断屏蔽保护。
|
|
|
|
|
|
*/
|
2026-07-15 16:14:30 +08:00
|
|
|
|
bit EventQueue_InsertFront(SystemEvent evt);
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 从队列首部弹出一个事件 (出队)
|
|
|
|
|
|
* @return SystemEvent 被取出的系统事件。如果队列为空,将返回一个 key_event 为 KEY_EVENT_NONE 的空事件。
|
|
|
|
|
|
* @note 操作时受全局中断屏蔽保护。
|
|
|
|
|
|
*/
|
2026-07-15 16:14:30 +08:00
|
|
|
|
SystemEvent EventQueue_Pop(void);
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 检测事件队列当前是否为空
|
|
|
|
|
|
* @return bit 1-队列为空,0-队列中仍有事件未处理
|
|
|
|
|
|
*/
|
2026-07-15 16:14:30 +08:00
|
|
|
|
bit EventQueue_IsEmpty(void);
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 检测事件队列当前是否已满 (即达到最大深度 8)
|
|
|
|
|
|
* @return bit 1-队列已满,0-队列仍有剩余空闲槽位
|
|
|
|
|
|
*/
|
2026-07-15 16:14:30 +08:00
|
|
|
|
bit EventQueue_IsFull(void);
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 获取事件队列中当前已缓冲的事件总个数
|
|
|
|
|
|
* @return u8 当前事件的缓存个数
|
|
|
|
|
|
*/
|
2026-07-15 16:14:30 +08:00
|
|
|
|
u8 EventQueue_GetCount(void);
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
2026-07-31 13:57:06 +08:00
|
|
|
|
/* ====== 事件分发环 ====== */
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 事件分发轮询主处理程序
|
|
|
|
|
|
* @details 负责从事件队列中弹出当前最优先的事件,解析其内容,处理全局重置逻辑(如重置闲置休眠计时器),
|
|
|
|
|
|
* 并根据事件的类型与当前活跃的前台 APP 状态将事件分发到具体的应用程序中去处理。
|
|
|
|
|
|
*/
|
2026-07-15 16:14:30 +08:00
|
|
|
|
void Event_Dispatcher_Loop(void);
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
2026-07-31 13:57:06 +08:00
|
|
|
|
// 主循环按键扫描定时标志 (由 Drivers/timer.c 的 Timer1 1ms 中断置 1,主循环响应清除)
|
2026-07-28 18:03:20 +08:00
|
|
|
|
extern volatile bit key_scan_flag;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 主循环按键扫描与消抖处理函数
|
|
|
|
|
|
* @details 将按键检测逻辑从中断搬移至此,在主线程执行,避免 ADC 多重采样冲突死锁
|
|
|
|
|
|
*/
|
|
|
|
|
|
void Event_KeyScan_Poll(void);
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
#endif // __EVENT_H__
|