From 32c07c046666c2625db5f4a611b35361988a4304 Mon Sep 17 00:00:00 2001 From: zouhaitao Date: Thu, 9 Jul 2026 17:42:55 +0800 Subject: [PATCH] docs: optimize SOS button behavior, add 2-step pairing wizard, and IPC exit action --- Docs/10_requirements-overview/main.md | 52 ++- Docs/20_requirements-detail/main.md | 44 ++- Docs/30_architecture/main.md | 371 ++++++++++++++------ Docs/40_ui-design/main.md | 110 +++--- Docs/40_ui-design/wristband_ui_gallery.html | 168 ++++----- Docs/50_module-breakdown/mod-key.md | 26 +- Docs/50_module-breakdown/mod-lcd.md | 28 +- Docs/50_module-breakdown/mod-power.md | 25 +- Docs/50_module-breakdown/mod-rf.md | 6 +- Docs/50_module-breakdown/mod-sys.md | 46 +-- Docs/60_coding/mod-key.md | 171 ++++++--- Docs/60_coding/mod-lcd.md | Bin 4945 -> 4350 bytes Docs/60_coding/mod-power.md | 76 +++- Docs/60_coding/mod-rf.md | 8 +- Docs/60_coding/mod-sys.md | 96 +++-- Docs/70_testing/main.md | 72 ++-- 16 files changed, 821 insertions(+), 478 deletions(-) diff --git a/Docs/10_requirements-overview/main.md b/Docs/10_requirements-overview/main.md index 4e81a30..b0327f1 100644 --- a/Docs/10_requirements-overview/main.md +++ b/Docs/10_requirements-overview/main.md @@ -1,11 +1,11 @@ # 总体需求 (Docs/10_requirements-overview/main.md) -## 1. 项目整体框架与系统拓扑 +本项目主要实现随身手环终端的底层驱动、核心业务管理以及低功耗待机逻辑。 -本项目**仅包含手环端核心业务及驱动代码的实现**。 -* **被动接收**:手环作为随身告警终端,独立接收来自 **7类 433MHz 传感器**的探测射频信号(本地安防联动系统)。 -* **主动发射**:手环在本地触发 SOS 求救时,必须向外主动发射 **433MHz SOS 呼救射频信号**,使周边的 IPC 摄像头接收并联动。 -* 周围的其他组件(如 IPC 摄像头和手机 APP)不在本项目编码范围内,仅作外部仿真与对接边界。 +## 1. 项目系统拓扑与边界 + +* **业务流向**:手环作为智能家居安防的便携式告警与求救终端,与无线传感器以及 IPC 摄像头(网络摄像机)构成以下星型网络架构。 +* **设计边界**:本项目**仅开发手环端的软件代码**,传感器和 IPC 摄像头侧的软件仅作为对接调试的外界仿真源。 ```mermaid graph TD @@ -13,18 +13,34 @@ graph TD Wristband -->|433MHz SOS 呼救信号| IPC[IPC 摄像头 (仿真对接)] ``` -## 2. 核心信号流向与手环行为要求 +--- -1. **传感器触发**:探测到异常时,发射固定编码信号(24位 EV1527 协议数据,包含 20位地址码 + 4位数据码)。 -2. **手环独立接收**:手环配备 LR690L 433MHz 接收解调芯片,独立进行软件自适应时序解码。 -3. **手环响应行为**: - * **屏幕显示**:1.14寸(135x240 像素,**竖直排版**,型号为 **SPEC LHS114TC-IF03 VER A**)TFT LCD 屏幕,**保持常亮显示时间**。报警时呈现对应的报警 ICON + 传感器法语名称。 - * **灯效响应**:可编程 RGB 灯珠根据传感器类型亮起对应颜色并进行特定波形闪烁。 - * **马达响应**:马达触发特定的振动次数与时长组合。 -4. **手环主动发射与辨识**: - * **主动求救**:用户短按手环上部的 SOS 键,手环进入 SOS 状态,并使用**出厂固定唯一 ID (Factory ID)** 作为源地址发射 433MHz 的 SOS 编码电报。 - * **身份辨识**:该出厂 ID 作为手环的唯一物理地址标识,以便 IPC 摄像头可以通过与该 ID 配对,唯一识别该手环并将其与具体的用户绑定。 +## 2. 总体功能需求 -## 3. 协作规范与门禁说明 -本项目的开发协作基于《开发规范.md》定义的“七个环节”。任何目录下文件的修改应当保证其依赖项是同步的。 -在每次完成阶段性工作或代码调整后,应运行 `python .xagent/check-dirty.py` 进行脏检测自检。 +手环系统应具备以下六大核心总体功能: + +### 2.1 显示时间日期与状态栏 +* 手环应支持软时钟走时,在主页面清晰直观地显示当前的小时、分钟、星期及日期信息。 +* 主页面状态栏应实时指示当前电池电量、USB 充电状态,以及当前的系统安防运行状态(布防/撤防)。 + +### 2.2 系统安防布防与撤防控制 +* 系统支持两种安防警戒模式: + * **布防状态**:对所有类型已配对的传感器报警信号(如门磁、红外等)均执行本地声光振动告警。 + * **撤防状态**:对普通盗防类传感器信号予以忽略,仅对危及安全和紧急求救的传感器信号进行报警响应。 + +### 2.3 传感器无线对码配对 +* 手环能捕获周围 433MHz 传感器发出的 EV1527 对码射频包,将其地址码与类型绑定记录在非易失存储区(掉电不丢失)。 +* 手环支持多达 16 个传感器防区槽位的配对与法语前缀加数字序号的命名保存。 + +### 2.4 主动呼救与 IPC 绑定配对 +* **主动求救**:当遇到紧急情况时,用户可一键快速触发主动 SOS 求救广播,向外以 2 秒为周期循环发射带有手环出厂固定唯一 ID 的 433MHz 载波信号。 +* **IPC 绑定**:手环提供主动向 IPC发射对码信号的功能,以便 IPC 摄像头将该手环地址绑定至特定用户,识别求救来源。 + +### 2.5 多维告警响应反馈 +* 手环根据捕获到报警传感器的类型,执行差异化的硬件声光、马达振动和屏幕图标文字反馈,提供直观的物理告警。 + +### 2.6 低功耗待机与中断秒级唤醒 +* 手环必须具备优秀的低功耗休眠机制,在连续无按键操作 10 秒后,自动关闭屏幕并切断屏幕供电电路,使单片机进入深度休眠(Power-Down 挂起状态)。 +* 手环在休眠状态下,支持任何物理按键按下瞬间被唤醒,以及接收到 433MHz 无线射频载波信号瞬间被唤醒,唤醒后应在极短时间内恢复系统运行与屏幕显示。 + + diff --git a/Docs/20_requirements-detail/main.md b/Docs/20_requirements-detail/main.md index 34464dd..44ab2af 100644 --- a/Docs/20_requirements-detail/main.md +++ b/Docs/20_requirements-detail/main.md @@ -2,24 +2,41 @@ 本章节定义手环终端的物理按键交互、报警矩阵(可编程 RGB 灯颜色与振动)以及防区划分详细需求。 -## 1. 物理按键与交互定义 +## 1. 物理按键与菜单交互定义 -手环共配备 **5 个物理按键**:侧边 3 个(▲ 上移、▼ 下移、■ 确认),上部 2 个(相同的 SOS1、SOS2,具备完全一致的并联电气逻辑)。 +手环共配备 **5 个物理按键**:侧边 3 个(▲ 上移、▼ 下移、■ 确认/CONFIRM),上部 2 个(相同的 SOS1、SOS2,具备完全一致的并联电气逻辑)。 -| 按键类别 | 按键动作 | 常态 (时钟待机) | 对码配对模式 | 警报触发状态 | +### 1.1 页面与状态定义 +* **时钟待机状态 (STATE_CLOCK)**:正常显示时间、日期、电量及布撤防状态。 +* **低功耗休眠状态 (STATE_SLEEP)**:无按键操作 10 秒后自动进入。屏幕完全关闭,拉低 `SGM_CTRL = 0` 关闭 SGM3833 供电,单片机进入 Power-Down 挂起状态。 +* **主选择菜单 (STATE_MENU)**:在 `STATE_CLOCK` 下长按 **■ 确认键** 3 秒进入。显示四个选项,通过 ▲/▼ 键进行滚动,CONFIRM 键确认进入: + 1. `1. DATE/HEURE` (进入时间日期修改界面 `STATE_SET_TIME`) + 2. `2. APPAIRAGE` (进入对码配对搜索界面 `STATE_PAIR_SEARCH`) + 3. `3. ARM/DISARM` (进入系统布撤防手动设定界面 `STATE_ARM_DISARM_SELECT`) + 4. `4. LIAISON IPC` (进入 IPC 摄像头绑定发送界面 `STATE_IPC_BIND`) + +### 1.2 按键动作状态机映射 + +| 当前状态 | ▲ 上移键动作 | ▼ 下移键动作 | ■ 确认键 (CONFIRM) 动作 | SOS1 / SOS2 按键动作 | | :--- | :--- | :--- | :--- | :--- | -| **侧边按键** | **▲ 上移键** | 短按:时间微调 | 菜单向上滚动 / **确认对码时自增序号 (01->99)** | 无动作 | -| **侧边按键** | **▼ 下移键** | 短按:时间微调 | 菜单向下滚动 / **确认对码时自减序号 (99->01)** | 长按 2 秒:解除当前告警并退回时钟 | -| **侧边按键** | **▲ + ▼ (同时长按3秒)** | **进入对码配对模式** | 无动作 | 无动作 | -| **侧边按键** | **■ 确认键 (CONFIRM)** | 无动作 | 菜单确认 / **对码确认页:确认保存配置** | 短按:解除当前告警并退回时钟 | -| **上部按键** | **SOS1 / SOS2 (短按)** | **触发本地主动 SOS 呼救 + 循环发射 433MHz 呼救包** | **对码确认页:确认保存配置** | 短按:解除告警并退回时钟 | -| **上部按键** | **SOS1 / SOS2 (长按5秒)** | **触发 IPC 绑定对码广播** | 无动作 | 长按:解除告警并退回时钟 | +| **时钟待机 (STATE_CLOCK)** | 无动作 | 无动作 | 长按 3 秒:进入主选择菜单 | 短按/长按:立即跳转至发送 SOS 报警 (`STATE_SOS_EMITTED`) | +| **低功耗休眠 (STATE_SLEEP)** | 短按:唤醒并恢复至时钟待机 | 短按:唤醒并恢复至时钟待机 | 短按:唤醒并恢复至时钟待机 | 短按/长按:唤醒系统并立即触发 SOS 报警 | +| **主选择菜单 (STATE_MENU)** | 短按:菜单项向上滚动 | 短按:菜单项向下滚动 | 短按:确认进入选中分支;长按 3 秒:退出菜单返回时钟 | 短按/长按:立即跳转至发送 SOS 报警 | +| **时间修改 (STATE_SET_TIME)** | 短按:增加当前选中数值 | 短按:减少当前选中数值 | 短按:保存并切换到下一个修改位;长按 3 秒:放弃修改返回时钟 | 短按/长按:立即跳转至发送 SOS 报警 | +| **对码配对 (STATE_PAIR_SEARCH)** | 无动作 | 长按 2 秒:放弃对码返回主菜单 | 无动作 | 短按/长按:立即跳转至发送 SOS 报警 | +| **对码确认微调 (STATE_PAIR_CONFIRM)** | **步骤1 (选类型)**:切换传感器类型
**步骤2 (选序号)**:自增后缀序号 (01->99) | **步骤1 (选类型)**:切换传感器类型
**步骤2 (选序号)**:自减后缀序号 (99->01) | **步骤1**:确认类型并进入步骤2 (选序号)
**步骤2**:确认保存配置并存入 Flash,返回时钟
*长按 3 秒:放弃保存返回时钟* | 短按/长按:立即跳转至发送 SOS 报警 | +| **布撤防手动设定 (STATE_ARM_DISARM_SELECT)** | 短按:切换布撤防高亮项 | 短按:切换布撤防高亮项 | 短按:保存选定状态返回时钟 | 短按/长按:立即跳转至发送 SOS 报警 | +| **IPC 绑定发送 (STATE_IPC_BIND)** | 无动作 | 长按 2 秒:放弃绑定返回时钟 | 短按:立刻再次发射绑定射频包;长按 3 秒:退出返回时钟 | 短按/长按:立即跳转至发送 SOS 报警 | +| **警报触发状态 (STATE_ALARMING)** | 短按:解除报警并退回时钟 | 短按:解除报警并退回时钟 | 短按:解除报警并退回时钟 | 短按/长按:解除报警并退回时钟 | +| **本地主动 SOS 发送 (STATE_SOS_EMITTED)** | 短按:解除 SOS 发送退回时钟 | 短按:解除 SOS 发送退回时钟 | 短按:解除 SOS 发送退回时钟 | 短按/长按:解除 SOS 发送退回时钟 | > [!NOTE] > 1. **双 SOS 按键冗余**:上部的两个 SOS 键在电路与软件上完全等价。按下其中任意一个按键,均会触发相同的 SOS 信号采集与求救动作。 -> 2. **警报快速解除**:在手环发出主动 SOS 呼救或响应被动防区报警时,按下“确认键”或任意一个“SOS 键”(或者长按“▼键”2秒)均会立刻切断声光电反馈,安全重置至时钟待机状态。 -> 3. **确认页序号手动修改**:当捕获到匹配 of 射频信号进入对码确认页时,界面将显示当前选定的前缀和初始序号。用户可以使用 ▲ 键增加序号,使用 ▼ 键减少序号(范围 `01` 到 `99`,达到边界自动截断),选中后按下“确认键”或任意“SOS 键”进行保存。 -> 4. **屏幕常亮与全时射频监测**:系统不进行任何低功耗关屏或停机操作。TFT LCD 屏幕始终常亮显示时钟待机画面。主频与 1ms 定时中断全时运转,配置 **`P0.0` (ADC 通道 8)** 进行电池电量采样,配置 **`P2.7`** 监测充电插拔状态。使 433MHz 射频解调模块保持 100% 实时无线监听接收,并在任何时候(包括待机和菜单状态)按下 SOS 均能实现即刻发送求救包。 +> 2. **一键报警优先级**:除了在报警状态和本地 SOS 发送状态下按 SOS 键为解除报警外,在其它任意状态下,短按或长按 SOS 键均拥有最高优先级,立刻强行中止当前业务并跳转至 SOS 呼救状态。 +> 3. **对码二步保存向导**:进入对码微调页面后,交互分为两个步骤: +> * **第一步 (选择类型)**:屏幕上的类型字段(如 `[ PORTE ]`)带选择框,按 ▲/▼ 可手动修正所捕获的传感器类型。按 CONFIRM 键保存当前选择并切换到第二步。 +> * **第二步 (选择序号)**:屏幕上的序号选框(如 `[ 01 ]`)高亮,按 ▲/▼ 键微调该类型传感器的序号(01~99)。按 CONFIRM 键完成最终写入并存入 Flash 数据库。 +> 4. **低功耗休眠与唤醒**:在待机、菜单或非报警页面下,若 **10秒内无任何按键操作**,系统将自动关闭 OLED 屏幕、切断 SGM3833 PMIC 电源,并将 MCU 挂起进入 Power-Down 停机模式。任何按键的按下或射频信号的接收都会通过中断将 CPU 瞬间唤醒。 ## 2. 传感器对码与报警映射矩阵 @@ -43,9 +60,6 @@ > * **数据码**:固定为 **`0x08`** (即 `1000`)。 > * **目的**:使 IPC 摄像头能接收解码,将其与配对列表中该手环 of Factory ID 匹对,从而识别求救来源。 -> [!IMPORTANT] -> **屏蔽 SOS 被动报警**:为避免两个手环互发 SOS 相互触发造成死循环报警,手环**必须强行过滤**并排除对外界发射的 SOS 求救广播(数据码为 `0x08`,或其它手环发射源)的被动接收。 - ## 3. ZONE 防区划分 手环支持将配对的传感器划分至不同的防区: diff --git a/Docs/30_architecture/main.md b/Docs/30_architecture/main.md index d054ff5..13f8a87 100644 --- a/Docs/30_architecture/main.md +++ b/Docs/30_architecture/main.md @@ -1,107 +1,264 @@ -# 架构设计 (Docs/30_architecture/main.md) - -本章节阐述手环的硬件拓扑、引脚分配、软件状态机设计、以及 IAP Flash 数据库存储设计。 - -## 1. 硬件规格与引脚映射 - -主控芯片采用 **STC32G12K128** 单片机(工作频率 24.0 MHz,单周期 8051 内核,32位乘除法器)。 -显示端采用 **1.14寸 TFT LCD 屏幕**,物理分辨率为 **135x240 像素**。 - -### 1.1 GPIO 引脚配置表 - -| 引脚号 | 引脚定义 | 模式配置 | 物理外设与功能说明 | -| :--- | :--- | :--- | :--- | -| **P2.3** | `WS2812_DI` | 双向/SPI MOSI | 连接可编程 RGB 灯珠(WS2812B/FCOB-2.7)的 DIN 信号输入 | -| **P2.5** | `MOTOR` | 推挽输出/SCLK | 连接振动马达驱动电路。高电平震动,低电平静止 | -| **P0.1** | `KEY_UP` | 高阻输入+上拉 | 侧边按键 ▲ (上移),按下为低电平 | -| **P0.3** | `KEY_DOWN` | 高阻输入+上拉 | 侧边按键 ▼ (下移),按下为低电平 | -| **P0.4** | `KEY_CONFIRM`| 高阻输入+上拉 | 侧边按键 ■ (确认),按下为低电平 | -| **P0.2** | `KEY_SOS1` | 高阻输入+上拉 | 上部按键 SOS 1,按下为低电平 | -| **P0.5** | `KEY_SOS2` | 高阻输入+上拉 | 上部按键 SOS 2,按下为低电平 | -| **P3.4** | `LCD_PWR_CTRL` | 推挽输出 | LCD 屏幕背光与芯片电源控制引脚。高电平使能,低电平关闭 | -| **P1.1** | `LCD_RST` | 推挽输出 | LCD 屏幕复位引脚 | -| **P1.3** | `LCD_RS` | 推挽输出 | LCD 屏幕 SPI 数据/命令寄存器选择 (D/C) | -| **P1.4** | `LCD_CS` | 推挽输出 | LCD 屏幕 SPI 片选信号 | -| **P1.5** | `LCD_SCL` | 推挽输出 | LCD 屏幕 SPI 时钟信号 | -| **P1.6** | `LCD_SDA` | 推挽输出 | LCD 屏幕 SPI 数据信号 | -| **P0.0** | `BAT_ADC` | 模拟输入 | 电池电压采样输入端口,对应硬件 ADC 通道 8 (A8) | -| **P2.7** | `USB_DET` | 高阻输入 | USB 插入充电检测引脚,高电平代表正在充电 | - -### 1.2 上部双 SOS 键并联逻辑设计 - -为了保证两颗 SOS 按键在软件逻辑上等价,软件在按键消抖和长按状态判定时,采用“逻辑并联”设计。定义一个虚拟的 `is_sos_pressed` 状态标志: -```c -// 只要 SOS1 或 SOS2 有任意一个被按下(低电平),即判定为 SOS 按下 -bit is_sos_pressed = (KEY_SOS1 == 0) || (KEY_SOS2 == 0); -``` -该标志后续被直接送入消抖状态机和长按计时器,生成 `KEY_SOS_SHORT` 或 `KEY_SOS_LONG` 事件,从而完全对上层业务层屏蔽双按键硬件细节。 - -### 1.3 出厂唯一固定 ID (Factory ID) 的设计与获取 - -手环在主动发射对码广播与主动 SOS 报警时,需要以唯一的出厂 ID (Factory ID) 作源地址以供接收端(IPC)进行辨识。 -为避免每台手环烧写不同固件,程序从 STC32G 内置的全球唯一硬件 ID (UID) 中提取地址码: -* **硬件读取源**:STC32G 芯片在出厂时会在程序存储器(ROM)的末尾扇区存储一个 **7 字节的唯一 ID**,同样在 RAM 空间的特定区(如 `0xF1`~`0xF7`)也会在启动时映射。 -* **Factory ID 生成**:系统初始化时,通过读取 UID 寄存器,将其中的 3 个字节提取出来,并进行 `& 0x0FFFFF`(20位掩码限制,以符合 EV1527 的 20 位地址规范),存入全局变量 `bracelet_factory_id` 中。若读取 UID 失败,则默认使用硬编码预置 ID `0x37A86UL`。 - -### 1.4 SPI 复用与马达防噪硬件规避设计 - -由于 `P2.5` 同时作为马达引脚和硬件 SPI 的 SCLK 引脚,为了避免在高频发送 24-bit 灯效数据时引脚电平抖动导致马达异常鸣叫: -1. **发送前**:调用 `EA = 0` 关闭总中断。临时将 `P2.5` 引脚配置为 **高阻输入模式**。此时 SCLK 输出时钟不会使马达导通。 -2. **发送中**:通过硬件 SPI 直接串行写入 72 位转换数据(24位 RGB 经过 LUT 展宽)。 -3. **发送后**:将 `P2.5` 引脚改回 **推挽输出模式**。调用 `EA = 1` 开启中断,继续通过常规 IO 控制马达电平。 - -### 1.5 确认配对时的后缀序号调整机制 - -在对码确认状态 (`STATE_PAIR_CONFIRM`) 下,系统支持用户手动微调所要保存同类防区的数字序号: -* **全局变量定义**:`u8 selected_suffix_num` 用以记录当前的数字选择值。 -* **初始默认分配**:当信号被捕获跳转到该状态时,系统自动检索当前内存对码表,统计捕获类型已登记的个数 $C$,将 `selected_suffix_num` 初始化为 $C + 1$。 -* **按键调整行为**: - * 读取到 `KEY_EVENT_UP_CLICK` 时:`if (selected_suffix_num < 99) selected_suffix_num++`。 - * 读取到 `KEY_EVENT_DOWN_CLICK` 时:`if (selected_suffix_num > 1) selected_suffix_num--`。 - * 调值完成后置 `Redraw = 1` 以触发 LCD 快速局部刷新。 -* **最终确认写入**:当用户按下 CONFIRM 键或 SOS 键时,系统自动取出对应的预设名前缀(如 `PORTE`),并将 `selected_suffix_num` 转换为两位字符串格式(如 `02`),以 `[前缀] [序号]` 格式拼装后(最大 15 字节,如 `PORTE 02`),调用数据库写入函数。 - ---- - -## 2. 核心软件业务状态机 (SystemState) - -系统处于主循环中,根据事件和计数器在以下状态(`SystemState`)间迁移: - -```mermaid -stateDiagram-v2 - [*] --> STATE_NORMAL - STATE_NORMAL --> STATE_ARMED : 接收到布防广播 - STATE_ARMED --> STATE_DISARMED : 接收到撤防广播 - STATE_DISARMED --> STATE_NORMAL : 自动恢复/按键返回 - - STATE_NORMAL --> STATE_PAIR_MENU : ▲ + ▼ 长按 3 秒 - STATE_PAIR_MENU --> STATE_PAIR_WAIT : 确认选中类型 - STATE_PAIR_WAIT --> STATE_PAIR_CONFIRM : 捕获 433MHz 匹配数据 - STATE_PAIR_CONFIRM --> STATE_PAIR_SUCCESS : 按 CONFIRM/SOS 键并保存名称 - STATE_PAIR_CONFIRM --> STATE_PAIR_FAIL : 超时/长按▼取消 - STATE_PAIR_SUCCESS --> STATE_PAIR_MENU : 2秒后自动返回 - STATE_PAIR_FAIL --> STATE_PAIR_MENU : 2秒后自动返回 - - STATE_NORMAL --> STATE_SOS_EMITTED : 短按 SOS - STATE_ARMED --> STATE_ALARMING : 捕获已配对传感器报警 - STATE_ALARMING --> STATE_NORMAL : 按任意键/超时解除 - STATE_SOS_EMITTED --> STATE_NORMAL : 长按任意键/超时解除 -``` - ---- - -## 3. IAP Flash 传感器数据库设计 - -为了断电保存传感器配对信息,使用 STC32G 的 IAP 功能读写 Flash: -* **扇区基地址**:`0xFE0000` (末尾扇区)。 -* **存储结构**:`Sensor_Slot` 结构体: - ```c - typedef struct { - u8 is_used; // 登记标志(0x01表示有效,其它代表空闲) - u8 addr[3]; // 24位射频物理地址 (EV1527) - u8 type; // 传感器类型 (0:门磁, 1:红外, 2:烟感, 3:紧急, 4:气体, 5:水浸, 6:振动) - u8 zone; // 防区类别 (0: 永久防区, 1: 普通可撤防区) - char name_gbk[16]; // 法语自定义防区名称 (以 [前缀] [序号] 自动格式化写入) - } Sensor_Slot; - ``` -* 一共支持 **16** 个传感器槽位,通过 `Load_Database()` 和 `Save_Database()` 进行统一序列化读写。 +# 架构设计说明书 (Docs/30_architecture/main.md) + +本章节定义手环的系统软硬件架构设计,包括引脚分配、核心状态机迁移关系、持久化数据存储结构以及软件分层框架与主循环调度流程。 + +--- + +## 1. 硬件原理图与引脚分配架构 + +手环的完整电路连接设计参见以下 KiCad 硬件工程文件: +* **硬件原理图**:[text.kicad_sch](file:///c:/workfile/105/stc32g12k128/Hardware/text.kicad_sch) +* **PCB 布局图**:[text.kicad_pcb](file:///c:/workfile/105/stc32g12k128/Hardware/text.kicad_pcb) + +主控芯片采用 **STC32G12K128**(工作频率 24.0 MHz,单周期 8051 内核,32位乘除法器)。 +显示端采用 **Truly 0.95寸 AMOLED 屏幕**,物理分辨率为 **120x240 像素**,控制芯片为 **RM69310**。 + +### 1.1 GPIO 物理映射表 + +| 引脚号 | 引脚名称 | IO 模式 | 连接外设与功能描述 | +| :--- | :--- | :--- | :--- | +| **P0.0** | `BAT_ADC` | 模拟输入 | 电池电压采样输入端口,对应硬件 ADC 通道 8 (A8) | +| **P0.1** | `KEY_UP` | 高阻输入+上拉 | 侧边按键 ▲ (上移),按下为低电平 | +| **P0.2** | `KEY_SOS1` | 高阻输入+上拉 | 上部按键 SOS 1,按下为低电平 | +| **P0.3** | `KEY_DOWN` | 高阻输入+上拉 | 侧边按键 ▼ (下移),按下为低电平 | +| **P0.4** | `KEY_CONFIRM`| 高阻输入+上拉 | 侧边按键 ■ (确认),按下为低电平 | +| **P0.5** | `KEY_SOS2` | 高阻输入+上拉 | 上部按键 SOS 2,按下为低电平 | +| **P1.1** | `LCD_RST` | 推挽输出 | LCD 屏幕复位引脚 | +| **P1.3** | `LCD_RS` | 推挽输出 | LCD 屏幕 SPI 数据/命令寄存器选择 (D/C) | +| **P1.4** | `LCD_CS` | 推挽输出 | LCD 屏幕 SPI 片选信号 | +| **P1.5** | `LCD_SCL` | 推挽输出 | LCD 屏幕 SPI 时钟信号 | +| **P1.6** | `LCD_SDA` | 推挽输出 | LCD 屏幕 SPI 数据信号 | +| **P2.3** | `WS2812_DI` | SPI MOSI | 连接可编程双级联 RGB 灯珠的 DIN 信号输入 | +| **P2.5** | `MOTOR` | 推挽输出 | 连接振动马达驱动电路。高电平震动,低电平静止 | +| **P2.7** | `USB_DET` | 高阻输入 | USB 插入充电检测引脚,高电平代表正在充电 | +| **P3.4** | `SGM_CTRL` | 推挽输出 | OLED 供电芯片 SGM3833 控制引脚。高电平使能,低电平关闭 | + +--- + +## 2. 软件核心业务状态机 + +系统包含 10 个业务状态,其状态迁移关系如下图所示: + +```mermaid +stateDiagram-v2 + [*] --> STATE_CLOCK + + %% 休眠与唤醒 + STATE_CLOCK --> STATE_SLEEP : 10秒无操作超时 + STATE_SLEEP --> STATE_CLOCK : 中断唤醒 (按键/无线信号) + + %% 主选择菜单迁移 + STATE_CLOCK --> STATE_MENU : CONFIRM 长按 3 秒 + STATE_MENU --> STATE_CLOCK : CONFIRM 长按 3 秒 / 10秒无操作超时 + STATE_MENU --> STATE_SLEEP : 10秒无操作超时 + + %% 子设置页面迁移 + STATE_MENU --> STATE_SET_TIME : 选中 "1. DATE/HEURE" + 确认键单击 + STATE_SET_TIME --> STATE_CLOCK : 保存退出 / 10秒无操作超时 + + STATE_MENU --> STATE_PAIR_SEARCH : 选中 "2. APPAIRAGE" + 确认键单击 + STATE_PAIR_SEARCH --> STATE_PAIR_CONFIRM : 捕获 433MHz 传感器数据 + STATE_PAIR_CONFIRM --> STATE_CLOCK : CONFIRM/SOS 确认并保存配置 + STATE_PAIR_SEARCH --> STATE_MENU : 长按 ▼ 键退出 + + STATE_MENU --> STATE_ARM_DISARM_SELECT : 选中 "3. ARM/DISARM" + 确认键单击 + STATE_ARM_DISARM_SELECT --> STATE_CLOCK : 选择完成并返回 + + STATE_MENU --> STATE_IPC_BIND : 选中 "4. LIAISON IPC" + 确认键单击 + STATE_IPC_BIND --> STATE_CLOCK : 发射结束 / 确认键长按 3s 退出 / ▼键长按 2s 退出 + + %% 报警迁移 + STATE_CLOCK --> STATE_SOS_EMITTED : 按下上部任意 SOS 键 (点击/长按) + STATE_SLEEP --> STATE_SOS_EMITTED : 中断唤醒直接报警 + STATE_SOS_EMITTED --> STATE_CLOCK : 按任意键/超时退出 + + STATE_CLOCK --> STATE_ALARMING : 捕获已配对传感器报警 (ZONE 0 或布防下的 ZONE 1) + STATE_ALARMING --> STATE_CLOCK : 按任意键/超时退出 +``` + +### 2.1 低功耗设计与唤醒架构 +为实现超低功耗,系统在 `STATE_SLEEP` 状态下使用以下硬件与软件协同设计: +1. **彻底切断 PMIC**:拉低 `SGM_CTRL = 0`,使 SGM3833 停止工作,彻底消除 Truly AMOLED 屏的负压静态功耗。 +2. **休眠配置**:允许 P0 口电平变化中断与射频接收引脚的中断使能。 +3. **进入停机**:将单片机挂起写入 `PCON |= 0x02` 进入停机模式,关闭主时钟。 +4. **中断唤醒**:按键按下或 LR690L 接收到载波变化时,触发中断唤醒 MCU,ISR 立即拉高 `SGM_CTRL = 1` 并延时约 50ms 重新初始化 RM69310 屏幕控制器以恢复显示。 + +--- + +## 3. 持久化配置数据库架构 + +为了确保配对数据掉电不丢失,手环使用内置 IAP 读写 Flash 扇区: +* **物理存储扇区**:`0xFE0000` (末尾扇区,大小为 512 字节)。 +* **数据库容量**:共 16 组传感器配置槽位。 +* **存储结构定义**: +```c +typedef struct { + u8 is_used; // 有效标志 (0x01: 有效, 其它: 空闲) + u8 addr[3]; // 24位射频物理地址 (EV1527) + u8 type; // 传感器类型 (0: 门磁, 1: 红外, 2: 烟感, 3: 紧急, 4: 气体, 5: 水浸, 6: 振动) + u8 zone; // 防区类别 (0: 永久防区, 1: 普通可撤布防区) + char name_gbk[16]; // 法语自定义防区名称 (格式化为: [名前缀] [两位序号]) +} Sensor_Slot; +``` + +--- + +## 4. 软件层级架构与核心代码框架 + +软件系统采用 **非阻塞** 的三层级模块化架构设计: + +```mermaid +graph TD + subgraph Layer3 [应用层 (APP)] + MainScheduler[主循环轮询 & 喂狗] + SysStateMachine[SystemState 业务状态机] + SoftRTC[软件 RTC 计时器] + end + subgraph Layer2 [外设驱动层 (DRV)] + AMOLED[RM69310 AMOLED 屏幕绘制] + RF[LR690L 编解码 & 过滤 0x08 SOS 信号] + KEY[按键消抖 & 长按长计时] + PM[低功耗休眠与唤醒] + LED[WS2812B 级联双彩灯时序] + MOTOR[振动马达脉冲时序] + end + subgraph Layer1 [硬件抽象与时基层 (HW)] + Timer1[Timer 1 中断 (1ms 滴答)] + ADC[12位电压采集] + Flash[IAP 读写] + GPIO[数字 I/O 与电平中断] + end + Layer1 --> Layer2 + Layer2 --> Layer3 +``` + +### 4.1 核心主程序调度框架 (main.c) + +主程序采用完全解耦的时间片轮询加事件触发的非阻塞循环结构: + +```c +#include "config.h" + +// 全局状态变量 +SystemState current_state; +u16 inactivity_timer; +u32 rx_addr; +u8 rx_type; + +void main(void) { + // 1. 初始化底层硬件与外设驱动 + System_Init(); + Power_Init(); // SGM_CTRL 默认拉高工作 + LCD_Init(); // Truly AMOLED 初始化 + RF_Init(); // LR690L 接收中断与发射初始化 + WS2812_Init(); // 双级联彩灯初始化 + Motor_Init(); // 马达脉冲时序初始化 + ADC_Init(); // 电池采样初始化 + + // 2. 载入持久化数据配置 + Load_Database(); + + // 3. 初始化软件状态与计时器 + current_state = STATE_CLOCK; + inactivity_timer = 0; + Redraw = 1; + + // 开启全局中断 + EA = 1; + + // 4. 核心主循环轮询调度 + while (1) { + // A. 轮询射频接收 + if (EV1527_Decode(&rx_addr, &rx_type)) { + inactivity_timer = 0; // 重置休眠计数 + Process_RF_Event(rx_addr, rx_type); + } + + // B. 轮询并消耗按键事件 + if (key_event_buf != KEY_EVENT_NONE) { + KeyEvent evt = key_event_buf; + key_event_buf = KEY_EVENT_NONE; // 清空事件 + inactivity_timer = 0; // 重置休眠计数 + + Process_System_Event(evt); + } + + // C. 超时低功耗检测判定 + if (inactivity_timer >= 1000) { // 10秒无操作 + inactivity_timer = 0; + current_state = STATE_SLEEP; + + // 执行硬件关屏断电并让单片机进入深度休眠 + Enter_Low_Power_Sleep(); + + // 被外部中断唤醒后从此处开始继续向下运行,执行电源与显示恢复 + Wakeup_Restore(); + current_state = STATE_CLOCK; + Redraw = 1; + } + + // D. 屏幕刷新渲染调度 + if (Redraw) { + Redraw = 0; // 清除标志 + Render_UI_Screen(current_state); + } + + // E. 喂狗操作 + WDT_CONTR = 0x17; + } +} +``` + +--- + +## 5. 模块间输入/输出事件与流转处理消耗图 + +为了使各功能模块(Drivers & App)交互逻辑清晰可见,下表整理了各模块产生的事件源(输入)及其被消费(输出)的处理链路: + +### 5.1 模块输入/输出事件矩阵 + +| 模块名称 | 输入源 (触发源) | 产生/发出事件 | 输出消费对象 (消费处理) | +| :--- | :--- | :--- | :--- | +| **按键模块 (KEY)** | 物理引脚(P0.1~P0.5)电平状态改变 | `KeyEvent`
- `KEY_UP_SHORT` / `KEY_DOWN_SHORT`
- `KEY_DOWN_LONG` (长按▼ 2秒)
- `KEY_CONFIRM_CLICK`
- `KEY_CONFIRM_LONG` (长按■ 3秒)
- `KEY_SOS_SHORT` / `KEY_SOS_LONG` (SOS键短按或长按) | 写入全局事件缓冲队列 `key_event_buf`。由 **APP 应用状态机** 读出后用于控制页面导航、退出告警或启动对码。 | +| **无线射频 (RF)** | LR690L 433MHz 载波信号接收(输入电平变化) | `RFEvent` (包含 `rx_addr` 与 `rx_type`) | 传递至 **APP 状态机** 的 `Process_RF_Event` 进行报警分发。 | +| **状态机 (APP)** | 消耗 `key_event_buf` 或 `RFEvent` | `SysState` 业务状态跳转及动作指令 | 1. 改变 `current_state` 并设置 `Redraw = 1`;
2. 调度 **LED** 及 **MOTOR** 开启报警灯效/马达振动;
3. 写入 **IAP Flash 数据库** 配对记录;
4. 调用 **RF** 发送 `0x01` (IPC对码) 或 `0x08` (主动SOS)。 | +| **显示模块 (LCD)** | 状态机重绘请求 `Redraw == 1` | SPI 串行像素显示数据流 | 驱动 **Truly AMOLED** 渲染当前状态所对应的时钟、主菜单、对码、时间设定或报警画面。 | +| **供电管理 (POWER)**| 1. `inactivity_timer >= 1000` (10秒超时)
2. 中断唤醒信号 (GPIO/INT2) | 电源电平控制及停机状态 | 1. **进入休眠**:发出关屏指令 $ ightarrow$ 拉低 `SGM_CTRL = 0` $ ightarrow$ 执行停机挂起(主循环暂停在 `Enter_Low_Power_Sleep` 内);
2. **唤醒恢复**:拉高 `SGM_CTRL = 1` $ ightarrow$ 延时 50ms $ ightarrow$ 重新初始化 RM69310 屏幕控制器(主循环恢复运行并在待机页重新走时)。 | +| **彩灯模块 (LED)** | 状态机调用报警指示请求 | SPI 48-bit 灯珠级联控制字 | 向两颗级联的 WS2812B 发送颜色数据(报警时交替闪烁,配对时常亮)。 | +| **马达模块 (MOTOR)**| 状态机请求按键反馈/告警振动 | IO 电平状态控制字 (P2.5) | 定时驱动 `P2.5` 引脚电平产生不同振动波形(如短振、长振、间歇循环振动)。 | + +### 5.2 事件流转与消费链路拓扑 + +手环系统的输入事件(按键中断与无线载波中断)在主循环中的处理与消耗流转关系如下: + +```mermaid +flowchart TD + %% 硬件输入事件 + PinKey[物理按键按下 / 下降沿] -->|P0.1-P0.5 端口中断| ISR_Port0[Port0 中断 ISR] + Carrier[433MHz 射频载波信号] -->|INT2 中断| ISR_INT2[INT2 唤醒中断 ISR] + + %% 中断服务层 (ISR) + ISR_Port0 -->|唤醒系统并每10ms扫描| KeyScan[消抖与长短按判定] + ISR_INT2 -->|唤醒系统并使能软解码| RFDecode[EV1527 自适应比值解码] + + %% 事件过滤与缓冲层 + KeyScan -->|判定有效按键事件| BufKey[写入 key_event_buf 缓冲区] + RFDecode --> ProcessRF[生成合法传感器 RFEvent] + + %% APP 状态机消费处理 + BufKey -->|主循环读取并重置| SM_Key[消费按键事件] + ProcessRF -->|主循环调用并比对配置| SM_RF[消费已配对防区报警] + + SM_Key -->|CONFIRM 长按 3s| StateMenu[切入 STATE_MENU 并 Redraw=1] + SM_Key -->|子页面确认操作| StateSub[执行配对/布防/时间设定并 IAP 写入] + SM_Key -->|点击/长按 SOS 键| EmitSOS[调用 RF 主动发射 0x08 SOS 信号] + SM_Key -->|告警状态任意键| ClearAlarm[清除本地报警状态并退回时钟] + + SM_RF -->|匹配成功且处于布防| LocalAlarm[触发 LED 交替闪烁 & 马达间歇振动] + + %% 显示与控制响应 + StateMenu -->|Redraw == 1| LcdPaint[Truly AMOLED 屏幕局部像素重绘] + StateSub -->|Redraw == 1| LcdPaint + LocalAlarm -->|Redraw == 1| LcdPaint + EmitSOS -->|Redraw == 1| LcdPaint +``` diff --git a/Docs/40_ui-design/main.md b/Docs/40_ui-design/main.md index 7b23c67..c402512 100644 --- a/Docs/40_ui-design/main.md +++ b/Docs/40_ui-design/main.md @@ -1,85 +1,107 @@ # UI 设计 (Docs/40_ui-design/main.md) -本章节定义手环 135x240 TFT LCD 屏幕的画面布局、各页面坐标位置、中文字体/ASCII 字符对齐基线以及局部刷新逻辑。 +本章节定义手环 120x240 Truly AMOLED 屏幕的画面布局、各页面坐标位置、中文字体/ASCII 字符对齐基线以及局部刷新逻辑。 ## 1. 屏幕物理参数与刷新机制 -* **屏幕规格**:1.14寸 TFT LCD 屏,物理分辨率 **`135x240`**。 -* **竖向屏规范**:屏幕窗口配置为 **`135` 像素宽,`240` 像素高**。页面中的时钟、菜单、报警元素均采用竖屏垂直居中排版。 -* **坐标偏移修正**:TFT LCD 驱动芯片(ST7789V)的显示 RAM 大小为 240x320 像素。在控制 135x240 的竖屏物理面板时,为了将显示窗口完美对齐至显示区域,防止花屏或偏置错误,写屏窗口渲染必须应用 **X 轴偏移量 +52,Y 轴偏移量 +40**。即:`LCD_SetWindow(x1 + 52, x2 + 52, y1 + 40, y2 + 40)`。 +* **屏幕规格**:0.95寸 Truly AMOLED 屏,物理分辨率 **`120x240`**。 +* **竖向屏规范**:屏幕窗口配置为 **`120` 像素宽,`240` 像素高**。页面中的时钟、菜单、报警元素均采用竖屏垂直居中排版(以 `X=60` 为几何中线)。 +* **坐标偏移修正**: Truly AMOLED 屏幕驱动芯片(RM69310)控制的 GRAM 存在偏置。为了使画面对齐,写屏窗口渲染必须应用 **X 轴偏移量 +4,Y 轴偏移量 +0**。即:`LCD_SetWindow(x1 + 4, x2 + 4, y1, y2)`。 * **局部刷新防抖机制**:清除重绘标志(`Redraw`)的动作必须在具体的刷新绘制块结束时重置,防止因为主循环高速轮询而产生屏幕闪烁。 --- ## 2. 页面布局与坐标坐标规范 -### 2.1 时钟待机界面 (STATE_NORMAL / STATE_ARMED / STATE_DISARMED) +### 2.1 时钟待机界面 (STATE_CLOCK) 时钟页面作为常态显示,包括状态栏、数字时钟和日期行。 ``` +-----------------------------------------+ -| 🔒 ARME 🔋 85% | <- 状态栏 (Y=24~27) +| 🔒 ARME 🔋 85% | <- 状态栏 (Y=24~27) | | | | | 10:35 | <- 中央时间 (Y=80~128) | | | | | VEN. 07-10 | <- 底部日期 (Y=180) +| | +-----------------------------------------+ ``` * **状态栏电量显示(极重要)**: - * **电池图标** 绘制在 `X=107, Y=27`。 - * **电量百分比** 绘制在 `X=77, Y=24`。如果处于充电状态,追加 `+` 号后缀显示为 `85%+`,起始绘制点向左平移(如 `X=69`)以确保与电池图标之间依然有安全间距。 - * 两个控件在 `135` 像素宽的屏幕上保持 **6 像素安全间距**,彻底防范乱码和字符相撞。 + * **电池图标** 绘制在 `X=82, Y=27`。 + * **电量百分比** 绘制在 `X=76, Y=24`(以 `text-anchor="end"` 右对齐绘制)。如果处于充电状态,追加 `+` 号后缀显示为 `85%+`,起始绘制坐标向左偏置,以确保与电池图标之间依然有安全间距,不发生碰撞。 * **安防状态显示**: * **布防状态 (ARMED)**:状态栏左侧显示红色闭锁 `🔒` 图标,显示 `ARME`。 * **撤防状态 (DISARMED)**:状态栏左侧显示绿色开锁 `🔓` 图标,显示 `DESARME`。 -### 2.2 传感器配对选择菜单 (STATE_PAIR_MENU) +### 2.2 主选择菜单页面 (STATE_MENU) -* **顶部标题**:显示 `MODE PAIR P-XX`(其中 XX 为当前已配对的传感器数量)。 -* **列表滚动框**:采用 3 行滚动列表,可在 **7 种传感器类型**(门磁、红外、烟感、紧急、气体、水浸、振动)中上下循环滚动选中。当前行高亮并显示粗体外框,字号放大(如 `DETEC. PORTE`),非当前行暗淡显示。 -* **按键确认行为**:在配对菜单页面,短按侧边 **■ 确认键** 进入所选防区类型的对码等待状态。 +由时钟待机长按 CONFIRM 键 3 秒进入。显示四个功能条目,供滚动选择: +``` ++-----------------------------------------+ +| - MENU - | <- 标题 (Y=30) +| | +| 1. DATE/HEURE | <- 条目 1 (Y=80) +| > 2. APPAIRAGE < | <- 选中项高亮并加尖括号 (Y=115) +| 3. ARM/DISARM | <- 条目 3 (Y=150) +| 4. LIAISON IPC | <- 条目 4 (Y=185) ++-----------------------------------------+ +``` +* 当前所选中的菜单项前后加上闪烁的 `> <` 箭头或以高亮粗体形式渲染,其余非选中项正常亮度显示。 +* 短按 ▲ 键向上滚动,▼ 键向下滚动。短按 CONFIRM 键进入该项。 -### 2.3 报警触发与本地 SOS 界面 (STATE_ALARMING / STATE_SOS_EMITTED) +### 2.3 功能设定与子界面设计 -* **报警提示边框**:全屏闪烁的红色警告虚线/实线边框。 -* **中央图标**:根据触发的防区传感器类型,居中绘制对应的单色位图图标(32x32px): - * 门磁:`🚪` 开门图标。 - * 红外:`👤` 人体辐射波纹图标。 - * 烟感:`🔥` 火苗图标。 - * 紧急按钮:`🆘` 求救图标。 - * 燃气:`💨` 毒气云雾图标。 - * 水浸:`💧` 滴水波纹图标。 - * 振动:`📳` 震动线框图标。 - * **主动 SOS 界面**:大字显示 `SOS EMIS`,居中显示 `🚨` 旋转警灯图标。 -* **绑定 IPC 界面 (STATE_BINDING)**: - * 顶部标题:`LIAISON IPC` (法语:与 IPC 绑定)。 - * 中央:正在发送提示,显示 `ENVOI EN COURS`,配对确认锁图标。 - * **手环 Factory ID 显示**:底部居中显示手环自身出厂地址:`ID: 0xXXXXX`,以便用户配对及辨识。 +#### 2.3.1 时间日期修改界面 (STATE_SET_TIME) +* **页面指示**:顶部大字 `REGLAGE HEURE`。 +* **数据列表**:居中分行显示当前编辑的 `HOUR`、`MIN`、`SEC`、`YEAR`、`MONTH`、`DAY`。 +* **光标与交互**:当前正在修改的数值行(如修改“小时”)闪烁或带有下划线高亮。按 ▲ 键增加数值,▼ 键减小数值,短按 CONFIRM 确认并跳转至下一项,全部设置完后自动保存返回时钟页。 -### 2.4 对码确认与序号微调界面 (STATE_PAIR_CONFIRM) +#### 2.3.2 传感器对码等待与配对界面 (STATE_PAIR_SEARCH) +* **顶部标题**:显示 `APPAIRAGE`(配对)。 +* **中央图案**:绘制雷达搜索波纹动画 `SEARCHING...`,并闪烁提示 `DECLENCH. SENS`(触发传感器)。 +#### 2.3.3 对码确认与二步微调界面 (STATE_PAIR_CONFIRM) 当手环解码到传感器对码信号后,切入此确认页: ``` +-----------------------------------------+ - ✓ RECU (对码成功) (Y=40) - - [ 🚪 ICON ] (Y=80) - - PORTE (Y=135) - - [ 01 ] (Y=165) <- 序号微调框 (可按 ▲/▼ 修改) +| ✓ RECU (Y=40) +| +| PORTE (Y=90) <- 步骤1: 传感器类型 (可按 ▲/▼ 修改) +| +| [ 🚪 ICON ] (Y=130) <- 对应位图图标 (32x32px) +| +| [ 01 ] (Y=180) <- 步骤2: 序号选框 (可按 ▲/▼ 修改) +-----------------------------------------+ ``` -* **元素定位**: - * 顶部显示提示语 `✓ RECU`(法语:已接收),绿字。 - * 中央显示捕获传感器 32x32 对应位图图标。 - * 下方第一行展示传感器名称前缀(如 `PORTE`)。 - * 下方第二行展示序号选框 `[ 01 ]`:其中包含两个外括号,中间的数字即为 `selected_suffix_num`(01~99)。当用户按 ▲ 或 ▼ 键时,中间数字动态增减并实时局部刷新,外括号保持静止,增强可编辑交互感。 -* **确认行为**:短按 CONFIRM 键或 SOS 键保存退出。 +* **二步选择焦点逻辑**: + * **步骤1 (编辑类型)**:焦点在类型文字处(例如类型名称前后有闪烁括号 `[ PORTE ]`),此时按 ▲/▼ 键可在门磁、红外、烟感等 7 种传感器类型间循环切换,图标实时更换。点击 CONFIRM 键保存当前类型并锁定,焦点切换到步骤2。 + * **步骤2 (编辑序号)**:焦点切换在底部的序号选框 `[ 01 ]`。此时按 ▲/▼ 键自增或自减数字序号(01~99)。点击 CONFIRM 键完成最终保存并存入数据库,返回时钟待机。 + * *长按 CONFIRM 键 3 秒放弃修改并直接返回时钟待机*。 + +#### 2.3.4 系统布撤防手动选择界面 (STATE_ARM_DISARM_SELECT) +* **顶部标题**:显示 `REG. ALARME`。 +* **两个状态选项**: + * `[ ARME ]` + * `[ DESARME ]` +* 按 ▲ / ▼ 键在这两者之间切换高亮。按 CONFIRM 键确认生效,系统状态转入 ARMED 或 DISARMED 并返回时钟页。 + +#### 2.3.5 IPC 绑定发射界面 (STATE_IPC_BIND) +* **页面指示**:显示 `LIAISON IPC` (IPC 绑定)。 +* **发射中提示**:中央大字显示 `ENVOI EN COURS`(正在发送),绘制动态发射波形,系统使用 `bracelet_factory_id` 自动连续发射 EV1527 数据码为 `0x01` 的对码广播包。 +* **物理地址展示**:屏幕底部显示当前手环出厂唯一地址 `ID: 0xXXXXX`。 +* **退出/返回机制**: + 1. 自动退出:发射持续约 3 秒后,自动结束并退回时钟待机状态; + 2. 按键退出:**长按 CONFIRM 键 3 秒** 或 **长按 ▼ 键 2 秒** 立刻主动退出发射状态并返回时钟待机。 + +### 2.4 报警触发与本地 SOS 界面 (STATE_ALARMING / STATE_SOS_EMITTED) + +* **报警提示边框**:全屏闪烁的红色警告虚线/实线边框。 +* **中央图标**:根据触发的防区传感器类型,居中绘制对应的单色位图图标(32x32px)。 +* **主动 SOS 界面**:大字显示 `SOS EMIS`,居中显示 `🚨` 旋转警灯图标。 --- @@ -87,6 +109,6 @@ 为保证排版美观,[Drivers/lcd_font.h](file:///c:/workfile/105/stc32g12k128/Drivers/lcd_font.h) 内的标准字模点阵需要满足如下基线对齐: * **水平居中公式**: - * 对于标准 8px 宽字符:X 轴绘制起点为 `(135 - len * 8) / 2`。 - * 对于双倍放大 16px 宽时钟字符:X 轴绘制起点为 `(135 - len * 16) / 2`。 + * 对于标准 8px 宽字符:X 轴绘制起点为 `(120 - len * 8) / 2`。 + * 对于双倍放大 16px 宽时钟字符:X 轴绘制起点为 `(120 - len * 16) / 2`。 * **百分号(%)符号基线修正**:百分号字符在 `lcd_font.h` 数组的索引 `0x25` 中,点阵数据需**向上平移 2 像素**,以和 `0~9` 数字的基线保持严格水平对齐,避免百分号整体下沉。 diff --git a/Docs/40_ui-design/wristband_ui_gallery.html b/Docs/40_ui-design/wristband_ui_gallery.html index f4df969..c08d494 100644 --- a/Docs/40_ui-design/wristband_ui_gallery.html +++ b/Docs/40_ui-design/wristband_ui_gallery.html @@ -2,7 +2,7 @@ - Wristband LCD UI Gallery + Wristband AMOLED UI Gallery