Skip to content

feat(resources): 完善设备维护与 SD 资源调用闭环 - #26

Merged
orulink-Ciel merged 4 commits into
mainfrom
codex/device-maintenance-resources-clean
Aug 7, 2026
Merged

feat(resources): 完善设备维护与 SD 资源调用闭环#26
orulink-Ciel merged 4 commits into
mainfrom
codex/device-maintenance-resources-clean

Conversation

@orulink-wugui

Copy link
Copy Markdown
Contributor

背景

本 PR 替代 #24

旧分支曾通过双父 merge commit ba9036e5d12821192c62dbe7c29cad2c0d3df13f 合入 Application 分支 1ed28630cd1b8a6d5529f35c909de4bc4341bc1b,导致 GitHub 在旧 PR 中展示另一条分支的历史。当前远端 main 已通过 PR #22 正式包含 Application 相关提交,因此本 PR 从最新 origin/main 重新建立,只迁移 SDK 设备维护与资源闭环的最终代码差异。

新分支没有携带 ba9036e,相对 main 只有 4 个普通单父提交。迁移前后 Git tree 哈希完全一致,确保旧分支中的功能、测试和文档没有丢失。

本次改动

固件与 SD 资源维护

  • 提供 ESP32 固件 Release 查询、下载、校验和串口烧录能力。
  • 支持自动请求设备进入 ROM 下载模式,并在高速烧录失败后重新进入下载模式执行降速重试。
  • 提供官方 SD 资源查询、下载、校验、串口安装和读卡器安装接口。
  • 支持同版本官方资源重复安装,不根据当前版本跳过。
  • 将 SD 资源启用总时限扩展为 30 分钟,并增加 120 秒无进展停滞检测。
  • 超时错误保留最后阶段、进度和设备诊断明细。

用户作品与官方表情

  • 支持通过设备端口或 SD 读卡器读取用户作品目录。
  • 校验作品标识、时间线、轨道、素材数量、文件大小和 CRC。
  • 支持作品写入、读取、删除、完整播放与指定 clip_id 播放。
  • 提供 robot.expressions.play_official 调用官方表情。
  • 提供 robot.works.play_expression 调用用户作品中的单个表情。
  • 保留 v1/v2 作品和既有完整作品播放接口的兼容性。
  • 通过固件能力协商拒绝不支持的来源或调用方式,不在官方资源与用户作品之间静默回退。

Daemon 与 Application 边界

  • SDK 仓库继续作为 Daemon 唯一源码。
  • 维护 REST API 与业务帧路由分离。
  • 有 Application 时,Desktop 和 Device 业务帧仍经过当前 Application。
  • 无 Application 时,通过同一 Daemon 透明转发,不建立第二条设备业务连接。
  • 保持无 Application 启动、冻结 Runtime 入口和 Application 受控启动能力。
  • Application 冷启动等待窗口覆盖 Windows 首次启动耗时。

跨平台兼容

  • Windows 卷信息接口动态解析,非 Windows 平台不直接访问 ctypes.windll
  • 缺少 Windows 卷 API 时返回明确维护错误。
  • 保持 Python 3.10、Windows Runtime 与 Application 分发主线兼容。

历史清理说明

  • 基线:最新远端 main,提交 5f15233
  • 未迁移 merge commit:ba9036e
  • 新 PR 相对主线只有 4 个普通提交。
  • 新旧功能分支的最终 tree 哈希均为:
    23fcbddb6db2892703c6a595fb6b347b8116dd1f
  • 因此本次清理只改变提交拓扑,不改变 SDK 最终代码内容。

TDD / 验证

  • SDK 全量测试:
    • .venv\Scripts\python.exe -m pytest -q
    • 全部通过。
  • 重点闭环测试:
    • 维护服务与扩展能力;
    • SD 资源合同端到端;
    • 设备控制 REST;
    • Application Runtime;
    • Daemon 路由;
    • 冻结 Runtime 入口;
    • SDK 对外 API。
    • 全部通过。
  • 类型检查:
    • .venv\Scripts\python.exe -m mypy src
    • 85 个源码文件零错误。
  • git diff --check origin/main...HEAD:通过。

测试仅保留一条预期的 ZIP 重复文件名警告,用于验证重复条目会被拒绝,不代表功能失败。

配套仓库

  • ESP32:codex/sd-ota-resources-dev / PR #131。
  • 桌面端:codex/sd-resource-install-progress / PR #97。
  • 服务端不承载 Daemon,本次没有修改服务端。

风险与注意事项

将 Application 广场分发、Hugging Face 固定提交安装、独立虚拟环境和受控启动器集成到设备维护分支,使桌面端可从同一 SDK 构建 watcher-distribution。

合并时保留无 Application 的透明路由语义与全部固件、SD 资源维护接口,删除旧 .wapp Catalog 和冻结 Runtime 直启 Application 的旁路;同时补齐类型依赖并修正媒体转换类型边界。

验收:SDK 全量 610 项测试通过,mypy 检查 85 个源码文件零错误;桌面 PyInstaller 已成功收集 Daemon、默认 Application、分发 CLI 与天气 sidecar,并在最终来源锁门禁处按预期拒绝未提交 SDK。
动态解析 Windows kernel32 卷管理接口,避免 Linux/macOS 类型检查直接访问 ctypes.windll 失败,同时保持非 Windows 平台不枚举卷的既有行为。

补充缺少 Windows 卷 API 时的回归测试,并为调用方返回明确的维护错误。此提交配套 ESP32 codex/sd-ota-resources-dev 与桌面端 codex/firmware-resource-maintenance 的资源维护闭环。
将 Application 冷启动等待窗口提高到 90 秒,覆盖 Windows 默认 Application 首次加载耗时。

固件高速烧录失败后重新请求设备进入 ROM 下载模式,再以 460800 baud 完整重试,避免 esptool 复位后沿用失效连接。

补充回归测试、排障文档,并通过 612 项 SDK 测试及 COM29 v0.3.3 实机烧录与版本、SD 作品读取验收。
本次提交修复大型 SD 官方资源包在设备端持续解压时被统一 900 秒超时误判的问题。

主要改动:
- 将资源启用总时限扩展到 30 分钟,覆盖串口上传、解压、校验和原子切换全过程。
- 增加 120 秒无进度停滞检测;设备持续上报有效 STATUS 时刷新停滞截止时间。
- 超时错误携带最后阶段、进度和设备明细,便于区分正常慢速处理与真正卡死。
- 保持同版本资源可重复安装,不新增跳过逻辑。

TDD / 验证:
- 新增停滞心跳及错误上下文回归测试。
- python -m pytest tests/runtime/test_maintenance_service.py -q:33 项通过。

文档:
- 更新资源维护说明,记录同版本重装、总时限、停滞阈值和诊断语义。

配套关系:
- 配套 WatcheRobot_esp32 的异步解压及 STATUS 心跳修改。
- 桌面端可消费阶段、文件字节数和吞吐量明细。
@orulink-wugui
orulink-wugui marked this pull request as ready for review August 7, 2026 03:08
@orulink-Ciel
orulink-Ciel merged commit ac8fc1f into main Aug 7, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants