Files
stc32g128k/App/event.h

81 lines
2.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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