继 v1.6 项目成熟化后, v1.7 把硬件接入真实世界 —
WiFi STA 连接 (event-group + IP_GOT 双门控, 3 次自动重试),
NVS 凭证持久化 (重启自动续连),
真实 OTA over HTTPS (esp_https_ota 流式拉取 + 整数百分点 EVT 上报),
双槽 partitions.csv (ota_0/ota_1 各 5M + rollback),
qmi8658 自动 patch (CMake 内联 + toolkit 重试双层防御).
端到端 — wifi connect ssid=… pass=…
一行上网, ?ota download url=…
一行升级.
跨 2 仓 30+ 次 commit, 落 5 个 git tag (v1.0 → v1.4); aurora-harness 公共 API 30+ 函数 / 6 个头文件; 全部由 manifest --json 一行可见 + 每层都有 onboarding 文档。
doctor / test + v1.7 自动 patch (build 失败自动 retry waveshare__qmi8658)esp-harness test 跑 pytest: doctor + manifest + sim diff. 10sharness/bsp_iface.h 只 2 个符号 (lock/unlock), PORTING.md 多板清单本轮最关键的不是"做了什么"而是"怎么做"。每一个新 feature
都按"可复用积木 + 集成文档"的标准产出: aurora-harness
是 LEGO 底板, harness_toast() 是新积木块, Scene XIX
Notify 是参考拼装, INTEGRATION.md 是说明书。一个新项目复用这套,
跟 Aurora 自己用是一样的接口。
具体做法: 任何"任何 LVGL+console
项目都该有"的能力 — 协议、scene framework、toast、?stat
— 都进了 aurora-harness 组件。Aurora-specific 的 (?audio,
?sd, ?wifi 等) 留在 main/ 作为应用胶水。
这条线划清楚, 才能让"新人项目"和"Aurora 自己"用同一份核心。
┌─── esp-harness manifest --json ───┐
│ 一条命令枚举所有能力 │
└────────────────┬───────────────────┘
│
┌────────────────────────┼────────────────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ TOOLKIT │ │ FIRMWARE │ │ SIMULATOR │
│ │ │ │ │ │
│ Python CLI │ │ ESP-IDF v6 │ │ SDL2 host │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
│ 14 cmds │ 19 scenes │ 12 scenes
│ + init 模板 │ + ?ota partition │ + record 多帧
│ + sim diff/record │ + harness_toast 浮层 │ + diff vs golden
│ + console --repl │ + scene_t description │ + CI ubuntu
│ + manifest │ + ?stat fps/heap │
│ │ │
│ ▼ ▼
│ ┌────────────────────────────────┐
│ │ components/aurora-harness/ │
│ │ ↳ 可复用 ESP-IDF 组件 │
│ │ console_protocol │
│ │ scene_framework │
│ │ toast 浮层 │
│ │ default_cmds (?stat) │
│ └────────────────────────────────┘
│ ↑ firmware 和 sim 都依赖它
│
▼
build / flash / monitor / run
manifest / bench / backtrace
screenshot / console / audio / tap
sim {snapshot, diff, update-golden, record}
init <new-project>
───────────── Discovery surface 双向连通 ─────────────
AI 改源码 → sim diff 5s (sim) / sim record 看动画
AI 改源码 → build + flash + run 30s (设备 e2e)
AI 改源码 → bench --compare 8s (跨版本性能回归)
AI 起新项目 → esp-harness init 1 行 (scaffold)
AI 调试设备 → console --repl 交互
scenes-map XIV-XVI, boot flicker (NVS-restore 挪到 LVGL unlock 前), CHANGELOG ×2 仓, v1.0.0 tag 双仓 push.
不可逆改动前必先 tag — sim/ 引入 host build 重构是不可逆变更, v1.0 是它的安全网。
bench.py 加 --baseline/--compare, 8 个 metric 方向性阈值表。data/baseline.json 落地 v1.0 实测基线, AGENT.md §6.5 文档化。
方向性阈值 — heap 跌报警, 涨多少都不报; loopback 涨报警, 跌不报。对称阈值会被正常方差淹没。
Scene XVII Survey (WiFi 数据表) + XVIII Sniff (BLE 数据表) — 与 IX Spectrum / VIII Whisper 共享同一外设, 两种视觉风格 (艺术 vs 表格)。 ?ota info/mark-valid/rollback partition state 读取。修 MAX_SCENES silent drop bug。
用户态 scoop 装 MinGW gcc 16.1 + 手动解压 SDL2 dev libs (无 admin), 跑通 466×466 LVGL 窗口。补 headless 模式 --scene N --snapshot PATH, toolkit sim snapshot 一键调用。
三层独立验证 — GUI 模式跑通, 再 headless 模式跑通, 再 toolkit 调用跑通。一锅炖出错没办法定位。
git mv 4 个文件保留历史, 20 个调用方 sed 改 #include "harness/X.h" 命名空间形式。 main 改 REQUIRES 取代 SRCS, sim CMakeLists 指向组件路径直接编译。
配套文档: 组件 README 350 行 (API 契约 / 集成 / 线程模型 / 限制), sim/INTEGRATION.md (新项目复用 sim 的清单), 顶层 README 改写 "Aurora 是三合一"。
分界线: 任何 LVGL+console 项目都该有的能力 → 组件; peripheral-coupled 的 → 应用胶水留 main/。
?stat 上提进 aurora-harness 作为 harness_default_register() 入口2d21b33harness_toast() 任意 task 安全的浮层原语8334d7eesp-harness init <name> 项目模板生成器 (9 文件)04243f9sim record 动画多帧捕获04243f9console --repl 交互式 + 斜杠命令04243f9AGENT.md — 给后续 AI 的上手手册6c3a8c5description + tags 元数据6c3a8c5docs/harness-report.htmlb35fbb7v1.3 把核心抽出为组件; v1.4 把其余通用部分也送进去, 让 main/ 真正只剩 Aurora-specific 胶水。组件同时去掉对单一 BSP 的硬绑定, 加上多板移植清单。
cmd_scene 上提 + scene_change_listener 解耦 chromec192562cmd_tap + cmd_swipe 上提 (纯 LVGL indev)e60ae2ccmd_dump + PSRAM 截屏机制整段挪到 screenshot.c725826fbsp_iface.h 抽象 + 解 Waveshare 硬绑定 + PORTING.md39c73d4harness_progress() 进度条原语 + Scene XX Track 示范5258f73harness_default_register() 注册全套 (stat / scene / tap / swipe / ?dump) + 文档收口5258f73esp-harness doctor — 8 项依赖健康检查24de11aesp-harness test + pytest 集成测试套 (3 tests, 10s)24de11adocs/harness-report.html + v1.4.0 tag70275d8用户提议把分散在两个仓库的内容合并成单一 esp-harness, 按 artifact 类型而非功能模块切顶层。新结构让"库 / 工具 / 演示 / 模板"四类东西物理边界跟语义边界完全对齐, 各自独立, 各自 可发布。
aurora-harness 组件 + Waveshare BSP 进 boards/cp -rtools/esp-harness/含 tests/examples/aurora/含 sim/sim-base/ — ESP-IDF stub + mock_bsp + INTEGRATION.md 上提真模板化README.md 三路 onboarding + AGENT.md + docs/architecture.md + docs/getting-started.md~1200 行esp-harness new 重设计 — vendor/link/depend 三模式, 生成 AGENT.mdinit 保留作 aliasv1.6 的目标只有一句话: 陌生人 (或失忆的作者) 30 秒认出 这是什么, 5 分钟读懂为什么, 10 分钟跑出第一个项目。配套整 套成熟项目应有的文档生态 + 品牌身份。
docs/manifesto.md — 项目哲学 + out-of-scope 边界声明survive amnesiadocs/index.html homepage (hero / terminal / 三路 / 架构 / 对比)同 editorial 风.github/ — CONTRIBUTING + 3 issue templates + PR template + config.yml7 文件docs/faq.md (16 问答) + docs/troubleshooting.md (症状-修复 表)amnesia friendlyexamples/hello-minimal/ (template integrity check)~150 LOCcaldis.github.io/esp-harness/ 走 master /docsgh apiv1.6 之前 ?ota 只是空架子 — 有 info/mark-valid/rollback,
但 partitions.csv 是单 factory 槽, 也没真正的下载路径. v1.7 把这条线打通:
partitions 切到双 ota_0/ota_1 槽 + rollback gate, WiFi 加完整 STA 连接 +
NVS 凭证持久化, ?ota download url= 接 esp_https_ota 流式拉取
+ 整数百分点 EVT 进度上报. 顺手把困扰已久的
waveshare__qmi8658 upstream bug 收口为双层自动 patch:
CMake inline (项目本地 / 离线可用) + toolkit retry (失败签名识别 + 自动
重试). 之后任何新机器 clone 即建, 不再需要手动 sed.
esp_harness_apply_known_patches() CMake 函数 + patches.py toolkit retry 双层CMake+pyperipherals/wifi_creds — NVS 凭证持久化 (namespace wifi_cred, 5 函数 API)init/set/get/has/forgetwifi.c 扩展 — STA 连接 + event group + IP_GOT 门控 + 3 次自动重试 + wifi_get_status()~150 行新增wifi 命令重设计 — scan / connect ssid= pass= / disconnect / forget / status 五子命令save=1 自动持久化partitions.csv 双 OTA 布局 — ota_0/ota_1 各 5 M + storage 5 M + rollback gate sdkconfigCONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y?ota download url= 真实路径 — esp_https_ota 流式 + 整数百分点 EVT 上报 + 完成不自动重启AI 主导何时切槽
完整的 30+ 函数 / 类型. 公共头位于 components/aurora-harness/include/harness/. 任何 ESP-IDF + LVGL 项目 vendor 此组件即用。
?stat / scene / tap / swipe / ?dump. 一行覆盖所有 LVGL+console 项目应有的基础.?dump 命令 — LVGL 截屏 + 顶层合成 + 下采样 + base64. PSRAM 持久缓冲. harness_default_register 已自动调.void (int idx, const scene_t *) 回调, 每次 scene_fw_show 完成后触发. 应用用它来同步 UI chrome (ui_shell 等), 让 cmd_scene 不必硬依赖应用层 widgets.scene halo 这种按名切换.
每个新原语都该有一个最小可见示范, 让"怎么用"变成"复制粘贴"。
Notify 就是 harness_toast() 的 demo。
BOOT 循环 5 种 toast (1.5s 默认), USER 触发 3s 长 toast, 计数器跟踪触发次数,
on_hide 时主动 dismiss 防 toast 跨 scene 漏出。
scene halo / scene survey 直接生效。顺手修 bsp_display_lock(0) 死锁.esp-harness init <name> 9 文件起一个新项目骨架, 直接 build/flash 跑得起来.?ota download url= 接 esp_https_ota 流式拉取, 整数百分点 EVT 进度. 完成不自动重启 — AI 控制何时切槽.wifi connect ssid= pass= save=1 一行入网, event-group + IP_GOT 双门控防"假绿灯". NVS namespace wifi_cred 重启自动续连. 配网 UI 留待 v1.8 NimBLE peripheral.
v1.4 之后, 想用这套
开个新 ESP-IDF + LVGL 项目
是一条命令 —esp-harness init my-thing