diff --git a/Docs/10_requirements-overview/main.md b/Docs/10_requirements-overview/main.md index 2cb77ad..09998a0 100644 --- a/Docs/10_requirements-overview/main.md +++ b/Docs/10_requirements-overview/main.md @@ -3,7 +3,7 @@ ## 1. 项目整体框架与系统拓扑 本项目**仅包含手环端核心业务及驱动代码的实现**。 -* **被动接收**:手环作为随身告警终端,独立接收来自多类 **433MHz 传感器**的探测射频信号(本地安防联动系统)。 +* **被动接收**:手环作为随身告警终端,独立接收来自 **7类 433MHz 传感器**的探测射频信号(本地安防联动系统)。 * **主动发射**:手环在本地触发 SOS 求救时,必须向外主动发射 **433MHz SOS 呼救射频信号**,使周边的 IPC 摄像头接收并联动。 * 周围的其他组件(如 IPC 摄像头和手机 APP)不在本项目编码范围内,仅作外部仿真与对接边界。 diff --git a/Docs/20_requirements-detail/main.md b/Docs/20_requirements-detail/main.md index 08a98cc..a9818d9 100644 --- a/Docs/20_requirements-detail/main.md +++ b/Docs/20_requirements-detail/main.md @@ -8,39 +8,42 @@ | 按键类别 | 按键动作 | 常态 (时钟待机) | 对码配对模式 | 警报触发状态 | | :--- | :--- | :--- | :--- | :--- | -| **侧边按键** | **▲ 上移键** | 短按:时间微调 | 菜单向上滚动 | 无动作 | -| **侧边按键** | **▼ 下移键** | 短按:时间微调 | 菜单向下滚动 | 长按 2 秒:解除当前告警并退回时钟 | +| **侧边按键** | **▲ 上移键** | 短按:时间微调 | 菜单向上滚动 / **确认对码时自增序号 (01->99)** | 无动作 | +| **侧边按键** | **▼ 下移键** | 短按:时间微调 | 菜单向下滚动 / **确认对码时自减序号 (99->01)** | 长按 2 秒:解除当前告警并退回时钟 | | **侧边按键** | **▲ + ▼ (同时长按3秒)** | **进入对码配对模式** | 无动作 | 无动作 | -| **侧边按键** | **■ 确认键 (CONFIRM)** | 无动作 | **选中并进入该类型等待配对** | 短按:解除当前告警并退回时钟 | -| **上部按键** | **SOS1 / SOS2 (短按)** | **触发本地主动 SOS 呼救 + 循环发射 433MHz 呼救包** | **确认保存当前已捕获的配对** | 短按:解除告警并退回时钟 | +| **侧边按键** | **■ 确认键 (CONFIRM)** | 无动作 | 菜单确认 / **对码确认页:确认保存配置** | 短按:解除当前告警并退回时钟 | +| **上部按键** | **SOS1 / SOS2 (短按)** | **触发本地主动 SOS 呼救 + 循环发射 433MHz 呼救包** | **对码确认页:确认保存配置** | 短按:解除告警并退回时钟 | | **上部按键** | **SOS1 / SOS2 (长按5秒)** | **触发 IPC 绑定对码广播** | 无动作 | 长按:解除告警并退回时钟 | > [!NOTE] > 1. **双 SOS 按键冗余**:上部的两个 SOS 键在电路与软件上完全等价。按下其中任意一个按键,均会触发相同的 SOS 信号采集与求救动作。 > 2. **警报快速解除**:在手环发出主动 SOS 呼救或响应被动防区报警时,按下“确认键”或任意一个“SOS 键”(或者长按“▼键”2秒)均会立刻切断声光电反馈,安全重置至时钟待机状态。 +> 3. **确认页序号手动修改**:当捕获到匹配的射频信号进入对码确认页时,界面将显示当前选定的前缀和初始序号。用户可以使用 ▲ 键增加序号,使用 ▼ 键减少序号(范围 `01` 到 `99`,达到边界自动截断),选中后按下“确认键”或任意“SOS 键”进行保存。 ## 2. 传感器对码与报警映射矩阵 -手环接收到 433MHz 传感器射频数据后,通过匹配预设数据码(高 4 位为类型)和地址码,根据下表驱动多色 LED、马达振动波形并更新 OLED 显示。 +手环接收到 433MHz 传感器射频数据后,通过匹配预设数据码(高 4 位为类型)和地址码,根据下表驱动多色 LED、马达振动波形并更新 OLED 显示。本系统支持 7 种不同的外部传感器类型,并预留了出厂预设的固定名称前缀。 -| 传感器类型 | 数据码标识 | LED 颜色 | OLED 默认名称 (法语) | 马达振动波形 (周期 5 秒) | -| :--- | :--- | :--- | :--- | :--- | -| **🚪 门磁/窗磁** | `0x01` (A) | ● 红色 | `PORTE ENTREE` | 1 次短振 300ms | -| **👤 PIR 人体红外** | `0x02` (B) | ● 橙色 | `SALON PIR` | 2 次 short 300ms (间隔 200ms) | -| **🔥 烟雾传感器** | `0x03` (C) | ● 绿色 | `CUISINE FUMEE` | 3 次短振 200ms (间隔 150ms) | -| **💨 气体泄漏** | `0x05` (E) | ● 紫色 | `CUISINE GAZ` | 4 次短振 200ms (间隔 100ms) | -| **💧 水浸传感器** | `0x06` (F) | ● 黄色 | `SDB EAU` | 2 次长振 600ms (间隔 300ms) | -| **🚨 本地主动 SOS** | 手环触发 | ● 红色闪烁 | `SOS EMITTED` | 持续长振 (振 1000ms, 停 200ms) | +| 传感器类型 | 数据码标识 | 预设名前缀 | LED 颜色 | 默认防区类型 | 马达振动波形 (周期 5 秒) | +| :--- | :--- | :--- | :--- | :--- | :--- | +| **🚪 门磁/窗磁** | `0x01` | `PORTE` | ● 红色 | ZONE 1 (普通) | 1 次短振 300ms | +| **👤 PIR 人体红外** | `0x02` | `PIR` | ● 橙色 | ZONE 1 (普通) | 2 次短振 300ms (间隔 200ms) | +| **🔥 烟雾传感器** | `0x03` | `FUMEE` | ● 绿色 | ZONE 0 (24h) | 3 次短振 200ms (间隔 150ms) | +| **🆘 紧急按钮** | `0x04` | `URGENCE` | ● 蓝色 | ZONE 0 (24h) | 1 次长振 800ms | +| **💨 气体泄漏** | `0x05` | `GAZ` | ● 紫色 | ZONE 0 (24h) | 4 次短振 200ms (间隔 100ms) | +| **💧 水浸传感器** | `0x06` | `INOND.` | ● 黄色 | ZONE 0 (24h) | 2 次长振 600ms (间隔 300ms) | +| **📳 振动传感器** | `0x07` | `VIBRA.` | ● 青色 | ZONE 1 (普通) | 连续3次 150ms (间隔 100ms) | +| **🚨 本地主动 SOS** | 手环触发 | `SOS` | ● 红色闪烁 | 独立运行 | 持续长振 (振 1000ms, 停 200ms) | > [!IMPORTANT] > **手环主动发射 SOS 射频数据格式**: > 当触发“本地主动 SOS”时,手环通过内置发射芯片以 **2 秒** 为周期循环发射 EV1527 协议数据: > * **源地址**:手环的 **20位出厂固定唯一 ID (Factory ID)**。 > * **数据码**:固定为 **`0x08`** (即 `1000`)。 -> * **目的**:使 IPC 摄像头能接收解码,将其与配对列表中该手环的 Factory ID 匹对,从而识别求救来源。 +> * **目的**:使 IPC 摄像头能接收解码,将其与配对列表中该手环 of Factory ID 匹对,从而识别求救来源。 > [!IMPORTANT] -> **屏蔽 SOS 被动报警**:为避免两个手环互发 SOS 相互触发造成死循环报警,手环**必须强行过滤**并排除对外界发射的 SOS 求救广播(数据码为 `0x04` 或特定紧急按钮码)的被动接收。 +> **屏蔽 SOS 被动报警**:为避免两个手环互发 SOS 相互触发造成死循环报警,手环**必须强行过滤**并排除对外界发射的 SOS 求救广播(数据码为 `0x08`,或其它手环发射源)的被动接收。 ## 3. ZONE 防区划分 diff --git a/Docs/30_architecture/main.md b/Docs/30_architecture/main.md index dbddae4..ac94fb9 100644 --- a/Docs/30_architecture/main.md +++ b/Docs/30_architecture/main.md @@ -49,6 +49,17 @@ bit is_sos_pressed = (KEY_SOS1 == 0) || (KEY_SOS2 == 0); 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) @@ -65,8 +76,8 @@ stateDiagram-v2 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 : 短按 SOS 保存 - STATE_PAIR_CONFIRM --> STATE_PAIR_FAIL : 超时/按▼取消 + 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秒后自动返回 @@ -85,10 +96,11 @@ stateDiagram-v2 * **存储结构**:`Sensor_Slot` 结构体: ```c typedef struct { - u32 addr; // 24位射频硬件地址 (EV1527) - u8 type; // 传感器类型 (0: 门磁, 1: 红外, 2: 烟感, 3: 燃气, 4: 水浸) + u8 is_used; // 登记标志(0x01表示有效,其它代表空闲) + u8 addr[3]; // 24位射频物理地址 (EV1527) + u8 type; // 传感器类型 (0:门磁, 1:红外, 2:烟感, 3:紧急, 4:气体, 5:水浸, 6:振动) u8 zone; // 防区类别 (0: 永久防区, 1: 普通可撤防区) - char name[16]; // 自定义法语防区名称 + char name_gbk[16]; // 法语自定义防区名称 (以 [前缀] [序号] 自动格式化写入) } Sensor_Slot; ``` * 一共支持 **16** 个传感器槽位,通过 `Load_Database()` 和 `Save_Database()` 进行统一序列化读写。 diff --git a/Docs/40_ui-design/main.md b/Docs/40_ui-design/main.md index 33f05e7..95a81ae 100644 --- a/Docs/40_ui-design/main.md +++ b/Docs/40_ui-design/main.md @@ -39,7 +39,7 @@ ### 2.2 传感器配对选择菜单 (STATE_PAIR_MENU) * **顶部标题**:显示 `MODE PAIR P-XX`(其中 XX 为当前已配对的传感器数量)。 -* **列表滚动框**:采用 3 行滚动列表,当前行高亮并显示粗体外框,字号放大(如 `DETEC. PORTE`),非当前行暗淡显示。 +* **列表滚动框**:采用 3 行滚动列表,可在 **7 种传感器类型**(门磁、红外、烟感、紧急、气体、水浸、振动)中上下循环滚动选中。当前行高亮并显示粗体外框,字号放大(如 `DETEC. PORTE`),非当前行暗淡显示。 * **按键确认行为**:在配对菜单页面,短按侧边 **■ 确认键** 进入所选防区类型的对码等待状态。 ### 2.3 报警触发与本地 SOS 界面 (STATE_ALARMING / STATE_SOS_EMITTED) @@ -49,14 +49,37 @@ * 门磁:`🚪` 开门图标。 * 红外:`👤` 人体辐射波纹图标。 * 烟感:`🔥` 火苗图标。 + * 紧急按钮:`🆘` 求救图标。 * 燃气:`💨` 毒气云雾图标。 * 水浸:`💧` 滴水波纹图标。 + * 振动:`📳` 震动线框图标。 * **主动 SOS 界面**:大字显示 `SOS EMIS`,居中显示 `🚨` 旋转警灯图标。 * **绑定 IPC 界面 (STATE_BINDING)**: * 顶部标题:`LIAISON IPC` (法语:与 IPC 绑定)。 * 中央:正在发送提示,显示 `ENVOI EN COURS`,配对确认锁图标。 * **手环 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. 文字居中对齐与字模基线规范 diff --git a/Docs/50_module-breakdown/mod-key.md b/Docs/50_module-breakdown/mod-key.md index 09d4404..e74dcb3 100644 --- a/Docs/50_module-breakdown/mod-key.md +++ b/Docs/50_module-breakdown/mod-key.md @@ -44,4 +44,4 @@ typedef enum { * 检测到确认键释放,注入 `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 1a49b9a..3c48a6e 100644 --- a/Docs/50_module-breakdown/mod-lcd.md +++ b/Docs/50_module-breakdown/mod-lcd.md @@ -29,5 +29,6 @@ * `void UI_ShowClockPage(SystemState state, u8 hour, u8 min)`:渲染时钟待机页面(135 宽布局),并根据布撤防状态在状态栏绘制相应锁状态图标。 * `void UI_ShowAlarmPage(char *sensor_name, u8 zone)`:渲染防区告警页面,显示对应的传感器位图和法语名称。 * `void UI_ShowPairMenuPage(u8 selected_index)`:渲染对码选择菜单。 +* `void UI_ShowPairConfirmPage(u8 type, u8 selected_suffix)`:渲染对码确认页,显示捕获的类型图标、名字前缀及带选框的 `[ selected_suffix ]` 数字序号(支持按键调整)。 * `void UI_ShowBindingPage(void)`:渲染与 IPC 绑定对码界面,并在屏幕底部居中显示手环自身的唯一 `Factory ID`。 diff --git a/Docs/50_module-breakdown/mod-power.md b/Docs/50_module-breakdown/mod-power.md index 268bacb..f53997d 100644 --- a/Docs/50_module-breakdown/mod-power.md +++ b/Docs/50_module-breakdown/mod-power.md @@ -22,4 +22,4 @@ * `void Key_Wakeup_Isr(void)`: 按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕与背光供电,并发送 Wake Up 指令重建屏幕显示。 - + diff --git a/Docs/50_module-breakdown/mod-rf.md b/Docs/50_module-breakdown/mod-rf.md index 0ceacb9..2d5fbbe 100644 --- a/Docs/50_module-breakdown/mod-rf.md +++ b/Docs/50_module-breakdown/mod-rf.md @@ -26,3 +26,5 @@ 主动发射一帧数据。生成同步头,并按 `1` 码(高电平 3T, 低电平 1T)或 `0` 码(高电平 1T, 低电平 3T)依次驱动发射引脚电平,持续多帧以确保接收方捕获。 * 该函数被手环用作向 IPC 摄像头主动对码绑定(`data_code = 0x01`)。 * 该函数也用于手环主动发射 SOS 紧急呼救包(`data_code = 0x08`),此时传入手环自身的出厂固定 ID `bracelet_factory_id`。 + + diff --git a/Docs/50_module-breakdown/mod-sys.md b/Docs/50_module-breakdown/mod-sys.md index 5069614..25ed6f0 100644 --- a/Docs/50_module-breakdown/mod-sys.md +++ b/Docs/50_module-breakdown/mod-sys.md @@ -16,10 +16,11 @@ ### 2.1 传感器插槽结构体 (Sensor_Slot) ```c typedef struct { - u32 addr; // 24位 EV1527 地址 - u8 type; // 传感器类型 - u8 zone; // 防区类别 (0: 永久防区, 1: 可撤布防区) - char name[16]; // 法语自定义名称 + u8 is_used; // 0x01:已使用,其它:空闲 + u8 addr[3]; // 24位 EV1527 对码物理地址 + u8 type; // 传感器类型 (0~6) + u8 zone; // 防区类别 (0: 永久防区, 1: 可撤布防区) + char name_gbk[16]; // 法语自定义名字(前缀+两位数序号,如 PORTE 02) } Sensor_Slot; ``` @@ -34,7 +35,7 @@ typedef enum { STATE_PAIR_CONFIRM, STATE_PAIR_SUCCESS, STATE_PAIR_FAIL, - STATE_ALARMING, + STATE_ALARM, STATE_SOS_EMITTED } SystemState; ``` @@ -48,7 +49,7 @@ typedef enum { ### 3.2 IAP 数据库存储接口 * `void Load_Database(void)`:从 Flash 扇区 `0xFE0000` 读取 16 组传感器配置载入内存的 `sensor_list`。 * `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)`:在数据库中检索该地址码,若存在则返回它的槽位索引。 ### 3.3 系统初始化与全局 ID 获取 diff --git a/Docs/60_coding/mod-key.md b/Docs/60_coding/mod-key.md index cd7ee49..4b5cf87 100644 --- a/Docs/60_coding/mod-key.md +++ b/Docs/60_coding/mod-key.md @@ -76,7 +76,7 @@ void Key_Scan_Process(void) { } ``` - + ### 2.2 事件异步读取与清除 主循环在其周期内轮询 `key_event_buf`。一旦发现其非 `KEY_EVENT_NONE`,拷贝并立即重置该缓冲区为 `KEY_EVENT_NONE` 以防止重复触发: diff --git a/Docs/60_coding/mod-lcd.md b/Docs/60_coding/mod-lcd.md index cd0c60f..1d5e219 100644 --- a/Docs/60_coding/mod-lcd.md +++ b/Docs/60_coding/mod-lcd.md @@ -68,4 +68,33 @@ void UI_ShowBindingPage(void) { FormatHex(bracelet_factory_id, id_str); 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); +} +``` ``` diff --git a/Docs/60_coding/mod-power.md b/Docs/60_coding/mod-power.md index 3f05645..e88c44e 100644 --- a/Docs/60_coding/mod-power.md +++ b/Docs/60_coding/mod-power.md @@ -54,5 +54,5 @@ void Port0_Isr(void) interrupt 37 { } ``` - + 通过中断直接退出 `PD` 模式,恢复手环的常规时钟显示。 diff --git a/Docs/60_coding/mod-rf.md b/Docs/60_coding/mod-rf.md index 214d3d1..28bf926 100644 --- a/Docs/60_coding/mod-rf.md +++ b/Docs/60_coding/mod-rf.md @@ -36,3 +36,5 @@ void EV1527_Transmit(u32 addr, u8 data_code) { 通过控制发射引脚的电平跳转产生标准的 433MHz EV1527 载波信号。 * **绑定对码**:当用户触发对码绑定时,传入 `addr = bracelet_factory_id`,`data_code = 0x01`。 * **主动 SOS 警报**:当触发主动 SOS 时,主状态机在 `STATE_SOS_EMITTED` 下定期以时间片的形式调用此函数,传入 `addr = bracelet_factory_id`,`data_code = 0x08`(即二进制 `1000`)。 + + diff --git a/Docs/60_coding/mod-sys.md b/Docs/60_coding/mod-sys.md index 0a22200..310bb56 100644 --- a/Docs/60_coding/mod-sys.md +++ b/Docs/60_coding/mod-sys.md @@ -45,3 +45,33 @@ u32 Get_Bracelet_Factory_ID(void) { 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(); +} +``` diff --git a/Docs/70_testing/main.md b/Docs/70_testing/main.md index 86bef6a..ea3c3b4 100644 --- a/Docs/70_testing/main.md +++ b/Docs/70_testing/main.md @@ -8,10 +8,10 @@ | 串口发送字符 | 对应仿真的物理事件与说明 | 预期系统响应 | | :--- | :--- | :--- | -| **`u` / `U`** | 仿真短按 / 长按 **侧边 ▲ 键** | 时钟微调 / 菜单滚动 | -| **`d` / `D`** | 仿真短按 / 长按 **侧边 ▼ 键** | 时钟微调 / 菜单滚动 / 长按取消报警 | -| **`e` / `E`** | 仿真短按 / 长按 **侧边 ■ 确认键** | 选中并进入等待配对 / 短按取消报警 | -| **`s` / `S`** | 仿真短按 / 长按 **上部 SOS 1 键** | 触发本地主动 SOS 警报 / 触发对码保存 | +| **`u` / `U`** | 仿真短按 / 长按 **侧边 ▲ 键** | 时钟微调 / 菜单滚动 / **对码确认页:自增序号 (01->99)** | +| **`d` / `D`** | 仿真短按 / 长按 **侧边 ▼ 键** | 时钟微调 / 菜单滚动 / 长按取消报警 / **对码确认页:自减序号 (99->01)** | +| **`e` / `E`** | 仿真短按 / 长按 **侧边 ■ 确认键** | 选中并进入等待配对 / 短按取消报警 / **对码确认页:确认保存配置** | +| **`s` / `S`** | 仿真短按 / 长按 **上部 SOS 1 键** | 触发本地主动 SOS 警报 / 触发对码保存 / **对码确认页:确认保存配置** | | **`x` / `X`** | 仿真短按 / 长按 **上部 SOS 2 键** | 同上,验证双 SOS 键并联触发等效性 | | **`c`** | 仿真同时长按 **▲ + ▼ 键 3 秒** | 系统直接进入配对模式(P-00) | | **`a`** | 仿真捕获到**已配对门磁**报警信号 | 系统跳转到门磁报警界面,亮红灯,振动 1 次 | @@ -24,7 +24,7 @@ ## 2. LED 与马达 IO 跳变日志 -主循环对外设引脚的电平状态进行了跟踪,当引脚电平发生变化时,自动通过串口向外部终端打印输出日志。这可以在没有焊接实体马达或 LED 灯的情况下验证控制逻辑是否正确: +主循环对外设引脚的电平状态进行了跟踪,当引脚电平发生变化时,自动通过串口向外部终端打印输出日志。这可以在没有焊接实体马达或 LED灯的情况下验证控制逻辑是否正确: * **LED 状态日志格式**:`[STATE] LED status -> R:1 G:0 B:0` (0表示亮,1表示灭,WS2812B 幻彩 LED 控制状态) * **马达状态日志格式**:`[STATE] MOTOR -> 1` (1表示开启振动,0表示关闭振动) @@ -37,10 +37,10 @@ * **预期结果**:时钟、日期显示正常。在 **135 像素宽** 屏幕上,电量 `85%` 绘制在 `X=77, Y=24`,电池图标绘制在 `X=107, Y=27`,对齐美观且有 6 像素的安全间距。 ### 3.2 传感器对码与保存 -* **测试方法**:同时长按 ▲+▼ 3秒进入配对,用上下键选中 `DETEC. PIR`,按下侧边 **■ 确认键** 开启等待,随后物理触发 PIR 传感器,最后按下 **SOS 1**(或 **SOS 2**)确认保存。 +* **测试方法**:同时长按 ▲+▼ 3秒进入配对,用上下键选中 `DETEC. PIR`,按下侧边 **■ 确认键** 开启等待,随后物理触发 PIR 传感器。进入对码确认页后,按 **▲ 键** 将中间括号内数字调节至 `02`(即显示 `PIR [ 02 ]`),最后按下 **■ 确认键** (或 **SOS 1**)确认保存。 * **预期结果**: 1. 进入配对时,LED 亮白色闪烁(3Hz),马达短振 1 次确认。 - 2. 解码匹配成功后,OLED 屏显示 `✓已保存`,LED 绿色常亮 2 秒,马达强振 1 次(400ms),随后自动退回配对菜单。 + 2. 解码匹配成功后,OLED 屏显示 `✓已保存` 以及 `PIR 02`,LED 绿色常亮 2 秒,马达强振 1 次(400ms),随后自动退回配对菜单。 ### 3.3 低功耗休眠与按键唤醒 * **测试方法**:在常态下静置手环 10 秒钟不作任何操作。