自动汇总 2026-10-26 当天
hummingg在 GitHub 上的提交。
hummingg/skills
- feat(compshare-comfyui-video): 新增优云视频生成技能
- 记录浏览器操作、参考首帧输入、计费保护及视频验收流程,区分真实碰撞问题与剪辑规避。
hummingg/watch-appstore
- feat(api): 新增的四个 Lua 能力模块入库,ABI 11 → 20
- 这些模块 2026-10-23~26 陆续做完并在设备上跑过(当前固件 ba9ab559 就是 abi=20),
- 但源码一直只在工作树里。今天盘点发现:git 里的 ABI 还是 11,中间 9 级
- (12~20)的实现文件一个都没入库。
- 新增的模块:
- | 模块 | 对应 ABI | 作用 |
- |—|—|—|
- |
port/microapp_port_rtc.c+include/microapp_rtc.h| 12 | rtc 权限的硬件 UTC 读取与受限系统时间校准,由 port 注入,不开放 os 库 | - |
port/microapp_port_vibro.c+include/microapp_vibro.h| 13 | vibro 权限的受控按压/状态,单次最长 250ms、退出即停,不暴露引脚/PWM | - |
port/microapp_port_boardio.c+include/microapp_boardio.h| 16 | 固定 BOOT/PWR 只读诊断与重测,不提供任意 GPIO 读写 | - |
port/ui/touch-track.c/h| 18 | touch.events 轨迹环形缓冲(96 项、溢出丢最旧),满载渲染阻塞时不丢中间点 | - |
src/mic-fft.c/h| 20 | 有界单精度 FFT,周期 Hann 窗、N/2 幅度,只在 Lua 配额内算工作区,不启动采集 | include/app_manager.h带上:FIRMWARE_ABI_VERSION11 → 20、新增权限位APP_PERM_BOARDIO(bit 12)、以及 12~20 每一级的语义注释。这一份就是这些模块- 「为什么存在」的唯一权威说明,比任何提交信息都值得入库。
- 这只是源码入库,还没接到可编译状态 —— 消费方仍在工作树里未提交:
src/microapp_mic.c的mic.fft绑定、include/microapp_mic.hport/microapp_port_lvgl.c与两块板的bsp_touch.c的 touch-track 接入bsp_pins.h的BSP_HAS_VIBRO/BSP_HAS_BOARDIO(没有它 vibro/boardio 端口编不过)main.c的端口初始化调用、src/app_manager.c的权限解析与启动错误处理- 这和整棵树本来就不可独立编译是一致的(工作树还有 180+ 项未提交),不是本次引入的问题。
- 验证:test-mic-fft 8 例、test-touch-track 6 例、test-touch-events 4 例、
- test-rtc-app 11 例、test-vibro-port 17 例、test-boardio-port 4 例、
- test-native-fftbench 4 例,共 54 例全过。
- feat(apps): spectrum 换原生 C FFT(v1.2.1),cornerprobe/fftprobe 上架
- spectrum:把纯 Lua 的 radix-2 FFT 换成 ABI 20 的原生有界 C FFT。
- 删掉 assets/micfft.lua(165 行 Lua FFT 实现),频谱计算改走固件的
- l_mic_fft,工作区仍受 Lua 配额约束。
- 显示从 32 条对数频带改成 48 条线性条纹,+10dB/-90dBFS 窗、pow0.8 条高、
- 0.2 EMA、自适应峰值;每轮 66ms 延时 + 处理,单声道采集仍是 100ms 一块。
- min_fw 8 → 20(依赖 ABI 20 的 mic.fft),版本 1.0.1 → 1.2.1。
- 注意版本号:git 里上一次是 1.0.1,商店在架的 1.1.0 是从未提交的工作树发布出去的,
- 所以这次在 git 历史里直接跳到 1.2.1,不是漏提交。
- cornerprobe / fftprobe:publish false → true,上架。
- 两者原本的 desc 写着「一次性标定工具…任务完成,留在仓库里给下一块板用」和
- 「One-off performance probe… Not for the store」。上架前改成面向用户的描述
- (切角标定工具 / 性能探针),保留技术内容、去掉「一次性」与「不上架」措辞。
- cornerprobe 的 UI 本来就要画到四角切角里做标定,test-corner-safety 的
- EXEMPT_APPS 豁免理由与此无关(不是因为它没上架),所以没动那个测试。
- 发布与验证(2026-10-26 22:44):
- 三个包已打包签名并上架:线上 index.json 25 → 27 条,index.sig 重签并验签通过;
- 其余 25 个包用 build_repo.py –skip-pack 保持字节不变。
- 设备端从线上商店 app-install cornerprobe / spectrum 均 state=done result=ESP_OK,
- 下载→验签→安装整条链路通,随后已卸载。
- tools/run-tests.py –only host 136/136 通过(含 test-spectrum-app、
- test-spectrum-native-quota)。
- feat(apps): 8 个商店应用的源码首次入库
- 这 8 个应用 2026-10-23~24 就开发完并陆续上架了,但源码一直只在工作树里,
git ls-files对它们全是 0。今天盘点未提交改动时才发现:线上商店在架的 27 个包里,- 有 8 个的源码在 git 里根本不存在,丢了只剩签过名的 .wapp 二进制。
- | 应用 | 版本 | min_fw | 说明 |
- |—|—|—|—|
- | aichat | 1.0.0 | 10 | AI Chat,OpenAI 兼容文本聊天 |
- | boardio | 1.0.0 | 16 | Board I/O,固定 BOOT/PWR 按键 |
- | calculator | 1.0.0 | 11 | 计算器 |
- | drawpanel | 1.2.0 | 18 | Draw Pad,原生线段绘制 |
- | gravitysphere | 1.2.0 | 17 | Gravity Ball,原生圆形 |
- | rtc | 1.0.0 | 12 | RTC (UTC) |
- | squareline | 1.0.0 | 15 | Squareline UI,七页演示 |
- | vibration | 1.0.0 | 14 | Vibration,单脉冲马达 |
- 每个目录含 app.json / main.lua / 模型文件,以及从微雪官方 demo 移植时带的
- LICENSE.txt + NOTICE.md(署名要求,不能丢)。
- 一处顺带修正:
apps/aichat/app-settings.lua原来是 6699B 的实体副本,与 apps/common/app-settings.lua字节完全相同;其余 6 个用应用设置的应用都是指向../common/的符号链接。按约定改成符号链接,避免以后两份漂移(转换前后cmp一致,打包字节不变)。- 验证:
- 8 个应用各自的宿主回归全过:aichat 10 / boardio 8 / calculator 17 /
- drawpanel 12 / gravitysphere 14 / rtc 11 / squareline 15 / vibration 15 例。
- tools/run-tests.py –only host 136/136。
- 这 8 个包都已在商店在架,本次只入库源码,不改任何包。
- 真机验收状态(如实记录,不是本次提交的缺口):
- drawpanel:满载端点真机验收 5/5 后上架;aichat:真机 app-install + 启动空态正常。
- gravitysphere:只确认过重装后磁贴名干净,没有功能验收记录。
- calculator / rtc / vibration / boardio / squareline:只有「上架 + 部署版本」,
- 没有真机功能验收记录(waveshare-app-port-matrix-2026-10-23.md 里当时写的是
- 「未安装/未发布/真机仍待验收」,后来直接上架了)。补验时间待定。
- docs+tests: 四天的会话记录与回归脚本入库
- 2026-10-23 → 10-26 的 66 篇文档和 62 个工具脚本一直只在工作树里。这些不是草稿:
- 它们是真机验收记录、故障取证和每条工作线的决策依据,也是这次能定位「reset=panic
- 其实是开机 abort」的唯一线索来源。128 个文件 / 15842 行,内容原样入库,没有编辑。
- docs/(66 篇,含 docs/plans/ 2 篇)按主题大致是:
- 显示/触摸/渲染:lcd-fill、render-timing、draw-layer、lvgl-line-group、lcd-line-clipping…
- 应用移植:boardio、vibration、squareline、gravity-native、native-line-and-drawpanel…
- 设置/WiFi:settings-wifi-switch、settings-wifi-forget、settings-live-volume、alignment-audit
- ABI 18/19/20:touch-events-abi18、abi19-acceptance-runbook、abi19-r8-release、
- spectrum-native、mic-stop-failure、mic-stop-port-integration…
- USB:usb-restore、usb-ownership、usb-repl-idle-expiry、usb-status-result
- Lua 健壮性:lua-error-nonstring、lua-init-guard、lua-entry-load-guard
- 板级/发布:waveshare-device-acceptance、app-port-matrix、board206-candidate-regression
- tools/(62 个):
- 51 个
test-*.py回归脚本(宿主侧,run-tests.py --only host就是跑它们) - 5 个 fixture:
native-fftbench/、mic-pcm-probe/两个夹具应用 + drawpanel-985 渲染脚本 - 2 个串口夹具:
device/capture-screen.py、device/touch-screen.py——这些天真机截图/ - 触摸取证全靠它们,包括今天解 coredump 前后的所有现场
- 2 个变异测试助手:
mutate-power-status.py、mutate-settings-about.py - 2 个构建期工具:
lvgl-render-probe.py(无硬件编译真实 LVGL 到 RGB565 探针)、 make-img.py(生成 ABI 19 lcd.image 用的 .img v1 容器)- 刻意没进这个提交的:
tools/tmp-line-mismatch-diag.py:文件名和 docstring 都写着「临时诊断」,是复用- lvgl-render-probe 构建的一次性脚本,不入库。
docs/BOARD_2_06_AMOLED_PINOUT.md:它已被跟踪、本次是修改(引脚表更新),- 属于板级改动那批,留给 D 组一起提。
- 验证:
tools/run-tests.py --only host136/136(这些脚本本来就在跑,只是没入库)。
- feat(firmware): 补齐 10-23~26 的固件改动(mic.stop 保护、设置页、LVGL 能力、板级)
- 这是四天里既有模块改动的合集。前面几个提交把新应用、新模块、诊断命令、文档和测试
- 分别入了库,剩下这 54 个文件是「改既有代码」的那部分,互相交织(测试与被测代码是
- 一起改的),硬拆会得到几个都编不过、还说不清依赖关系的提交,所以合并成这一个。
- 最要紧的一条:mic.stop 的尾数据失败保护
- HEAD 里的
l_mic_stop是直接luaL_prepbuffsize+ 循环读干再 stop;一旦尾数据缓冲 - 分配失败(内存紧时很容易),Lua 抛错,
microapp_mic_stop()根本不执行 —— 麦就挂在 - 那儿。现在改成
lua_pcall(drain_tail)保护分配阶段,之后无条件调 stop,再原样 - 重抛同一错误对象。今天真机用 OOM 注入验过:
stop_ok=false/rec_after=false, - mic=0 稳定 11.19s,之后还能重新开麦(docs/mic-stop-oom-acceptance-2026-10-26.md)。
- 其余按主题:
- mic 其它:
mic.fft绑定(ABI 20,纯计算不启动采集);microapp_port_mic.c的 - teardown / orphan 语义(join 超时把缓冲交给任务自回收,不假称任务已退出)。
- pmic:
microapp_pmic.c+ 头新增read_status快照(valid/present/percent/mv/ - state/charger_phase),映射只在 port 层,读失败 valid=0 而不谎报没电池。
- LCD/LVGL:
port/microapp_port_lvgl.c(+683)补齐 lcd.image(ABI 19 .img 容器、 - 4 幅 FIFO 淘汰)、circle_fx(ABI 17)、line(ABI 15)、flush 与 touch.events 绑定。
- 设置页:
settings_app.c(+577)、settings_store.c/h、wifi_manager.c/h、 bsp_rtc.c—— 实时音量、WiFi 开关/忘记网络、About 页、Power 页、120px 切角对齐。- USB 键盘:
usb_key.c/h、usb_key_binding.c、usb-app-console.c。 - 板级:两块板的
bsp_display.c/bsp_touch.c/bsp_pins.h(BSP_HAS_*能力宏)、 bsp_i2c.c(清总线结果只读)、bsp_imu.c、bsp_lvgl.c。- 核心:
app_manager.c(boardio 权限解析、开库失败不计崩溃、OOM 返回 NO_MEM)、 launcher.c、main.c、store_console.h。- 构建:
examples/host/CMakeLists.txt只给 LVGL 组件单独-O2(全局 -O2 候选没过 - 启动门禁,全局维持 Debug + 断言);
sdkconfig.defaults补 SPIRAM 内部保留 32KiB、 LV_USE_CLIB_MALLOC(64KiB 固定池装不下 1000 段)、TinyUSB CDC/HID、控制台回 UART。- 工具与元信息:20 个 test 脚本随被测代码更新、
app_harness.py、README、 - THIRD_PARTY_NOTICES、
docs/BOARD_2_06_AMOLED_PINOUT.md(引脚表)。 - 验证:
tools/run-tests.py --only host136/136。设备当前固件ba9ab559(abi=20) - 就是这棵树编出来的,已连续运行 1.5 小时无 panic。
- 说明:
tools/tmp-line-mismatch-diag.py是临时诊断脚本,仍未入库。
- chore(tools): 保留宽线 partial/full 差异诊断脚本
- 复用 lvgl-render-probe 的无硬件渲染构建,dump 宽线在 partial/full 两种刷新路径下
- 的差异像素坐标。是一次性诊断脚本,但确实定位过 lcd.line 的宽线刷新问题,
- 按用户要求保留入库,文件名保持原样(tmp- 前缀说明它的性质)。
- feat(console): screen-shot / touch / render-diag 三条 REPL 诊断命令入库
- 这三个模块一直只在工作树里。但 f4deec3 提交的 store_console.c 已经在分派它们
- (
screen-shot/touch/render-diag),所以 HEAD 里那几条分派是链接不过的 - ——这次把实现补上,正好把这个洞堵住。
screen-shot-console.c/h:按需串口截图。410x502 RGB565 分块传输 + CRC32 校验,- 成功才在主机侧落 PNG;不向 Lua 或网络暴露,只是本地调试入口。
touch-console.c/h:本地串口有界触摸注入(tap / hold / swipe),带 TOUCH_BEGIN /- TOUCH_END 回执,和原生界面与 Lua 共用板级读取入口;按调用入口区分消费者,
- 不依赖任务身份,state 查询不消费 read 的释放边沿。
render-diag.c/h:按需渲染计时,固定 5 秒窗口、无逐帧日志、无动态分配,- 只记 Lua 绘图任务(0 入帧 / 1 得锁 / 2 回调返回 / 3 收尾)与 LVGL 任务的阶段。
- CMakeLists 只带了这三条源码与
esp_app_format(后者是已提交的 boot-status 读 esp_app_desc需要的)。同一文件里 B 组的东西——port/ui/touch-track.c与port/microapp_port_{rtc,vibro,boardio}.c——故意留在工作树,下一刀再提。- 验证:test-screen-shot 9 例、test-touch-console 23 例、test-render-diag 2 例全过;
- tools/run-tests.py –only host 136/136。
- 注意:这仍是「从脏工作树里切一刀」,工作树还有 190+ 项未提交,所以这个 commit
- 不是自洽可编译的快照。
- fix(pmic): 上电探活改有界重试,BOOTDIAG 落盘并新增 pmic-diag
- 真机上两次「无人操作下自己重启」,读回 flash coredump 才看清不是运行中崩溃:
- abort() 发生在 app_main 里 main.c:325 的 ESP_ERROR_CHECK(bsp_board_power_on()),
- rc=261 (ESP_ERR_NOT_FOUND) 来自 microapp_pmic_axp2101_attach() 的 CHIP_ID 探活。
- coredump 里只有 6 个任务,确认死在初始化阶段。于是 reset=panic 其实是两步链的
- 第二步:先有一次复位,那次启动在探活上失败并 abort,再重启一次才跑起来。
- 改动:
- port/microapp_pmic_axp2101.c:探活改成有界延迟重试(任何失败都重试,退避
- 10/20/40ms,最多 4 次)。刻意保留三条既有边界——真 NACK 不清总线(不把「器件
- 缺失」掩盖成「总线问题」)、清总线只做一次且清不动就不再试、诊断留最后一次原因。
- 没动 main.c 的 ESP_ERROR_CHECK 语义:上电失败后 display 必然也失败,把第一处
- abort 改成「继续」只是把 panic 推到下一行。
- bsp/2_06_amoled/bsp_pmic.c:BOOTDIAG 先落盘到 RTC_NOINIT 保留区再发 USB。
- 失败那次启动会 abort 重启、主机来不及读 FIFO,落盘后重启还能读回来。
- bsp/1_28_gc9a01/bsp_pmic.c:没 PMIC 的板给 NULL 桩。
- store_console.c:新增只读命令 pmic-diag(没塞进 boot-status,那个命令体禁止
- 出现 bsp_,tools/test-boot-status.py 用字符串断言把关)。
- tools/test-pmic-diag.py:新命令回归;test-pmic-boot-diagnostics.py 补两例
- (失败后能读回、干净启动必须是 null);test-power-status.py 与
- test-repl-line-overflow.py 补编译桩。
- docs/:mic.stop 尾数据失败的真机验收 + 本次 panic 的根因与修法。
- 验证:
- test-pmic-boot-diagnostics.py 19/19;test-pmic-diag.py 4/4;
- tools/run-tests.py –only host 136/136。
- 变异测试:去掉落盘、命令永远报 none、把重试次数改 1、让 NACK 也清总线,
- 四种变异分别让对应用例变红;还原后全绿(源码 sha256 校验一致)。
- 真机:只写 app 分区刷入(不碰 NVS/appfs),刷后 pmic-diag 读回 none、
- 25 应用与 appfs 用量未变、桌面与应用起停正常。固件 elf_sha256 ba9ab559…。
- 说明两点:
- 这两个文件(store_console.c / bsp.h)本次提交还带上了此前一直未提交的 PMIC
- 诊断工作(s_last_error、BOOTDIAG、boot-status 命令、bsp_i2c_last_clear_result),
- 它们是本次改动的前置。同文件里与 PMIC 无关的未提交改动(USB PHY 交接、
- screen-shot writer、lcd-line-status、display flush 声明)也一并进来了——因为
- 它们和本次改动缠在同几个 hunk 里,拆开会让提交不可编译。
- 工作树仍有 200+ 未提交改动,所以这个 commit 不是自洽可编译的快照。