Files
stc32g128k/Docs/walkthrough.md

81 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# STC32G 手环项目工程与功能实现 Walkthrough
本项目完成了手环核心交互逻辑与状态机的全部实现。所有代码已完全用中文进行行级注释,且在 Keil C251 下编译成功0 Errors
## 实现功能摘要
### 1. 法语 UI 语言包支持 (French-Only UI)
* **全界面翻译**:手环所有的 UI 屏幕显示内容均已替换为法语。
* **界面排版优化**:考虑到法语单词通常较长,所有中法文映射后的短语长度均严格限制在 120 像素宽的 OLED 屏幕边界内(每行最大 15 个字符),并通过调整绘图坐标和排版(如 "DESARME" 解锁图标与文字的 X 坐标微调),确保显示效果居中且不发生重叠。
* `WATCH``MONTRE`
* `ARMED``ARME`
* `DISARM``DESARME`
* `PAIR MENU``MENU APPAI.`
* `DOOR SENSOR``DETEC. PORTE`
* `PIR MOTION``DETEC. PIR`
* `SMOKE DETECT``DETEC. FUMEE`
* `GAS LEAK``DETEC. GAZ`
* `WATER FLOOD``DETEC. EAU`
* `SEARCHING...``RECHERCHE...`
* `TRIGGER SENSOR``DECLENCH. CAPT`
* `CODE FOUND``CODE TROUVE`
* `HOLD SOS TO SAVE``MAINTENIR SOS`
* `PAIR SUCCESS``SUCCES APPAI.`
* `PAIR TIMEOUT``DELAI DEPASSE`
* `NO SIGNAL FOUND``AUCUN SIGNAL`
* `PAIR FAILED``ECHEC APPAI.`
* `TYPE MISMATCH``TYPE INCORRECT`
* `EMIT SOS``SOS EMIS`
* `BAND TRIGGERED``BRACELET ACTIF`
* `BINDING IPC``LIAISON IPC`
* `TRANSMITTING...``ENVOI EN COURS`
### 2. 单线制幻彩 RGB LED (XL-2020RGBC-2812B) 驱动集成
* **物理层引脚映射**:使用原 `LED_R` 所属引脚 `P0.0` 作为单线数据输入DIN引脚将其配置为高速推挽输出。在系统初始化时主动输出熄灭状态防止上电乱闪。
* **精准 Bit-bang 驱动**:根据 `XL-2020` 的 800Kbps 时序规范1T cycle ≈ 41.67ns @ 24MHz实现了毫微秒级别的 `WS2812_Write24Bit(u8 g, u8 r, u8 b)``WS2812_Reset()` 软件驱动。在发送数据流时,关闭总中断 `EA = 0`,确保脉冲宽度不被中断打断。
* **软件级虚拟 LED 兼容层**:将原有的 `LED_R`, `LED_G`, `LED_B` 重定义为全局 `bit` 软件变量。在 1ms `Timer1_Isr` 结尾捕获到虚拟 LED 的状态改变时,再自动调用 `WS2812` 驱动输出对应的 GRB 24 位电平。这使得应用层所有的 LED 闪烁及颜色逻辑无需任何改动,保证了系统的高稳定性与高扩展性。
### 3. 自适应射频解码兼容性
* 重构为**基于电平比例的自适应解码算法**。放宽绝对微秒窗口限制,通过低/高电平比例15~48倍基准为31倍自动识别 EV1527 帧并解析数据。
* 优化串口调试输出,避免大量多行打印造成的 CPU 阻塞。
### 4. 严格匹配要求的按键与事件交互逻辑
* **进入配对菜单**:在待机模式下,同时长按 `▲` + `▼` 3秒进入传感器类型选择菜单。
* **进入对码搜索 (Pair Wait)**:在菜单中选择好类型后,短按 `SOS` 确认,此时触发 1 次 100ms 短振确认,且 LED 开启白色快闪3Hz进入雷达扫描信号接收。
* **主动呼救 (Emit SOS)**:在待机模式下,短按 `SOS` 键,立刻切入求救模式并开始向外循环发射 433MHz 警报信号。
* **IPC 对码绑定**:在待机模式下,长按 `SOS` 键 5秒显示 BINDING IPC 页面,向外发射 1 次 433MHz 绑定信号(数据码为 0x01维持 2 秒后自动返回待机。
* **解除求救模式**在求救模式下长按任意一个按键UP、DOWN 或 SOS即可主动解除警报退回时钟待机。
### 5. 不接收/解析他人 SOS 广播
* 手环只对已经配对存储在内部数据库门磁、PIR、烟感、燃气、水浸的传感器 ID 触发报警。
* 防区轮询解码时客观过滤并排除 SOS 信号的被动接收。
### 6. 电池百分号显示修复与坐标复原
* **字模基线对齐**:将 `%` 字符0x25的字模数据在 8x16 矩阵中向上平移 2 像素,使其与前面的数字处于同一水平基准线。
* **坐标优化防重合**:将电池图标右移至 `X=92, Y=27`,电量百分比置于 `X=62, Y=24`。二者之间保留 6 像素间距,既美观又完美杜绝了贴合与重叠问题。
### 7. 对码捕获卡顿 Bug 修复
* 修复了 `while(1)` 循环开头无条件执行 `state_changed = 0` 导致在 Section 4 异步检测到射频匹配信号跳入 `STATE_PAIR_CONFIRM` 后重绘标记被强行抹除、屏幕始终卡死在搜索雷达页面的 Bug。现在已改在重绘判定内部重置检测到对码信号即可瞬间跳转至“捕获成功”确认页。
## 仿真模式扩展说明
为了支持无物理元件调试,串口输入指令集已同步扩展:
* **模拟组合按键**:串口发送 **`c`** 字符,模拟同时长按 `▲` + `▼` 按键 3 秒进入配对菜单。
* **模拟确认搜索**:在菜单页下发送 **`s`**,模拟按下 SOS 键,触发 100ms 短振与白灯快闪,进入对码搜索(雷达显示)。
* **模拟按键解除**:在求救模式下,发送 **`U`**、**`D`** 或 **`S`**(代表长按按键),即可解除 SOS 并退回时钟。
* **模拟切换系统布防状态**(用于测试普通防区的触发):
* 发送 **`1`**:强制系统进入 **NORMAL** 撤防/常态模式(门磁/PIR 触发时会被忽略,烟感/水浸/燃气仍可触发)。
* 发送 **`2`**:强制系统进入 **ARMED** 布防模式(门磁/PIR 此时被触发会立刻报警)。
* 发送 **`3`**:强制系统进入 **DISARMED** 撤防模式。
## 编译与 Git 仓库同步信息
* **编译器**Keil C251 V5.60.0.0
* **编译输出目标**`Build\wristband.hex`
* **编译状态**0 Errors, 2 Warnings (均属于未调用辅助函数的警告,无任何影响)
* **Program Size**data=104.7, edata+hdata=351, xdata=352, const=1390, code=13855
* **Git 仓库地址**`https://dev.xtell.cn/zouhaitao/stc32g128k.git`
* **Git 提交记录**
* `feat: initial commit for stc32g12k128 wristband firmware` (含完整 `.gitignore` 规则,已成功忽略全部编译器生成的 `.obj` / `.lst` / `.hex` 等中间临时文件)。
* `feat: translate UI to French and implement XL-2020RGBC-2812B addressable RGB LED driver` (添加了法语界面翻译与 WS2812B 精准时序单线驱动,并成功推送至远程 `master` 分支)。