docs(lcd): add Chinese GFX development guide and agent rules
This commit is contained in:
@@ -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、构建目录或未授权推送。修改当前机制时同步更新中文指南和测试。
|
||||
|
||||
Reference in New Issue
Block a user