docs(lcd): add Chinese GFX development guide and agent rules

This commit is contained in:
chenjintao
2026-10-09 17:03:10 +08:00
parent 89e8e3abc2
commit c0770ac459
3 changed files with 407 additions and 15 deletions
+76 -1
View File
@@ -67,7 +67,7 @@ Additional enforcement rules:
## LCD Expression Management
- Use `docs/lcd-expressions.md` as the operational guide for managing, requesting, and adding LCD expressions.
- LCD/GFX 开发先阅读 `docs/GFX表情显示应用与开发指南.md`。旧 `docs/lcd-expressions.md` 的测试图案和优先级仲裁描述不能作为当前实现事实;以现行源码和新指南为准。
- New expression semantics must be declared as `domain_expression_*` contracts in `components/domain/include/domain.h` and mapped in the domain runtime adapter catalog.
- Upper layers must request expressions through `domain_runtime_request_expression()`; they must not call `platform_lcd_*` playback APIs directly.
- Platform LCD code must expose playback primitives only and must not reference `DOMAIN_EXPRESSION_*` semantic IDs.
@@ -219,3 +219,78 @@ Use a clear conventional format:
- Never hardcode credentials or API keys in source files; configure through `menuconfig`.
- Do not commit local `sdkconfig` variants, serial-port-specific commands, or generated `build/` artifacts.
## GFX 表情开发约束(给 AI 与开发者)
本节是在原有架构规则上的补充,不替代前文。处理显示、资产、表情、缓存、
刷新或帧率任务时,必须先完整阅读 `docs/GFX表情显示应用与开发指南.md`,
再按任务核对当前源码和配置;不得把历史日志的资源开销或 FPS 当成当前事实。
### 开始工作前
1. 确认仓库为 lucky-cat,检查分支、状态及已有差异。保留未提交代码、素材
和预览,不把 tq-cat 的实现或其他目录里的旧文件当成当前工程。
2. 优先查看 `lcd_direct.c`、领域表情目录、平台公共接口、构建列表和 Kconfig。
图层制作还需阅读 `split_idle_expression.py`、`compress_idle_expression.py`。
3. 当前是待机 GFX 与其他 PNG 混合后端;未接入 esp_emote_expression 状态机,
也未整体迁移到 LVGL。不要凭依赖存在或请求优先级字段推断功能已经实现。
### 必须保持的正确性
4. 保持控制层→领域层→平台层依赖方向。业务通过领域语义请求表情,GFX 类型
与资产实现留在平台私有代码,不增加跨层直接写 LCD 的入口。
5. GFX 锁必须由同一个任务获取和释放。批量对象修改、缓存捕获、性能计数
快照在渲染锁内完成;不能在初始化任务加锁、到渲染任务解锁。
6. 不在中断/定时器回调中生成纹理、解码、绘制、等待传输或打印性能日志。
保持 SPI 完成中断轻量,渲染任务和 GFX 刷新之间避免并行写屏。
7. DMA 暂存区必须等传输完成后才复用;整区域发送完成才通知 GFX。
超时后的在途缓冲不可立即覆盖或释放,不能绕过现有故障保护。
8. 自动返回待机只在没有新 pending 且没有停止请求时入队;不得覆盖刚来的
表情。取消与成功完成必须区分,修改完成事件前检查所有等待者。
9. 保留固定时间轴。每轮目标基于共同起点,不回退到画完再固定等 34ms,
不忙等、不自动跳过眼型,不未经验证修改全局 tick、SPI 时钟或任务优先级。
### 资源与缓存
10. 生成后的 C 数组不要手改。PNG 是可编辑输入,压缩脚本生成实际编译资产;
拆分脚本会覆盖图层,运行前检查美术是否有手工修改。
11. 当前九个缓存是带局部静态背景的不透明 RGB565 结果,不是纯透明眼睛。
换背景、鼻子、胡须、配色、眼睛位置或尺寸时,必须重建缓存并核对窗口。
12. 改时间线必须同步缓存表和回归测试;保持阶段不能产生多余刷新。
不支持的 closure 不得静默映射成别的眼型。
13. 网格锚点、最小边界位置补偿、闭眼弧线与眼睛中心属于耦合几何参数。
不得只替换资产就声称已适配;改尺寸需同时检查资源脚本的尺寸断言。
14. 原图为 RGB565 加独立 A8 平面,缓存为已经合成的 RGB565。验证颜色字节序、
透明层及交换配置,避免重复交换。新增区域裁剪必须恢复旧、新区域并集背景。
15. 新增表情先定义静态/动态层、缓存预算和结束行为,不批量无上限预热所有
表情。不得无授权删除未迁移 PNG、历史图层或未跟踪文件。
16. 缓存失败要释放部分成果并维持安全后备。当前资源随 LCD 常驻,停止循环
不等于完整销毁;新增热替换/重复初始化需要显式生命周期、超时和错误测试。
### 状态、测量与验收
17. 时间沿用现有同步与时区服务;电量来自领域状态,不在显示层用电压重算。
保留未知值和二维码/边界测试不叠加规则。当前点阵仅满足数字状态,不能
声称已支持任意中文文字。
18. 性能测量沿用 `CONFIG_TQ_LCD_EMOTE_FPS_LOG`,不逐帧打印。区分步骤频率、
实际图像更新、DMA 块次数与面板扫描率;不将 30 FPS 配置写成实测 30 FPS。
19. 分项都是墙钟时间,含任务抢占;平均包含保持帧,各项最大值可能不在同一帧。
不把合成耗时当纯 CPU,不把等待传输当纯线上耗时。
20. 内存必须分别报告 Flash、PSRAM、内部 RAM 和 DMA。像素缓冲合计不是整个
组件总开销;应用镜像已包含嵌入式资源,不重复加算。留意联网/唤醒后的最低余量。
21. 变更后至少运行三个显示回归脚本和 ESP-IDF 5.5.4 构建。条件编译要验证
日志开启/关闭两种情况;涉及资源时检查编码往返及视觉预览。
22. 实机验收包括待机/表情切换、跨分钟、充电、缓存启动、唤醒与网络并行、
取消和超时。区分源码检查、主机测试、编译、设备日志与用户观感证据。
没有 TE 同步,不能承诺完全无撕裂;用户满意也不等于已量化稳定帧率。
回归命令(仓库根目录):
```bash
python3 tools/test_lcd_status_hud.py
python3 tools/test_lcd_emote_transport.py
python3 tools/test_lcd_emote_timeline.py
```
提交只包含任务相关文件,遵守主题分支与原有提交规则;不要提交临时补丁脚本、
本机 sdkconfig、构建目录或未授权推送。修改当前机制时同步更新中文指南和测试。