docs: restructure framework, extract app execution module, group event collection & align GPIOs
This commit is contained in:
25
Docs/50_module-breakdown/mod-app.md
Normal file
25
Docs/50_module-breakdown/mod-app.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# 模块拆分 - 应用执行层 (Docs/50_module-breakdown/mod-app.md)
|
||||
|
||||
本模块描述手环的 App 调度管理器(AppManager)、活跃前台应用生命周期钩子(OnStart, onRun, onClose, onEvent)以及各功能模块的页面渲染与状态机调度设计。
|
||||
|
||||
## 1. 模块职责说明
|
||||
|
||||
* **职责范围**:
|
||||
1. **应用生命周期调度 (AppManager)**:维护当前活跃应用的实例指针 `active_app`。当触发切换时,调用旧 App 的 `onClose()` 并调用新 App 的 `OnStart()`,初始化相应的视窗 GRAM。
|
||||
2. **待机时钟应用 (ClockApp)**:手环默认待机状态。中央以 `32x64px` 超大点阵渲染当前时分,右上角渲染 `16x32px` 电量百分比及充电指示 `+`;10秒无操作时触发睡眠调度。
|
||||
3. **主菜单应用 (MenuApp)**:单屏单条目显示交互。每次仅在中央渲染选中项的 `48x48px` 大图标,下方以大字渲染菜单名称,支持 ▲/▼ 键高亮切换,确认键进入对应子页面。
|
||||
4. **配对与微调应用 (PairApp)**:对码捕捉到未配对 24 位射频码时拉起。自动匹配识别传感器类型图标,提供 `32x64px` 超大微调序号选框(可通过 ▲/▼ 键在 `[01]`~`[99]` 之间滚动微调),确认后存入持久化 Flash。
|
||||
5. **传感器报警应用 (AlarmApp)**:被后台监测唤醒拉起。识别触发的对码槽位,屏幕闪烁红色粗边框,中央渲染该类传感器的 `48x48px` 警报大图标与防区前缀,调度对应的专属马达振动波形与 LED 警示颜色。
|
||||
6. **主动求救应用 (SOSApp)**:在待机时短按/长按 SOS 物理按键(Pin 27 / `P2.6`)拉起。屏幕高亮显示 `SOS EMIS`;调度发射模块以 2 秒为周期循环向外界发射 `0x08` (SOS) 无线电数据;触发最高优先级的持续马达震动及红色幻彩灯交替爆闪。
|
||||
|
||||
---
|
||||
|
||||
## 2. 接口与函数说明
|
||||
|
||||
* `void AppManager_Init(void)`:注册所有 WristbandApp 页面实例并设置默认活跃 App 指针为 ClockApp。
|
||||
* `void StartApp(u8 app_id)`:执行应用切换动作。安全切出旧前台应用并唤醒载入新应用。
|
||||
* `void CloseApp(void)`:退出当前活跃 App 实例,默认回退至待机时钟 ClockApp。
|
||||
* `void UI_ShowClockPage(SystemState state, u8 hour, u8 min)`:ClockApp 的专有刷屏绘制函数。
|
||||
* `void UI_ShowMenuPage(u8 selected_item)`:MenuApp 的专有菜单绘制函数。
|
||||
* `void UI_ShowPairConfirmPage(u8 type, u8 selected_suffix)`:PairApp 对码序号微调与保存绘制函数。
|
||||
* `void UI_ShowAlarmPage(u8 type, char *name_prefix, u8 suffix_num)`:AlarmApp 入侵警报粗红框与大图标绘制函数。
|
||||
@@ -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()` 并分发路由。
|
||||
|
||||
@@ -5,16 +5,16 @@
|
||||
## 1. 模块职责说明
|
||||
|
||||
* **职责范围**:
|
||||
1. **事件产生者 (Event Producer)**:物理按键 `KEY_UP` (P2.0), `KEY_DOWN` (P3.6), `KEY_CONFIRM` (P3.7), `KEY_SOS` (P2.3) 被按下触发低电平,按键模块负责将物理信号翻译为 `KeyEvent` 事件,并**推送到事件队列**中。
|
||||
1. **事件产生者 (Event Producer)**:物理按键 `KEY_UP` (P0.1), `KEY_DOWN` (P0.3), `KEY_CONFIRM` (P0.2), `KEY_SOS` (P2.6) 被按下触发低电平,按键模块负责定义物理端口输入并将物理信号翻译为 `KeyEvent` 事件。
|
||||
2. **移位消抖**:在 Timer1 10ms 中断分频中读取 IO 状态,连续 3 次检测一致则确认电平状态,过滤物理抖动。
|
||||
3. **推入事件队列**:当确认有物理键沿跳变时,调用 `Event_Queue_Push()` 将对应的 `KeyEvent` 压入独立的事件队列缓冲区中,避免因主逻辑繁忙丢失按键。
|
||||
4. **长短按时序**:确认键长按 3 秒产生 `KEY_CONFIRM_LONG`,▼ 键长按 2 秒产生 `KEY_DOWN_LONG`,SOS 键按下即刻产生最高优先级的 `KEY_SOS_ACTIVE` 抢占求救事件。
|
||||
4. **长短按时序**:确认键长按 3 秒产生长按事件,▼ 键长按 2 秒产生长按事件,SOS 键按下即刻产生最高优先级的 `KEY_SOS_ACTIVE` 抢占求救事件。
|
||||
|
||||
---
|
||||
|
||||
## 2. 接口与函数说明
|
||||
|
||||
* `void Key_Init(void)`:将 Pin 19, 20, 21, 24 配置为高阻输入并开启内部上拉电阻 (`P3PU |= 0xC0`, `P2PU |= 0x09`)。
|
||||
* `void Key_Init(void)`:将 Pin 30, 31, 32, 27 配置为高阻输入并开启内部上拉电阻 (`P0PU |= 0x0E`, `P2PU |= 0x40`)。
|
||||
* `void Key_Scan_Process(void)`:
|
||||
在 Timer1 的 10ms 定时周期中回调。
|
||||
* 读取 `KEY_UP`, `KEY_DOWN`, `KEY_CONFIRM`, `KEY_SOS` 引脚。
|
||||
@@ -23,4 +23,4 @@
|
||||
* `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 -->
|
||||
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V3 -->
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
## 2. 接口与函数说明
|
||||
|
||||
* `void LCD_Init(void)`:配置 Pin 9 到 Pin 14 的 SPI 通信总线引脚为推挽输出。拉高 `SHUT` 稳定后,向 RM69310 芯片写入初始化指令序列。
|
||||
* `void LCD_Init(void)`:配置 Pin 1 到 Pin 6 的 SPI 通信总线引脚为推挽输出。拉高 `SHUT` 稳定后,向 RM69310 芯片写入初始化指令序列。
|
||||
* `void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2)`:设置局部像素写入视窗,自动执行 `+4` 偏置修正。
|
||||
* `void LCD_Clear(u16 color)`:用指定颜色刷满屏幕 GRAM。
|
||||
* `void LCD_ShowStringCentered(u16 y, char *str, u16 fc, u16 bc)`:居中渲染 16x32 大字符。
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* **职责范围**:
|
||||
1. **响应指示请求**:提供底层硬件 SPI 写接口,受前台应用(如对码指示)或后台警报进程的控制,点亮特定色彩。
|
||||
2. **隔离抗干扰时序**:
|
||||
WS2812B 的单线纳秒级控制数据流极易受到地线高频噪声干扰。在每次调用 `WS2812_WriteRGB` 之前,必须执行 **临时关闭全局中断 (EA=0) 并切换马达引脚 (P2.4) 为高阻输入** 状态,发送完毕后恢复 `EA=1`,以屏蔽共地杂噪。
|
||||
WS2812B 的单线纳秒级控制数据流极易受到地线高频噪声干扰。在每次调用 `WS2812_WriteRGB` 之前,必须执行 **临时关闭全局中断 (EA=0) 并切换马达引脚 (P2.5) 为高阻输入** 状态,发送完毕后恢复 `EA=1`,以屏蔽共地杂噪。
|
||||
3. **软件定时器异步更新**:
|
||||
提供 `LED_Flash_Process` 中断分频函数,由 Timer1 (1ms) 定期回调自增,以非阻塞方式改变闪烁标志电平,避免软件 `delay` 阻塞 CPU。
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
|
||||
## 2. 接口与函数说明
|
||||
|
||||
* `void WS2812_Init(void)`:初始化物理引脚 `P2.6` (LED_RGB) 复用硬件 SPI 功能。
|
||||
* `void WS2812_Init(void)`:初始化物理引脚 `P2.3` (LED_RGB) 复用硬件 SPI 功能。
|
||||
* `void WS2812_WriteRGB(u8 l1_g, u8 l1_r, u8 l1_b, u8 l2_g, u8 l2_r, u8 l2_b)`:
|
||||
1. 保存并拉低 `EA = 0`。
|
||||
2. 临时设置马达控制脚 `P2.4` 为高阻输入。
|
||||
2. 临时设置马达控制脚 `P2.5` 为高阻输入。
|
||||
3. 通过 SPI 数据寄存器连续发送两个灯珠的 GRB 控制字节。
|
||||
4. 发送完毕后发出 >80us 低电平复位脉冲。
|
||||
5. 恢复马达引脚模式并还原 `EA`。
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
## 2. 接口与函数说明
|
||||
|
||||
* `void Motor_Init(void)`:配置 Pin 25 (`P2.4` / MOTOR_PWM) 为推挽输出,默认输出 `MOTOR_PWM = 0`。
|
||||
* `void Motor_Init(void)`:配置 Pin 26 (`P2.5` / MOTOR_PWM) 为推挽输出,默认输出 `MOTOR_PWM = 0`。
|
||||
* `void Motor_Start_Pattern(u8 pattern_type)`:传入震动节奏类型(按键微振/各防区警报震动/主动SOS循环震),装载维持时间片,开启异步状态机。
|
||||
* `void Motor_Pulse_Process(void)`:
|
||||
在 Timer1 的 10ms 中断分频中被调度调用。
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
|
||||
* **职责范围**:
|
||||
1. **低功耗决策与断电**:
|
||||
当应用管理层判定 10 秒无按键且无无线事件时,PM 模块向 AMOLED 发送 Display OFF 命令,随后拉低 `SHUT = 0` (Pin 28 / P2.7),**彻底切断 SGM3833 供电**。
|
||||
当应用管理层判定 10 秒无按键且无无线事件时,PM 模块向 AMOLED 发送 Display OFF 命令,随后拉低 `SHUT = 0` (Pin 23 / P2.2),**彻底切断 SGM3833 供电**。
|
||||
2. **挂起 CPU (Power-Down)**:
|
||||
使能 GPIO 按键沿中断和无线接收 `P0.0` 沿中断,写入 `PCON |= 0x02` 关闭高频振荡器,使 MCU 进入深度停机挂起。
|
||||
使能 GPIO 按键沿中断和无线接收沿中断,写入 `PCON |= 0x02` 关闭高频振荡器,使 MCU 进入深度停机挂起。
|
||||
3. **防浪涌安全唤醒初始化**:
|
||||
发生中断唤醒后,PM 必须遵循安全上电时序:首先拉高 `SHUT = 1` 开启 SGM3833,随后**执行 50ms 强阻塞延时**避开冲击电流并等待电源轨稳定,最后调用 `LCD_Init()` 完整重新配置 RM69310 寄存器,方可恢复应用绘制。
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
|
||||
## 2. 接口与函数说明
|
||||
|
||||
* `void Power_Init(void)`:配置 Pin 28 为推挽输出,默认 `SHUT = 1` 开启屏幕 PMIC。
|
||||
* `void Power_Init(void)`:配置 Pin 23 为推挽输出,默认 `SHUT = 1` 开启屏幕 PMIC。
|
||||
* `void Enter_Low_Power_Sleep(void)`:
|
||||
1. 向 RM69310 写入关屏指令 (0x28)。
|
||||
2. 拉低 `SHUT = 0` 关断 SGM3833 PMIC。
|
||||
3. 使能端口引脚沿中断 (P3.6/P3.7/P2.0/P2.3) 及 INT2 沿中断。
|
||||
4. 执行 `PCON |= 0x02` 进入停机模式。
|
||||
3. 使能端口引脚沿中断并进入 `PCON |= 0x02` 停机状态。
|
||||
* `void Wakeup_Restore(void)`:
|
||||
1. 拉高 `SHUT = 1` 重新开启 SGM3833。
|
||||
2. 执行 `delay_ms(50)` 硬件稳压阻塞等待。
|
||||
|
||||
@@ -5,18 +5,18 @@
|
||||
## 1. 模块职责说明
|
||||
|
||||
* **职责范围**:
|
||||
1. **事件产生者 (Event Producer)**:当物理引脚 `P0.0` (RF_RX_DATA) 沿中断触发,射频解调成功后,模块产生 `RF_EVENT_PAIR` (对码) 或 `RF_EVENT_ALARM` (报警) 并投递至系统事件总线。
|
||||
1. **事件产生者 (Event Producer)**:当物理引脚 `P2.1` (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 位状态数据码。
|
||||
3. **屏蔽接收 0x08 SOS 码**:手环被动接收到数据码为 `0x08` 的载波信号时,强制过滤忽略,不产生任何事件。仅保留主动向外界发射 `0x08` 求救码的能力。
|
||||
4. **主动发送驱动**:在应用层请求下,使能 `P0.1` (RF_TX) 和数据线 `P0.3` (RF_TX_DAT),连续发射多遍调制数据(如对码绑定 `0x01` 或求救包 `0x08`)。
|
||||
4. **主动发送驱动**:在应用层请求下,使能 `P2.0` (RF_TX) 和数据线 `P3.6` (RF_TX_DAT),连续发射多遍调制数据(如对码绑定 `0x01` 或求救包 `0x08`)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 接口与函数说明
|
||||
|
||||
* `void RF_Init(void)`:配置 `P0.0~P0.3` 物理引脚。使能接收控制 `RF_RX = 1`。使能引脚电平变化中断用于休眠唤醒。
|
||||
* `void RF_Init(void)`:配置 Pin 19, 20, 21, 22 物理引脚。使能接收控制 `RF_RX` (P3.7) = 1。使能引脚电平变化中断用于休眠唤醒。
|
||||
* `bit EV1527_Decode(u32 *out_addr, u8 *out_type)`:
|
||||
被主循环 `main.c` 轮询轮空调用。
|
||||
* 通过状态标志检测引脚跳变沿。
|
||||
@@ -24,4 +24,4 @@
|
||||
* `void EV1527_Transmit(u32 addr, u8 data_code)`:
|
||||
由主动发送 App 调度。产生前导头及 24 位电平时序。连续发送 5 遍,以确保 IPC 摄像头可靠捕获。
|
||||
|
||||
<!-- 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 -->
|
||||
|
||||
@@ -1,53 +1,36 @@
|
||||
# 模块拆分 - 系统状态机与 App 框架 (Docs/50_module-breakdown/mod-sys.md)
|
||||
# 模块拆分 - 系统初始化与 IAP 数据库 (Docs/50_module-breakdown/mod-sys.md)
|
||||
|
||||
本模块描述手环的 App 调度引擎(生命周期回调)以及 IAP 持久化防区数据库。
|
||||
本模块描述手环的系统基础时钟/中断配置、IAP 闪存数据库以及电池/充电硬件状态采样。
|
||||
|
||||
## 1. 模块职责说明
|
||||
|
||||
* **职责范围**:
|
||||
1. **维护 App 生命周期**:提供 `StartApp(app_id)` 和 `CloseApp(app_id)` 的系统级接口,调度应用层组件的切入与切出。
|
||||
2. **调用事件分发轮询**:主循环中调用独立事件模块 (`mod-event`) 的分发器,将事件投递至当前活跃 App 的 `onEvent` 回调。
|
||||
3. **系统外设与状态初始化**:配置初始时钟,使能全局中断,读取电池 ADC 电压(Pin 22 / `P2.1`)以及 USB 充电状态(Pin 23 / `P2.2`)。
|
||||
4. **后台应用调度**:当有传感器入侵事件触发时,不论当前处于什么 App 页面,后台监测进程会自动唤醒并强占调用警报 App(APP_ALARM)。
|
||||
5. **Flash 数据库管理**:维护 `0xFE0000` (第 254 扇区) 物理闪存的读写擦除,管理 16 个已配对传感器的配置数据(含有效标志 flags_suffix 及 EV1527 24位物理与数据合并地址)。
|
||||
1. **系统外设与状态初始化**:配置初始时钟,使能全局中断,初始化基本寄存器状态。
|
||||
2. **ADC 电量与充电读取**:通过硬件 ADC 通道 8 (Pin 29 / `P0.0`) 采样电池电压,并读取充电检测引脚 (Pin 28 / `P2.7`) 判断 USB 是否正在充电。
|
||||
3. **Flash 数据库管理**:维护 `0xFE0000` (第 254 扇区) 物理闪存的读写擦除,管理 16 个已配对传感器的配置数据(含有效位 flags_suffix 及 EV1527 24位地址)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 核心结构体与接口定义
|
||||
|
||||
### 2.1 应用程序结构体原型 (WristbandApp)
|
||||
### 2.1 传感器存储插槽定义 (Sensor_Slot)
|
||||
```c
|
||||
typedef struct {
|
||||
u8 app_id; // 应用程序 ID
|
||||
void (*OnStart)(void); // 启动接口:渲染初始画面、装载应用资源
|
||||
void (*onRun)(void); // 循环接口:主循环轮空调用,执行非阻塞业务逻辑
|
||||
void (*onClose)(void); // 关闭接口:退出前台,保存状态、复位相关驱动
|
||||
void (*onEvent)(KeyEvent evt); // 事件处理:接收并消耗事件队列分配的按键/射频事件
|
||||
} WristbandApp;
|
||||
```
|
||||
typedef struct {
|
||||
u8 flags_suffix; // 属性字节:Bit 7 代表有效标志 (1: 有效, 0: 空闲);Bit 0~6 代表法语防区名称的后缀序号 (01~99)
|
||||
u8 addr[3]; // 24位射频物理地址 (EV1527 地址 + 4位状态数据码)
|
||||
} Sensor_Slot;
|
||||
|
||||
### 2.2 APP 管理器全局状态
|
||||
```c
|
||||
extern WristbandApp* active_app; // 指向当前前台活跃应用的指针
|
||||
extern u16 inactivity_timer; // 无操作自动睡眠计时器
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 接口与函数说明
|
||||
|
||||
* `void App_Manager_Init(void)`:注册所有支持的应用实例(待机时钟、主菜单、时间设置、对码、布撤防、主动SOS、被动报警),默认设置 `active_app` 指向时钟应用并执行 `active_app->OnStart()`。
|
||||
* `void StartApp(u8 app_id)`:
|
||||
1. 执行当前 `active_app->onClose()` 清理现场。
|
||||
2. 切换 `active_app` 指向目标 `app_id` 实例。
|
||||
3. 执行新应用的 `active_app->OnStart()`,并置 `Redraw = 1`。
|
||||
* `void System_Init(void)`:配置 STC32G 系统时钟与中断,初始化各外设模块的 GPIO 状态。
|
||||
* `void Load_Database(void)`:读取 `0xFE0000` 扇区,载入 16 组 `Sensor_Slot` 数据。
|
||||
* `void Save_Database(void)`:擦除 IAP 扇区并写回当前缓存的配对记录。
|
||||
* `void Add_Sensor(u32 addr, u8 suffix_idx)`:添加配对(保存物理地址与后缀序号)并持久化。
|
||||
* `void Save_Database(void)`:擦除 IAP 扇区并写回当前缓存 of 配对记录。
|
||||
* `void Add_Sensor_To_Flash(u32 addr, u8 flags_suffix)`:添加配对并写入闪存。
|
||||
* `bit Check_Sensor_ID(u32 addr, u8 *out_slot_index)`:在数据库中匹配已对码的传感器 ID,获取槽位。
|
||||
* `u8 Read_Battery_Percent(void)`:通过硬件 ADC 通道 8 (Pin 29 / `P0.0`) 采样计算当前电量。
|
||||
* `bit Is_Charging(void)`:读取检测引脚 (Pin 28 / `P2.7`) 判定 USB 是否正在充电。
|
||||
|
||||
<!-- 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 -->
|
||||
|
||||
Reference in New Issue
Block a user