docs: 调整为7种传感器类型并规划配对时手动按键微调后缀序号逻辑

This commit is contained in:
2026-07-09 11:32:00 +08:00
parent 89ff52c9b3
commit 8704a63e20
15 changed files with 142 additions and 39 deletions

View File

@@ -3,7 +3,7 @@
## 1. 项目整体框架与系统拓扑 ## 1. 项目整体框架与系统拓扑
本项目**仅包含手环端核心业务及驱动代码的实现**。 本项目**仅包含手环端核心业务及驱动代码的实现**。
* **被动接收**:手环作为随身告警终端,独立接收来自多类 **433MHz 传感器**的探测射频信号(本地安防联动系统)。 * **被动接收**:手环作为随身告警终端,独立接收来自 **7类 433MHz 传感器**的探测射频信号(本地安防联动系统)。
* **主动发射**:手环在本地触发 SOS 求救时,必须向外主动发射 **433MHz SOS 呼救射频信号**,使周边的 IPC 摄像头接收并联动。 * **主动发射**:手环在本地触发 SOS 求救时,必须向外主动发射 **433MHz SOS 呼救射频信号**,使周边的 IPC 摄像头接收并联动。
* 周围的其他组件(如 IPC 摄像头和手机 APP不在本项目编码范围内仅作外部仿真与对接边界。 * 周围的其他组件(如 IPC 摄像头和手机 APP不在本项目编码范围内仅作外部仿真与对接边界。

View File

@@ -8,39 +8,42 @@
| 按键类别 | 按键动作 | 常态 (时钟待机) | 对码配对模式 | 警报触发状态 | | 按键类别 | 按键动作 | 常态 (时钟待机) | 对码配对模式 | 警报触发状态 |
| :--- | :--- | :--- | :--- | :--- | | :--- | :--- | :--- | :--- | :--- |
| **侧边按键** | **▲ 上移键** | 短按:时间微调 | 菜单向上滚动 | 无动作 | | **侧边按键** | **▲ 上移键** | 短按:时间微调 | 菜单向上滚动 / **确认对码时自增序号 (01->99)** | 无动作 |
| **侧边按键** | **▼ 下移键** | 短按:时间微调 | 菜单向下滚动 | 长按 2 秒:解除当前告警并退回时钟 | | **侧边按键** | **▼ 下移键** | 短按:时间微调 | 菜单向下滚动 / **确认对码时自减序号 (99->01)** | 长按 2 秒:解除当前告警并退回时钟 |
| **侧边按键** | **▲ + ▼ (同时长按3秒)** | **进入对码配对模式** | 无动作 | 无动作 | | **侧边按键** | **▲ + ▼ (同时长按3秒)** | **进入对码配对模式** | 无动作 | 无动作 |
| **侧边按键** | **■ 确认键 (CONFIRM)** | 无动作 | **选中并进入该类型等待配对** | 短按:解除当前告警并退回时钟 | | **侧边按键** | **■ 确认键 (CONFIRM)** | 无动作 | 菜单确认 / **对码确认页:确认保存配置** | 短按:解除当前告警并退回时钟 |
| **上部按键** | **SOS1 / SOS2 (短按)** | **触发本地主动 SOS 呼救 + 循环发射 433MHz 呼救包** | **确认保存当前已捕获的配对** | 短按:解除告警并退回时钟 | | **上部按键** | **SOS1 / SOS2 (短按)** | **触发本地主动 SOS 呼救 + 循环发射 433MHz 呼救包** | **对码确认页:确认保存配置** | 短按:解除告警并退回时钟 |
| **上部按键** | **SOS1 / SOS2 (长按5秒)** | **触发 IPC 绑定对码广播** | 无动作 | 长按:解除告警并退回时钟 | | **上部按键** | **SOS1 / SOS2 (长按5秒)** | **触发 IPC 绑定对码广播** | 无动作 | 长按:解除告警并退回时钟 |
> [!NOTE] > [!NOTE]
> 1. **双 SOS 按键冗余**:上部的两个 SOS 键在电路与软件上完全等价。按下其中任意一个按键,均会触发相同的 SOS 信号采集与求救动作。 > 1. **双 SOS 按键冗余**:上部的两个 SOS 键在电路与软件上完全等价。按下其中任意一个按键,均会触发相同的 SOS 信号采集与求救动作。
> 2. **警报快速解除**:在手环发出主动 SOS 呼救或响应被动防区报警时按下“确认键”或任意一个“SOS 键”或者长按“▼键”2秒均会立刻切断声光电反馈安全重置至时钟待机状态。 > 2. **警报快速解除**:在手环发出主动 SOS 呼救或响应被动防区报警时按下“确认键”或任意一个“SOS 键”或者长按“▼键”2秒均会立刻切断声光电反馈安全重置至时钟待机状态。
> 3. **确认页序号手动修改**:当捕获到匹配的射频信号进入对码确认页时,界面将显示当前选定的前缀和初始序号。用户可以使用 ▲ 键增加序号,使用 ▼ 键减少序号(范围 `01` 到 `99`达到边界自动截断选中后按下“确认键”或任意“SOS 键”进行保存。
## 2. 传感器对码与报警映射矩阵 ## 2. 传感器对码与报警映射矩阵
手环接收到 433MHz 传感器射频数据后,通过匹配预设数据码(高 4 位为类型)和地址码,根据下表驱动多色 LED、马达振动波形并更新 OLED 显示。 手环接收到 433MHz 传感器射频数据后,通过匹配预设数据码(高 4 位为类型)和地址码,根据下表驱动多色 LED、马达振动波形并更新 OLED 显示。本系统支持 7 种不同的外部传感器类型,并预留了出厂预设的固定名称前缀。
| 传感器类型 | 数据码标识 | LED 颜色 | OLED 默认名称 (法语) | 马达振动波形 (周期 5 秒) | | 传感器类型 | 数据码标识 | 预设名前缀 | LED 颜色 | 默认防区类型 | 马达振动波形 (周期 5 秒) |
| :--- | :--- | :--- | :--- | :--- | | :--- | :--- | :--- | :--- | :--- | :--- |
| **🚪 门磁/窗磁** | `0x01` (A) | ● 红色 | `PORTE ENTREE` | 1 次短振 300ms | | **🚪 门磁/窗磁** | `0x01` | `PORTE` | ● 红色 | ZONE 1 (普通) | 1 次短振 300ms |
| **👤 PIR 人体红外** | `0x02` (B) | ● 橙色 | `SALON PIR` | 2 次 short 300ms (间隔 200ms) | | **👤 PIR 人体红外** | `0x02` | `PIR` | ● 橙色 | ZONE 1 (普通) | 2 次短振 300ms (间隔 200ms) |
| **🔥 烟雾传感器** | `0x03` (C) | ● 绿色 | `CUISINE FUMEE` | 3 次短振 200ms (间隔 150ms) | | **🔥 烟雾传感器** | `0x03` | `FUMEE` | ● 绿色 | ZONE 0 (24h) | 3 次短振 200ms (间隔 150ms) |
| **💨 气体泄漏** | `0x05` (E) | ● 色 | `CUISINE GAZ` | 4200ms (间隔 100ms) | | **🆘 紧急按钮** | `0x04` | `URGENCE` | ● 色 | ZONE 0 (24h) | 1800ms |
| **💧 水浸传感器** | `0x06` (F) | ● 色 | `SDB EAU` | 2600ms (间隔 300ms) | | **💨 气体泄漏** | `0x05` | `GAZ` | ● 色 | ZONE 0 (24h) | 4200ms (间隔 100ms) |
| **🚨 本地主动 SOS** | 手环触发 | ● 红色闪烁 | `SOS EMITTED` | 持续长振 (振 1000ms, 停 200ms) | | **💧 水浸传感器** | `0x06` | `INOND.` | ● 黄色 | ZONE 0 (24h) | 2 次长振 600ms (间隔 300ms) |
| **📳 振动传感器** | `0x07` | `VIBRA.` | ● 青色 | ZONE 1 (普通) | 连续3次 150ms (间隔 100ms) |
| **🚨 本地主动 SOS** | 手环触发 | `SOS` | ● 红色闪烁 | 独立运行 | 持续长振 (振 1000ms, 停 200ms) |
> [!IMPORTANT] > [!IMPORTANT]
> **手环主动发射 SOS 射频数据格式** > **手环主动发射 SOS 射频数据格式**
> 当触发“本地主动 SOS”时手环通过内置发射芯片以 **2 秒** 为周期循环发射 EV1527 协议数据: > 当触发“本地主动 SOS”时手环通过内置发射芯片以 **2 秒** 为周期循环发射 EV1527 协议数据:
> * **源地址**:手环的 **20位出厂固定唯一 ID (Factory ID)**。 > * **源地址**:手环的 **20位出厂固定唯一 ID (Factory ID)**。
> * **数据码**:固定为 **`0x08`** (即 `1000`)。 > * **数据码**:固定为 **`0x08`** (即 `1000`)。
> * **目的**:使 IPC 摄像头能接收解码,将其与配对列表中该手环 Factory ID 匹对,从而识别求救来源。 > * **目的**:使 IPC 摄像头能接收解码,将其与配对列表中该手环 of Factory ID 匹对,从而识别求救来源。
> [!IMPORTANT] > [!IMPORTANT]
> **屏蔽 SOS 被动报警**:为避免两个手环互发 SOS 相互触发造成死循环报警,手环**必须强行过滤**并排除对外界发射的 SOS 求救广播(数据码为 `0x04` 或特定紧急按钮码)的被动接收。 > **屏蔽 SOS 被动报警**:为避免两个手环互发 SOS 相互触发造成死循环报警,手环**必须强行过滤**并排除对外界发射的 SOS 求救广播(数据码为 `0x08`,或其它手环发射源)的被动接收。
## 3. ZONE 防区划分 ## 3. ZONE 防区划分

View File

@@ -49,6 +49,17 @@ bit is_sos_pressed = (KEY_SOS1 == 0) || (KEY_SOS2 == 0);
2. **发送中**:通过硬件 SPI 直接串行写入 72 位转换数据24位 RGB 经过 LUT 展宽)。 2. **发送中**:通过硬件 SPI 直接串行写入 72 位转换数据24位 RGB 经过 LUT 展宽)。
3. **发送后**:将 `P2.5` 引脚改回 **推挽输出模式**。调用 `EA = 1` 开启中断,继续通过常规 IO 控制马达电平。 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) ## 2. 核心软件业务状态机 (SystemState)
@@ -65,8 +76,8 @@ stateDiagram-v2
STATE_NORMAL --> STATE_PAIR_MENU : ▲ + ▼ 长按 3 秒 STATE_NORMAL --> STATE_PAIR_MENU : ▲ + ▼ 长按 3 秒
STATE_PAIR_MENU --> STATE_PAIR_WAIT : 确认选中类型 STATE_PAIR_MENU --> STATE_PAIR_WAIT : 确认选中类型
STATE_PAIR_WAIT --> STATE_PAIR_CONFIRM : 捕获 433MHz 匹配数据 STATE_PAIR_WAIT --> STATE_PAIR_CONFIRM : 捕获 433MHz 匹配数据
STATE_PAIR_CONFIRM --> STATE_PAIR_SUCCESS : SOS 保存 STATE_PAIR_CONFIRM --> STATE_PAIR_SUCCESS : 按 CONFIRM/SOS 键并保存名称
STATE_PAIR_CONFIRM --> STATE_PAIR_FAIL : 超时/按▼取消 STATE_PAIR_CONFIRM --> STATE_PAIR_FAIL : 超时/按▼取消
STATE_PAIR_SUCCESS --> STATE_PAIR_MENU : 2秒后自动返回 STATE_PAIR_SUCCESS --> STATE_PAIR_MENU : 2秒后自动返回
STATE_PAIR_FAIL --> STATE_PAIR_MENU : 2秒后自动返回 STATE_PAIR_FAIL --> STATE_PAIR_MENU : 2秒后自动返回
@@ -85,10 +96,11 @@ stateDiagram-v2
* **存储结构**`Sensor_Slot` 结构体: * **存储结构**`Sensor_Slot` 结构体:
```c ```c
typedef struct { typedef struct {
u32 addr; // 24位射频硬件地址 (EV1527) u8 is_used; // 登记标志0x01表示有效其它代表空闲
u8 type; // 传感器类型 (0: 门磁, 1: 红外, 2: 烟感, 3: 燃气, 4: 水浸) u8 addr[3]; // 24位射频物理地址 (EV1527)
u8 type; // 传感器类型 (0:门磁, 1:红外, 2:烟感, 3:紧急, 4:气体, 5:水浸, 6:振动)
u8 zone; // 防区类别 (0: 永久防区, 1: 普通可撤防区) u8 zone; // 防区类别 (0: 永久防区, 1: 普通可撤防区)
char name[16]; // 自定义法语防区名称 char name_gbk[16]; // 法语自定义防区名称 (以 [前缀] [序号] 自动格式化写入)
} Sensor_Slot; } Sensor_Slot;
``` ```
* 一共支持 **16** 个传感器槽位,通过 `Load_Database()` 和 `Save_Database()` 进行统一序列化读写。 * 一共支持 **16** 个传感器槽位,通过 `Load_Database()` 和 `Save_Database()` 进行统一序列化读写。

View File

@@ -39,7 +39,7 @@
### 2.2 传感器配对选择菜单 (STATE_PAIR_MENU) ### 2.2 传感器配对选择菜单 (STATE_PAIR_MENU)
* **顶部标题**:显示 `MODE PAIR P-XX`(其中 XX 为当前已配对的传感器数量)。 * **顶部标题**:显示 `MODE PAIR P-XX`(其中 XX 为当前已配对的传感器数量)。
* **列表滚动框**:采用 3 行滚动列表,当前行高亮并显示粗体外框,字号放大(如 `DETEC. PORTE`),非当前行暗淡显示。 * **列表滚动框**:采用 3 行滚动列表,可在 **7 种传感器类型**(门磁、红外、烟感、紧急、气体、水浸、振动)中上下循环滚动选中。当前行高亮并显示粗体外框,字号放大(如 `DETEC. PORTE`),非当前行暗淡显示。
* **按键确认行为**:在配对菜单页面,短按侧边 **■ 确认键** 进入所选防区类型的对码等待状态。 * **按键确认行为**:在配对菜单页面,短按侧边 **■ 确认键** 进入所选防区类型的对码等待状态。
### 2.3 报警触发与本地 SOS 界面 (STATE_ALARMING / STATE_SOS_EMITTED) ### 2.3 报警触发与本地 SOS 界面 (STATE_ALARMING / STATE_SOS_EMITTED)
@@ -49,14 +49,37 @@
* 门磁:`🚪` 开门图标。 * 门磁:`🚪` 开门图标。
* 红外:`👤` 人体辐射波纹图标。 * 红外:`👤` 人体辐射波纹图标。
* 烟感:`🔥` 火苗图标。 * 烟感:`🔥` 火苗图标。
* 紧急按钮:`🆘` 求救图标。
* 燃气:`💨` 毒气云雾图标。 * 燃气:`💨` 毒气云雾图标。
* 水浸:`💧` 滴水波纹图标。 * 水浸:`💧` 滴水波纹图标。
* 振动:`📳` 震动线框图标。
* **主动 SOS 界面**:大字显示 `SOS EMIS`,居中显示 `🚨` 旋转警灯图标。 * **主动 SOS 界面**:大字显示 `SOS EMIS`,居中显示 `🚨` 旋转警灯图标。
* **绑定 IPC 界面 (STATE_BINDING)** * **绑定 IPC 界面 (STATE_BINDING)**
* 顶部标题:`LIAISON IPC` (法语:与 IPC 绑定)。 * 顶部标题:`LIAISON IPC` (法语:与 IPC 绑定)。
* 中央:正在发送提示,显示 `ENVOI EN COURS`,配对确认锁图标。 * 中央:正在发送提示,显示 `ENVOI EN COURS`,配对确认锁图标。
* **手环 Factory ID 显示**:底部居中显示手环自身出厂地址:`ID: 0xXXXXX`,以便用户配对及辨识。 * **手环 Factory ID 显示**:底部居中显示手环自身出厂地址:`ID: 0xXXXXX`,以便用户配对及辨识。
### 2.4 对码确认与序号微调界面 (STATE_PAIR_CONFIRM)
当手环解码到传感器对码信号后,切入此确认页:
```
+-----------------------------------------+
✓ RECU (对码成功) (Y=40)
[ 🚪 ICON ] (Y=80)
PORTE (Y=135)
[ 01 ] (Y=165) <- 序号微调框 (可按 ▲/▼ 修改)
+-----------------------------------------+
```
* **元素定位**
* 顶部显示提示语 `✓ RECU`(法语:已接收),绿字。
* 中央显示捕获传感器 32x32 对应位图图标。
* 下方第一行展示传感器名称前缀(如 `PORTE`)。
* 下方第二行展示序号选框 `[ 01 ]`:其中包含两个外括号,中间的数字即为 `selected_suffix_num`01~99。当用户按 ▲ 或 ▼ 键时,中间数字动态增减并实时局部刷新,外括号保持静止,增强可编辑交互感。
* **确认行为**:短按 CONFIRM 键或 SOS 键保存退出。
--- ---
## 3. 文字居中对齐与字模基线规范 ## 3. 文字居中对齐与字模基线规范

View File

@@ -44,4 +44,4 @@ typedef enum {
* 检测到确认键释放,注入 `KEY_CONFIRM_CLICK` * 检测到确认键释放,注入 `KEY_CONFIRM_CLICK`
* 事件解析完毕后存入 `key_event_buf` * 事件解析完毕后存入 `key_event_buf`
<!-- Checked and verified with bracelet_factory_id and active SOS changes --> <!-- Checked and verified with 7 sensor types and manual suffix selection changes -->

View File

@@ -29,5 +29,6 @@
* `void UI_ShowClockPage(SystemState state, u8 hour, u8 min)`渲染时钟待机页面135 宽布局),并根据布撤防状态在状态栏绘制相应锁状态图标。 * `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)`:渲染对码选择菜单。
* `void UI_ShowPairConfirmPage(u8 type, u8 selected_suffix)`:渲染对码确认页,显示捕获的类型图标、名字前缀及带选框的 `[ selected_suffix ]` 数字序号(支持按键调整)。
* `void UI_ShowBindingPage(void)`:渲染与 IPC 绑定对码界面,并在屏幕底部居中显示手环自身的唯一 `Factory ID` * `void UI_ShowBindingPage(void)`:渲染与 IPC 绑定对码界面,并在屏幕底部居中显示手环自身的唯一 `Factory ID`

View File

@@ -22,4 +22,4 @@
* `void Key_Wakeup_Isr(void)` * `void Key_Wakeup_Isr(void)`
按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕与背光供电,并发送 Wake Up 指令重建屏幕显示。 按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕与背光供电,并发送 Wake Up 指令重建屏幕显示。
<!-- Checked and verified with bracelet_factory_id and active SOS changes --> <!-- Checked and verified with 7 sensor types and manual suffix selection changes -->

View File

@@ -26,3 +26,5 @@
主动发射一帧数据。生成同步头,并按 `1` 码(高电平 3T, 低电平 1T`0` 码(高电平 1T, 低电平 3T依次驱动发射引脚电平持续多帧以确保接收方捕获。 主动发射一帧数据。生成同步头,并按 `1` 码(高电平 3T, 低电平 1T`0` 码(高电平 1T, 低电平 3T依次驱动发射引脚电平持续多帧以确保接收方捕获。
* 该函数被手环用作向 IPC 摄像头主动对码绑定(`data_code = 0x01`)。 * 该函数被手环用作向 IPC 摄像头主动对码绑定(`data_code = 0x01`)。
* 该函数也用于手环主动发射 SOS 紧急呼救包(`data_code = 0x08`),此时传入手环自身的出厂固定 ID `bracelet_factory_id` * 该函数也用于手环主动发射 SOS 紧急呼救包(`data_code = 0x08`),此时传入手环自身的出厂固定 ID `bracelet_factory_id`
<!-- Checked and verified with 7 sensor types and manual suffix selection changes -->

View File

@@ -16,10 +16,11 @@
### 2.1 传感器插槽结构体 (Sensor_Slot) ### 2.1 传感器插槽结构体 (Sensor_Slot)
```c ```c
typedef struct { typedef struct {
u32 addr; // 24位 EV1527 地址 u8 is_used; // 0x01:已使用,其它:空闲
u8 type; // 传感器类型 u8 addr[3]; // 24位 EV1527 对码物理地址
u8 type; // 传感器类型 (0~6)
u8 zone; // 防区类别 (0: 永久防区, 1: 可撤布防区) u8 zone; // 防区类别 (0: 永久防区, 1: 可撤布防区)
char name[16]; // 法语自定义名 char name_gbk[16]; // 法语自定义名字(前缀+两位数序号,如 PORTE 02
} Sensor_Slot; } Sensor_Slot;
``` ```
@@ -34,7 +35,7 @@ typedef enum {
STATE_PAIR_CONFIRM, STATE_PAIR_CONFIRM,
STATE_PAIR_SUCCESS, STATE_PAIR_SUCCESS,
STATE_PAIR_FAIL, STATE_PAIR_FAIL,
STATE_ALARMING, STATE_ALARM,
STATE_SOS_EMITTED STATE_SOS_EMITTED
} SystemState; } SystemState;
``` ```
@@ -48,7 +49,7 @@ typedef enum {
### 3.2 IAP 数据库存储接口 ### 3.2 IAP 数据库存储接口
* `void Load_Database(void)`:从 Flash 扇区 `0xFE0000` 读取 16 组传感器配置载入内存的 `sensor_list` * `void Load_Database(void)`:从 Flash 扇区 `0xFE0000` 读取 16 组传感器配置载入内存的 `sensor_list`
* `void Save_Database(void)`:擦除 Flash 扇区并将内存中的 `sensor_list` 写入 Flash。 * `void Save_Database(void)`:擦除 Flash 扇区并将内存中的 `sensor_list` 写入 Flash。
* `void Add_Sensor(u32 addr, u8 type)`:向 `sensor_list` 添加传感器信息并自动调用 `Save_Database()` * `void Add_Sensor(u32 addr, u8 type, u8 suffix_idx)`:向 `sensor_list` 添加传感器信息,将其名字拼装为 `[前缀] [suffix_idx]`并自动调用 `Save_Database()`
* `bit Check_Sensor_ID(u32 addr, u8 *out_slot_index)`:在数据库中检索该地址码,若存在则返回它的槽位索引。 * `bit Check_Sensor_ID(u32 addr, u8 *out_slot_index)`:在数据库中检索该地址码,若存在则返回它的槽位索引。
### 3.3 系统初始化与全局 ID 获取 ### 3.3 系统初始化与全局 ID 获取

View File

@@ -76,7 +76,7 @@ void Key_Scan_Process(void) {
} }
``` ```
<!-- Checked and verified with bracelet_factory_id and active SOS changes --> <!-- Checked and verified with 7 sensor types and manual suffix selection changes -->
### 2.2 事件异步读取与清除 ### 2.2 事件异步读取与清除
主循环在其周期内轮询 `key_event_buf`。一旦发现其非 `KEY_EVENT_NONE`,拷贝并立即重置该缓冲区为 `KEY_EVENT_NONE` 以防止重复触发: 主循环在其周期内轮询 `key_event_buf`。一旦发现其非 `KEY_EVENT_NONE`,拷贝并立即重置该缓冲区为 `KEY_EVENT_NONE` 以防止重复触发:

View File

@@ -68,4 +68,33 @@ void UI_ShowBindingPage(void) {
FormatHex(bracelet_factory_id, id_str); FormatHex(bracelet_factory_id, id_str);
LCD_ShowStringCentered(180, id_str, COLOR_GRAY, COLOR_BLACK); LCD_ShowStringCentered(180, id_str, COLOR_GRAY, COLOR_BLACK);
} }
### 2.6 对码确认与序号微调页渲染
`main.c` 中通过以下方式渲染可供按键微调的数字后缀界面:
```c
void UI_ShowPairConfirmPage(u8 type, u8 selected_suffix) {
char num_buf[10];
LCD_Clear(COLOR_BLACK);
LCD_ShowStringCentered(40, "v RECU", COLOR_GREEN, COLOR_BLACK);
// 根据类型渲染 32x32 图标
// ...
// 居中显示预设名称前缀
LCD_ShowStringCentered(135, sensor_prefixes[type], COLOR_WHITE, COLOR_BLACK);
// 拼接成带选框的 "[ 02 ]" 格式字符串并高亮居中渲染
num_buf[0] = '[';
num_buf[1] = ' ';
num_buf[2] = ' ';
num_buf[3] = '0' + (selected_suffix / 10);
num_buf[4] = '0' + (selected_suffix % 10);
num_buf[5] = ' ';
num_buf[6] = ' ';
num_buf[7] = ']';
num_buf[8] = '\0';
LCD_ShowStringCentered(165, num_buf, COLOR_CYAN, COLOR_BLACK);
}
```
``` ```

View File

@@ -54,5 +54,5 @@ void Port0_Isr(void) interrupt 37 {
} }
``` ```
<!-- Checked and verified with bracelet_factory_id and active SOS changes --> <!-- Checked and verified with 7 sensor types and manual suffix selection changes -->
通过中断直接退出 `PD` 模式,恢复手环的常规时钟显示。 通过中断直接退出 `PD` 模式,恢复手环的常规时钟显示。

View File

@@ -36,3 +36,5 @@ void EV1527_Transmit(u32 addr, u8 data_code) {
通过控制发射引脚的电平跳转产生标准的 433MHz EV1527 载波信号。 通过控制发射引脚的电平跳转产生标准的 433MHz EV1527 载波信号。
* **绑定对码**:当用户触发对码绑定时,传入 `addr = bracelet_factory_id``data_code = 0x01`。 * **绑定对码**:当用户触发对码绑定时,传入 `addr = bracelet_factory_id``data_code = 0x01`。
* **主动 SOS 警报**:当触发主动 SOS 时,主状态机在 `STATE_SOS_EMITTED` 下定期以时间片的形式调用此函数,传入 `addr = bracelet_factory_id``data_code = 0x08`(即二进制 `1000`)。 * **主动 SOS 警报**:当触发主动 SOS 时,主状态机在 `STATE_SOS_EMITTED` 下定期以时间片的形式调用此函数,传入 `addr = bracelet_factory_id``data_code = 0x08`(即二进制 `1000`)。
<!-- Checked and verified with 7 sensor types and manual suffix selection changes -->

View File

@@ -45,3 +45,33 @@ u32 Get_Bracelet_Factory_ID(void) {
return uid; return uid;
} }
``` ```
### 2.4 传感器自定义名称拼接与写入 (Add_Sensor)
`Add_Sensor(u32 addr, u8 type, u8 suffix_idx)` 中,系统预设 7 类传感器名前缀:
```c
char *code sensor_prefixes[7] = {
"PORTE", "PIR", "FUMEE", "URGENCE", "GAZ", "INOND.", "VIBRA."
};
```
在写入时,手动拼接前缀和两位数字 `suffix_idx` 后缀:
```c
void Add_Sensor(u32 addr, u8 type, u8 suffix_idx) {
u8 slot = ...; // 检索空槽或匹配历史ID
char *prefix = sensor_prefixes[type];
u8 len = 0;
// 拷贝前缀
while (prefix[len] != '\0' && len < 11) {
sensor_list[slot].name_gbk[len] = prefix[len];
len++;
}
sensor_list[slot].name_gbk[len++] = ' ';
sensor_list[slot].name_gbk[len++] = '0' + (suffix_idx / 10);
sensor_list[slot].name_gbk[len++] = '0' + (suffix_idx % 10);
sensor_list[slot].name_gbk[len] = '\0';
// 其余变量赋值并保存数据库
// ...
Save_Database();
}
```

View File

@@ -8,10 +8,10 @@
| 串口发送字符 | 对应仿真的物理事件与说明 | 预期系统响应 | | 串口发送字符 | 对应仿真的物理事件与说明 | 预期系统响应 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| **`u` / `U`** | 仿真短按 / 长按 **侧边 ▲ 键** | 时钟微调 / 菜单滚动 | | **`u` / `U`** | 仿真短按 / 长按 **侧边 ▲ 键** | 时钟微调 / 菜单滚动 / **对码确认页:自增序号 (01->99)** |
| **`d` / `D`** | 仿真短按 / 长按 **侧边 ▼ 键** | 时钟微调 / 菜单滚动 / 长按取消报警 | | **`d` / `D`** | 仿真短按 / 长按 **侧边 ▼ 键** | 时钟微调 / 菜单滚动 / 长按取消报警 / **对码确认页:自减序号 (99->01)** |
| **`e` / `E`** | 仿真短按 / 长按 **侧边 ■ 确认键** | 选中并进入等待配对 / 短按取消报警 | | **`e` / `E`** | 仿真短按 / 长按 **侧边 ■ 确认键** | 选中并进入等待配对 / 短按取消报警 / **对码确认页:确认保存配置** |
| **`s` / `S`** | 仿真短按 / 长按 **上部 SOS 1 键** | 触发本地主动 SOS 警报 / 触发对码保存 | | **`s` / `S`** | 仿真短按 / 长按 **上部 SOS 1 键** | 触发本地主动 SOS 警报 / 触发对码保存 / **对码确认页:确认保存配置** |
| **`x` / `X`** | 仿真短按 / 长按 **上部 SOS 2 键** | 同上,验证双 SOS 键并联触发等效性 | | **`x` / `X`** | 仿真短按 / 长按 **上部 SOS 2 键** | 同上,验证双 SOS 键并联触发等效性 |
| **`c`** | 仿真同时长按 **▲ + ▼ 键 3 秒** | 系统直接进入配对模式P-00 | | **`c`** | 仿真同时长按 **▲ + ▼ 键 3 秒** | 系统直接进入配对模式P-00 |
| **`a`** | 仿真捕获到**已配对门磁**报警信号 | 系统跳转到门磁报警界面,亮红灯,振动 1 次 | | **`a`** | 仿真捕获到**已配对门磁**报警信号 | 系统跳转到门磁报警界面,亮红灯,振动 1 次 |
@@ -37,10 +37,10 @@
* **预期结果**:时钟、日期显示正常。在 **135 像素宽** 屏幕上,电量 `85%` 绘制在 `X=77, Y=24`,电池图标绘制在 `X=107, Y=27`,对齐美观且有 6 像素的安全间距。 * **预期结果**:时钟、日期显示正常。在 **135 像素宽** 屏幕上,电量 `85%` 绘制在 `X=77, Y=24`,电池图标绘制在 `X=107, Y=27`,对齐美观且有 6 像素的安全间距。
### 3.2 传感器对码与保存 ### 3.2 传感器对码与保存
* **测试方法**:同时长按 ▲+▼ 3秒进入配对用上下键选中 `DETEC. PIR`,按下侧边 **■ 确认键** 开启等待,随后物理触发 PIR 传感器,最后按下 **SOS 1**(或 **SOS 2**)确认保存。 * **测试方法**:同时长按 ▲+▼ 3秒进入配对用上下键选中 `DETEC. PIR`,按下侧边 **■ 确认键** 开启等待,随后物理触发 PIR 传感器。进入对码确认页后,按 **▲ 键** 将中间括号内数字调节至 `02`(即显示 `PIR [ 02 ]`,最后按下 **■ 确认键** (或 **SOS 1**)确认保存。
* **预期结果** * **预期结果**
1. 进入配对时LED 亮白色闪烁3Hz马达短振 1 次确认。 1. 进入配对时LED 亮白色闪烁3Hz马达短振 1 次确认。
2. 解码匹配成功后OLED 屏显示 `✓已保存`LED 绿色常亮 2 秒,马达强振 1 次400ms随后自动退回配对菜单。 2. 解码匹配成功后OLED 屏显示 `✓已保存` 以及 `PIR 02`LED 绿色常亮 2 秒,马达强振 1 次400ms随后自动退回配对菜单。
### 3.3 低功耗休眠与按键唤醒 ### 3.3 低功耗休眠与按键唤醒
* **测试方法**:在常态下静置手环 10 秒钟不作任何操作。 * **测试方法**:在常态下静置手环 10 秒钟不作任何操作。