tirtc-device-builder 0.9.2 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +21 -0
- package/README.md +14 -14
- package/bin/esp32-kit-metadata.js +7 -7
- package/package.json +1 -1
- package/skills/tirtc-esp32-builder/SKILL.md +6 -0
- package/skills/tirtc-esp32-builder/USAGE.md +1 -1
- package/skills/tirtc-esp32-builder/VERSION +1 -1
- package/skills/tirtc-esp32-builder/assets/developer-intake-prompt.md +1 -1
- package/skills/tirtc-esp32-builder/assets/lckfb-szpi-esp32s3-portable-prompt.md +5 -5
- package/skills/tirtc-esp32-builder/knowledge/board-registry.json +41 -1
- package/skills/tirtc-esp32-builder/knowledge/waveshare-esp32-p4-wifi6-touch-lcd-3.5/knowledge.md +84 -0
- package/skills/tirtc-esp32-builder/references/board-knowledge.md +7 -0
- package/skills/tirtc-esp32-builder/references/environment.md +2 -2
- package/skills/tirtc-esp32-builder/references/hardware-ir.md +6 -4
- package/skills/tirtc-esp32-builder/references/runtime-resource-review.md +58 -0
- package/skills/tirtc-esp32-builder/scripts/board_registry.py +19 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
This project follows Semantic Versioning.
|
|
4
4
|
|
|
5
|
+
## 0.9.4
|
|
6
|
+
|
|
7
|
+
- Add a knowledge-only Waveshare ESP32-P4-WIFI6-Touch-LCD-3.5 package with
|
|
8
|
+
pinned source maps, media/resource lessons and explicit hardware/HIL limits.
|
|
9
|
+
- Expose validated knowledge references for model candidates without granting
|
|
10
|
+
adapter reuse; allow unknown PCB revisions only in knowledge-only packages.
|
|
11
|
+
- Add focused media/resource diagnosis guidance covering directional stream
|
|
12
|
+
contracts, WithCaps task cleanup, reserved codec ownership and UI cadence.
|
|
13
|
+
- Test candidate discovery, unknown revisions and reference path boundaries.
|
|
14
|
+
|
|
15
|
+
## 0.9.3
|
|
16
|
+
|
|
17
|
+
- Pin ESP32 Device Kit 1.1.4 and use wildcard DNS plus HTTP probe redirects for
|
|
18
|
+
the local captive portal without misadvertising the HTML page as a DHCP
|
|
19
|
+
option 114 CAPPORT API.
|
|
20
|
+
- Canonicalize ustar headers across GNU tar versions and require the release
|
|
21
|
+
workflow to match the rebuilt archive against the checksum pinned in the
|
|
22
|
+
release tag.
|
|
23
|
+
- Keep every SoftAP prompt aligned with the `captive_portal: true` Hardware IR
|
|
24
|
+
contract, and include the reviewed knowledge-only ESP32-S3 board identities.
|
|
25
|
+
|
|
5
26
|
## 0.9.2
|
|
6
27
|
|
|
7
28
|
- Pin ESP32 Device Kit 1.1.3 with captive portal discovery through DHCP option
|
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ H5/AI 的 ESP32-S3 托管模板、协议文档和 TiRTC SDK 已打包在独立
|
|
|
12
12
|
|
|
13
13
|
- npm 包:[tirtc-device-builder](https://www.npmjs.com/package/tirtc-device-builder)
|
|
14
14
|
- GitHub 仓库:[tangeai/tirtc-device-builder](https://github.com/tangeai/tirtc-device-builder)
|
|
15
|
-
- ESP32 Device Kit:[kit-esp32s3-v1.1.
|
|
15
|
+
- ESP32 Device Kit:[kit-esp32s3-v1.1.4](https://github.com/tangeai/tirtc-device-builder/releases/tag/kit-esp32s3-v1.1.4)
|
|
16
16
|
|
|
17
17
|
文档导航:
|
|
18
18
|
|
|
@@ -283,7 +283,7 @@ board-materials/
|
|
|
283
283
|
| ESP-IDF | 5.5.x |
|
|
284
284
|
| 自动安装版本 | ESP-IDF v5.5.4 |
|
|
285
285
|
| TiRTC SDK | `espressif-esp32s3/2.3.0` |
|
|
286
|
-
| ESP32 Device Kit | 1.1.
|
|
286
|
+
| ESP32 Device Kit | 1.1.4 |
|
|
287
287
|
| Node.js | 18 或更高版本 |
|
|
288
288
|
| 支持自动安装的系统 | Linux、WSL、macOS |
|
|
289
289
|
| 原生 Windows | 使用 Espressif 官方安装器准备 ESP-IDF,再重新运行检查 |
|
|
@@ -392,7 +392,7 @@ Cline 当前还需要在 `Settings → Features → Enable Skills` 中启用实
|
|
|
392
392
|
|---|---|
|
|
393
393
|
| Agent Skill | 上表中所选目录下的 `tirtc-esp32-builder` |
|
|
394
394
|
| 托管根目录 | `~/.tirtc-device-builder` |
|
|
395
|
-
| Device Kit | `~/.tirtc-device-builder/kits/esp32s3/1.1.
|
|
395
|
+
| Device Kit | `~/.tirtc-device-builder/kits/esp32s3/1.1.4` |
|
|
396
396
|
| ESP-IDF | `~/.tirtc-device-builder/esp-idf-v5.5.4` |
|
|
397
397
|
| Espressif 工具 | `~/.tirtc-device-builder/espressif` |
|
|
398
398
|
| 安装记录 | `~/.tirtc-device-builder/config.json` |
|
|
@@ -437,7 +437,7 @@ npx --yes tirtc-device-builder@latest setup esp32 --install \
|
|
|
437
437
|
|
|
438
438
|
```bash
|
|
439
439
|
npx --yes tirtc-device-builder@latest setup esp32 --install \
|
|
440
|
-
--kit-archive /absolute/path/tirtc-esp32s3-kit-1.1.
|
|
440
|
+
--kit-archive /absolute/path/tirtc-esp32s3-kit-1.1.4.tar.gz
|
|
441
441
|
```
|
|
442
442
|
|
|
443
443
|
安装器仍会核对固定的 SHA-256、目录结构、清单和每个资源文件,不接受未经验证的同名压缩包。
|
|
@@ -652,7 +652,7 @@ bootloader、分区表和应用镜像;无需手工维护多条 `esptool.py`
|
|
|
652
652
|
|
|
653
653
|
### Wi-Fi 凭证和设备绑定
|
|
654
654
|
|
|
655
|
-
SoftAP 是可选方案,不是接入前提。Hardware IR 要根据 BSP 的实际能力和产品要求,选择 SoftAP、BLE、SmartConfig、安全工厂/NVS 注入、不纳入版本控制的开发配置,或有文档的自定义方案。若选择 SoftAP,热点名必须以 `TiRTC-` 开头、使用开放认证(无需密码),AP 网关和配网页面地址固定为 `192.168.6.1`(`http://192.168.6.1
|
|
655
|
+
SoftAP 是可选方案,不是接入前提。Hardware IR 要根据 BSP 的实际能力和产品要求,选择 SoftAP、BLE、SmartConfig、安全工厂/NVS 注入、不纳入版本控制的开发配置,或有文档的自定义方案。若选择 SoftAP,热点名必须以 `TiRTC-` 开头、使用开放认证(无需密码),AP 网关和配网页面地址固定为 `192.168.6.1`(`http://192.168.6.1`),并通过通配 DNS 和 HTTP 回退启用 captive portal 自动发现。DHCP Option 114 只用于 RFC 8908 HTTPS/JSON API,不能指向本地 HTML 页面。系统没有自动弹窗时仍可手动打开该 HTTP 地址;HTTPS 不能透明重定向。这些值要写入 Hardware IR 并通过门禁;目标 WLAN 的 SSID 和密码仍不得写死在源码中。
|
|
656
656
|
|
|
657
657
|
无论选择哪种方法,都要有当前 PCB/BSP 的支持证据,凭证不能进入 Git、源码或报告,并且要保留清除或重配入口。没有 SoftAP、但支持工厂 NVS 注入的设备同样可以接入。只要工程提交了明文密码,Hardware IR v2 门禁就会判为 `BLOCKED`。
|
|
658
658
|
|
|
@@ -820,7 +820,7 @@ npx --yes tirtc-device-builder@latest setup esp32 --install --force-skill
|
|
|
820
820
|
|
|
821
821
|
```bash
|
|
822
822
|
npx --yes tirtc-device-builder@latest setup esp32 --install \
|
|
823
|
-
--kit-archive /absolute/path/tirtc-esp32s3-kit-1.1.
|
|
823
|
+
--kit-archive /absolute/path/tirtc-esp32s3-kit-1.1.4.tar.gz
|
|
824
824
|
```
|
|
825
825
|
|
|
826
826
|
安装器会校验 SHA-256 和内部文件清单。如果校验不一致,请重新获取官方 Release 附件,不要跳过校验。
|
|
@@ -932,25 +932,25 @@ python3 ~/.codex/skills/.system/plugin-creator/scripts/validate_plugin.py .
|
|
|
932
932
|
```bash
|
|
933
933
|
npm run pack:esp32-kit -- \
|
|
934
934
|
--source /absolute/path/tirtc-server-example/thing-connect \
|
|
935
|
-
--kit-version 1.1.
|
|
935
|
+
--kit-version 1.1.4
|
|
936
936
|
```
|
|
937
937
|
|
|
938
938
|
输出位于 `dist/`:
|
|
939
939
|
|
|
940
940
|
```text
|
|
941
|
-
tirtc-esp32s3-kit-1.1.
|
|
942
|
-
tirtc-esp32s3-kit-1.1.
|
|
941
|
+
tirtc-esp32s3-kit-1.1.4.tar.gz
|
|
942
|
+
tirtc-esp32s3-kit-1.1.4.tar.gz.sha256
|
|
943
943
|
```
|
|
944
944
|
|
|
945
945
|
校验后推送独立的 `kit-esp32s3-v<version>` 标签。`publish-kit.yml` 会从 metadata 固定的上游 commit 重建压缩包、核对 SHA-256,并使用 GitHub Actions token 创建 Release:
|
|
946
946
|
|
|
947
947
|
```bash
|
|
948
948
|
cd dist
|
|
949
|
-
sha256sum -c tirtc-esp32s3-kit-1.1.
|
|
949
|
+
sha256sum -c tirtc-esp32s3-kit-1.1.4.tar.gz.sha256
|
|
950
950
|
cd ..
|
|
951
951
|
|
|
952
|
-
git tag -a kit-esp32s3-v1.1.
|
|
953
|
-
git push origin kit-esp32s3-v1.1.
|
|
952
|
+
git tag -a kit-esp32s3-v1.1.4 -m "TiRTC ESP32-S3 Device Kit 1.1.4"
|
|
953
|
+
git push origin kit-esp32s3-v1.1.4
|
|
954
954
|
```
|
|
955
955
|
|
|
956
956
|
metadata 中的版本、标签、上游 commit 和期望 SHA-256 必须与本地可复现打包结果一致;工作流不会从浮动的 `main` 取发布内容。
|
|
@@ -961,8 +961,8 @@ metadata 中的版本、标签、上游 commit 和期望 SHA-256 必须与本地
|
|
|
961
961
|
|
|
962
962
|
```bash
|
|
963
963
|
npm test
|
|
964
|
-
git tag -a v0.9.
|
|
965
|
-
git push origin v0.9.
|
|
964
|
+
git tag -a v0.9.4 -m "v0.9.4"
|
|
965
|
+
git push origin v0.9.4
|
|
966
966
|
```
|
|
967
967
|
|
|
968
968
|
不要重复发布已经存在的 npm 版本。版本变化同步更新 `package.json`、`.codex-plugin/plugin.json` 和发布说明。
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export const ESP32_KIT = Object.freeze({
|
|
2
|
-
archiveName: "tirtc-esp32s3-kit-1.1.
|
|
3
|
-
archiveRoot: "tirtc-esp32s3-kit-1.1.
|
|
4
|
-
releaseTag: "kit-esp32s3-v1.1.
|
|
5
|
-
sha256: "
|
|
6
|
-
sourceCommit: "
|
|
7
|
-
url: "https://github.com/tangeai/tirtc-device-builder/releases/download/kit-esp32s3-v1.1.
|
|
8
|
-
version: "1.1.
|
|
2
|
+
archiveName: "tirtc-esp32s3-kit-1.1.4.tar.gz",
|
|
3
|
+
archiveRoot: "tirtc-esp32s3-kit-1.1.4",
|
|
4
|
+
releaseTag: "kit-esp32s3-v1.1.4",
|
|
5
|
+
sha256: "b041baca1fbf6f3f3bd1299921793f0f708c669023b39148a34e3f478e3789fc",
|
|
6
|
+
sourceCommit: "7e9c595b8b5531bd781e42344c584095f3f74a1b",
|
|
7
|
+
url: "https://github.com/tangeai/tirtc-device-builder/releases/download/kit-esp32s3-v1.1.4/tirtc-esp32s3-kit-1.1.4.tar.gz",
|
|
8
|
+
version: "1.1.4",
|
|
9
9
|
});
|
package/package.json
CHANGED
|
@@ -43,6 +43,12 @@ A probable match supplies hypotheses; a component match supplies only component
|
|
|
43
43
|
lessons. Any identity conflict creates a new variant and keeps concrete GPIO,
|
|
44
44
|
clock, DMA and task values unresolved.
|
|
45
45
|
|
|
46
|
+
Read a match's `knowledge_refs` before scanning reference repositories. These
|
|
47
|
+
are source maps and evidence, not permission to install a candidate adapter.
|
|
48
|
+
For an existing project's media, memory or scheduling bug, read
|
|
49
|
+
[runtime-resource-review.md](references/runtime-resource-review.md); preserve
|
|
50
|
+
the user's business baseline separately from the hardware reference.
|
|
51
|
+
|
|
46
52
|
## 3. Prove the business flows before board porting
|
|
47
53
|
|
|
48
54
|
When device-call or WeChat VoIP is requested, first build and run the pinned
|
|
@@ -74,7 +74,7 @@ printf '%s\n' "$TIRTC_THING_CONNECT_ROOT"
|
|
|
74
74
|
python3 <skill-dir>/scripts/doctor.py \
|
|
75
75
|
--expected-idf 5.5 \
|
|
76
76
|
--target esp32s3 \
|
|
77
|
-
--thing-connect-root ~/.tirtc-device-builder/kits/esp32s3/1.1.
|
|
77
|
+
--thing-connect-root ~/.tirtc-device-builder/kits/esp32s3/1.1.4 \
|
|
78
78
|
--require-workspace
|
|
79
79
|
```
|
|
80
80
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.4
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
接入方式:
|
|
29
29
|
- Wi-Fi:<选择一种,或写“根据 BSP 选择”>
|
|
30
|
-
- 选择 SoftAP 时:热点名以 `TiRTC-` 开头、开放认证无需密码,AP 网关和配网页面为 `192.168.6.1` / `http://192.168.6.1
|
|
30
|
+
- 选择 SoftAP 时:热点名以 `TiRTC-` 开头、开放认证无需密码,AP 网关和配网页面为 `192.168.6.1` / `http://192.168.6.1`,启用通配 DNS 和 HTTP 重定向进行 captive portal 自动发现,不把 DHCP Option 114 指向本地 HTML 页面,并保留手动打开地址的回退说明
|
|
31
31
|
- 设备绑定:<选择一种,或写“根据平台合同选择”>
|
|
32
32
|
|
|
33
33
|
工程:
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
export TIRTC_AGENT_CLIENT=codex
|
|
11
|
-
npx --yes tirtc-device-builder@0.9.
|
|
11
|
+
npx --yes tirtc-device-builder@0.9.4 setup esp32 --install \
|
|
12
12
|
--client "$TIRTC_AGENT_CLIENT" --force-skill
|
|
13
13
|
```
|
|
14
14
|
|
|
@@ -17,11 +17,11 @@ npx --yes tirtc-device-builder@0.9.2 setup esp32 --install \
|
|
|
17
17
|
本轮第一步先只读运行:
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
npx --yes tirtc-device-builder@0.9.
|
|
21
|
-
npx --yes tirtc-device-builder@0.9.
|
|
20
|
+
npx --yes tirtc-device-builder@0.9.4 --version
|
|
21
|
+
npx --yes tirtc-device-builder@0.9.4 setup esp32 --client "$TIRTC_AGENT_CLIENT"
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
必须根据命令的实际输出和本机文件确认:npm 包为 0.9.
|
|
24
|
+
必须根据命令的实际输出和本机文件确认:npm 包为 0.9.4、已安装 Skill 的 `VERSION` 为 0.9.4、所选 Device Kit 的 `manifest.json` 中 `kit_version` 为 1.1.4,并且 Doctor 对 `--expected-kit 1.1.4` 输出 `OVERALL: PASS`。Plugin manifest 不属于这种 npm 安装方式的运行时前置条件,不得把不可访问的 Plugin 版本当作阻塞项。如果版本不一致、Skill 是在当前会话启动后才安装,或环境检查未通过,停止并报告前置条件不成立;不要在当前会话中替换 Skill 后继续生成工程。
|
|
25
25
|
|
|
26
26
|
工作区与 clean-room 边界:
|
|
27
27
|
- 将启动 Agent 客户端时的当前目录定义为 `WORKSPACE_ROOT`。
|
|
@@ -60,7 +60,7 @@ npx --yes tirtc-device-builder@0.9.2 setup esp32 --client "$TIRTC_AGENT_CLIENT"
|
|
|
60
60
|
- AI 对讲必须实现全双工和 AEC;构建阶段必须证明同时采集播放、真实播放参考与 `echo_cancellation.enabled=true`,实机结果仍只能在 L2-L7 验证后声明。
|
|
61
61
|
|
|
62
62
|
接入要求:
|
|
63
|
-
- SoftAP 配网:热点名使用 `TiRTC-` 前缀、开放认证无需密码,AP 网关和配网页面为 `192.168.6.1` / `http://192.168.6.1`;目标 Wi-Fi 凭证保存 NVS。
|
|
63
|
+
- SoftAP 配网:热点名使用 `TiRTC-` 前缀、开放认证无需密码,AP 网关和配网页面为 `192.168.6.1` / `http://192.168.6.1`;启用通配 DNS 和 HTTP 重定向进行 captive portal 自动发现,不把 DHCP Option 114 指向本地 HTML 页面;Hardware IR 记录 `captive_portal: true`;目标 Wi-Fi 凭证保存 NVS。
|
|
64
64
|
- 验证码绑定,并复用已有绑定。
|
|
65
65
|
- 分别实现 `wifi-clear` 和 `tirtc-clear`。
|
|
66
66
|
- 平台发现本轮先使用 HTTP;HTTPS 留待独立验收。
|
|
@@ -1,4 +1,44 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": 1,
|
|
3
|
-
"boards": [
|
|
3
|
+
"boards": [
|
|
4
|
+
{
|
|
5
|
+
"package_id": "waveshare_esp32p4_wifi6_touch_lcd_35_unknown_rev",
|
|
6
|
+
"status": "knowledge_only",
|
|
7
|
+
"identity": {
|
|
8
|
+
"vendor": "Waveshare",
|
|
9
|
+
"model": "ESP32-P4-WIFI6-Touch-LCD-3.5",
|
|
10
|
+
"aliases": ["微雪ESP32-P4-WIFI6-Touch-LCD-3.5", "Waveshare ESP32-P4-WIFI6-Touch-LCD-3.5"],
|
|
11
|
+
"hardware_revision": null,
|
|
12
|
+
"target": "esp32p4",
|
|
13
|
+
"module": null,
|
|
14
|
+
"flash_mb": 16,
|
|
15
|
+
"psram_mb": 32,
|
|
16
|
+
"components": [
|
|
17
|
+
{"kind": "camera", "model": "OV5647"},
|
|
18
|
+
{"kind": "audio_codec", "model": "ES8311"},
|
|
19
|
+
{"kind": "display", "model": "ST7796"},
|
|
20
|
+
{"kind": "touch", "model": "FT6336"},
|
|
21
|
+
{"kind": "network", "model": "ESP32-C6"}
|
|
22
|
+
],
|
|
23
|
+
"probes": []
|
|
24
|
+
},
|
|
25
|
+
"compatibility": {"idf": "5.5.4", "tirtc_sdk": "2.3.0"},
|
|
26
|
+
"artifacts": {},
|
|
27
|
+
"knowledge_refs": ["waveshare-esp32-p4-wifi6-touch-lcd-3.5/knowledge.md"],
|
|
28
|
+
"lessons": [
|
|
29
|
+
{
|
|
30
|
+
"id": "waveshare_p4_media_receive_identity",
|
|
31
|
+
"scope": "board",
|
|
32
|
+
"subject": "VoIP receive admission",
|
|
33
|
+
"guidance": "Observed WeChat JPEG stream1 differs from subscribe/uplink stream11. Check active connection, generation and codec; reproduce with actual ingress before editing filters. See knowledge_refs for evidence and limitations.",
|
|
34
|
+
"action": "warn",
|
|
35
|
+
"verification": "corroborated",
|
|
36
|
+
"applies_to": {"package_id": "waveshare_esp32p4_wifi6_touch_lcd_35_unknown_rev"},
|
|
37
|
+
"evidence": [{"board_package_id": "waveshare_esp32p4_wifi6_touch_lcd_35_unknown_rev", "source_ref": "waveshare-esp32-p4-wifi6-touch-lcd-3.5/knowledge.md#media-and-failures-worth-remembering"}]
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{"package_id":"lckfb_szpi_esp32s3_v1_0_1","status":"knowledge_only","identity":{"vendor":"深圳嘉立创科技集团股份有限公司(立创开发板)","model":"立创·实战派 ESP32-S3 开发板","aliases":["LCKFB SZPI ESP32-S3"],"hardware_revision":"V1.0.1","target":"esp32s3","module":"ESP32-S3 module","flash_mb":16,"psram_mb":8,"components":[{"kind":"camera","model":"GC2145"},{"kind":"aec_reference","model":"ES7210 MIC3 hardware reference"}],"probes":[]},"compatibility":{"idf":"5.5.4","tirtc_sdk":"2.3.0"},"artifacts":{},"lessons":[]},
|
|
42
|
+
{"package_id":"alientek_atk_dnesp32s3_v1","status":"knowledge_only","identity":{"vendor":"正点原子 (ALIENTEK)","model":"ATK-DNESP32S3","aliases":[],"hardware_revision":"V1.0","target":"esp32s3","module":"ATK-MWS3S","flash_mb":16,"psram_mb":8,"components":[{"kind":"camera","model":"OV5640 PID 0x5640"},{"kind":"audio_codec","model":"ES8388"}],"probes":[]},"compatibility":{"idf":"5.5.4","tirtc_sdk":"2.3.0"},"artifacts":{},"lessons":[]}
|
|
43
|
+
]
|
|
4
44
|
}
|
package/skills/tirtc-esp32-builder/knowledge/waveshare-esp32-p4-wifi6-touch-lcd-3.5/knowledge.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Waveshare ESP32-P4-WIFI6-Touch-LCD-3.5
|
|
2
|
+
|
|
3
|
+
2026-09-07. Knowledge only; PCB and silicon revisions unresolved. This package
|
|
4
|
+
contains source-correlated observations and targeted regressions, not an
|
|
5
|
+
installable adapter or complete Hardware IR. A matching sales name does not
|
|
6
|
+
authorize pin reuse. No credentials, raw call logs or user media are retained.
|
|
7
|
+
|
|
8
|
+
## Read only the needed source
|
|
9
|
+
|
|
10
|
+
| Baseline | Pinned source | Locate next |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| Product business | xiaotai, baseline `8d67f0fe1b7385485e9d3de57065be53d10639ed` plus uncommitted P4 port | `lckfb-szpi-esp32s3-tirtc/components/starter_runtime/src/starter_runtime.c`, shared `starter_product`, `starter_tirtc` |
|
|
13
|
+
| Hardware/media | tirtc-device-example `cad4cbe58c3ff451906322930ceede19e6bf6a07`, app 1.5.3 | `complete-applications/esp32-p4/device-monitor/main/` |
|
|
14
|
+
| Vendor | waveshareteam/ESP32-P4-WIFI6-Touch-LCD-3.5 `870588e62daaf723f3c52f0060d8dc053665ed30` | `examples/esp-idf/06_I2SCodec`, `docs/revisions.md`, schematic |
|
|
15
|
+
| Cross-check | xiaozhi-esp32 `1ce658bcb9ce9aac69d3f87af9894a715b7175f6` | `main/boards/waveshare/esp32-p4-wifi6-touch-lcd-3.5/` |
|
|
16
|
+
|
|
17
|
+
Source paths are repository-relative, not prerequisites for a particular home
|
|
18
|
+
directory. Product HEAD alone does not identify dirty source; retain the local
|
|
19
|
+
diff and BIN/ELF identity when promoting this package. Project source maps live
|
|
20
|
+
under `docs/boards/waveshare-esp32-p4-wifi6-touch-lcd-3.5/`; current build status
|
|
21
|
+
is in `waveshare-esp32p4-xiaotai/PORT_STATUS.md` and `BUILD_IDENTITY.md`.
|
|
22
|
+
|
|
23
|
+
## Hardware candidates (source-correlated, re-probe on new hardware)
|
|
24
|
+
|
|
25
|
+
- P4, 32 MiB PSRAM, 16 MiB flash; ESP32-C6 over Hosted SDIO. P4 requires its own
|
|
26
|
+
RISC-V SDK; the tested IDF is 5.5.4-dirty, TiRTC 2.3.0.
|
|
27
|
+
- ST7796 **SPI**, physical 320x480 / landscape 480x320; FT6336 uses the FT5x06
|
|
28
|
+
driver family. CSI camera does not imply a DSI display.
|
|
29
|
+
- No onboard IMU is documented for this model: vendor hardware inventory omits
|
|
30
|
+
one, pinned monitor BSP declares `BSP_CAPS_IMU=0`, and vendor BSP 2.0.1 lists
|
|
31
|
+
IMU unavailable. External sensing is needed for motion-based rotation; BSP
|
|
32
|
+
support flags alone are not proof of hardware absence. Sources checked
|
|
33
|
+
2026-09-07: https://docs.waveshare.com/ESP32-P4-WIFI6-Touch-LCD-3.5 and
|
|
34
|
+
https://components.espressif.com/components/waveshare/esp32_p4_wifi6_touch_lcd_3_5/versions/2.0.1/readme
|
|
35
|
+
- Shared I2C1 SDA7/SCL8: pass the existing bus to camera SCCB (`init_sccb=false`),
|
|
36
|
+
codec and touch; an unused I2C0 macro is not evidence for a second owner.
|
|
37
|
+
- ES8311 I2S1 MCLK13/BCLK12/WS10/DOUT9/DIN11; PA53 high. Shared TX/RX,
|
|
38
|
+
16 kHz stereo 16-bit, left MIC/right DAC reference. Monitor uses
|
|
39
|
+
`.no_dac_ref=false`, codec register 0x44=0x58. Validate reference energy and
|
|
40
|
+
double-talk; a board-level reference macro in Xiaozhi does not prove its
|
|
41
|
+
actual codec object enables reference input.
|
|
42
|
+
- LCD MOSI20/CLK21/CS23/DC26/RST27/BL28; touch RST29/INT50; BOOT35.
|
|
43
|
+
Verify combined rotation/mirror and all four touch corners. BOOT is distinct
|
|
44
|
+
from AXP2101 power controls; PMIC power sequencing remains unverified.
|
|
45
|
+
- C6 SDIO CLK18/CMD19/D0..3=14..17/RST54. Read host/slave versions; STA working
|
|
46
|
+
does not verify SoftAP/captive portal. Read the remote STA MAC after got-IP.
|
|
47
|
+
- OV5647 source: `main/drivers/camera/camera_driver.c`. Sensor mode may run
|
|
48
|
+
faster than requested output: observed 800x640@50 sensor paced to 15 fps.
|
|
49
|
+
Verify PID and actual silicon revision before selecting rev<3 defaults.
|
|
50
|
+
|
|
51
|
+
## Media and failures worth remembering
|
|
52
|
+
|
|
53
|
+
| Symptom | Evidence and correction | Regression / next source |
|
|
54
|
+
| --- | --- | --- |
|
|
55
|
+
| VoIP audio but no remote image | Callback metadata stream=1/media=65 (JPEG), rx=37 and decoded=0; adapter only allowed stream11. Receive by active connection/generation/codec, not uplink ID. User later reported image visible. | P4 `tools/test_video_ingress.py`, actual `p4_video_submit`/`drain_video`; monitor `tirtc_session_on_video` |
|
|
56
|
+
| Remote producer not requested | Monitor subscribes then sends its version-specific video-enable command `(SN<<16)\u007c0x1105`, byte1. Added missing request, but this alone was not proven to fix image. | `tools/test_p4_video.py`; monitor `tirtc_session.c`, `tirtc_commands.c` |
|
|
57
|
+
| H264 open fails with >8 MiB free | Singleton output workspace remained reserved for old profile. Stop worker, apply profile, reconcile reservation, restart. | `tools/test_p4_profile_switch.py`; `camera_pipeline_on_rtc_video_config_changed` |
|
|
58
|
+
| Repeated WHIP attempts leak | Shared worker used WithCaps creation and ordinary deletion. Fixed to paired deletion; 24 KiB stack plus TCB per completed attempt was retained. | S3 `tools/test_voip_task_cleanup.py`; installed IDF `esp_additions/idf_additions.c` |
|
|
59
|
+
| UI slow / video not smooth | Product UI tick100ms limits presentation near10fps; renderer input24x256KiB plus output20x480x320x2 dominate pools. Retained pools are intentional, not proven optimal for this product. | `call_video_renderer_config.h`, `p4_video_ui_tick`; measure before tuning |
|
|
60
|
+
|
|
61
|
+
Product-specific media: device CALL H264 both directions; WeChat VOIP H264 up /
|
|
62
|
+
MJPEG down, profile video enabled with 640x480, 8k mono A-law. Preserve explicit
|
|
63
|
+
voice calls. Camera privacy disables local capture/send while keeping remote
|
|
64
|
+
decode/audio; microphone is independent. Profile declaration is not proof of
|
|
65
|
+
actual packets or display. P4 H264 encode is hardware; downstream H264 here is
|
|
66
|
+
software, MJPEG uses hardware JPEG plus scaling.
|
|
67
|
+
|
|
68
|
+
## Evidence boundary
|
|
69
|
+
|
|
70
|
+
P4 `xiaotai-p4-voip.8` compiled with host regressions including 100 simulated
|
|
71
|
+
worker exits; no repeated-call heap HIL yet.
|
|
72
|
+
|
|
73
|
+
- BIN SHA256: `8bb2e46f3ce68318ebdd544c6cff979e6885e1c40b70ff0ee1731342b07c55e1`
|
|
74
|
+
- ELF SHA256: `6a138dede2fe20e7980937801c48a0206b0a78a3634a49a9ef3e31f9bce811aa`
|
|
75
|
+
- P4 SDK archive SHA256: `a7a01ffd496a55364c7e4d665ff3884d078147bba96752a965d97befca12e451`
|
|
76
|
+
|
|
77
|
+
These identify historical local artifacts, not bundled binaries or a reproducible
|
|
78
|
+
release. User reports video visible after the stream-filter correction, without
|
|
79
|
+
a complete artifact-bound capture. Startup logs prove one successful media
|
|
80
|
+
start, not long-run stability. Earlier HMAC signing -> invalid LVGL event crash
|
|
81
|
+
is unresolved; no claim it was fixed by task cleanup. AEC/double-talk, weak
|
|
82
|
+
network, repeated calls, PMIC controls and full product parity remain pending.
|
|
83
|
+
Promote only after exact identity, portable adapter/IR/contracts and per-flow
|
|
84
|
+
artifact-bound acceptance are retained.
|
|
@@ -51,6 +51,13 @@ Registry package status controls reuse:
|
|
|
51
51
|
|
|
52
52
|
An older HIL result is provenance, not proof for a newly built artifact.
|
|
53
53
|
|
|
54
|
+
Knowledge-only packages may record an unknown PCB revision as `null`; verified
|
|
55
|
+
packages still require an explicit revision. `match` returns registry-relative
|
|
56
|
+
`knowledge_refs` for exact/model candidates, including knowledge-only packages.
|
|
57
|
+
Read that source map first and inspect only relevant source deltas. A probable
|
|
58
|
+
match provides investigation leads, not validated pins or an installable adapter.
|
|
59
|
+
The Waveshare ESP32-P4-WIFI6-Touch-LCD-3.5 package follows this boundary.
|
|
60
|
+
|
|
54
61
|
## Learning loop
|
|
55
62
|
|
|
56
63
|
After the final assessment, create a project-local candidate:
|
|
@@ -16,7 +16,7 @@ The automatic branch never runs `sudo` or modifies a persistent shell profile. W
|
|
|
16
16
|
When `<setup-root>/env.sh` exists, use it only as an activation prefix for the current command:
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
bash -lc '. "<setup-root>/env.sh" && python3 "<skill-dir>/scripts/doctor.py" --expected-idf 5.5 --expected-kit 1.1.
|
|
19
|
+
bash -lc '. "<setup-root>/env.sh" && python3 "<skill-dir>/scripts/doctor.py" --expected-idf 5.5 --expected-kit 1.1.4 --target esp32s3 --require-workspace'
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
The helper contains paths, not device or network credentials. Read `<setup-root>/config.json` when exact managed paths are needed; the environment helper does not authorize unrelated downloads, shell-profile changes, flashing, or credential writes.
|
|
@@ -26,7 +26,7 @@ Run the doctor before generation, build, flash, or monitor:
|
|
|
26
26
|
```bash
|
|
27
27
|
python3 <skill-dir>/scripts/doctor.py \
|
|
28
28
|
--expected-idf 5.5 \
|
|
29
|
-
--expected-kit 1.1.
|
|
29
|
+
--expected-kit 1.1.4 \
|
|
30
30
|
--target esp32s3 \
|
|
31
31
|
--require-workspace
|
|
32
32
|
```
|
|
@@ -74,10 +74,12 @@ When the selected method is SoftAP:
|
|
|
74
74
|
the setup page at `http://192.168.6.1`, and lease clients from that subnet.
|
|
75
75
|
With ESP-IDF, stop DHCP before changing the AP netif IP information and
|
|
76
76
|
restart it afterward;
|
|
77
|
-
- enable captive portal discovery with
|
|
78
|
-
|
|
79
|
-
the
|
|
80
|
-
|
|
77
|
+
- enable captive portal discovery with wildcard DNS resolving names to
|
|
78
|
+
`192.168.6.1` and an HTTP fallback redirect to the setup page. Do not point
|
|
79
|
+
DHCP option 114 at the local HTML page: that option requires an RFC 8908
|
|
80
|
+
HTTPS/JSON API endpoint. Keep the direct HTTP address documented because
|
|
81
|
+
client auto-popup is not guaranteed and HTTPS cannot be transparently
|
|
82
|
+
redirected.
|
|
81
83
|
|
|
82
84
|
Record these values on the selected SoftAP method as `ssid_prefix: "TiRTC-"`,
|
|
83
85
|
`auth_mode: "open"`, `ipv4_address: "192.168.6.1"`, and
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Existing-project media and resource review
|
|
2
|
+
|
|
3
|
+
Use for missing remote video, allocation failures, task leaks, slow UI or call
|
|
4
|
+
switching. This is a focused diagnostic route, not a requirement to redo board
|
|
5
|
+
intake, replay every simulator flow or regenerate a working product.
|
|
6
|
+
|
|
7
|
+
## Establish a narrow baseline
|
|
8
|
+
|
|
9
|
+
Record business baseline and hardware reference separately. Keep the user's
|
|
10
|
+
contacts, call arbitration, onboarding and UI semantics in the former; borrow
|
|
11
|
+
drivers, capture and codec resource ownership from the latter. Read the matched
|
|
12
|
+
knowledge package's source map, compare pinned commits and relevant dirty files,
|
|
13
|
+
then inspect only the path under investigation. Reuse prior build evidence only
|
|
14
|
+
when artifact identity matches; otherwise label it historical.
|
|
15
|
+
|
|
16
|
+
## Receive-to-display contract
|
|
17
|
+
|
|
18
|
+
For each active mode record uplink codec, subscribe ID, downlink codec and
|
|
19
|
+
observed receive metadata independently. H5 video-up stream 11 remains valid;
|
|
20
|
+
it does not establish a universal receive stream ID. Authenticate the active
|
|
21
|
+
connection, validate generation and negotiated media, and test actual ingress
|
|
22
|
+
with captured non-sensitive frame metadata before changing filters.
|
|
23
|
+
|
|
24
|
+
Use bounded counters at callback, admission, queue, decoder, converter and
|
|
25
|
+
presentation boundaries. Count admission rejection separately from overflow.
|
|
26
|
+
`rx>0, decoded=0` is not automatically a codec failure. Test enabling remote
|
|
27
|
+
production separately from subscription; protocol commands are SDK/reference
|
|
28
|
+
specific, not generic magic constants.
|
|
29
|
+
|
|
30
|
+
## Resource lifecycle
|
|
31
|
+
|
|
32
|
+
- Inventory task creation and deletion pairs. ESP-IDF `xTaskCreate*WithCaps`
|
|
33
|
+
requires `vTaskDeleteWithCaps`; ordinary deletion retains its statically
|
|
34
|
+
registered stack/TCB. Confirm the installed IDF implementation. Self-deletion
|
|
35
|
+
may allocate a helper task; under tight internal RAM prefer owner-driven
|
|
36
|
+
cleanup after the worker has stopped. A mock API-pair test is not heap HIL.
|
|
37
|
+
- Distinguish free capacity, largest contiguous block, DMA capability and
|
|
38
|
+
reserved-workspace ownership. Stop the old codec owner before reconfiguring
|
|
39
|
+
or acquiring a singleton workspace. Retry cannot repair stale ownership.
|
|
40
|
+
- Budget internal RAM and PSRAM independently for idle, handshake, duplex media
|
|
41
|
+
and stop/reconnect overlap. Include codec pools, ingress copies, UI surfaces,
|
|
42
|
+
worker stacks and SDK queues; a retained pool is not a per-call leak.
|
|
43
|
+
- Measure receive, decode and presentation cadence independently. A 100 ms UI
|
|
44
|
+
timer caps presentation near 10 fps even if decode runs at 15 fps. Evaluate
|
|
45
|
+
dedicated video presentation and smaller MJPEG latest-frame pools against
|
|
46
|
+
audio deadlines; H264 recovery buffers have different dependencies.
|
|
47
|
+
|
|
48
|
+
## Completion evidence
|
|
49
|
+
|
|
50
|
+
Run an actual-code regression for the failing seam. Report build/host tests
|
|
51
|
+
separately from hardware. For resource changes, compare post-warmup baselines
|
|
52
|
+
over repeated connect/cancel/hangup cycles and a sustained duplex call: heap
|
|
53
|
+
free/largest/minimum by capability, task stack low-water marks, queue drops,
|
|
54
|
+
decode/present rates and audio starvation. Sample cheaply outside realtime
|
|
55
|
+
callbacks; choose intervals for the experiment, not permanent noisy polling.
|
|
56
|
+
Unreproduced crashes remain unresolved even if a later call succeeds. Change
|
|
57
|
+
one high-risk variable per hardware comparison and retain redacted artifact-
|
|
58
|
+
bound results; user-reported video is evidence of video, not AEC or stability.
|
|
@@ -95,12 +95,16 @@ def validate_probe(item: Any, path: str, errors: list[str]) -> None:
|
|
|
95
95
|
errors.append(f"{path}.required_for_exact must be true or false")
|
|
96
96
|
|
|
97
97
|
|
|
98
|
-
def validate_identity(identity: Any, path: str, errors: list[str]) -> None:
|
|
98
|
+
def validate_identity(identity: Any, path: str, errors: list[str], *, allow_unknown_revision: bool = False) -> None:
|
|
99
99
|
if not isinstance(identity, dict):
|
|
100
100
|
errors.append(f"{path} must be an object")
|
|
101
101
|
return
|
|
102
|
-
for field in ("vendor", "model", "
|
|
102
|
+
for field in ("vendor", "model", "target"):
|
|
103
103
|
nonempty(identity.get(field), f"{path}.{field}", errors)
|
|
104
|
+
if allow_unknown_revision:
|
|
105
|
+
nullable_nonempty(identity.get("hardware_revision"), f"{path}.hardware_revision", errors)
|
|
106
|
+
else:
|
|
107
|
+
nonempty(identity.get("hardware_revision"), f"{path}.hardware_revision", errors)
|
|
104
108
|
aliases = string_array(identity.get("aliases", []), f"{path}.aliases", errors)
|
|
105
109
|
names = [identity.get("model"), *aliases]
|
|
106
110
|
normalized_names = [normalized(value) for value in names if normalized(value)]
|
|
@@ -244,7 +248,15 @@ def validate_registry(data: dict[str, Any], registry_path: Path) -> list[str]:
|
|
|
244
248
|
errors.append(
|
|
245
249
|
f"{prefix}.status must be one of {', '.join(sorted(PACKAGE_STATUSES))}"
|
|
246
250
|
)
|
|
247
|
-
validate_identity(board.get("identity"), f"{prefix}.identity", errors
|
|
251
|
+
validate_identity(board.get("identity"), f"{prefix}.identity", errors,
|
|
252
|
+
allow_unknown_revision=status == "knowledge_only")
|
|
253
|
+
for ref_index, value in enumerate(string_array(
|
|
254
|
+
board.get("knowledge_refs", []), f"{prefix}.knowledge_refs", errors
|
|
255
|
+
)):
|
|
256
|
+
resolved = safe_registry_path(registry_path, value,
|
|
257
|
+
f"{prefix}.knowledge_refs[{ref_index}]", errors)
|
|
258
|
+
if resolved is not None and not resolved.is_file():
|
|
259
|
+
errors.append(f"{prefix}.knowledge_refs[{ref_index}] does not exist")
|
|
248
260
|
compatibility = board.get("compatibility")
|
|
249
261
|
if not isinstance(compatibility, dict):
|
|
250
262
|
errors.append(f"{prefix}.compatibility must be an object")
|
|
@@ -453,6 +465,10 @@ def match_board(board: dict[str, Any], query: dict[str, Any]) -> dict[str, Any]
|
|
|
453
465
|
{"kind": kind, "model": model} for kind, model in shared_components
|
|
454
466
|
],
|
|
455
467
|
"applicable_lessons": applicable_lessons,
|
|
468
|
+
# A model candidate can read its evidence without acquiring GPIO/adapter
|
|
469
|
+
# authority. Component-only matches must not inherit board-specific docs.
|
|
470
|
+
"knowledge_refs": board.get("knowledge_refs", [])
|
|
471
|
+
if classification in {"exact", "probable"} else [],
|
|
456
472
|
"artifacts": board.get("artifacts", {}) if reuse == "registered_board" else {},
|
|
457
473
|
}
|
|
458
474
|
|