docs: restructure framework, extract app execution module, group event collection & align GPIOs

This commit is contained in:
2026-07-10 10:47:00 +08:00
parent a04ea5fb51
commit b640fa25ae
24 changed files with 428 additions and 213 deletions

View File

@@ -1,40 +1,29 @@
# 模块拆分 - 事件总线分发管理 (Docs/50_module-breakdown/mod-event.md)
# 模块拆分 - 事件采集与总线分发管理 (Docs/50_module-breakdown/mod-event.md)
本模块描述系统事件缓冲队列Event Queue、事件分发路由器Event Dispatcher以及系统核心事件定义与流转机制
本模块描述系统输入事件采集(按键移位消抖滤波与 RF 自适应解调解码)、事件环形队列EventQueue缓冲以及事件输出分配EventDispatcher的整体流转规格
## 1. 模块职责说明
* **职责范围**
1. **事件解耦隔离**:作为硬件中断/扫描层Layer 2 驱动与应用层Layer 5 应用业务)的中间桥梁,使得高频的中断产生者和低频的业务逻辑处理器完全解耦。
2. **事件环形缓冲区 (EventQueue)**:实现一个深度为 4 级的环形事件队列。底层按键消抖模块和射频自适应解调模块作为“事件产生者”在任何时候都可以非阻塞地向缓冲区 Push 事件;主循环(或 APP 管理器)作为“事件消费者”从中 Pop 事件
3. **事件分发路由 (EventDispatcher)**:定时查询事件队列,若队列非空,则弹出首个事件并根据事件类型将其分发给当前活跃应用的前台 `active_app->onEvent(evt)` 钩子,或者分发给后台守护进程 `BgApp` 进行处理
1. **事件采集(按键输入)**
* 在 Timer1 中断 (10ms 时基) 中以移位方式读取物理引脚 `KEY_UP` (P0.1), `KEY_CONFIRM` (P0.2), `KEY_DOWN` (P0.3), `KEY_SOS` (P2.6) 的电平状态,连续 3 次检测一致确立电平
* 物理确认键长按 3 秒生成 `KEY_EVENT_SOS_LONG`,下移键长按 2 秒生成 `KEY_EVENT_DOWN_LONG`SOS键按下即刻产生最高优先级的 `KEY_SOS_ACTIVE` 求救事件
2. **事件采集(射频接收)**
* 当射频输入引脚 `RF_RX_DATA` (Pin 22 / `P2.1`) 发生电平沿变化时触发外部中断,定时器捕获高低电平比值。
* 解调自适应基准 T。连续采集 24 个数据位并组合还原 20 位物理 ID 及 4 位状态码。解密通过后打包为无线对码事件 `RF_EVENT_PAIR` 或报警事件 `RF_EVENT_ALARM`
3. **多事件环形队列缓冲 (EventQueue)**
* 维护一个深度为 4 级的软件环形事件队列。按键和射频中断作为“事件产生者”非阻塞地向其中 Push 事件,隔离高频中断和低频业务交互。
4. **事件输出路由分发 (EventDispatcher)**
* 在主循环轮询中,若检测到队列非空,从中 Pop 弹出第一个有效事件。
* 优先分发给物理强占型 APP`KEY_SOS_ACTIVE` 强制启动 SOSApp或分发给后台守护进程 `BgApp` 匹对防区决定是否唤醒 `AlarmApp`;其余常规交互事件分发给当前前台应用 `active_app->onEvent(evt)` 钩子。
---
## 2. 核心结构体与事件定义
## 2. 接口与函数说明
### 2.1 系统事件类型枚举 (KeyEvent)
```c
typedef enum {
KEY_EVENT_NONE,
KEY_EVENT_UP_CLICK, // SW1 单击 (Pin 21 / P2.0)
KEY_EVENT_DOWN_CLICK, // SW2 单击 (Pin 19 / P3.6)
KEY_EVENT_SOS_CLICK, // SW3 单击 (Pin 24 / P2.3)
KEY_EVENT_UP_LONG, // SW1 长按 3 秒
KEY_EVENT_DOWN_LONG, // SW2 长按 3 秒
KEY_EVENT_SOS_LONG, // SW3 长按 3 秒
KEY_EVENT_UP_DOWN_COMB, // SW1 + SW2 组合按键
KEY_SOS_ACTIVE, // 本地主动触发紧急报警事件
RF_EVENT_ALARM, // 射频接收到对码防区传感器触发事件
RF_EVENT_PAIR // 射频接收到未对码的传感器配对事件
} KeyEvent;
```
---
## 3. 接口与函数说明
* `void Event_Queue_Init(void)`:初始化环形队列的读写指针(`write_ptr = 0`, `read_ptr = 0`)与计数器。
* `bit Event_Queue_Push(KeyEvent evt)`:向队列尾部推入一个事件,若队列已满则丢弃并返回 0用于中断或扫描函数回调。
* `KeyEvent Event_Queue_Pop(void)`:从队列头部弹出一个事件,若队列为空则返回 `KEY_EVENT_NONE`
* `void Event_Dispatcher_Loop(void)`:在主循环中不断被轮询调用,从 `Event_Queue_Pop` 获取有效事件,分发路由到 `active_app->onEvent(evt)` 或后台监测模块。
* `void Event_Queue_Init(void)`:复位环形队列读写指针与总计数器。
* `bit Event_Queue_Push(KeyEvent evt)`:非阻塞将物理采集的事件推入队列尾部,成功返回 1。
* `KeyEvent Event_Queue_Pop(void)`:从队列头部弹出一个事件并返回,若空返回 `KEY_EVENT_NONE`
* `void Key_Scan_Process(void)`Timer1 (10ms) 滴答调度。扫描物理引脚 P0.1-P0.3 / P2.6 并判定长短按逻辑,调用 `Event_Queue_Push` 产生输入源。
* `bit EV1527_Decode(u32 *out_addr, u8 *out_type)`:无线引脚 `P2.1` 边沿触发,捕获解密数据,解密成功后由主轮询捕获并 Push 对应的射频事件。
* `void Event_Dispatcher_Loop(void)`:主循环轮询总线路由器,调用 `Event_Queue_Pop()` 并分发路由。