GitHub 提交日报 · 2026-10-26

自动汇总 2026-10-26 当天 hummingg 在 GitHub 上的提交。

hummingg/skills

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_VERSION 11 → 20、新增权限位
    • APP_PERM_BOARDIO(bit 12)、以及 12~20 每一级的语义注释。这一份就是这些模块
    • 「为什么存在」的唯一权威说明,比任何提交信息都值得入库。
    • 这只是源码入库,还没接到可编译状态 —— 消费方仍在工作树里未提交:
    • src/microapp_mic.c 的 mic.fft 绑定、include/microapp_mic.h
    • port/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 host 136/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 host 136/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…。
    • 说明两点:
      1. 这两个文件(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 里,拆开会让提交不可编译。
      1. 工作树仍有 200+ 未提交改动,所以这个 commit 不是自洽可编译的快照。