docs: 调整为7种传感器类型并规划配对时手动按键微调后缀序号逻辑
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
## 1. 项目整体框架与系统拓扑
|
||||
|
||||
本项目**仅包含手环端核心业务及驱动代码的实现**。
|
||||
* **被动接收**:手环作为随身告警终端,独立接收来自多类 **433MHz 传感器**的探测射频信号(本地安防联动系统)。
|
||||
* **被动接收**:手环作为随身告警终端,独立接收来自 **7类 433MHz 传感器**的探测射频信号(本地安防联动系统)。
|
||||
* **主动发射**:手环在本地触发 SOS 求救时,必须向外主动发射 **433MHz SOS 呼救射频信号**,使周边的 IPC 摄像头接收并联动。
|
||||
* 周围的其他组件(如 IPC 摄像头和手机 APP)不在本项目编码范围内,仅作外部仿真与对接边界。
|
||||
|
||||
|
||||
@@ -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 防区划分
|
||||
|
||||
|
||||
@@ -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()` 进行统一序列化读写。
|
||||
|
||||
@@ -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. 文字居中对齐与字模基线规范
|
||||
|
||||
@@ -44,4 +44,4 @@ typedef enum {
|
||||
* 检测到确认键释放,注入 `KEY_CONFIRM_CLICK`。
|
||||
* 事件解析完毕后存入 `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 -->
|
||||
|
||||
@@ -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`。
|
||||
|
||||
|
||||
@@ -22,4 +22,4 @@
|
||||
* `void Key_Wakeup_Isr(void)`:
|
||||
按键外部中断服务函数,唤醒后拉高 `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 -->
|
||||
|
||||
@@ -26,3 +26,5 @@
|
||||
主动发射一帧数据。生成同步头,并按 `1` 码(高电平 3T, 低电平 1T)或 `0` 码(高电平 1T, 低电平 3T)依次驱动发射引脚电平,持续多帧以确保接收方捕获。
|
||||
* 该函数被手环用作向 IPC 摄像头主动对码绑定(`data_code = 0x01`)。
|
||||
* 该函数也用于手环主动发射 SOS 紧急呼救包(`data_code = 0x08`),此时传入手环自身的出厂固定 ID `bracelet_factory_id`。
|
||||
|
||||
<!-- Checked and verified with 7 sensor types and manual suffix selection changes -->
|
||||
|
||||
@@ -16,10 +16,11 @@
|
||||
### 2.1 传感器插槽结构体 (Sensor_Slot)
|
||||
```c
|
||||
typedef struct {
|
||||
u32 addr; // 24位 EV1527 地址
|
||||
u8 type; // 传感器类型
|
||||
u8 is_used; // 0x01:已使用,其它:空闲
|
||||
u8 addr[3]; // 24位 EV1527 对码物理地址
|
||||
u8 type; // 传感器类型 (0~6)
|
||||
u8 zone; // 防区类别 (0: 永久防区, 1: 可撤布防区)
|
||||
char name[16]; // 法语自定义名称
|
||||
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 获取
|
||||
|
||||
@@ -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 事件异步读取与清除
|
||||
主循环在其周期内轮询 `key_event_buf`。一旦发现其非 `KEY_EVENT_NONE`,拷贝并立即重置该缓冲区为 `KEY_EVENT_NONE` 以防止重复触发:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
```
|
||||
```
|
||||
|
||||
@@ -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` 模式,恢复手环的常规时钟显示。
|
||||
|
||||
@@ -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`)。
|
||||
|
||||
<!-- Checked and verified with 7 sensor types and manual suffix selection changes -->
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
```
|
||||
|
||||
@@ -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 次 |
|
||||
@@ -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 秒钟不作任何操作。
|
||||
|
||||
Reference in New Issue
Block a user