docs: 根据1.14寸屏幕、5按键与可编程RGB新规格更新项目文档
This commit is contained in:
@@ -1,25 +1,23 @@
|
|||||||
# 总体需求 (docs/10_requirements-overview/main.md)
|
# 总体需求 (Docs/10_requirements-overview/main.md)
|
||||||
|
|
||||||
## 1. 项目整体框架与系统拓扑
|
## 1. 项目整体框架与系统拓扑
|
||||||
|
|
||||||
本项目构建一套以 **IPC 摄像头**为中枢、**手环**为随身告警终端、多类 **433MHz 传感器**为探测前端的本地安防联动系统,同时通过 WiFi 连接云端,向手机 APP 发送推送通知。
|
本项目**仅包含手环端核心业务及驱动代码的实现**。手环作为随身告警终端,独立接收来自多类 **433MHz 传感器**的探测射频信号(本地安防联动系统)。IPC 摄像头和手机 APP 等其他周边组件不在本项目编码范围内,仅作外部仿真与对接边界。
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
graph TD
|
graph TD
|
||||||
Sensor[433MHz 传感器] -->|433MHz 射频信号| IPC[IPC 摄像头]
|
Sensor[433MHz 传感器] -->|433MHz 射频信号| Wristband[随身手环]
|
||||||
Sensor -->|433MHz 射频信号| Wristband[随身手环]
|
|
||||||
IPC -->|WiFi / LAN| Cloud[云端推送服务]
|
|
||||||
Cloud -->|推送通知| App[手机 APP]
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2. 核心信号流向与行为要求
|
## 2. 核心信号流向与手环行为要求
|
||||||
|
|
||||||
1. **传感器触发**:探测到异常时(如门磁打开、烟雾浓度超标),发射固定编码信号(24位 EV1527 协议数据,包含 20位地址码 + 4位数据码)。
|
1. **传感器触发**:探测到异常时,发射固定编码信号(24位 EV1527 协议数据,包含 20位地址码 + 4位数据码)。
|
||||||
2. **手环与 IPC 独立接收**:IPC 和手环各自配备 433MHz 接收解调芯片,分别独立解码,互不依赖。
|
2. **手环独立接收**:手环配备 LR690L 433MHz 接收解调芯片,独立进行软件自适应时序解码。
|
||||||
3. **终端响应行为**:
|
3. **手环响应行为**:
|
||||||
* **IPC 摄像头端**:解码成功后,TFT LCD 屏幕显示报警 ICON、闪光报警,并通过网关向云端推送手机通知。
|
* **屏幕显示**:1.14寸(135x240 像素)TFT LCD 屏幕显示对应的报警 ICON + 传感器法语自定义名称。
|
||||||
* **手环端**:解码成功后,OLED 屏幕显示报警 ICON + 传感器自定义名称,多色 LED 亮起对应颜色,且马达触发特定振动模式。
|
* **灯效响应**:可编程 RGB 灯珠根据传感器类型亮起对应颜色并进行特定波形闪烁。
|
||||||
|
* **马达响应**:马达触发特定的振动次数与时长组合。
|
||||||
|
|
||||||
## 3. 协作规范与门禁说明
|
## 3. 协作规范与门禁说明
|
||||||
本项目的开发协作基于《开发规范.md》定义的“七个环节”。任何目录下文件的修改应当保证其依赖项是同步的。
|
本项目的开发协作基于《开发规范.md》定义的“七个环节”。任何目录下文件的修改应当保证其依赖项是同步的。
|
||||||
在每次完成阶段性工作或代码调整后,应运行 `bash .xagent/check-dirty.sh` 进行脏检测自检。
|
在每次完成阶段性工作或代码调整后,应运行 `python .xagent/check-dirty.py` 进行脏检测自检。
|
||||||
|
|||||||
@@ -1,19 +1,23 @@
|
|||||||
# 细化需求 (docs/20_requirements-detail/main.md)
|
# 细化需求 (Docs/20_requirements-detail/main.md)
|
||||||
|
|
||||||
本章节定义手环终端的物理按键交互、报警矩阵(LED颜色与振动)以及防区划分详细需求。
|
本章节定义手环终端的物理按键交互、报警矩阵(可编程 RGB 灯颜色与振动)以及防区划分详细需求。
|
||||||
|
|
||||||
## 1. 物理按键与交互定义
|
## 1. 物理按键与交互定义
|
||||||
|
|
||||||
| 按键动作 | 常态 (时钟待机) | 对码配对模式 | 警报触发状态 |
|
手环共配备 **5 个物理按键**:侧边 3 个(▲ 上移、▼ 下移、■ 确认),上部 2 个(相同的 SOS1、SOS2,具备完全一致的并联电气逻辑)。
|
||||||
| :--- | :--- | :--- | :--- |
|
|
||||||
| **▲ 上移键** | 短按:时间调整(或菜单浏览) | 向上滚动选择传感器类型 | 无动作 |
|
| 按键类别 | 按键动作 | 常态 (时钟待机) | 对码配对模式 | 警报触发状态 |
|
||||||
| **▼ 下移键** | 短按:时间调整(或菜单浏览) | 向下滚动选择传感器类型 | 长按 2 秒:解除当前告警并退回时钟 |
|
| :--- | :--- | :--- | :--- | :--- |
|
||||||
| **▲ + ▼ (同时长按3秒)** | **进入对码配对模式** | 无动作 | 无动作 |
|
| **侧边按键** | **▲ 上移键** | 短按:时间微调 | 菜单向上滚动 | 无动作 |
|
||||||
| **SOS 键 (短按)** | **触发本地主动 SOS 呼救** | **确认保存当前配对** | 短按:解除告警并退回时钟 |
|
| **侧边按键** | **▼ 下移键** | 短按:时间微调 | 菜单向下滚动 | 长按 2 秒:解除当前告警并退回时钟 |
|
||||||
| **SOS 键 (长按5秒)** | **触发 IPC 绑定对码广播** | 无动作 | 长按:解除告警并退回时钟 |
|
| **侧边按键** | **▲ + ▼ (同时长按3秒)** | **进入对码配对模式** | 无动作 | 无动作 |
|
||||||
|
| **侧边按键** | **■ 确认键 (CONFIRM)** | 无动作 | **选中并进入该类型等待配对** | 短按:解除当前告警并退回时钟 |
|
||||||
|
| **上部按键** | **SOS1 / SOS2 (短按)** | **触发本地主动 SOS 呼救** | **确认保存当前已捕获的配对** | 短按:解除告警并退回时钟 |
|
||||||
|
| **上部按键** | **SOS1 / SOS2 (长按5秒)** | **触发 IPC 绑定对码广播** | 无动作 | 长按:解除告警并退回时钟 |
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> 在手环发出主动 SOS 呼救(马达长振、红灯闪烁)或响应防区报警时,长按物理按键(▲、▼、SOS 任意之一)2 秒均应立刻切断声光电反馈,安全重置至时钟待机状态。
|
> 1. **双 SOS 按键冗余**:上部的两个 SOS 键在电路与软件上完全等价。按下其中任意一个按键,均会触发相同的 SOS 信号采集与求救动作。
|
||||||
|
> 2. **警报快速解除**:在手环发出主动 SOS 呼救或响应被动防区报警时,按下“确认键”或任意一个“SOS 键”(或者长按“▼键”2秒)均会立刻切断声光电反馈,安全重置至时钟待机状态。
|
||||||
|
|
||||||
## 2. 传感器对码与报警映射矩阵
|
## 2. 传感器对码与报警映射矩阵
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,41 @@
|
|||||||
# 架构设计 (docs/30_architecture/main.md)
|
# 架构设计 (Docs/30_architecture/main.md)
|
||||||
|
|
||||||
本章节阐述手环的硬件拓扑、引脚分配、软件状态机设计、IAP Flash 数据库存储设计以及低功耗待机机制。
|
本章节阐述手环的硬件拓扑、引脚分配、软件状态机设计、IAP Flash 数据库存储设计以及低功耗待机机制。
|
||||||
|
|
||||||
## 1. 硬件规格与引脚映射
|
## 1. 硬件规格与引脚映射
|
||||||
|
|
||||||
主控芯片采用 **STC32G12K128** 单片机(工作频率 24.0 MHz,单周期 8051 内核,32位乘除法器)。
|
主控芯片采用 **STC32G12K128** 单片机(工作频率 24.0 MHz,单周期 8051 内核,32位乘除法器)。
|
||||||
|
显示端采用 **1.14寸 TFT LCD 屏幕**,物理分辨率为 **135x240 像素**。
|
||||||
|
|
||||||
### 1.1 GPIO 引脚配置表
|
### 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 | 连接振动马达驱动电路。高电平震动,低电平静止 |
|
| **P2.5** | `MOTOR` | 推挽输出/SCLK | 连接振动马达驱动电路。高电平震动,低电平静止 |
|
||||||
| **P0.1** | `KEY_UP` | 高阻输入+上拉 | 物理按键 SW1 (▲),按下为低电平 |
|
| **P0.1** | `KEY_UP` | 高阻输入+上拉 | 侧边按键 ▲ (上移),按下为低电平 |
|
||||||
| **P0.2** | `KEY_SOS` | 高阻输入+上拉 | 物理按键 SW3 (SOS),按下为低电平 |
|
| **P0.3** | `KEY_DOWN` | 高阻输入+上拉 | 侧边按键 ▼ (下移),按下为低电平 |
|
||||||
| **P0.3** | `KEY_DOWN` | 高阻输入+上拉 | 物理按键 SW2 (▼),按下为低电平 |
|
| **P0.4** | `KEY_CONFIRM`| 高阻输入+上拉 | 侧边按键 ■ (确认),按下为低电平 |
|
||||||
| **P1.0** | `SGM_CTRL` | 推挽输出 | SGM3833 电源使能。高电平使能输出正负 VELVDD & VAVDD |
|
| **P0.2** | `KEY_SOS1` | 高阻输入+上拉 | 上部按键 SOS 1,按下为低电平 |
|
||||||
| **P1.1** | `LCD_RST` | 推挽输出 | AMOLED 屏幕 RM69310 复位引脚 |
|
| **P0.5** | `KEY_SOS2` | 高阻输入+上拉 | 上部按键 SOS 2,按下为低电平 |
|
||||||
| **P1.3** | `LCD_RS` | 推挽输出 | AMOLED 屏幕 SPI 数据/命令寄存器选择 (D/C) |
|
| **P1.0** | `SGM_CTRL` | 推挽输出 | 屏幕/驱动供电使能。高电平使能,低电平关闭 |
|
||||||
| **P1.4** | `LCD_CS` | 推挽输出 | AMOLED 屏幕 SPI 片选信号 |
|
| **P1.1** | `LCD_RST` | 推挽输出 | LCD 屏幕复位引脚 |
|
||||||
| **P1.5** | `LCD_SCL` | 推挽输出 | AMOLED 屏幕 SPI 时钟信号 |
|
| **P1.3** | `LCD_RS` | 推挽输出 | LCD 屏幕 SPI 数据/命令寄存器选择 (D/C) |
|
||||||
| **P1.6** | `LCD_SDA` | 推挽输出 | AMOLED 屏幕 SPI 数据信号 |
|
| **P1.4** | `LCD_CS` | 推挽输出 | LCD 屏幕 SPI 片选信号 |
|
||||||
|
| **P1.5** | `LCD_SCL` | 推挽输出 | LCD 屏幕 SPI 时钟信号 |
|
||||||
|
| **P1.6** | `LCD_SDA` | 推挽输出 | LCD 屏幕 SPI 数据信号 |
|
||||||
| **P2.3** | `ADC3` | 模拟输入 | 电池电压采样输入端口 |
|
| **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 灯效数据时引脚电平抖动导致马达异常鸣叫:
|
由于 `P2.5` 同时作为马达引脚和硬件 SPI 的 SCLK 引脚,为了避免在高频发送 24-bit 灯效数据时引脚电平抖动导致马达异常鸣叫:
|
||||||
1. **发送前**:调用 `EA = 0` 关闭总中断。临时将 `P2.5` 引脚配置为 **高阻输入模式**。此时 SCLK 输出时钟不会使马达导通。
|
1. **发送前**:调用 `EA = 0` 关闭总中断。临时将 `P2.5` 引脚配置为 **高阻输入模式**。此时 SCLK 输出时钟不会使马达导通。
|
||||||
|
|||||||
@@ -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. 屏幕物理参数与刷新机制
|
## 1. 屏幕物理参数与刷新机制
|
||||||
|
|
||||||
* **屏幕规格**:0.95寸 AMOLED 屏 (RM69310 控制芯片),物理分辨率 `120x240`。
|
* **屏幕规格**:1.14寸 TFT LCD 屏,物理分辨率 **`135x240`**。
|
||||||
* **坐标偏移修正**:根据硬件布线,写屏窗口渲染存在 **4 像素的 X 轴偏移偏量**,软件在调用 `LCD_SetWindow()` 时必须强行追加该偏移。
|
* **坐标偏移修正**:写屏窗口渲染存在 **4 像素的 X 轴偏移量**,调用 `LCD_SetWindow(x1 + 4, x2 + 4, y1, y2)`。
|
||||||
* **局部刷新防抖机制**:清除重绘标志(`Redraw`)的动作必须在具体的刷新绘制块结束时重置,防止因为主循环高速轮询而产生屏幕闪烁。
|
* **局部刷新防抖机制**:清除重绘标志(`Redraw`)的动作必须在具体的刷新绘制块结束时重置,防止因为主循环高速轮询而产生屏幕闪烁。
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -17,29 +17,30 @@
|
|||||||
时钟页面作为常态显示,包括状态栏、数字时钟和日期行。
|
时钟页面作为常态显示,包括状态栏、数字时钟和日期行。
|
||||||
|
|
||||||
```
|
```
|
||||||
+---------------------------------------+
|
+-----------------------------------------+
|
||||||
| 🔒 ARMED 🔋 85% | <- 状态栏 (Y=24~27)
|
| 🔒 ARME 🔋 85% | <- 状态栏 (Y=24~27)
|
||||||
| |
|
| |
|
||||||
| |
|
| |
|
||||||
| 10:35 | <- 中央时间 (Y=80~128)
|
| 10:35 | <- 中央时间 (Y=80~128)
|
||||||
| |
|
| |
|
||||||
| |
|
| |
|
||||||
| VEN. 07-10 | <- 底部日期 (Y=180)
|
| VEN. 07-10 | <- 底部日期 (Y=180)
|
||||||
+---------------------------------------+
|
+-----------------------------------------+
|
||||||
```
|
```
|
||||||
|
|
||||||
* **状态栏电量显示(极重要)**:
|
* **状态栏电量显示(极重要)**:
|
||||||
* **电池图标** 绘制在 `X=92, Y=27`。
|
* **电池图标** 绘制在 `X=107, Y=27`。
|
||||||
* **电量百分比** 绘制在 `X=62, Y=24`。
|
* **电量百分比** 绘制在 `X=77, Y=24`。
|
||||||
* 两个控件保持 **6 像素安全间距**,彻底防范乱码和字符相撞。
|
* 两个控件在 `135` 像素宽的屏幕上保持 **6 像素安全间距**(77 + 3*8 = 101,与 107 之间为 6px),彻底防范乱码和字符相撞。
|
||||||
* **安防状态显示**:
|
* **安防状态显示**:
|
||||||
* **布防状态 (ARMED)**:状态栏左侧显示红色闭锁 `🔒` 图标,显示 `ARMED`。
|
* **布防状态 (ARMED)**:状态栏左侧显示红色闭锁 `🔒` 图标,显示 `ARME`。
|
||||||
* **撤防状态 (DISARMED)**:状态栏左侧显示绿色开锁 `🔓` 图标,显示 `DISARMED`。
|
* **撤防状态 (DISARMED)**:状态栏左侧显示绿色开锁 `🔓` 图标,显示 `DESARME`。
|
||||||
|
|
||||||
### 2.2 传感器配对选择菜单 (STATE_PAIR_MENU)
|
### 2.2 传感器配对选择菜单 (STATE_PAIR_MENU)
|
||||||
|
|
||||||
* **顶部标题**:显示 `MODE PAIR P-XX`(其中 XX 为当前已配对的传感器数量)。
|
* **顶部标题**:显示 `MODE PAIR P-XX`(其中 XX 为当前已配对的传感器数量)。
|
||||||
* **列表滚动框**:采用 3 行滚动列表,当前行高亮并显示粗体外框,字号放大(如 `DETEC. PORTE`),非当前行暗淡显示。
|
* **列表滚动框**:采用 3 行滚动列表,当前行高亮并显示粗体外框,字号放大(如 `DETEC. PORTE`),非当前行暗淡显示。
|
||||||
|
* **按键确认行为**:在配对菜单页面,短按侧边 **■ 确认键** 进入所选防区类型的对码等待状态。
|
||||||
|
|
||||||
### 2.3 报警触发与本地 SOS 界面 (STATE_ALARMING / STATE_SOS_EMITTED)
|
### 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) 内的标准字模点阵需要满足如下基线对齐:
|
为保证排版美观,[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` 数字的基线保持严格水平对齐,避免百分号整体下沉。
|
* **百分号(%)符号基线修正**:百分号字符在 `lcd_font.h` 数组的索引 `0x25` 中,点阵数据需**向上平移 2 像素**,以和 `0~9` 数字的基线保持严格水平对齐,避免百分号整体下沉。
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
# 模块拆分 - 按键扫描与事件判定 (docs/50_module-breakdown/mod-key.md)
|
# 模块拆分 - 按键扫描与事件判定 (Docs/50_module-breakdown/mod-key.md)
|
||||||
|
|
||||||
本模块描述按键状态消抖、长按计时判定以及组合按键识别。
|
本模块描述按键状态消抖、长按计时判定以及组合按键识别。支持 5 个物理按键到手环事件的映射。
|
||||||
|
|
||||||
## 1. 模块职责说明
|
## 1. 模块职责说明
|
||||||
|
|
||||||
* **职责范围**:
|
* **职责范围**:
|
||||||
1. 在 1ms 定时器中断中建立 10ms 扫描计时周期。
|
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 检测到电平稳定才认定按键动作)。
|
3. 实现消抖检测(连续 20ms 检测到电平稳定才认定按键动作)。
|
||||||
4. 对按住不放的行为进行计时累加,判定长按(如长按 SOS 达 5 秒触发对码;长按 ▲+▼ 达 3 秒触发配对模式)。
|
4. 对上部双 SOS 按键进行逻辑并联处理,保证按下任意一个均能触发求救。
|
||||||
5. 将按键判定结果转换为 `KeyEvent` 枚举,并注入按键事件缓冲区 `key_event_buf` 供主循环异步读取。
|
5. 对按住不放的行为进行计时累加,判定长按(如长按 SOS 达 5 秒触发对码;长按 ▲+▼ 达 3 秒触发配对模式)。
|
||||||
|
6. 将按键判定结果转换为 `KeyEvent` 并注入按键事件缓冲区 `key_event_buf`。
|
||||||
|
|
||||||
## 2. 数据结构定义
|
## 2. 数据结构定义
|
||||||
|
|
||||||
@@ -21,8 +24,9 @@ typedef enum {
|
|||||||
KEY_UP_LONG,
|
KEY_UP_LONG,
|
||||||
KEY_DOWN_SHORT,
|
KEY_DOWN_SHORT,
|
||||||
KEY_DOWN_LONG,
|
KEY_DOWN_LONG,
|
||||||
KEY_SOS_SHORT,
|
KEY_CONFIRM_CLICK, // ■ 确认键短按
|
||||||
KEY_SOS_LONG,
|
KEY_SOS_SHORT, // SOS键短按 (SOS1 或 SOS2)
|
||||||
|
KEY_SOS_LONG, // SOS键长按(5秒) (SOS1 或 SOS2)
|
||||||
KEY_COMB_LONG // ▲ + ▼ 组合长按事件
|
KEY_COMB_LONG // ▲ + ▼ 组合长按事件
|
||||||
} KeyEvent;
|
} KeyEvent;
|
||||||
```
|
```
|
||||||
@@ -31,9 +35,11 @@ typedef enum {
|
|||||||
|
|
||||||
* `void Key_Scan_Process(void)`:
|
* `void Key_Scan_Process(void)`:
|
||||||
在 Timer 1 ISR 中每 10ms 调度一次。
|
在 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_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_sos_hold >= 500` 达 5 秒时,注入 `KEY_SOS_LONG` 事件;若释放时未达 5 秒但大于 20ms,注入 `KEY_SOS_SHORT`。
|
||||||
|
* 检测到确认键释放,注入 `KEY_CONFIRM_CLICK`。
|
||||||
* 事件解析完毕后存入 `key_event_buf`。
|
* 事件解析完毕后存入 `key_event_buf`。
|
||||||
|
|||||||
@@ -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. 模块职责说明
|
## 1. 模块职责说明
|
||||||
|
|
||||||
@@ -9,11 +9,11 @@
|
|||||||
2. 控制 SGM_CTRL 供电管脚。
|
2. 控制 SGM_CTRL 供电管脚。
|
||||||
3. 支持屏幕窗口配置,实现底层清屏与局部像素写入。
|
3. 支持屏幕窗口配置,实现底层清屏与局部像素写入。
|
||||||
4. 读取 `lcd_font.h` 库,在指定坐标绘制 8x16 字符与自定义大小位图。
|
4. 读取 `lcd_font.h` 库,在指定坐标绘制 8x16 字符与自定义大小位图。
|
||||||
5. 实现各业务状态屏幕画面绘制。
|
5. 实现各业务状态屏幕(135x240 分辨率)画面绘制与文字对齐。
|
||||||
|
|
||||||
## 2. 底层显示接口
|
## 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_WriteCmd(u8 cmd)`:拉低 `LCD_RS` 发送 SPI 命令。
|
||||||
* `void LCD_WriteData(u8 dat)`:拉高 `LCD_RS` 发送 SPI 数据。
|
* `void LCD_WriteData(u8 dat)`:拉高 `LCD_RS` 发送 SPI 数据。
|
||||||
* `void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2)`:设置局部像素绘制范围(强制处理 X 轴偏量 `+4`)。
|
* `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_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_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 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_ShowAlarmPage(char *sensor_name, u8 zone)`:渲染防区告警页面,显示对应的传感器位图和法语名称。
|
||||||
* `void UI_ShowPairMenuPage(u8 selected_index)`:渲染对码选择菜单。
|
* `void UI_ShowPairMenuPage(u8 selected_index)`:渲染对码选择菜单。
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# 模块拆分 - 低功耗电源管理 (docs/50_module-breakdown/mod-power.md)
|
# 模块拆分 - 低功耗电源管理 (Docs/50_module-breakdown/mod-power.md)
|
||||||
|
|
||||||
本模块描述手环待机情况下的屏幕休眠与单片机停机唤醒机制,用于降低日常静态电流消耗。
|
本模块描述手环待机情况下的屏幕休眠与单片机停机唤醒机制,用于降低日常静态电流消耗。
|
||||||
|
|
||||||
@@ -6,18 +6,18 @@
|
|||||||
|
|
||||||
* **职责范围**:
|
* **职责范围**:
|
||||||
1. 在系统无物理按键按下且无射频信号输入达 **10 秒** 后,触发低功耗睡眠动作。
|
1. 在系统无物理按键按下且无射频信号输入达 **10 秒** 后,触发低功耗睡眠动作。
|
||||||
2. 向 RM69310 屏幕控制器发送 Sleep In(命令 `0x10`)使 AMOLED 内部关闭。
|
2. 向 LCD 屏幕控制器发送 Sleep In 指令使屏幕进入休眠。
|
||||||
3. 拉低 `SGM_CTRL = 0` 彻底切断 SGM3833 的正负压与 VAVDD 供电,将屏幕静态电流降至微安级。
|
3. 拉低 `SGM_CTRL = 0` 彻底切断 LCD 背光与驱动供电,将屏幕静态电流降至微安级。
|
||||||
4. 将按键引脚(KEY_UP P0.1, KEY_SOS P0.2, KEY_DOWN P0.3)配置为外部中断源。
|
4. 将 5 个按键引脚(P0.1, P0.2, P0.3, P0.4, P0.5)全部配置为端口外部中断源。
|
||||||
5. 调用单片机 PD 停机控制寄存器,关闭主时钟进入 Power-Down 停机状态。
|
5. 调用单片机 PD 停机控制寄存器,关闭主时钟进入 Power-Down 停机状态。
|
||||||
6. 在用户按压任意键时通过引脚电平下降沿产生外部中断,瞬时唤醒主控时钟并恢复供电。
|
6. 在用户按压任意键时通过引脚电平下降沿产生外部端口中断,瞬时唤醒主控时钟并恢复供电。
|
||||||
|
|
||||||
## 2. 接口与函数设计
|
## 2. 接口与函数设计
|
||||||
|
|
||||||
* `void Enter_Deep_Sleep(void)`:
|
* `void Enter_Deep_Sleep(void)`:
|
||||||
1. 通过 SPI 通道写指令 `0x10`。
|
1. 通过 SPI 通道写 Sleep In 指令。
|
||||||
2. 设置 `SGM_CTRL = 0`。
|
2. 设置 `SGM_CTRL = 0` 关闭背光和供电。
|
||||||
3. 清除外部中断标志,使能 P0 口外部中断输入。
|
3. 清除外部中断标志,使能 P0 口(P0.1~P0.5)的端口中断输入(P0INTE = 0x3E)。
|
||||||
4. 设置单片机的 `PCON` 寄存器使 `PD = 1`。主时钟停止。
|
4. 设置单片机的 `PCON` 寄存器使 `PD = 1`。主时钟停止。
|
||||||
* `void Key_Wakeup_Isr(void)`:
|
* `void Key_Wakeup_Isr(void)`:
|
||||||
按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕高压供电,并发送 Wake Up 指令 `0x11` 重建屏幕显示。
|
按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕与背光供电,并发送 Wake Up 指令重建屏幕显示。
|
||||||
|
|||||||
@@ -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. 模块职责说明
|
## 1. 模块职责说明
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 模块拆分 - 系统核心控制与存储 (docs/50_module-breakdown/mod-sys.md)
|
# 模块拆分 - 系统核心控制与存储 (Docs/50_module-breakdown/mod-sys.md)
|
||||||
|
|
||||||
本模块定义手环系统的生命周期、时间计数器、定时中断调度器以及断电保存数据库模块。
|
本模块定义手环系统的生命周期、时间计数器、定时中断调度器以及断电保存数据库模块。只涉及手环本地代码实现。
|
||||||
|
|
||||||
## 1. 模块职责说明
|
## 1. 模块职责说明
|
||||||
|
|
||||||
|
|||||||
@@ -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. 读取引脚状态并消抖
|
// 1. 读取引脚状态并消抖
|
||||||
static u8 key_up_state = 0xFF;
|
static u8 key_up_state = 0xFF;
|
||||||
static u8 key_down_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_up_state = (key_up_state << 1) | KEY_UP;
|
||||||
key_down_state = (key_down_state << 1) | KEY_DOWN;
|
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. 长按与组合按键计时器累加
|
// 2. 长按与组合按键计时器累加
|
||||||
if ((key_up_state & 0x07) == 0 && (key_down_state & 0x07) == 0) {
|
if ((key_up_state & 0x07) == 0 && (key_down_state & 0x07) == 0) {
|
||||||
@@ -31,7 +39,7 @@ void Key_Scan_Process(void) {
|
|||||||
} else {
|
} else {
|
||||||
comb_hold = 0;
|
comb_hold = 0;
|
||||||
|
|
||||||
// 单个按键:▲ 键
|
// 单个按键:▲ 键 (UP)
|
||||||
if ((key_up_state & 0x07) == 0) {
|
if ((key_up_state & 0x07) == 0) {
|
||||||
key_up_hold++;
|
key_up_hold++;
|
||||||
} else {
|
} else {
|
||||||
@@ -41,7 +49,17 @@ void Key_Scan_Process(void) {
|
|||||||
key_up_hold = 0;
|
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) {
|
if ((key_sos_state & 0x07) == 0) {
|
||||||
key_sos_hold++;
|
key_sos_hold++;
|
||||||
if (key_sos_hold == 500) { // 5秒
|
if (key_sos_hold == 500) { // 5秒
|
||||||
@@ -53,7 +71,7 @@ void Key_Scan_Process(void) {
|
|||||||
}
|
}
|
||||||
key_sos_hold = 0;
|
key_sos_hold = 0;
|
||||||
}
|
}
|
||||||
// ▼ 键处理同上...
|
// ▼ 键 (DOWN) 处理同上...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# 编码实现 - LCD 显示与字模驱动 (docs/60_coding/mod-lcd.md)
|
# 编码实现 - LCD 显示与字模驱动 (Docs/60_coding/mod-lcd.md)
|
||||||
|
|
||||||
本文件对应 LCD 驱动与字模渲染的具体编码实现细节。
|
本文件对应 LCD 驱动与字模渲染的具体编码实现细节。
|
||||||
|
|
||||||
@@ -31,14 +31,28 @@ void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2) {
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 2.2 电池图标与百分比坐标对齐
|
### 2.2 电池图标与百分比坐标对齐
|
||||||
在 `main.c` 的时钟重绘函数中,通过以下坐标绘制电量:
|
在 `main.c` 的时钟重绘函数中,通过以下坐标在 **135 像素宽** 屏幕上绘制电量:
|
||||||
```c
|
```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 字模百分号偏置
|
### 2.3 字模百分号偏置
|
||||||
在 `lcd_font.h` 的 ASCII 字符数组中,百分号 `%`(十进制 37,十六进制 0x25)的字模通过在字模绘制时向上平移 2 像素对齐普通数字的下基准线。
|
在 `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);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# 编码实现 - 低功耗电源管理 (docs/60_coding/mod-power.md)
|
# 编码实现 - 低功耗电源管理 (Docs/60_coding/mod-power.md)
|
||||||
|
|
||||||
本文件对应低功耗待机与外部中断唤醒的具体编码实现细节。
|
本文件对应低功耗待机与外部中断唤醒的具体编码实现细节。
|
||||||
|
|
||||||
@@ -9,20 +9,20 @@
|
|||||||
## 2. 关键代码片段与逻辑实现
|
## 2. 关键代码片段与逻辑实现
|
||||||
|
|
||||||
### 2.1 屏幕休眠命令与供电切断
|
### 2.1 屏幕休眠命令与供电切断
|
||||||
在待机检测到达 10 秒超时后,调用进入睡眠流程:
|
在待机检测到达 10秒超时后,调用进入睡眠流程:
|
||||||
```c
|
```c
|
||||||
void Enter_Deep_Sleep(void) {
|
void Enter_Deep_Sleep(void) {
|
||||||
// 1. 发送屏幕休眠指令 (Sleep In)
|
// 1. 发送屏幕休眠指令 (Sleep In)
|
||||||
LCD_WriteCmd(0x10);
|
LCD_WriteCmd(0x10);
|
||||||
Delay_ms(120); // 必须等待 120ms 供屏幕电容放电
|
Delay_ms(120); // 必须等待 120ms 供屏幕电容放电
|
||||||
|
|
||||||
// 2. 切断 SGM3833 正负高压供电,阻断 VELVDD 的泄露电流
|
// 2. 切断 LCD 供电与背光
|
||||||
SGM_CTRL = 0;
|
SGM_CTRL = 0;
|
||||||
|
|
||||||
// 3. 配置 KEY 端口的中断触发(配置为下降沿触发)
|
// 3. 配置 KEY 端口的中断触发(配置为下降沿触发)
|
||||||
P0IM0 = 0x00; // 下降沿
|
P0IM0 = 0x00; // 下降沿
|
||||||
P0IM1 = 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 指令挂起主时钟
|
// 4. 调用单片机 PD 指令挂起主时钟
|
||||||
PCON |= 0x02; // PD = 1
|
PCON |= 0x02; // PD = 1
|
||||||
@@ -32,14 +32,14 @@ void Enter_Deep_Sleep(void) {
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 2.2 端口中断唤醒与显示重建
|
### 2.2 端口中断唤醒与显示重建
|
||||||
当按键被按下(P0.1~P0.3 电平跳变),触发外部端口中断,CPU 被唤醒并从停机处继续执行:
|
当任意按键被按下(P0.1~P0.5 电平下降沿跳变),触发外部端口中断,CPU 被唤醒并从停机处继续执行:
|
||||||
```c
|
```c
|
||||||
void Port0_Isr(void) interrupt 37 {
|
void Port0_Isr(void) interrupt 37 {
|
||||||
u8 int_src = P0INTF;
|
u8 int_src = P0INTF;
|
||||||
P0INTF = 0x00; // 清除中断标志位
|
P0INTF = 0x00; // 清除中断标志位
|
||||||
|
|
||||||
if (int_src & 0x0E) {
|
if (int_src & 0x3E) { // 检查是否是 5 个按键引发的唤醒
|
||||||
// 1. 恢复 SGM3833 供电
|
// 1. 恢复 LCD 背光与供电
|
||||||
SGM_CTRL = 1;
|
SGM_CTRL = 1;
|
||||||
Delay_ms(20); // 等待供电稳定
|
Delay_ms(20); // 等待供电稳定
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 编码实现 - 自适应 RF 解码与发射 (docs/60_coding/mod-rf.md)
|
# 编码实现 - 自适应 RF 解码与发射 (Docs/60_coding/mod-rf.md)
|
||||||
|
|
||||||
本文件对应自适应射频解码与主动发射的具体编码实现细节。
|
本文件对应自适应射频解码与主动发射的具体编码实现细节。已验证无变动。
|
||||||
|
|
||||||
## 1. 对应代码源文件
|
## 1. 对应代码源文件
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 编码实现 - 系统核心控制与存储 (docs/60_coding/mod-sys.md)
|
# 编码实现 - 系统核心控制与存储 (Docs/60_coding/mod-sys.md)
|
||||||
|
|
||||||
本文件对应系统控制与存储的具体编码实现细节。
|
本文件对应系统控制与存储的具体编码实现细节。只包含手环代码实现。
|
||||||
|
|
||||||
## 1. 对应代码源文件
|
## 1. 对应代码源文件
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# 测试设计与验证方法 (docs/70_testing/main.md)
|
# 测试设计与验证方法 (Docs/70_testing/main.md)
|
||||||
|
|
||||||
本章节整理手环系统的仿真联调指令、IO 状态变化监控规范以及人工实机验证用例。
|
本章节整理手环系统的仿真联调指令、IO 状态变化监控规范以及人工实机验证用例。
|
||||||
|
|
||||||
@@ -8,9 +8,11 @@
|
|||||||
|
|
||||||
| 串口发送字符 | 对应仿真的物理事件与说明 | 预期系统响应 |
|
| 串口发送字符 | 对应仿真的物理事件与说明 | 预期系统响应 |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| **`u` / `U`** | 仿真短按 / 长按 **▲ 键** | 时钟界面切换 / 菜单滚动 |
|
| **`u` / `U`** | 仿真短按 / 长按 **侧边 ▲ 键** | 时钟微调 / 菜单滚动 |
|
||||||
| **`d` / `D`** | 仿真短按 / 长按 **▼ 键** | 时钟界面切换 / 菜单滚动 / 长按取消报警 |
|
| **`d` / `D`** | 仿真短按 / 长按 **侧边 ▼ 键** | 时钟微调 / 菜单滚动 / 长按取消报警 |
|
||||||
| **`s` / `S`** | 仿真短按 / 长按 **SOS 键** | 触发本地主动 SOS 警报 / 触发对码保存 |
|
| **`e` / `E`** | 仿真短按 / 长按 **侧边 ■ 确认键** | 选中并进入等待配对 / 短按取消报警 |
|
||||||
|
| **`s` / `S`** | 仿真短按 / 长按 **上部 SOS 1 键** | 触发本地主动 SOS 警报 / 触发对码保存 |
|
||||||
|
| **`x` / `X`** | 仿真短按 / 长按 **上部 SOS 2 键** | 同上,验证双 SOS 键并联触发等效性 |
|
||||||
| **`c`** | 仿真同时长按 **▲ + ▼ 键 3 秒** | 系统直接进入配对模式(P-00) |
|
| **`c`** | 仿真同时长按 **▲ + ▼ 键 3 秒** | 系统直接进入配对模式(P-00) |
|
||||||
| **`a`** | 仿真捕获到**已配对门磁**报警信号 | 系统跳转到门磁报警界面,亮红灯,振动 1 次 |
|
| **`a`** | 仿真捕获到**已配对门磁**报警信号 | 系统跳转到门磁报警界面,亮红灯,振动 1 次 |
|
||||||
| **`p`** | 仿真捕获到**已配对 PIR 红外**信号 | 系统跳转到 PIR 报警界面,亮橙灯,振动 2 次 |
|
| **`p`** | 仿真捕获到**已配对 PIR 红外**信号 | 系统跳转到 PIR 报警界面,亮橙灯,振动 2 次 |
|
||||||
@@ -23,7 +25,7 @@
|
|||||||
## 2. LED 与马达 IO 跳变日志
|
## 2. LED 与马达 IO 跳变日志
|
||||||
|
|
||||||
主循环对外设引脚的电平状态进行了跟踪,当引脚电平发生变化时,自动通过串口向外部终端打印输出日志。这可以在没有焊接实体马达或 LED 灯的情况下验证控制逻辑是否正确:
|
主循环对外设引脚的电平状态进行了跟踪,当引脚电平发生变化时,自动通过串口向外部终端打印输出日志。这可以在没有焊接实体马达或 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表示关闭振动)
|
* **马达状态日志格式**:`[STATE] MOTOR -> 1` (1表示开启振动,0表示关闭振动)
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -32,10 +34,10 @@
|
|||||||
|
|
||||||
### 3.1 时钟待机与电量对齐
|
### 3.1 时钟待机与电量对齐
|
||||||
* **测试方法**:正常上电启动,查看待机界面。
|
* **测试方法**:正常上电启动,查看待机界面。
|
||||||
* **预期结果**:时钟、日期显示正常。屏幕右上角的电量 `85%` 与电池图标对齐美观,无任何重叠或乱码(间距为 6 像素)。
|
* **预期结果**:时钟、日期显示正常。在 **135 像素宽** 屏幕上,电量 `85%` 绘制在 `X=77, Y=24`,电池图标绘制在 `X=107, Y=27`,对齐美观且有 6 像素的安全间距。
|
||||||
|
|
||||||
### 3.2 传感器对码与保存
|
### 3.2 传感器对码与保存
|
||||||
* **测试方法**:同时长按 ▲+▼ 3秒进入配对,用上下键选中 `DETEC. PIR`,然后物理触发 PIR 传感器,随后按下 SOS 确认保存。
|
* **测试方法**:同时长按 ▲+▼ 3秒进入配对,用上下键选中 `DETEC. PIR`,按下侧边 **■ 确认键** 开启等待,随后物理触发 PIR 传感器,最后按下 **SOS 1**(或 **SOS 2**)确认保存。
|
||||||
* **预期结果**:
|
* **预期结果**:
|
||||||
1. 进入配对时,LED 亮白色闪烁(3Hz),马达短振 1 次确认。
|
1. 进入配对时,LED 亮白色闪烁(3Hz),马达短振 1 次确认。
|
||||||
2. 解码匹配成功后,OLED 屏显示 `✓已保存`,LED 绿色常亮 2 秒,马达强振 1 次(400ms),随后自动退回配对菜单。
|
2. 解码匹配成功后,OLED 屏显示 `✓已保存`,LED 绿色常亮 2 秒,马达强振 1 次(400ms),随后自动退回配对菜单。
|
||||||
@@ -44,4 +46,5 @@
|
|||||||
* **测试方法**:在常态下静置手环 10 秒钟不作任何操作。
|
* **测试方法**:在常态下静置手环 10 秒钟不作任何操作。
|
||||||
* **预期结果**:
|
* **预期结果**:
|
||||||
1. 10秒后,屏幕全黑关闭,且 LED 熄灭,马达不鸣叫(`SGM_CTRL` 拉低为0)。
|
1. 10秒后,屏幕全黑关闭,且 LED 熄灭,马达不鸣叫(`SGM_CTRL` 拉低为0)。
|
||||||
2. 按下任意一个物理按键(▲、▼、SOS),屏幕瞬间被点亮并重新恢复时钟待机画面。
|
2. 按下任意一个物理按键(▲、▼、确认键、SOS1、SOS2),屏幕瞬间被点亮并重新恢复时钟待机画面。
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user