docs: 重构系统层级为自下而上,剥离独立事件管理模块,全量校正GPIO引脚映射为原理图线标

This commit is contained in:
2026-07-10 10:04:40 +08:00
parent fdda10aadc
commit a04ea5fb51
28 changed files with 291 additions and 120 deletions

View File

@@ -0,0 +1,40 @@
# 模块拆分 - 事件总线与分发管理 (Docs/50_module-breakdown/mod-event.md)
本模块描述系统事件缓冲队列Event Queue、事件分发路由器Event Dispatcher以及系统核心事件定义与流转机制。
## 1. 模块职责说明
* **职责范围**
1. **事件解耦隔离**:作为硬件中断/扫描层Layer 2 驱动与应用层Layer 5 应用业务)的中间桥梁,使得高频的中断产生者和低频的业务逻辑处理器完全解耦。
2. **事件环形缓冲区 (EventQueue)**:实现一个深度为 4 级的环形事件队列。底层按键消抖模块和射频自适应解调模块作为“事件产生者”在任何时候都可以非阻塞地向缓冲区 Push 事件;主循环(或 APP 管理器)作为“事件消费者”从中 Pop 事件。
3. **事件分发路由 (EventDispatcher)**:定时查询事件队列,若队列非空,则弹出首个事件并根据事件类型将其分发给当前活跃应用的前台 `active_app->onEvent(evt)` 钩子,或者分发给后台守护进程 `BgApp` 进行处理。
---
## 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)` 或后台监测模块。

View File

@@ -6,8 +6,8 @@
* **职责范围**
1. **事件产生者 (Event Producer)**:物理按键 `KEY_UP` (P2.0), `KEY_DOWN` (P3.6), `KEY_CONFIRM` (P3.7), `KEY_SOS` (P2.3) 被按下触发低电平,按键模块负责将物理信号翻译为 `KeyEvent` 事件,并**推送到事件队列**中。
2. **移位消抖**:在 Timer1 10ms 中断分频中读取 IO 状态,连续 3 次检测一致则确认电平状态,滤波滤除物理抖动。
3. **多事件防丢缓冲**:维护一个深度为 4 级的环形事件队列。当主循环繁忙(例如正在处理复杂的 SPI 显示或 RF 编解码)时,后续到达的按键事件被压入队列保存,避免丢键。
2. **移位消抖**:在 Timer1 10ms 中断分频中读取 IO 状态,连续 3 次检测一致则确认电平状态,滤物理抖动。
3. **推入事件队列**:当确认有物理键沿跳变时,调用 `Event_Queue_Push()` 将对应的 `KeyEvent` 压入独立的事件队列缓冲区中,避免因主逻辑繁忙丢失按键。
4. **长短按时序**:确认键长按 3 秒产生 `KEY_CONFIRM_LONG`,▼ 键长按 2 秒产生 `KEY_DOWN_LONG`SOS 键按下即刻产生最高优先级的 `KEY_SOS_ACTIVE` 抢占求救事件。
---
@@ -20,7 +20,7 @@
* 读取 `KEY_UP`, `KEY_DOWN`, `KEY_CONFIRM`, `KEY_SOS` 引脚。
* 累加按键维持计数器以判定长按与短按。
* 将结果转换为 `KeyEvent` 传入事件队列。
* `bit Key_Push_Event(KeyEvent evt)`:将产生的事件压入事件环形队列Event Queue。若溢出返回 0。
* `KeyEvent Key_Pop_Event(void)`循环调用该接口读出排队事件。若空返回 `KEY_EVENT_NONE`
* `bit Event_Queue_Push(KeyEvent evt)`:将产生的按键事件压入系统事件环形队列。若溢出返回 0。
* `KeyEvent Event_Queue_Pop(void)`分发循环调用该接口读出排队事件。若空返回 `KEY_EVENT_NONE`
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V2 -->

View File

@@ -25,4 +25,4 @@
* `void LCD_ShowString32x64Centered(u16 y, char *str, u16 fc, u16 bc)`:居中渲染 32x64 超大字符。
* `void LCD_ShowImage(u16 x, u16 y, u16 w, u16 h, const u8 *img, u16 fc, u16 bc)`:将单色大位图写入屏幕指定 GRAM。
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V2 -->
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V3 -->

View File

@@ -24,4 +24,4 @@
5. 恢复马达引脚模式并还原 `EA`
* `void LED_Flash_Process(void)`:中断更新闪烁标志位状态,用于驱动交替闪烁。
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V2 -->
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V3 -->

View File

@@ -22,4 +22,4 @@
* 计数归零时,反转物理引脚 `MOTOR_PWM` 的电平,并装填下一阶段所需维持的毫秒数。
* `void Motor_Stop(void)`:强行清空所有震动计数器,并拉低引脚电平使其停止震动。
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V2 -->
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V3 -->

View File

@@ -28,4 +28,4 @@
3. 重新调用 `LCD_Init()` 完成屏幕控制寄存器复位和 GRAM 开启。
4. 路由通知应用管理器切回时钟应用重新绘制。
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V2 -->
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V3 -->

View File

@@ -5,7 +5,7 @@
## 1. 模块职责说明
* **职责范围**
1. **事件产生者 (Event Producer)**:当物理引脚 `P0.0` (RF_RX_DATA) 沿中断触发,射频解调成功后,模块产生 `RF_PAIR_EVENT` (对码) 或 `RF_ALARM_EVENT` (报警) 并投递至系统事件总线。
1. **事件产生者 (Event Producer)**:当物理引脚 `P0.0` (RF_RX_DATA) 沿中断触发,射频解调成功后,模块产生 `RF_EVENT_PAIR` (对码) 或 `RF_EVENT_ALARM` (报警) 并投递至系统事件总线。
2. **自适应解调算法**
* 捕获 1500us~60000us 的同步低电平,动态计算时钟基准 `T = low_time / 31`
* 连续解调 24 位宽数据1:3 对应 0 码3:1 对应 1 码,计算出 20 位地址码与 4 位状态数据码。

View File

@@ -1,14 +1,15 @@
# 模块拆分 - 系统状态机与 App 框架 (Docs/50_module-breakdown/mod-sys.md)
本模块描述手环的软件事件管理器、App 调度引擎(生命周期回调)以及 IAP 持久化防区数据库。
本模块描述手环的 App 调度引擎(生命周期回调)以及 IAP 持久化防区数据库。
## 1. 模块职责说明
* **职责范围**
1. **维护 App 生命周期**:提供 `StartApp(app_id)``CloseApp(app_id)` 的系统级接口,调度应用层组件的切入与切出。
2. **事件路由器**主循环不断查询事件环形缓冲区Event Queue。若有事件分发至当前活跃 App 的 `onEvent` 接口
3. **后台应用调度**:当有传感器入侵事件触发时,不论当前处于什么 App 页面,后台监测进程会自动唤醒并强占调用警报 AppAPP_ALARM)。
4. **Flash 数据库管理**:维护 `0xFE0000` (第 254 扇区) 物理闪存的读写擦除,管理 16 个已配对传感器的配置数据
2. **调用事件分发轮询**:主循环中调用独立事件模块 (`mod-event`) 的分发器,将事件投递至当前活跃 App 的 `onEvent` 回调
3. **系统外设与状态初始化**:配置初始时钟,使能全局中断,读取电池 ADC 电压Pin 22 / `P2.1`)以及 USB 充电状态Pin 23 / `P2.2`)。
4. **后台应用调度**:当有传感器入侵事件触发时,不论当前处于什么 App 页面,后台监测进程会自动唤醒并强占调用警报 AppAPP_ALARM
5. **Flash 数据库管理**:维护 `0xFE0000` (第 254 扇区) 物理闪存的读写擦除,管理 16 个已配对传感器的配置数据(含有效标志 flags_suffix 及 EV1527 24位物理与数据合并地址
---