docs: optimize SOS button behavior, add 2-step pairing wizard, and IPC exit action

This commit is contained in:
2026-07-09 17:42:55 +08:00
parent 1168e747e6
commit 32c07c0466
16 changed files with 821 additions and 478 deletions

View File

@@ -1,15 +1,16 @@
# 模块拆分 - 系统核心控制与存储 (Docs/50_module-breakdown/mod-sys.md)
本模块定义手环系统的生命周期、时间计数器、定时中断调度器以及断电保存数据库模块。只涉及手环本地代码实现。
本模块定义手环系统的生命周期、状态机、时间计数器、定时中断调度器以及断电保存数据库模块。
## 1. 模块职责说明
* **职责范围**
1. 驱动系统主状态机运转(`current_state`)。
2. 提供 RTC 软时钟维护(`current_hour`, `current_min`, `current_sec`)。
3. 利用 Timer 1 产生 1ms 定时器中断,维护毫秒滴答计数器并作为其他外设时效的基础
4. 实现 IAP 读写底层函数,对防区数据库进行存取与读取
5. 读取并管理手环出厂固定唯一的 `bracelet_factory_id`,作为主动射频发送的数据源地址
3. 利用 Timer 1 产生 1ms 定时器中断,作为按键消抖、LED闪烁、马达脉冲及超时休眠计数器的调度时基
4. 维护无按键操作计时器 `inactivity_timer`,计满 10 秒后触发系统进入 `STATE_SLEEP`
5. 实现 IAP 读写底层函数,对防区数据库进行存取与读取
6. 读取并管理手环出厂固定唯一的 `bracelet_factory_id`,作为主动射频发送的数据源地址。
## 2. 数据结构定义
@@ -24,19 +25,19 @@ typedef struct {
} Sensor_Slot;
```
### 2.2 系统状态枚举 (SystemState)
### 2.2 系统状态 (SystemState)
```c
typedef enum {
STATE_NORMAL,
STATE_ARMED,
STATE_DISARMED,
STATE_PAIR_MENU,
STATE_PAIR_WAIT,
STATE_PAIR_CONFIRM,
STATE_PAIR_SUCCESS,
STATE_PAIR_FAIL,
STATE_ALARM,
STATE_SOS_EMITTED
STATE_CLOCK, // 常态时钟待机
STATE_SLEEP, // 低功耗休眠
STATE_MENU, // 主选择菜单
STATE_SET_TIME, // 时间日期设置
STATE_PAIR_SEARCH, // 对码等待搜寻
STATE_PAIR_CONFIRM, // 序号微调与保存确认
STATE_ARM_DISARM_SELECT, // 手动选择布撤防设定
STATE_IPC_BIND, // IPC 对码发射绑定
STATE_ALARMING, // 被动防区报警响应
STATE_SOS_EMITTED // 本地主动发射 SOS 呼救状态
} SystemState;
```
@@ -44,7 +45,7 @@ typedef enum {
### 3.1 定时与时钟函数
* `void Timer1_Init(void)`:配置 Timer 1 作为 1ms 中断源,并使能全局中断。
* `void Timer1_Isr(void) interrupt 3`ISR 中断处理自增时间滴答、维护 LED 闪烁周期、马达振动波形定时,以及维护软件 RTC自增 `current_sec` 并在满 60 秒时触发主界面分钟刷新)
* `void Timer1_Isr(void) interrupt 3`ISR 中断处理自增时间滴答,并在主循环处于非休眠时自增 `inactivity_timer` 超时计时器。自增 RTC时/分/秒/日/月/年)并维护其他任务定时
### 3.2 IAP 数据库存储接口
* `void Load_Database(void)`:从 Flash 扇区 `0xFE0000` 读取 16 组传感器配置载入内存的 `sensor_list`
@@ -55,13 +56,12 @@ typedef enum {
### 3.3 系统初始化与全局 ID 获取
* `void System_Init(void)`
1. 初始化单片机系统寄存器WTST, EAXFR 等)。
2. 读取 STC32G 硬件全球唯一 ID (UID)。
3. 提取 UID 中的后 3 字节,并通过 `& 0x0FFFFF` 裁剪为 20 位 EV1527 源地址,赋值给全局变量 `bracelet_factory_id`。如果读取失败,则默认赋予 `0x37A86UL`
4. 载入数据库并配置 Timer1 和外设 GPIO 状态。
2. 读取 STC32G 硬件全球唯一 ID (UID) 生成 `bracelet_factory_id`
3. 载入数据库并配置 Timer1 和外设 GPIO 状态
### 3.4 电池与充电检测接口
* `u16 Get_ADC_Result(u8 channel)`:底层 ADC 数据采集函数,完成单次指定通道的模拟量到 12-bit 数字量的转换并返回读数
* `u8 Read_Battery_Percent(void)`:读取通道 8 (`P0.0`),将电压采样转换数据做线性比例转换(`1279~1628` 映射到 `0~100`),计算并返回电量百分比
* `bit Is_Charging(void)`:读取 `P2.7`(充电检测管脚)的 GPIO 数字输入电平。当电平为高1时代表 USB 已接入,返回 `1`;否则返回 `0`
* `u16 Get_ADC_Result(u8 channel)`:底层 ADC 数据采集函数。
* `u8 Read_Battery_Percent(void)`:读取通道 8 (`P0.0`) 并返回 0%~100% 的电量
* `bit Is_Charging(void)`:读取 `P2.7` 返回是否处于充电状态
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes -->
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V2 -->