From fdf0c5ed1beca2016e1cbb4b331f1ba9239091e8 Mon Sep 17 00:00:00 2001 From: zouhaitao Date: Thu, 9 Jul 2026 10:49:15 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=A0=B9=E6=8D=AE1.14=E5=AF=B8?= =?UTF-8?q?=E5=B1=8F=E5=B9=95=E3=80=815=E6=8C=89=E9=94=AE=E4=B8=8E?= =?UTF-8?q?=E5=8F=AF=E7=BC=96=E7=A8=8BRGB=E6=96=B0=E8=A7=84=E6=A0=BC?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/10_requirements-overview/main.md | 24 +++++++-------- Docs/20_requirements-detail/main.md | 24 ++++++++------- Docs/30_architecture/main.md | 36 ++++++++++++++-------- Docs/40_ui-design/main.md | 43 ++++++++++++++------------- Docs/50_module-breakdown/mod-key.md | 26 +++++++++------- Docs/50_module-breakdown/mod-lcd.md | 13 ++++---- Docs/50_module-breakdown/mod-power.md | 18 +++++------ Docs/50_module-breakdown/mod-rf.md | 4 +-- Docs/50_module-breakdown/mod-sys.md | 4 +-- Docs/60_coding/mod-key.md | 30 +++++++++++++++---- Docs/60_coding/mod-lcd.md | 24 +++++++++++---- Docs/60_coding/mod-power.md | 14 ++++----- Docs/60_coding/mod-rf.md | 4 +-- Docs/60_coding/mod-sys.md | 4 +-- Docs/70_testing/main.md | 19 +++++++----- 15 files changed, 174 insertions(+), 113 deletions(-) diff --git a/Docs/10_requirements-overview/main.md b/Docs/10_requirements-overview/main.md index 881d9e4..56aa906 100644 --- a/Docs/10_requirements-overview/main.md +++ b/Docs/10_requirements-overview/main.md @@ -1,25 +1,23 @@ -# 总体需求 (docs/10_requirements-overview/main.md) +# 总体需求 (Docs/10_requirements-overview/main.md) ## 1. 项目整体框架与系统拓扑 -本项目构建一套以 **IPC 摄像头**为中枢、**手环**为随身告警终端、多类 **433MHz 传感器**为探测前端的本地安防联动系统,同时通过 WiFi 连接云端,向手机 APP 发送推送通知。 +本项目**仅包含手环端核心业务及驱动代码的实现**。手环作为随身告警终端,独立接收来自多类 **433MHz 传感器**的探测射频信号(本地安防联动系统)。IPC 摄像头和手机 APP 等其他周边组件不在本项目编码范围内,仅作外部仿真与对接边界。 ```mermaid graph TD - Sensor[433MHz 传感器] -->|433MHz 射频信号| IPC[IPC 摄像头] - Sensor -->|433MHz 射频信号| Wristband[随身手环] - IPC -->|WiFi / LAN| Cloud[云端推送服务] - Cloud -->|推送通知| App[手机 APP] + Sensor[433MHz 传感器] -->|433MHz 射频信号| Wristband[随身手环] ``` -## 2. 核心信号流向与行为要求 +## 2. 核心信号流向与手环行为要求 -1. **传感器触发**:探测到异常时(如门磁打开、烟雾浓度超标),发射固定编码信号(24位 EV1527 协议数据,包含 20位地址码 + 4位数据码)。 -2. **手环与 IPC 独立接收**:IPC 和手环各自配备 433MHz 接收解调芯片,分别独立解码,互不依赖。 -3. **终端响应行为**: - * **IPC 摄像头端**:解码成功后,TFT LCD 屏幕显示报警 ICON、闪光报警,并通过网关向云端推送手机通知。 - * **手环端**:解码成功后,OLED 屏幕显示报警 ICON + 传感器自定义名称,多色 LED 亮起对应颜色,且马达触发特定振动模式。 +1. **传感器触发**:探测到异常时,发射固定编码信号(24位 EV1527 协议数据,包含 20位地址码 + 4位数据码)。 +2. **手环独立接收**:手环配备 LR690L 433MHz 接收解调芯片,独立进行软件自适应时序解码。 +3. **手环响应行为**: + * **屏幕显示**:1.14寸(135x240 像素)TFT LCD 屏幕显示对应的报警 ICON + 传感器法语自定义名称。 + * **灯效响应**:可编程 RGB 灯珠根据传感器类型亮起对应颜色并进行特定波形闪烁。 + * **马达响应**:马达触发特定的振动次数与时长组合。 ## 3. 协作规范与门禁说明 本项目的开发协作基于《开发规范.md》定义的“七个环节”。任何目录下文件的修改应当保证其依赖项是同步的。 -在每次完成阶段性工作或代码调整后,应运行 `bash .xagent/check-dirty.sh` 进行脏检测自检。 +在每次完成阶段性工作或代码调整后,应运行 `python .xagent/check-dirty.py` 进行脏检测自检。 diff --git a/Docs/20_requirements-detail/main.md b/Docs/20_requirements-detail/main.md index 3d967a4..632ba8d 100644 --- a/Docs/20_requirements-detail/main.md +++ b/Docs/20_requirements-detail/main.md @@ -1,19 +1,23 @@ -# 细化需求 (docs/20_requirements-detail/main.md) +# 细化需求 (Docs/20_requirements-detail/main.md) -本章节定义手环终端的物理按键交互、报警矩阵(LED颜色与振动)以及防区划分详细需求。 +本章节定义手环终端的物理按键交互、报警矩阵(可编程 RGB 灯颜色与振动)以及防区划分详细需求。 ## 1. 物理按键与交互定义 -| 按键动作 | 常态 (时钟待机) | 对码配对模式 | 警报触发状态 | -| :--- | :--- | :--- | :--- | -| **▲ 上移键** | 短按:时间调整(或菜单浏览) | 向上滚动选择传感器类型 | 无动作 | -| **▼ 下移键** | 短按:时间调整(或菜单浏览) | 向下滚动选择传感器类型 | 长按 2 秒:解除当前告警并退回时钟 | -| **▲ + ▼ (同时长按3秒)** | **进入对码配对模式** | 无动作 | 无动作 | -| **SOS 键 (短按)** | **触发本地主动 SOS 呼救** | **确认保存当前配对** | 短按:解除告警并退回时钟 | -| **SOS 键 (长按5秒)** | **触发 IPC 绑定对码广播** | 无动作 | 长按:解除告警并退回时钟 | +手环共配备 **5 个物理按键**:侧边 3 个(▲ 上移、▼ 下移、■ 确认),上部 2 个(相同的 SOS1、SOS2,具备完全一致的并联电气逻辑)。 + +| 按键类别 | 按键动作 | 常态 (时钟待机) | 对码配对模式 | 警报触发状态 | +| :--- | :--- | :--- | :--- | :--- | +| **侧边按键** | **▲ 上移键** | 短按:时间微调 | 菜单向上滚动 | 无动作 | +| **侧边按键** | **▼ 下移键** | 短按:时间微调 | 菜单向下滚动 | 长按 2 秒:解除当前告警并退回时钟 | +| **侧边按键** | **▲ + ▼ (同时长按3秒)** | **进入对码配对模式** | 无动作 | 无动作 | +| **侧边按键** | **■ 确认键 (CONFIRM)** | 无动作 | **选中并进入该类型等待配对** | 短按:解除当前告警并退回时钟 | +| **上部按键** | **SOS1 / SOS2 (短按)** | **触发本地主动 SOS 呼救** | **确认保存当前已捕获的配对** | 短按:解除告警并退回时钟 | +| **上部按键** | **SOS1 / SOS2 (长按5秒)** | **触发 IPC 绑定对码广播** | 无动作 | 长按:解除告警并退回时钟 | > [!NOTE] -> 在手环发出主动 SOS 呼救(马达长振、红灯闪烁)或响应防区报警时,长按物理按键(▲、▼、SOS 任意之一)2 秒均应立刻切断声光电反馈,安全重置至时钟待机状态。 +> 1. **双 SOS 按键冗余**:上部的两个 SOS 键在电路与软件上完全等价。按下其中任意一个按键,均会触发相同的 SOS 信号采集与求救动作。 +> 2. **警报快速解除**:在手环发出主动 SOS 呼救或响应被动防区报警时,按下“确认键”或任意一个“SOS 键”(或者长按“▼键”2秒)均会立刻切断声光电反馈,安全重置至时钟待机状态。 ## 2. 传感器对码与报警映射矩阵 diff --git a/Docs/30_architecture/main.md b/Docs/30_architecture/main.md index 1f86593..bb50285 100644 --- a/Docs/30_architecture/main.md +++ b/Docs/30_architecture/main.md @@ -1,29 +1,41 @@ -# 架构设计 (docs/30_architecture/main.md) +# 架构设计 (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 | 连接 FCOB-2.7 幻彩 RGB 灯条的 DIN 信号输入 | +| **P2.3** | `WS2812_DI` | 双向/SPI MOSI | 连接可编程 RGB 灯珠(WS2812B/FCOB-2.7)的 DIN 信号输入 | | **P2.5** | `MOTOR` | 推挽输出/SCLK | 连接振动马达驱动电路。高电平震动,低电平静止 | -| **P0.1** | `KEY_UP` | 高阻输入+上拉 | 物理按键 SW1 (▲),按下为低电平 | -| **P0.2** | `KEY_SOS` | 高阻输入+上拉 | 物理按键 SW3 (SOS),按下为低电平 | -| **P0.3** | `KEY_DOWN` | 高阻输入+上拉 | 物理按键 SW2 (▼),按下为低电平 | -| **P1.0** | `SGM_CTRL` | 推挽输出 | SGM3833 电源使能。高电平使能输出正负 VELVDD & VAVDD | -| **P1.1** | `LCD_RST` | 推挽输出 | AMOLED 屏幕 RM69310 复位引脚 | -| **P1.3** | `LCD_RS` | 推挽输出 | AMOLED 屏幕 SPI 数据/命令寄存器选择 (D/C) | -| **P1.4** | `LCD_CS` | 推挽输出 | AMOLED 屏幕 SPI 片选信号 | -| **P1.5** | `LCD_SCL` | 推挽输出 | AMOLED 屏幕 SPI 时钟信号 | -| **P1.6** | `LCD_SDA` | 推挽输出 | AMOLED 屏幕 SPI 数据信号 | +| **P0.1** | `KEY_UP` | 高阻输入+上拉 | 侧边按键 ▲ (上移),按下为低电平 | +| **P0.3** | `KEY_DOWN` | 高阻输入+上拉 | 侧边按键 ▼ (下移),按下为低电平 | +| **P0.4** | `KEY_CONFIRM`| 高阻输入+上拉 | 侧边按键 ■ (确认),按下为低电平 | +| **P0.2** | `KEY_SOS1` | 高阻输入+上拉 | 上部按键 SOS 1,按下为低电平 | +| **P0.5** | `KEY_SOS2` | 高阻输入+上拉 | 上部按键 SOS 2,按下为低电平 | +| **P1.0** | `SGM_CTRL` | 推挽输出 | 屏幕/驱动供电使能。高电平使能,低电平关闭 | +| **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** | `ADC3` | 模拟输入 | 电池电压采样输入端口 | -### 1.2 SPI 复用与马达防噪硬件规避设计 +### 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 SPI 复用与马达防噪硬件规避设计 由于 `P2.5` 同时作为马达引脚和硬件 SPI 的 SCLK 引脚,为了避免在高频发送 24-bit 灯效数据时引脚电平抖动导致马达异常鸣叫: 1. **发送前**:调用 `EA = 0` 关闭总中断。临时将 `P2.5` 引脚配置为 **高阻输入模式**。此时 SCLK 输出时钟不会使马达导通。 diff --git a/Docs/40_ui-design/main.md b/Docs/40_ui-design/main.md index 2e7c252..900ff4c 100644 --- a/Docs/40_ui-design/main.md +++ b/Docs/40_ui-design/main.md @@ -1,11 +1,11 @@ -# UI 设计 (docs/40_ui-design/main.md) +# UI 设计 (Docs/40_ui-design/main.md) -本章节定义手环 120x240 AMOLED 屏幕的画面布局、各页面坐标位置、中文字体/ASCII 字符对齐基线以及局部刷新逻辑。 +本章节定义手环 135x240 TFT LCD 屏幕的画面布局、各页面坐标位置、中文字体/ASCII 字符对齐基线以及局部刷新逻辑。 ## 1. 屏幕物理参数与刷新机制 -* **屏幕规格**:0.95寸 AMOLED 屏 (RM69310 控制芯片),物理分辨率 `120x240`。 -* **坐标偏移修正**:根据硬件布线,写屏窗口渲染存在 **4 像素的 X 轴偏移偏量**,软件在调用 `LCD_SetWindow()` 时必须强行追加该偏移。 +* **屏幕规格**:1.14寸 TFT LCD 屏,物理分辨率 **`135x240`**。 +* **坐标偏移修正**:写屏窗口渲染存在 **4 像素的 X 轴偏移量**,调用 `LCD_SetWindow(x1 + 4, x2 + 4, y1, y2)`。 * **局部刷新防抖机制**:清除重绘标志(`Redraw`)的动作必须在具体的刷新绘制块结束时重置,防止因为主循环高速轮询而产生屏幕闪烁。 --- @@ -17,29 +17,30 @@ 时钟页面作为常态显示,包括状态栏、数字时钟和日期行。 ``` -+---------------------------------------+ -| 🔒 ARMED 🔋 85% | <- 状态栏 (Y=24~27) -| | -| | -| 10:35 | <- 中央时间 (Y=80~128) -| | -| | -| VEN. 07-10 | <- 底部日期 (Y=180) -+---------------------------------------+ ++-----------------------------------------+ +| 🔒 ARME 🔋 85% | <- 状态栏 (Y=24~27) +| | +| | +| 10:35 | <- 中央时间 (Y=80~128) +| | +| | +| VEN. 07-10 | <- 底部日期 (Y=180) ++-----------------------------------------+ ``` * **状态栏电量显示(极重要)**: - * **电池图标** 绘制在 `X=92, Y=27`。 - * **电量百分比** 绘制在 `X=62, Y=24`。 - * 两个控件保持 **6 像素安全间距**,彻底防范乱码和字符相撞。 + * **电池图标** 绘制在 `X=107, Y=27`。 + * **电量百分比** 绘制在 `X=77, Y=24`。 + * 两个控件在 `135` 像素宽的屏幕上保持 **6 像素安全间距**(77 + 3*8 = 101,与 107 之间为 6px),彻底防范乱码和字符相撞。 * **安防状态显示**: - * **布防状态 (ARMED)**:状态栏左侧显示红色闭锁 `🔒` 图标,显示 `ARMED`。 - * **撤防状态 (DISARMED)**:状态栏左侧显示绿色开锁 `🔓` 图标,显示 `DISARMED`。 + * **布防状态 (ARMED)**:状态栏左侧显示红色闭锁 `🔒` 图标,显示 `ARME`。 + * **撤防状态 (DISARMED)**:状态栏左侧显示绿色开锁 `🔓` 图标,显示 `DESARME`。 ### 2.2 传感器配对选择菜单 (STATE_PAIR_MENU) * **顶部标题**:显示 `MODE PAIR P-XX`(其中 XX 为当前已配对的传感器数量)。 * **列表滚动框**:采用 3 行滚动列表,当前行高亮并显示粗体外框,字号放大(如 `DETEC. PORTE`),非当前行暗淡显示。 +* **按键确认行为**:在配对菜单页面,短按侧边 **■ 确认键** 进入所选防区类型的对码等待状态。 ### 2.3 报警触发与本地 SOS 界面 (STATE_ALARMING / STATE_SOS_EMITTED) @@ -57,8 +58,10 @@ --- -## 3. 字模设计与基线修正规范 +## 3. 文字居中对齐与字模基线规范 为保证排版美观,[Drivers/lcd_font.h](file:///c:/workfile/105/stc32g12k128/Drivers/lcd_font.h) 内的标准字模点阵需要满足如下基线对齐: -* **标准 ASCII 字符集**:8x16 像素点阵。 +* **水平居中公式**: + * 对于标准 8px 宽字符:X 轴绘制起点为 `(135 - len * 8) / 2`。 + * 对于双倍放大 16px 宽时钟字符:X 轴绘制起点为 `(135 - len * 16) / 2`。 * **百分号(%)符号基线修正**:百分号字符在 `lcd_font.h` 数组的索引 `0x25` 中,点阵数据需**向上平移 2 像素**,以和 `0~9` 数字的基线保持严格水平对齐,避免百分号整体下沉。 diff --git a/Docs/50_module-breakdown/mod-key.md b/Docs/50_module-breakdown/mod-key.md index b714a33..c84e1df 100644 --- a/Docs/50_module-breakdown/mod-key.md +++ b/Docs/50_module-breakdown/mod-key.md @@ -1,15 +1,18 @@ -# 模块拆分 - 按键扫描与事件判定 (docs/50_module-breakdown/mod-key.md) +# 模块拆分 - 按键扫描与事件判定 (Docs/50_module-breakdown/mod-key.md) -本模块描述按键状态消抖、长按计时判定以及组合按键识别。 +本模块描述按键状态消抖、长按计时判定以及组合按键识别。支持 5 个物理按键到手环事件的映射。 ## 1. 模块职责说明 * **职责范围**: 1. 在 1ms 定时器中断中建立 10ms 扫描计时周期。 - 2. 对三个物理按键(KEY_UP SW1, KEY_SOS SW3, KEY_DOWN SW2)进行状态扫描。 + 2. 对 5 个物理按键进行引脚电平扫描: + * 侧边:`KEY_UP` SW1 (▲), `KEY_DOWN` SW2 (▼), `KEY_CONFIRM` (■) + * 上部:`KEY_SOS1` (SOS 1), `KEY_SOS2` (SOS 2) 3. 实现消抖检测(连续 20ms 检测到电平稳定才认定按键动作)。 - 4. 对按住不放的行为进行计时累加,判定长按(如长按 SOS 达 5 秒触发对码;长按 ▲+▼ 达 3 秒触发配对模式)。 - 5. 将按键判定结果转换为 `KeyEvent` 枚举,并注入按键事件缓冲区 `key_event_buf` 供主循环异步读取。 + 4. 对上部双 SOS 按键进行逻辑并联处理,保证按下任意一个均能触发求救。 + 5. 对按住不放的行为进行计时累加,判定长按(如长按 SOS 达 5 秒触发对码;长按 ▲+▼ 达 3 秒触发配对模式)。 + 6. 将按键判定结果转换为 `KeyEvent` 并注入按键事件缓冲区 `key_event_buf`。 ## 2. 数据结构定义 @@ -21,9 +24,10 @@ typedef enum { KEY_UP_LONG, KEY_DOWN_SHORT, KEY_DOWN_LONG, - KEY_SOS_SHORT, - KEY_SOS_LONG, - KEY_COMB_LONG // ▲ + ▼ 组合长按事件 + KEY_CONFIRM_CLICK, // ■ 确认键短按 + KEY_SOS_SHORT, // SOS键短按 (SOS1 或 SOS2) + KEY_SOS_LONG, // SOS键长按(5秒) (SOS1 或 SOS2) + KEY_COMB_LONG // ▲ + ▼ 组合长按事件 } KeyEvent; ``` @@ -31,9 +35,11 @@ typedef enum { * `void Key_Scan_Process(void)`: 在 Timer 1 ISR 中每 10ms 调度一次。 - * 读取 `KEY_UP`, `KEY_DOWN`, `KEY_SOS` 的 GPIO 逻辑电平。 + * 读取 `KEY_UP`, `KEY_DOWN`, `KEY_CONFIRM`, `KEY_SOS1`, `KEY_SOS2` 的 GPIO 逻辑电平。 + * 计算并联 SOS 状态:`is_sos_pressed = (KEY_SOS1 == 0) || (KEY_SOS2 == 0)`。 * 如果发现按键电平状态改变,进行计数消抖。 - * 如果按住不放,累加计时计数器(`key_up_hold`, `key_down_hold`, `key_sos_hold`)。 + * 如果按住不放,累加计时计数器(`key_up_hold`, `key_down_hold`, `key_confirm_hold`, `key_sos_hold`)。 * 检测到 `key_up_hold >= 300` 且 `key_down_hold >= 300` 达 3 秒时,注入 `KEY_COMB_LONG` 事件。 * 检测到 `key_sos_hold >= 500` 达 5 秒时,注入 `KEY_SOS_LONG` 事件;若释放时未达 5 秒但大于 20ms,注入 `KEY_SOS_SHORT`。 + * 检测到确认键释放,注入 `KEY_CONFIRM_CLICK`。 * 事件解析完毕后存入 `key_event_buf`。 diff --git a/Docs/50_module-breakdown/mod-lcd.md b/Docs/50_module-breakdown/mod-lcd.md index f06cc3a..e5422a1 100644 --- a/Docs/50_module-breakdown/mod-lcd.md +++ b/Docs/50_module-breakdown/mod-lcd.md @@ -1,6 +1,6 @@ -# 模块拆分 - LCD 显示与字模驱动 (docs/50_module-breakdown/mod-lcd.md) +# 模块拆分 - LCD 显示与字模驱动 (Docs/50_module-breakdown/mod-lcd.md) -本模块管理 AMOLED 屏幕引脚、SGM3833 电源使能、SPI 传输和界面图文渲染。 +本模块管理 1.14寸 TFT LCD 屏幕引脚、电平控制、SPI 传输和界面图文渲染(分辨率为 135x240 像素)。 ## 1. 模块职责说明 @@ -9,11 +9,11 @@ 2. 控制 SGM_CTRL 供电管脚。 3. 支持屏幕窗口配置,实现底层清屏与局部像素写入。 4. 读取 `lcd_font.h` 库,在指定坐标绘制 8x16 字符与自定义大小位图。 - 5. 实现各业务状态屏幕画面绘制。 + 5. 实现各业务状态屏幕(135x240 分辨率)画面绘制与文字对齐。 ## 2. 底层显示接口 -* `void LCD_Init(void)`:初始化 LCD 引脚,置 `SGM_CTRL = 1` 使能正负高压供电,并发送 RM69310 的初始化 SPI 寄存器序列。 +* `void LCD_Init(void)`:初始化 LCD 引脚,置 `SGM_CTRL = 1` 使能供电,并发送屏幕控制器的初始化 SPI 寄存器序列。 * `void LCD_WriteCmd(u8 cmd)`:拉低 `LCD_RS` 发送 SPI 命令。 * `void LCD_WriteData(u8 dat)`:拉高 `LCD_RS` 发送 SPI 数据。 * `void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2)`:设置局部像素绘制范围(强制处理 X 轴偏量 `+4`)。 @@ -23,7 +23,10 @@ * `void LCD_ShowChar(u16 x, u16 y, char c, u16 fc, u16 bc)`:在 (x, y) 坐标处绘制 ASCII 字符 `c`。 * `void LCD_ShowString(u16 x, u16 y, char *s, u16 fc, u16 bc)`:循环打印字符串。 +* `void LCD_ShowStringCentered(u16 y, char *str, u16 fc, u16 bc)`:在 135 像素宽屏幕上水平居中绘制 8 像素宽的字符串,水平起始坐标算法为 `(135 - len * 8) / 2`。 +* `void LCD_ShowString16x32Centered(u16 y, char *str, u16 fc, u16 bc)`:在 135 像素宽屏幕上水平居中绘制双倍大小 (16x32px) 的字符串,水平起始坐标算法为 `(135 - len * 16) / 2`。 * `void LCD_ShowImage(u16 x, u16 y, u16 w, u16 h, const u8 *img, u16 fc, u16 bc)`:在指定区域绘制单色位图。 -* `void UI_ShowClockPage(SystemState state, u8 hour, u8 min)`:渲染时钟待机页面,并根据布撤防状态在状态栏绘制相应锁状态图标。 +* `void UI_ShowClockPage(SystemState state, u8 hour, u8 min)`:渲染时钟待机页面(135 宽布局),并根据布撤防状态在状态栏绘制相应锁状态图标。 * `void UI_ShowAlarmPage(char *sensor_name, u8 zone)`:渲染防区告警页面,显示对应的传感器位图和法语名称。 * `void UI_ShowPairMenuPage(u8 selected_index)`:渲染对码选择菜单。 + diff --git a/Docs/50_module-breakdown/mod-power.md b/Docs/50_module-breakdown/mod-power.md index 7dd9c3a..cafb536 100644 --- a/Docs/50_module-breakdown/mod-power.md +++ b/Docs/50_module-breakdown/mod-power.md @@ -1,4 +1,4 @@ -# 模块拆分 - 低功耗电源管理 (docs/50_module-breakdown/mod-power.md) +# 模块拆分 - 低功耗电源管理 (Docs/50_module-breakdown/mod-power.md) 本模块描述手环待机情况下的屏幕休眠与单片机停机唤醒机制,用于降低日常静态电流消耗。 @@ -6,18 +6,18 @@ * **职责范围**: 1. 在系统无物理按键按下且无射频信号输入达 **10 秒** 后,触发低功耗睡眠动作。 - 2. 向 RM69310 屏幕控制器发送 Sleep In(命令 `0x10`)使 AMOLED 内部关闭。 - 3. 拉低 `SGM_CTRL = 0` 彻底切断 SGM3833 的正负压与 VAVDD 供电,将屏幕静态电流降至微安级。 - 4. 将按键引脚(KEY_UP P0.1, KEY_SOS P0.2, KEY_DOWN P0.3)配置为外部中断源。 + 2. 向 LCD 屏幕控制器发送 Sleep In 指令使屏幕进入休眠。 + 3. 拉低 `SGM_CTRL = 0` 彻底切断 LCD 背光与驱动供电,将屏幕静态电流降至微安级。 + 4. 将 5 个按键引脚(P0.1, P0.2, P0.3, P0.4, P0.5)全部配置为端口外部中断源。 5. 调用单片机 PD 停机控制寄存器,关闭主时钟进入 Power-Down 停机状态。 - 6. 在用户按压任意键时通过引脚电平下降沿产生外部中断,瞬时唤醒主控时钟并恢复供电。 + 6. 在用户按压任意键时通过引脚电平下降沿产生外部端口中断,瞬时唤醒主控时钟并恢复供电。 ## 2. 接口与函数设计 * `void Enter_Deep_Sleep(void)`: - 1. 通过 SPI 通道写指令 `0x10`。 - 2. 设置 `SGM_CTRL = 0`。 - 3. 清除外部中断标志,使能 P0 口外部中断输入。 + 1. 通过 SPI 通道写 Sleep In 指令。 + 2. 设置 `SGM_CTRL = 0` 关闭背光和供电。 + 3. 清除外部中断标志,使能 P0 口(P0.1~P0.5)的端口中断输入(P0INTE = 0x3E)。 4. 设置单片机的 `PCON` 寄存器使 `PD = 1`。主时钟停止。 * `void Key_Wakeup_Isr(void)`: - 按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕高压供电,并发送 Wake Up 指令 `0x11` 重建屏幕显示。 + 按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕与背光供电,并发送 Wake Up 指令重建屏幕显示。 diff --git a/Docs/50_module-breakdown/mod-rf.md b/Docs/50_module-breakdown/mod-rf.md index c1b2cb8..3399160 100644 --- a/Docs/50_module-breakdown/mod-rf.md +++ b/Docs/50_module-breakdown/mod-rf.md @@ -1,6 +1,6 @@ -# 模块拆分 - 自适应 RF 解码与发射 (docs/50_module-breakdown/mod-rf.md) +# 模块拆分 - 自适应 RF 解码与发射 (Docs/50_module-breakdown/mod-rf.md) -本模块管理射频芯片 GPIO 初始化、433MHz EV1527 解调接收(宽限时序比值算法)与射频打包主动发射。 +本模块管理射频芯片 GPIO 初始化、433MHz EV1527 解调接收(宽限时序比值算法)与射频打包主动发射。已确认此模块与新的 1.14寸屏幕/5按键物理变更兼容。 ## 1. 模块职责说明 diff --git a/Docs/50_module-breakdown/mod-sys.md b/Docs/50_module-breakdown/mod-sys.md index cb314fb..9ec4c9e 100644 --- a/Docs/50_module-breakdown/mod-sys.md +++ b/Docs/50_module-breakdown/mod-sys.md @@ -1,6 +1,6 @@ -# 模块拆分 - 系统核心控制与存储 (docs/50_module-breakdown/mod-sys.md) +# 模块拆分 - 系统核心控制与存储 (Docs/50_module-breakdown/mod-sys.md) -本模块定义手环系统的生命周期、时间计数器、定时中断调度器以及断电保存数据库模块。 +本模块定义手环系统的生命周期、时间计数器、定时中断调度器以及断电保存数据库模块。只涉及手环本地代码实现。 ## 1. 模块职责说明 diff --git a/Docs/60_coding/mod-key.md b/Docs/60_coding/mod-key.md index afffee8..6a3b125 100644 --- a/Docs/60_coding/mod-key.md +++ b/Docs/60_coding/mod-key.md @@ -1,4 +1,4 @@ -# 编码实现 - 按键扫描与事件判定 (docs/60_coding/mod-key.md) +# 编码实现 - 按键扫描与事件判定 (Docs/60_coding/mod-key.md) 本文件对应按键状态消抖、长按计时判定以及组合按键识别的具体编码实现细节。 @@ -15,11 +15,19 @@ void Key_Scan_Process(void) { // 1. 读取引脚状态并消抖 static u8 key_up_state = 0xFF; static u8 key_down_state = 0xFF; - static u8 key_sos_state = 0xFF; + static u8 key_confirm_state = 0xFF; + static u8 key_sos1_state = 0xFF; + static u8 key_sos2_state = 0xFF; + u8 key_sos_state; key_up_state = (key_up_state << 1) | KEY_UP; key_down_state = (key_down_state << 1) | KEY_DOWN; - key_sos_state = (key_sos_state << 1) | KEY_SOS; + key_confirm_state = (key_confirm_state << 1) | KEY_CONFIRM; + key_sos1_state = (key_sos1_state << 1) | KEY_SOS1; + key_sos2_state = (key_sos2_state << 1) | KEY_SOS2; + + // 双上部 SOS 键的逻辑并联(低电平有效,按位与运算相当于逻辑或) + key_sos_state = key_sos1_state & key_sos2_state; // 2. 长按与组合按键计时器累加 if ((key_up_state & 0x07) == 0 && (key_down_state & 0x07) == 0) { @@ -31,7 +39,7 @@ void Key_Scan_Process(void) { } else { comb_hold = 0; - // 单个按键:▲ 键 + // 单个按键:▲ 键 (UP) if ((key_up_state & 0x07) == 0) { key_up_hold++; } else { @@ -41,7 +49,17 @@ void Key_Scan_Process(void) { key_up_hold = 0; } - // 单个按键:SOS 键 + // 单个按键:■ 确认键 (CONFIRM) + if ((key_confirm_state & 0x07) == 0) { + key_confirm_hold++; + } else { + if (key_confirm_hold > 2 && key_confirm_hold < 200) { + key_event_buf = KEY_CONFIRM_CLICK; + } + key_confirm_hold = 0; + } + + // 单个按键:并联 SOS 键 if ((key_sos_state & 0x07) == 0) { key_sos_hold++; if (key_sos_hold == 500) { // 5秒 @@ -53,7 +71,7 @@ void Key_Scan_Process(void) { } key_sos_hold = 0; } - // ▼ 键处理同上... + // ▼ 键 (DOWN) 处理同上... } } ``` diff --git a/Docs/60_coding/mod-lcd.md b/Docs/60_coding/mod-lcd.md index 4f08000..722ffc3 100644 --- a/Docs/60_coding/mod-lcd.md +++ b/Docs/60_coding/mod-lcd.md @@ -1,4 +1,4 @@ -# 编码实现 - LCD 显示与字模驱动 (docs/60_coding/mod-lcd.md) +# 编码实现 - LCD 显示与字模驱动 (Docs/60_coding/mod-lcd.md) 本文件对应 LCD 驱动与字模渲染的具体编码实现细节。 @@ -31,14 +31,28 @@ void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2) { ``` ### 2.2 电池图标与百分比坐标对齐 -在 `main.c` 的时钟重绘函数中,通过以下坐标绘制电量: +在 `main.c` 的时钟重绘函数中,通过以下坐标在 **135 像素宽** 屏幕上绘制电量: ```c // 绘制百分比字符 -LCD_ShowString(62, 24, "85%", WHITE, BLACK); +LCD_ShowString(77, 24, "85%", COLOR_GRAY, COLOR_BLACK); // 绘制电池位图 -LCD_ShowImage(92, 27, 24, 12, BATTERY_ICON, RED, BLACK); +LCD_ShowImage(107, 27, 20, 10, bmp_battery_20x10, COLOR_GRAY, COLOR_BLACK); ``` -两者 Y 轴保持 24 与 27 对齐,X 轴保持 30 像素的安全边距(62 + 3 * 8 = 86,与 92 之间有 6 像素的安全间距),防止文字错乱或重合。 +两者 Y 轴保持 24 与 27 对齐,X 轴坐标根据 135 宽屏幕右偏 15 像素(原为 62 和 92),安全边距保持在 6 像素(77 + 3*8 = 101,与 107 之间为 6px),防止重合。 ### 2.3 字模百分号偏置 在 `lcd_font.h` 的 ASCII 字符数组中,百分号 `%`(十进制 37,十六进制 0x25)的字模通过在字模绘制时向上平移 2 像素对齐普通数字的下基准线。 + +### 2.4 水平居中渲染实现 +在 `lcd.c` 中,字符串居中函数需修改宽度限制参数为 `135` 像素: +```c +void LCD_ShowStringCentered(u16 y, char *str, u16 color, u16 bg_color) { + u16 len = 0; + char *p = str; + while(*p++) len++; + if(len * 8 >= 135) + LCD_ShowString(0, y, str, color, bg_color); + else + LCD_ShowString((135 - len * 8) / 2, y, str, color, bg_color); +} +``` diff --git a/Docs/60_coding/mod-power.md b/Docs/60_coding/mod-power.md index b578a1d..2378055 100644 --- a/Docs/60_coding/mod-power.md +++ b/Docs/60_coding/mod-power.md @@ -1,4 +1,4 @@ -# 编码实现 - 低功耗电源管理 (docs/60_coding/mod-power.md) +# 编码实现 - 低功耗电源管理 (Docs/60_coding/mod-power.md) 本文件对应低功耗待机与外部中断唤醒的具体编码实现细节。 @@ -9,20 +9,20 @@ ## 2. 关键代码片段与逻辑实现 ### 2.1 屏幕休眠命令与供电切断 -在待机检测到达 10 秒超时后,调用进入睡眠流程: +在待机检测到达 10秒超时后,调用进入睡眠流程: ```c void Enter_Deep_Sleep(void) { // 1. 发送屏幕休眠指令 (Sleep In) LCD_WriteCmd(0x10); Delay_ms(120); // 必须等待 120ms 供屏幕电容放电 - // 2. 切断 SGM3833 正负高压供电,阻断 VELVDD 的泄露电流 + // 2. 切断 LCD 供电与背光 SGM_CTRL = 0; // 3. 配置 KEY 端口的中断触发(配置为下降沿触发) P0IM0 = 0x00; // 下降沿 P0IM1 = 0x00; - P0INTE = 0x0E; // 开启 P0.1, P0.2, P0.3 的端口中断 + P0INTE = 0x3E; // 开启 P0.1(UP), P0.2(SOS1), P0.3(DOWN), P0.4(CONFIRM), P0.5(SOS2) 的端口中断 (0011 1110) // 4. 调用单片机 PD 指令挂起主时钟 PCON |= 0x02; // PD = 1 @@ -32,14 +32,14 @@ void Enter_Deep_Sleep(void) { ``` ### 2.2 端口中断唤醒与显示重建 -当按键被按下(P0.1~P0.3 电平跳变),触发外部端口中断,CPU 被唤醒并从停机处继续执行: +当任意按键被按下(P0.1~P0.5 电平下降沿跳变),触发外部端口中断,CPU 被唤醒并从停机处继续执行: ```c void Port0_Isr(void) interrupt 37 { u8 int_src = P0INTF; P0INTF = 0x00; // 清除中断标志位 - if (int_src & 0x0E) { - // 1. 恢复 SGM3833 供电 + if (int_src & 0x3E) { // 检查是否是 5 个按键引发的唤醒 + // 1. 恢复 LCD 背光与供电 SGM_CTRL = 1; Delay_ms(20); // 等待供电稳定 diff --git a/Docs/60_coding/mod-rf.md b/Docs/60_coding/mod-rf.md index e58df4c..e7f5457 100644 --- a/Docs/60_coding/mod-rf.md +++ b/Docs/60_coding/mod-rf.md @@ -1,6 +1,6 @@ -# 编码实现 - 自适应 RF 解码与发射 (docs/60_coding/mod-rf.md) +# 编码实现 - 自适应 RF 解码与发射 (Docs/60_coding/mod-rf.md) -本文件对应自适应射频解码与主动发射的具体编码实现细节。 +本文件对应自适应射频解码与主动发射的具体编码实现细节。已验证无变动。 ## 1. 对应代码源文件 diff --git a/Docs/60_coding/mod-sys.md b/Docs/60_coding/mod-sys.md index 362a0e3..3a0021f 100644 --- a/Docs/60_coding/mod-sys.md +++ b/Docs/60_coding/mod-sys.md @@ -1,6 +1,6 @@ -# 编码实现 - 系统核心控制与存储 (docs/60_coding/mod-sys.md) +# 编码实现 - 系统核心控制与存储 (Docs/60_coding/mod-sys.md) -本文件对应系统控制与存储的具体编码实现细节。 +本文件对应系统控制与存储的具体编码实现细节。只包含手环代码实现。 ## 1. 对应代码源文件 diff --git a/Docs/70_testing/main.md b/Docs/70_testing/main.md index 90f7488..fd5529e 100644 --- a/Docs/70_testing/main.md +++ b/Docs/70_testing/main.md @@ -1,4 +1,4 @@ -# 测试设计与验证方法 (docs/70_testing/main.md) +# 测试设计与验证方法 (Docs/70_testing/main.md) 本章节整理手环系统的仿真联调指令、IO 状态变化监控规范以及人工实机验证用例。 @@ -8,9 +8,11 @@ | 串口发送字符 | 对应仿真的物理事件与说明 | 预期系统响应 | | :--- | :--- | :--- | -| **`u` / `U`** | 仿真短按 / 长按 **▲ 键** | 时钟界面切换 / 菜单滚动 | -| **`d` / `D`** | 仿真短按 / 长按 **▼ 键** | 时钟界面切换 / 菜单滚动 / 长按取消报警 | -| **`s` / `S`** | 仿真短按 / 长按 **SOS 键** | 触发本地主动 SOS 警报 / 触发对码保存 | +| **`u` / `U`** | 仿真短按 / 长按 **侧边 ▲ 键** | 时钟微调 / 菜单滚动 | +| **`d` / `D`** | 仿真短按 / 长按 **侧边 ▼ 键** | 时钟微调 / 菜单滚动 / 长按取消报警 | +| **`e` / `E`** | 仿真短按 / 长按 **侧边 ■ 确认键** | 选中并进入等待配对 / 短按取消报警 | +| **`s` / `S`** | 仿真短按 / 长按 **上部 SOS 1 键** | 触发本地主动 SOS 警报 / 触发对码保存 | +| **`x` / `X`** | 仿真短按 / 长按 **上部 SOS 2 键** | 同上,验证双 SOS 键并联触发等效性 | | **`c`** | 仿真同时长按 **▲ + ▼ 键 3 秒** | 系统直接进入配对模式(P-00) | | **`a`** | 仿真捕获到**已配对门磁**报警信号 | 系统跳转到门磁报警界面,亮红灯,振动 1 次 | | **`p`** | 仿真捕获到**已配对 PIR 红外**信号 | 系统跳转到 PIR 报警界面,亮橙灯,振动 2 次 | @@ -23,7 +25,7 @@ ## 2. LED 与马达 IO 跳变日志 主循环对外设引脚的电平状态进行了跟踪,当引脚电平发生变化时,自动通过串口向外部终端打印输出日志。这可以在没有焊接实体马达或 LED 灯的情况下验证控制逻辑是否正确: -* **LED 状态日志格式**:`[STATE] LED status -> R:1 G:0 B:0` (0表示亮,1表示灭) +* **LED 状态日志格式**:`[STATE] LED status -> R:1 G:0 B:0` (0表示亮,1表示灭,WS2812B 幻彩 LED 控制状态) * **马达状态日志格式**:`[STATE] MOTOR -> 1` (1表示开启振动,0表示关闭振动) --- @@ -32,10 +34,10 @@ ### 3.1 时钟待机与电量对齐 * **测试方法**:正常上电启动,查看待机界面。 -* **预期结果**:时钟、日期显示正常。屏幕右上角的电量 `85%` 与电池图标对齐美观,无任何重叠或乱码(间距为 6 像素)。 +* **预期结果**:时钟、日期显示正常。在 **135 像素宽** 屏幕上,电量 `85%` 绘制在 `X=77, Y=24`,电池图标绘制在 `X=107, Y=27`,对齐美观且有 6 像素的安全间距。 ### 3.2 传感器对码与保存 -* **测试方法**:同时长按 ▲+▼ 3秒进入配对,用上下键选中 `DETEC. PIR`,然后物理触发 PIR 传感器,随后按下 SOS 确认保存。 +* **测试方法**:同时长按 ▲+▼ 3秒进入配对,用上下键选中 `DETEC. PIR`,按下侧边 **■ 确认键** 开启等待,随后物理触发 PIR 传感器,最后按下 **SOS 1**(或 **SOS 2**)确认保存。 * **预期结果**: 1. 进入配对时,LED 亮白色闪烁(3Hz),马达短振 1 次确认。 2. 解码匹配成功后,OLED 屏显示 `✓已保存`,LED 绿色常亮 2 秒,马达强振 1 次(400ms),随后自动退回配对菜单。 @@ -44,4 +46,5 @@ * **测试方法**:在常态下静置手环 10 秒钟不作任何操作。 * **预期结果**: 1. 10秒后,屏幕全黑关闭,且 LED 熄灭,马达不鸣叫(`SGM_CTRL` 拉低为0)。 - 2. 按下任意一个物理按键(▲、▼、SOS),屏幕瞬间被点亮并重新恢复时钟待机画面。 + 2. 按下任意一个物理按键(▲、▼、确认键、SOS1、SOS2),屏幕瞬间被点亮并重新恢复时钟待机画面。 +