16 Commits

Author SHA1 Message Date
wandering1 7027718dcd Merge remote-tracking branch 'origin/master'
CI / 静态门禁 (pre-commit) (push) Failing after 31s
CI / 主机侧单测 (MSVC) (push) Failing after 44s
冲突三处,全部按「保留我方去废话后的结构,吸收远端新增事实」解:

- docs/硬件平台/ADC通道映射说明.md
  远端新增 §7.2 ④ 段变比登记(电压族 606.06:1、电流族 29.4118 A/V)与
  §8 逐通道验证四步;我方上一笔把该文改成只留现状。合并后 §7.1 四段表
  的 ④ 行改为「已定死(参数算定)」并指向 §7.2,§8 保留四步验证(去掉
  已完成标记与历史挂账叙述),§8.1 静态记录与 §8.2 交流动态记录并存。
- docs/内存管理/RAM使用分析与优化方案.md、RAM预算台账.md
  受管内存快照区取远端数值,随后按合并后真实 .map 重跑
  check_mem_numbers.py --write 与 ram_baseline.py --write 同步(构建
  Program Size: Code=255160 RO=31204 RW=2080 ZI=152152,0 错误 0 警告)。

顺带修 §7.2 末尾一处指向 docs/任务规划/数据可信.md §8 的失效章节引用
(该文档已删 §8),改成陈述句。

门禁:check_doc_links --all --sections-strict 223 篇全通过、无法判定 0;
pre-commit 全 Passed。
2026-11-09 10:59:45 +08:00
wandering1 acf9f0d7e5 增加元器件说明 2026-11-09 10:27:22 +08:00
wandering1 ed1fe221e9 Merge pull request 'docs(wave): #93 修复板级验收轮证据与文档回填(续 #94)' (#98) from docs-94-evidence into master
CI / 静态门禁 (pre-commit) (push) Failing after 4m29s
CI / 主机侧单测 (MSVC) (push) Successful in 36s
Reviewed-on: http://100.123.83.113:3001/wandering1/STM32F4-Base/pulls/98
2026-11-08 10:56:47 +08:00
super_agent_bot 1dbead5177 docs(wave): #93 修复板级验收轮证据与设计面回填(PR #94 第二提交)
CI / 静态门禁 (pre-commit) (pull_request) Failing after 3m59s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 40s
- 证据目录 docs/测试说明/测试数据/wave_fix_20261107/:Before(旧固件烧录前实测
  oldN_P0..P3)/ After(新固件 19:10:36 构建,F1 五条 + F2 五条全过)逐帧 raw3200+PNG、
  serial 摘录与 sha 台账、boot_new2/3 启动报告、restore_verify(100 件逐字节还原 OK)、
  samples 三件与 README(含复现口令与 i104 环境条件如实记录)。
- 设计说明 §10 修复记录:板级验收结果行回填 + 台架环境新事实(拼接盘态口径相抵记账)+
  两条 i104 观察项(软复位首绑必失败 / 重试成功静默)建议各自开票。
- 手册 §4 步 7 判废行判读表 + 开页作废纪律、§8 [ERR] 停幕例外的坏段轮点名放行;
  ui_task.c 注释指向改 §4 步 7 与 §8(纯注释,Code=254960 复建一致)。
- 任务规划 README 独立行:#93 修复与板级验收里程碑。
2026-11-07 23:42:10 +08:00
wandering1 fe84a80912 Merge pull request 'ftl: add P0 bench verification probes (#85)' (#96) from dig-volume-view-283370226187 into master
CI / 静态门禁 (pre-commit) (push) Failing after 46s
CI / 主机侧单测 (MSVC) (push) Failing after 45s
Reviewed-on: http://100.123.83.113:3001/wandering1/STM32F4-Base/pulls/96
2026-11-07 22:20:58 +08:00
wandering1 ebb64f6df2 Merge branch 'master' into dig-volume-view-283370226187
CI / 静态门禁 (pre-commit) (pull_request) Failing after 29s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 44s
2026-11-07 22:20:40 +08:00
wandering1 01fde986ee Merge pull request 'docs(wave): 触发源字母汉字化注记——手册补 src 速查表,人读文案改「保护触发(P)」式(#83)' (#97) from docs-trig-legend-83-6f432acbeab7 into master
Reviewed-on: http://100.123.83.113:3001/wandering1/STM32F4-Base/pulls/97
2026-11-07 22:12:29 +08:00
super_agent_bot 82a84a4264 docs(wave): 触发源字母汉字化注记——手册补 src 速查表,人读文案改「保护触发(P)」式(#83)
CI / 静态门禁 (pre-commit) (push) Failing after 45s
CI / 主机侧单测 (MSVC) (push) Failing after 42s
用户反馈「P 触发」这类字母看不懂(#83 评论 755)。

- 手册开头补「触发源字母速查」:M=手动录波 / P=保护启动触发 /
  T=定时自抓(bench)/ -=本次上电未触发;注明四字母是串口与台架
  脚本的 grep 契约、不改汉字,契约定义属主仍指设计说明 §9;
- 手册 §1/§5/§9、docs/README、任务规划 README §2.0 的人读文案把
  裸字母改成「保护触发对时刻(src=P)」式汉字在前的写法;
- 串口字段 src=P / src=T 与测试数据目录下的抓帧原件逐字保留。
2026-11-07 22:09:39 +08:00
wandering1 2aa4561af6 Merge branch 'master' into dig-volume-view-283370226187
CI / 静态门禁 (pre-commit) (push) Failing after 46s
CI / 主机侧单测 (MSVC) (push) Failing after 45s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 46s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 44s
2026-11-07 22:06:44 +08:00
wandering1 33b52410f9 Merge pull request 'fix(wave): bench 定时自抓到期判定无符号回绕恒真修复,第四幕板级闭环入档(#84)' (#95) from exec-issue-84-1f621ac1c3ce into master
CI / 静态门禁 (pre-commit) (push) Failing after 45s
CI / 主机侧单测 (MSVC) (push) Failing after 45s
Reviewed-on: http://100.123.83.113:3001/wandering1/STM32F4-Base/pulls/95
2026-11-07 22:05:57 +08:00
wandering1 c6043af6c0 Merge pull request 'fix(wave): 回放页开页作废钉表重扫 + 判废串口逐次留痕(#93 F1/F2)' (#94) from fix-wave-findings-b8c190da2e56 into master
CI / 静态门禁 (pre-commit) (push) Has been cancelled
CI / 主机侧单测 (MSVC) (push) Has been cancelled
Reviewed-on: http://100.123.83.113:3001/wandering1/STM32F4-Base/pulls/94
2026-11-07 22:02:06 +08:00
super_agent_bot aa831968ea ftl: add P0 bench verification probes (#85)
CI / 主机侧单测 (MSVC) (push) Has been cancelled
CI / 静态门禁 (pre-commit) (pull_request) Has been cancelled
CI / 主机侧单测 (MSVC) (pull_request) Has been cancelled
CI / 静态门禁 (pre-commit) (push) Has been cancelled
Add two bench empirical verification probes for the whole-volume stale
view investigation:

1. Write-commit readback probe in dhara_nand_prog(): after a successful
   program, immediately read back the same physical page and compare
   byte-by-byte. Log ECC errors and data mismatches with a counter.

2. Map state logging in ftl_flush_cache(): after each successful
   dhara_map_write, log the journal root/head/tail/epoch/count to
   correlate with bench stale-view events.

Both probes are marked as bench-only and should be removed before
production release.
2026-11-07 21:57:46 +08:00
super_agent_bot 1df02c4658 fix(wave): bench 定时自抓到期判定无符号回绕恒真修复,第四幕板级闭环入档(#84)
CI / 静态门禁 (pre-commit) (push) Failing after 4m54s
CI / 主机侧单测 (MSVC) (push) Successful in 51s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 4m29s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 41s
F0(唯一代码改动,#if DTU_BENCH 闸内,产品影像零漂移):
adc_task.c 原无符号判据 (uint32_t)(now-next)>=PERIOD 在 next=now+PERIOD
挂出后立刻成立(now<next 差值回绕成巨数),台架实证 1 kHz 连发请求:
ovf 每秒 +1000、段节奏被去重钳到 ~1.5 s/段,违背 ON 行承诺
「1 seg / 2000 ms」。改有符号比较(半程内回绕安全)。修复后实测
seg 恰 +5/10 s;bench Code=255284 vs 产品 254820(差 464 B)证门控。

第四幕三判据板级实证(手册 §6 步骤 3 逐条对上):
- 临界占卷命中唯一 [ERR] seg drop: ring abandoned(idx=36),心跳
  err 恰 +1,段号不推进、同号 5250 B 重写(P1/P2/P3 + sha256 固化);
- 长占卷 72.6 s 静默自弃 err 1→15 零留痕(不是每拍刷屏最严形态);
- 占卷期间 104 STARTDT 实测应答 + UI 主菜单照常(丢录波不丢采集)。

现场发现 F1(单发未复现软件复位,只记不断)/F2(lftpd 放锁早于
DOWNLOAD 落账 ~0.13 s,临界命中方法钥匙)/F3(pack_next 留痕板级
首见,同族分支)入设计说明 §10 闭环记录。

文档销项:设计说明 §5.2 L163 / §10 留痕名清单 / 板级行 / 未跑清单
四处标记闭环 + 新增「bench 定时自抓与占卷弃段观察闭环记录」小节;
到场轮手册 §1 第四幕行标已完成 + §6 收工状态注记。

收工:FILLER/FILL2/FILL3 删净,产品构建 21:32:52 已烧(除 #53 i104
首绑 FAIL 行外 8/9 required 全过、端口 STARTDT 实测活,沿用 11-06
先例定性);UI 主菜单;证据目录 docs/测试说明/测试数据/
wave_bench_20261107/(README 判据对照 + 原始/复原串口摘录 + 各轮
JSON + 启动锚点两跑日志)。
2026-11-07 21:55:06 +08:00
wandering1 ad87f979b1 docs(规约): 删除编号规范.md,生效规则并入文档规范 §7.1
用户裁定:docs/编号规范.md 在项目里已无意义,删除。

依据:该文 253 行里真正仍生效的只有两条规则(新条目一律不发编号、
人读文档存量编号继续清退)和一张存量族表;其余内容早有归属——两道
编号门禁的退役记录在 docs/门禁说明/id-check.md 与 id-check-new.md,
手工普查与恢复机器面在 scripts/archive/id_gate/README.md。留着就是
第二真相源,同一事实写在两处迟早漂移。

处理:
- docs/文档规范.md 新增 §7.1「条目与编号:一律不发」,承接规则、
  场景表、三条硬规矩、存量族表、已停发旧号族清单、不是编号的清单、
  清理动作与「没有机器门禁兜底」四段。
- 活跃引用 62 处逐条改指 §7.1 或归档 README:AGENTS.md 2 处、
  门禁说明三篇 18 处、其余文档 11 篇、代码与脚本 10 处、rename_maps
  七个 record 字段、.dsh/skills 四个文件 8 处。
- 归档区 107 处去掉 docs/ 前缀当纯文本提及;编号治理历史.md 45 处
  改为「原编号规范 §N」,避免被 doc-links 当自引用解析。
- 顺带修正 scripts/archive/id_gate/README.md 里仍称旧文为现行规范
  的表述。

门禁:check_doc_links --all --sections-strict 220 篇全通过、无法判定 0;
pre-commit 全 Passed。
2026-11-06 18:32:04 +08:00
wandering1 c7c0125982 docs: 增加硬件平台关键元器件笔记(压敏电阻 10D102K)
docs/硬件平台/关键元器件.md:记 10D102K 氧化锌压敏电阻的工作
原理(正常高阻、瞬态击穿钳位、浪涌后恢复)与典型应用场景,
供选型与防护设计查阅。
2026-11-06 17:43:55 +08:00
wandering1 163b933715 docs: 数据可信与 ADC 通道映射只留现状,清历史与悬空引用
数据可信.md 与 ADC通道映射说明.md 按「只写现状」口径重写:
删历史沿革、推理过程与已删小节的残留指针,保留现行判据。

- 数据可信:§2.7 删「当时的证据」六行表;§4.6.1 标题改「范围与
  幅度上限」、四行改现状陈述;§4.6.2 删轮次名历史映射注;§4.6.3
  段文件行去过程语;删节尾孤立排程段;§4.4 负零点段收成现状结论。
- 数据可信:把「系数合法带」从已删的 §8 风险表搬回 §4.1(代码头注释
  仍指向它,属搬回不是新发明)。
- 数据可信:行号纠错 adc_task.c:382 -> :425、protect_task.c:245 ->
  :268,逐个 grep 核对。
- 跨文档与代码:12 处指向已删 §4.6.4/§4.6.5/§8/§9/§10 的悬空引用改到
  现存小节或内联结论,涉 6 处 App 源文件头注释与 6 篇文档。
- 两个 SVG 生成器文案同步重跑,产物同笔提交。

check_doc_links --all 通过(221 篇);pre-commit 全绿。
2026-11-06 17:41:11 +08:00
136 changed files with 4680 additions and 867 deletions
@@ -1,13 +1,13 @@
--- ---
name: id-family-semantic-migration name: id-family-semantic-migration
description: 编号族整族清退/停发 playbook:把一个编号族(字母+数字如保护功能号 L1-x~L5-x、网络条目号 F-*、登记簿旧号 N-x、台架阶段裸形 T1~T3、用例号 TC-*,或中文前缀「卡」+ 数字这类门禁语料里**没有机器识别面**的族)在全仓代码注释、测试、活文档与门禁配置里改成语义短语(含销项删行与逐号换算表入档),或把「不清退」裁定写成硬口径入档。触发语:清退某族编号、编号改成语义名或语义短语、还有多少号可清、残留多少、批次二/批次三/批次五、「卡 0」「卡 0b」「卡 1~12」、销项删行并去除相关编号、id-check 报悬空引用或不可判定超限、不可判定引用绝对数涨点、「这一族不做了」。 description: 编号族整族清退/停发 playbook:把一个编号族(字母+数字如保护功能号 L1-x~L5-x、网络条目号 F-*、登记簿旧号 N-x、台架阶段裸形 T1~T3、用例号 TC-*,或中文前缀「卡」+ 数字这类门禁语料里**没有机器识别面**的族)在全仓代码注释、测试、活文档与门禁配置里改成语义短语(含销项删行与逐号换算表入档),或把「不清退」裁定写成硬口径入档。触发语:清退某族编号、编号改成语义名或语义短语、还有多少号可清、残留多少、批次二/批次三/批次五、「卡 0」「卡 0b」「卡 1~12」、销项删行并去除相关编号、id-check 报悬空引用或不可判定超限、不可判定引用绝对数涨点、「这一族不做了」。
whenToUse: 用于**整族**处理:先判这一族有没有机器识别面 → 清点存量 → 逐族分类 → 分批派单清退 → 收口 → 回写 docs/编号规范.md 对应节。单条待办行销项并写 void 别名用 ledger-row-retire-void-id;某个事实数(页数、叶数、钩子数)变了要同步全仓用 stale-doc-count-sweep;单个文件改名或挪目录用 scripts/rename_ref.py;跑 HEAD 版对照组用 task-worktree 的净室 worktree。这四类不由本技能覆盖,但「涨点归因」一节会用到净室 worktree。 whenToUse: 用于**整族**处理:先判这一族有没有机器识别面 → 清点存量 → 逐族分类 → 分批派单清退 → 收口 → 回写 docs/文档规范.md §7.1。单条待办行销项并写 void 别名用 ledger-row-retire-void-id;某个事实数(页数、叶数、钩子数)变了要同步全仓用 stale-doc-count-sweep;单个文件改名或挪目录用 scripts/rename_ref.py;跑 HEAD 版对照组用 task-worktree 的净室 worktree。这四类不由本技能覆盖,但「涨点归因」一节会用到净室 worktree。
version: 1.1.0 version: 1.1.0
--- ---
# 编号族清退成语义标识 # 编号族清退成语义标识
**2026-10-29 用户裁定:全族一律停发**(含 `docs/编号规范.md` §4.1 那五个存量族)——本 playbook 的「停发」分支默认已成立, **2026-10-29 用户裁定:全族一律停发**(含 `docs/文档规范.md` §7.1 那幾个存量族)——本 playbook 的「停发」分支默认已成立,
现在唯一还需要决策的是**要不要清退存量**(全仓改语义 + 销项删行 + 逐号换算表入档)。 现在唯一还需要决策的是**要不要清退存量**(全仓改语义 + 销项删行 + 逐号换算表入档)。
**动手前先判这一族有没有「机器识别面」**——它决定计数口径的来源与落地去处,两条路的做法**正好相反**: **动手前先判这一族有没有「机器识别面」**——它决定计数口径的来源与落地去处,两条路的做法**正好相反**:
@@ -47,7 +47,7 @@ version: 1.1.0
10. 核队友交付 10. 核队友交付
11. 分笔提交走真实 pre-commit 钩子 11. 分笔提交走真实 pre-commit 钩子
12. 收口只认门禁自身计数 12. 收口只认门禁自身计数
13. 回写 docs/编号规范.md 13. 回写 docs/文档规范.md §7.1
14. 裁定「不做」也要写成可执行硬口径入档 14. 裁定「不做」也要写成可执行硬口径入档
> 本节全文(逐字搬移、未改写,含命令与实测数字)→ [steps-alpha-numeric-family.md](reference/steps-alpha-numeric-family.md)。动手前先读那篇。 > 本节全文(逐字搬移、未改写,含命令与实测数字)→ [steps-alpha-numeric-family.md](reference/steps-alpha-numeric-family.md)。动手前先读那篇。
@@ -2,7 +2,7 @@
> 本文由 id-family-semantic-migration 的 SKILL.md「Steps(字母+数字族:门禁看得见的那一路)」一节逐字外置而来(渐进展开:主文件只留索引与指针)。步骤号沿用原文,未重编。 > 本文由 id-family-semantic-migration 的 SKILL.md「Steps(字母+数字族:门禁看得见的那一路)」一节逐字外置而来(渐进展开:主文件只留索引与指针)。步骤号沿用原文,未重编。
1. **确认范围与定调**:先按开头的表判识别面(无识别面 → 走下一节);再读 `docs/编号规范.md` §4.1(族总表,穷举)、§4.1.1(已停发栏),存量与批次见 `scripts/archive/id_gate/编号治理历史.md` §9,明确本族属主登记处(`owner_docs_glob`);旧判据「有脚本按字面量匹配它」自 2026-10-29 起作废——全族一律停发。清退 = 全仓改语义;停发 = 在规范表里写死不再新增引用(`id_registry.json` 的游标冻结只是裁定留痕,2026-10-29 起无机器读者)。 1. **确认范围与定调**:先按开头的表判识别面(无识别面 → 走下一节);再读 `docs/文档规范.md` §7.1(存量族表与已停发族表),存量与批次见 `scripts/archive/id_gate/编号治理历史.md` §9,明确本族属主登记处(`owner_docs_glob`);旧判据「有脚本按字面量匹配它」自 2026-10-29 起作废——全族一律停发。清退 = 全仓改语义;停发 = 在规范表里写死不再新增引用(`id_registry.json` 的游标冻结只是裁定留痕,2026-10-29 起无机器读者)。
2. **按族实测三口径(字面量 / 站点 / 文件),不用 grep 估数**。`Checker.refs` 是 **dict(字面量 → 文件集合)不是方法**,`ck.refs(fam)` 这种写法会 `TypeError`;站点数门禁不直接给,用族正则重扫它自己的语料: 2. **按族实测三口径(字面量 / 站点 / 文件),不用 grep 估数**。`Checker.refs` 是 **dict(字面量 → 文件集合)不是方法**,`ck.refs(fam)` 这种写法会 `TypeError`;站点数门禁不直接给,用族正则重扫它自己的语料:
```python ```python
import sys; sys.path.insert(0, "scripts") import sys; sys.path.insert(0, "scripts")
@@ -58,9 +58,9 @@
./.venv/Scripts/python.exe scripts/archive/id_gate/check_ids.py --strict 2>&1 | tail -1 # [OK] 校验 1~6 无错误 ./.venv/Scripts/python.exe scripts/archive/id_gate/check_ids.py --strict 2>&1 | tail -1 # [OK] 校验 1~6 无错误
``` ```
报告「字面量 8787→8299→7828」「不可判定绝对数 1161→984→982→978(上限 1166)」「可判定比例 88.14%(基线 86.0%,容差 0.1pp)」。**绝对数与比例两根线都要报**:把可判定引用改成散文会稀释比值,所以另有不可判定绝对数上限。涨点归因见「净室归因」一节。 报告「字面量 8787→8299→7828」「不可判定绝对数 1161→984→982→978(上限 1166)」「可判定比例 88.14%(基线 86.0%,容差 0.1pp)」。**绝对数与比例两根线都要报**:把可判定引用改成散文会稀释比值,所以另有不可判定绝对数上限。涨点归因见「净室归因」一节。
13. **回写 `docs/编号规范.md`**:§4.1 族表(停发/待清栏)、§4.1.1 已停发栏;存量表与批次结果表在 `scripts/archive/id_gate/编号治理历史.md` §9(只减不增、清点数字按最终实测同步);表格若保留动手前的清点数,**明确标注「不是当前存量,是动手前基线」**,否则就是拿旧数当现状。**用户裁定原文与理由直接写进对应节**(§4.1.1 停发行 + 该族的批次结论段落)——2026-10-28 起不再往变更记录写流水(`docs/文档规范.md` §5.1)。 13. **回写 `docs/文档规范.md` §7.1**:存量族表与已停发族表;存量表与批次结果表在 `scripts/archive/id_gate/编号治理历史.md` §9(只减不增、清点数字按最终实测同步);表格若保留动手前的清点数,**明确标注「不是当前存量,是动手前基线」**,否则就是拿旧数当现状。**用户裁定原文与理由直接写进对应节**(§4.1.1 停发行 + 该族的批次结论段落)——2026-10-28 起不再往变更记录写流水(`docs/文档规范.md` §5.1)。
14. **裁定「不做」也要写成可执行硬口径入档**(不是只划掉一行——「不做」最容易被读成「那还可以继续发号」): 14. **裁定「不做」也要写成可执行硬口径入档**(不是只划掉一行——「不做」最容易被读成「那还可以继续发号」):
- §4.1.1「已停发」栏新增该族一行:**游标冻结、现存号只减不增、新用例改用语义化测试函数名 + 文档表格行名**,并写清与 §4.1 存量族栏的关系(那五族 2026-10-29 起也一律停发); - §4.1.1「已停发」栏新增该族一行:**游标冻结、现存号只减不增、新用例改用语义化测试函数名 + 文档表格行名**,并写清与 §4.1 存量族栏的关系(那五族 2026-10-29 起也一律停发);
- 批次段落写明裁定原文与理由(归档 `scripts/archive/id_gate/编号治理历史.md` §9.1——§9 一族的事实源已在归档篇,规范正文只留口径)(该族是唯一真被脚本按字面量匹配的族:C 断言标签 + 测试函数名 + 文档用例表三处同一号),并给出**将来真要清退的前置条件**:追溯器(`check_test_traceability.py`)先同时认新旧两种形态、并行核对通过,**不许先改文档再改代码**; - 批次段落写明裁定原文与理由(归档 `scripts/archive/id_gate/编号治理历史.md` §9.1——§9 一族的事实源已在归档篇,规范正文只留口径)(该族是唯一真被脚本按字面量匹配的族:C 断言标签 + 测试函数名 + 文档用例表三处同一号),并给出**将来真要清退的前置条件**:追溯器(`check_test_traceability.py`)先同时认新旧两种形态、并行核对通过,**不许先改文档再改代码**;
- 全文核「等你裁定 / 需你裁定」悬空表述残留数归 0; - 全文核「等你裁定 / 需你裁定」悬空表述残留数归 0;
- 无机器识别面的族落地面不同(`docs/编号规范.md` §4.1.1 一行 + 归档 `编号治理历史.md` §9.3 换算表 + 叙述同步三处),见下一节第 7 步。 - 无机器识别面的族落地面不同(`docs/文档规范.md` §7.1 的已停发族表一行 + 归档 `编号治理历史.md` §9.3 换算表 + 叙述同步三处),见下一节第 7 步。
@@ -48,7 +48,7 @@
5. **派单前写一份 spec 文件**(`ci-artifacts/card_retire_spec.md`),作为各道唯一口径来源,含五块:① 背景与**用户裁定原文**;② 逐号映射表(旧号形态 → 语义短语 → 属主出处);③ 措辞规则(补短语时括号怎么降级、动不动字符串字面量、生成器归属、悬空引用怎么判);④ 硬约束(BOM 原样补回、行尾由 `.gitattributes` 写死、冻结历史行与原始证据不回改、代码头注释引用的设计约束章节保留、带 BOM 文件名单);⑤ 自检与交付格式(逐文件命中数、删了哪几行、残留数、门禁复跑结果)。`send_message` 只发路径 + 关键裁定,长中文正文不要整段塞进消息(一次串多条长消息会撑爆 120s,发出 1 条后 abort,剩余未发)。 5. **派单前写一份 spec 文件**(`ci-artifacts/card_retire_spec.md`),作为各道唯一口径来源,含五块:① 背景与**用户裁定原文**;② 逐号映射表(旧号形态 → 语义短语 → 属主出处);③ 措辞规则(补短语时括号怎么降级、动不动字符串字面量、生成器归属、悬空引用怎么判);④ 硬约束(BOM 原样补回、行尾由 `.gitattributes` 写死、冻结历史行与原始证据不回改、代码头注释引用的设计约束章节保留、带 BOM 文件名单);⑤ 自检与交付格式(逐文件命中数、删了哪几行、残留数、门禁复跑结果)。`send_message` 只发路径 + 关键裁定,长中文正文不要整段塞进消息(一次串多条长消息会撑爆 120s,发出 1 条后 abort,剩余未发)。
6. **逐处替换断言命中数**(同第 7 步的 `rep(tag, old, new, want)`),且 `old` 串**从原文取、不凭记忆敲**:本仓中文引号与 ASCII 双引号混用(实测某文档里的「中文引号」其实是 ASCII `"`),凭印象写 `old` 必 `got=0`;断言抛错后先 `git status --porcelain=v1 -- <文件>` 自证文件未被别道改动,再回读该行真身重跑。删行类改动单独记 tag 并打印删了几行、行号与原行长度。多道并行时同一文件常被别道改过:`edit` 报 `file changed since it was read` → 重新 `read` 再改;报 `ReplaceFileW EIO (Win32 1175)` → 先自证文件字节完好(BOM / CRLF / `EF BF BD` 三项)再重试同一笔,不要顺手改内容。 6. **逐处替换断言命中数**(同第 7 步的 `rep(tag, old, new, want)`),且 `old` 串**从原文取、不凭记忆敲**:本仓中文引号与 ASCII 双引号混用(实测某文档里的「中文引号」其实是 ASCII `"`),凭印象写 `old` 必 `got=0`;断言抛错后先 `git status --porcelain=v1 -- <文件>` 自证文件未被别道改动,再回读该行真身重跑。删行类改动单独记 tag 并打印删了几行、行号与原行长度。多道并行时同一文件常被别道改过:`edit` 报 `file changed since it was read` → 重新 `read` 再改;报 `ReplaceFileW EIO (Win32 1175)` → 先自证文件字节完好(BOM / CRLF / `EF BF BD` 三项)再重试同一笔,不要顺手改内容。
7. **落地位置写死(这一族只有这几条兜)**: 7. **落地位置写死(这一族只有这几条兜)**:
- `docs/编号规范.md` **§4.1.1「已停发的族」表加一行**,三列齐全,第三列直写「⚠ **这一族从来没有机器面**:中文前缀不进任何编号语料(族 pattern 全是拉丁形态),而两道编号门禁已于 2026-10-28 / 29 退役 → 只有本表 + 归档换算表 + 评审三条兜;`id_aliases.json` 刻意不登记(没有机器读者,登记等于多一张没人核的表)」; - `docs/文档规范.md` **§7.1「已停发、只读的旧号」段加一行**,三列齐全,第三列直写「⚠ **这一族从来没有机器面**:中文前缀不进任何编号语料(族 pattern 全是拉丁形态),而两道编号门禁已于 2026-10-28 / 29 退役 → 只有本表 + 归档换算表 + 评审三条兜;`id_aliases.json` 刻意不登记(没有机器读者,登记等于多一张没人核的表)」;
- `scripts/archive/id_gate/编号治理历史.md` **§9.3 逐号换算表**(旧号形态 → 语义短语 → 现行口径出处;本族实测 14 行 = 0、0b、1~12)+ 同篇 §9 批次段落(裁定原文与逐号结论都落在归档正文),**写明旧号永久作废、不得重新取走**; - `scripts/archive/id_gate/编号治理历史.md` **§9.3 逐号换算表**(旧号形态 → 语义短语 → 现行口径出处;本族实测 14 行 = 0、0b、1~12)+ 同篇 §9 批次段落(裁定原文与逐号结论都落在归档正文),**写明旧号永久作废、不得重新取走**;
- 表内**把形态写成「卡」+ 数字而不复述字面量**:规范本身是门禁语料,复述字面量会把「讲规则的文档」变成自己的引用站点; - 表内**把形态写成「卡」+ 数字而不复述字面量**:规范本身是门禁语料,复述字面量会把「讲规则的文档」变成自己的引用站点;
- **同步叙述**:`AGENTS.md`「文档与图形」的销项条目、`docs/README.md`(例:`数据可信.md = 三项阻塞任务` → 两项)、`docs/任务规划/README.md`、`docs/任务规划/登记簿.md`——「剩余三项」这类旧口径实测归零; - **同步叙述**:`AGENTS.md`「文档与图形」的销项条目、`docs/README.md`(例:`数据可信.md = 三项阻塞任务` → 两项)、`docs/任务规划/README.md`、`docs/任务规划/登记簿.md`——「剩余三项」这类旧口径实测归零;
@@ -21,4 +21,4 @@
- **误报跟着改**:「< 40KB」是绘制缓冲红线,与页数无关。 - **误报跟着改**:「< 40KB」是绘制缓冲红线,与页数无关。
- **带日期戳的测量臆改新数**:「2026-10-26 实跑 …覆盖 40 页」改成 47 就是把历史测量冒充现值;只加「当时」。 - **带日期戳的测量臆改新数**:「2026-10-26 实跑 …覆盖 40 页」改成 47 就是把历史测量冒充现值;只加「当时」。
- **用截断的 grep 输出判定**:`cut -c` 截掉的后半句常含日期戳/口径,据此分类必错。 - **用截断的 grep 输出判定**:`cut -c` 截掉的后半句常含日期戳/口径,据此分类必错。
- **新写文本别再造编号**:两道编号门禁都已退役(全库八项校验 2026-10-28、只查新增行 2026-10-29,脚本与白名单在 `scripts/archive/id_gate/`),**撞号不再有机器报警**,只剩规范与评审——所以这批文本的形态自查要自己做(`docs/编号规范.md` §1 三句;要机器帮忙就手工跑 `scripts/archive/id_gate/check_ids_new.py --worktree`)。 - **新写文本别再造编号**:两道编号门禁都已退役(全库八项校验 2026-10-28、只查新增行 2026-10-29,脚本与白名单在 `scripts/archive/id_gate/`),**撞号不再有机器报警**,只剩规范与评审——所以这批文本的形态自查要自己做(`docs/文档规范.md` §7.1;要机器帮忙就手工跑 `scripts/archive/id_gate/check_ids_new.py --worktree`)。
+2 -2
View File
@@ -704,9 +704,9 @@ repos:
# (保留可复现性,**不再进提交门禁**)。退役路线与判据替换见规范 §8.5。 # (保留可复现性,**不再进提交门禁**)。退役路线与判据替换见规范 §8.5。
# 14) 编号门禁(2026-10-28 上线只查新增行那一道;2026-10-29 用户裁定**整体退役**,钩子已摘) # 14) 编号门禁(2026-10-28 上线只查新增行那一道;2026-10-29 用户裁定**整体退役**,钩子已摘)
# 退役后编号形态没有机器面:判据回到 docs/编号规范.md §1 三句自问 + §4.1 族总表 + 评审。 # 退役后编号形态没有机器面:判据回到 docs/文档规范.md §7.1(一律不发编号)+ 评审。
# 脚本移入 scripts/archive/id_gate/check_ids_new.py(手工可跑,--self-test 保留),留档说明 # 脚本移入 scripts/archive/id_gate/check_ids_new.py(手工可跑,--self-test 保留),留档说明
# → docs/门禁说明/id-check-new.md;手工普查与恢复机器面 → docs/编号规范.md §8.5。 # → docs/门禁说明/id-check-new.md;手工普查与恢复机器面 → scripts/archive/id_gate/README.md。
# ⚠ 计数口径:本条摘除使 YAML 解析条目 52 → **51**,须与 AGENTS.md 的「共 N 个钩子」、 # ⚠ 计数口径:本条摘除使 YAML 解析条目 52 → **51**,须与 AGENTS.md 的「共 N 个钩子」、
# docs/门禁说明/README.md §2 标题三数同源同批改(自查命令见该条;别在注释里写数钩子的字面量)。 # docs/门禁说明/README.md §2 标题三数同源同批改(自查命令见该条;别在注释里写数钩子的字面量)。
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"portName": "COM3", "portName": "COM4",
"baudRate": 115200, "baudRate": 115200,
"flash_cmd": ".venv\\Scripts\\python.exe .dsh\\skills\\stlink-flash\\scripts\\stlink_flash.py flash", "flash_cmd": ".venv\\Scripts\\python.exe .dsh\\skills\\stlink-flash\\scripts\\stlink_flash.py flash",
+2 -2
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
@@ -108,7 +108,7 @@ ADC 引脚电压 V)+ `adc_health_rail_watch()` ×9(「采样通道自检」
V0.2 改版与本目录 `adc_input` 映射表同步改。 V0.2 改版与本目录 `adc_input` 映射表同步改。
- 三态可用性 `adc_cal_flags()`:VALID(已按变比标定,二次值成立——端子变比确认与两点标定前恒 0) - 三态可用性 `adc_cal_flags()`:VALID(已按变比标定,二次值成立——端子变比确认与两点标定前恒 0)
/ CLIPPED(运行期按来源派生,V0.2 后自动清零)。**消费者判「能不能信」只许查它**, / CLIPPED(运行期按来源派生,V0.2 后自动清零)。**消费者判「能不能信」只许查它**,
`adc_cal_apply()` 不返回可用性(「数据可信」§8 风险表)。 `adc_cal_apply()` 不返回可用性(「数据可信」§4.2 三态可用性表)。
- 合法带哨兵:k ∉ ROM×[0.5,2.0] 或 |b| > 8192 → 折算回退 ROM + 每通道每开机一条 - 合法带哨兵:k ∉ ROM×[0.5,2.0] 或 |b| > 8192 → 折算回退 ROM + 每通道每开机一条
`[ERR]` + VALID 被压制(**即便文件位图说已标定**);这层兜底同时挡坏文件与坏标定。 `[ERR]` + VALID 被压制(**即便文件位图说已标定**);这层兜底同时挡坏文件与坏标定。
- `adc_cal_set()` / `adc_cal_two_point()`:整定与两点公式的算术核已齐备(单测还原合成 - `adc_cal_set()` / `adc_cal_two_point()`:整定与两点公式的算术核已齐备(单测还原合成
@@ -118,8 +118,8 @@ ADC 引脚电压 V)+ `adc_health_rail_watch()` ×9(「采样通道自检」
### 3.9 `meas.c` / `.h` — 遥测快照发布(全周傅氏相量发布侧,「数据可信」波次) ### 3.9 `meas.c` / `.h` — 遥测快照发布(全周傅氏相量发布侧,「数据可信」波次)
- **唯一发布者 = adcTask**:`phasor_run()`/`freq_run()` 同拍、200 ms **tick 经过**分频 - **唯一发布者 = adcTask**:`phasor_run()`/`freq_run()` 同拍、200 ms **tick 经过**分频
调 `meas_tick()`(非拍计数——idle/skip 拍拉长名义节拍)。docs/任务规划/数据可信.md §8 调 `meas_tick()`(非拍计数——idle/skip 拍拉长名义节拍)。`docs/任务规划/数据可信.md` §4.5
风险表"快照双写"行 = 评审判据:全仓 `meas_tick` 调用点数须为 1;iec104Task / 定"唯一发布者 = `adc_task`" = 评审判据:全仓 `meas_tick` 调用点数须为 1;iec104Task /
uiTask 只读。 uiTask 只读。
- 值口径(第二轮「遥测快照发布」的 A-lite 裁决):**基波有效值瞬时透传**,与 phasor 使用区 - 值口径(第二轮「遥测快照发布」的 A-lite 裁决):**基波有效值瞬时透传**,与 phasor 使用区
**同拍同核逐位相等**(单测钉死);**不做** 4 点平均 / 谐波方和根——按 **同拍同核逐位相等**(单测钉死);**不做** 4 点平均 / 谐波方和根——按
@@ -241,7 +241,7 @@ ADC 引脚电压 V)+ `adc_health_rail_watch()` ×9(「采样通道自检」
3. 加 `test/host/<模块>/` 主机单测(照 `test/host/meas` 或 `test/host/soe_store` 抄目录形态与 3. 加 `test/host/<模块>/` 主机单测(照 `test/host/meas` 或 `test/host/soe_store` 抄目录形态与
`run_unit_test.py`)。**要不要补 `.pre-commit-config.yaml` 专属钩子按 Lead 裁定 2026-10-27:默认不补**, `run_unit_test.py`)。**要不要补 `.pre-commit-config.yaml` 专属钩子按 Lead 裁定 2026-10-27:默认不补**,
由 `test-coverage` 总闸全量真跑;确有秒级归因需求再单独申请。用例标题写「它在验证什么」这类语义 由 `test-coverage` 总闸全量真跑;确有秒级归因需求再单独申请。用例标题写「它在验证什么」这类语义
短语,**不要发字母紧跟数字的新编号**(`docs/编号规范.md` §4.1「已停发」栏:停发不等于可以新发)。 短语,**不要发字母紧跟数字的新编号**(`docs/文档规范.md` §7.1:停发不等于可以新发)。
4. 消费者写在 `App/task/`,本层只出"数";跨转换器禁令见 §3 开头四条红线。 4. 消费者写在 `App/task/`,本层只出"数";跨转换器禁令见 §3 开头四条红线。
5. 在本 README §1 清单加一行,并在 `docs/算法/采集与算法层设计说明.md` 里写清该模块的契约与理由。 5. 在本 README §1 清单加一行,并在 `docs/算法/采集与算法层设计说明.md` 里写清该模块的契约与理由。
6. **单测产出的互验字节(要被别人的脚本读的那些):跑测之后立刻刷新副本并记下 sha256**。三套录波单测把合成段落 6. **单测产出的互验字节(要被别人的脚本读的那些):跑测之后立刻刷新副本并记下 sha256**。三套录波单测把合成段落
+1 -1
View File
@@ -290,7 +290,7 @@ uint32_t adc_cal_flags(adc_semantic_t sem) {
} }
/* CLIPPED 由**来源**派生(R5:STM32 侧单极性无偏置 → 负半周削顶)—— /* CLIPPED 由**来源**派生(R5:STM32 侧单极性无偏置 → 负半周削顶)——
* V0.2 改版(8 路全接 TPAFE,消除双转换器无共同采样触发)后本位自动恒 0,无需改码, * V0.2 改版(8 路全接 TPAFE,消除双转换器无共同采样触发)后本位自动恒 0,无需改码,
* 对应「数据可信」§10「页面与 104 绑定零改动」的要求 */ * 对应「数据可信」§4.2 三态可用性表「页面与 104 绑定零改动」的要求 */
if (s_rom_k_stm32((unsigned)sem) != 0) { if (s_rom_k_stm32((unsigned)sem) != 0) {
f |= ADC_CAL_F_CLIPPED; f |= ADC_CAL_F_CLIPPED;
} }
+2 -2
View File
@@ -62,7 +62,7 @@ extern "C" {
#define ADC_CAL_K_Q16_TPAFE (10000000L) #define ADC_CAL_K_Q16_TPAFE (10000000L)
#define ADC_CAL_K_Q16_STM32 (52800000L) #define ADC_CAL_K_Q16_STM32 (52800000L)
/* 系数合法带(「数据可信」§8 风险表):k 必须落在板级 ROM 系数的 ×[0.5, 2.0] /* 系数合法带(「数据可信」§4.1 尾注):k 必须落在板级 ROM 系数的 ×[0.5, 2.0]
* 区间内;带宽用 ROM 值移位实现(>>1 / <<1),不设独立宏防两处真相 */ * 区间内;带宽用 ROM 值移位实现(>>1 / <<1),不设独立宏防两处真相 */
/* 零点偏移幅值上限(码值):超此即判文件损坏/异常标定,回退 ROM 并留痕 */ /* 零点偏移幅值上限(码值):超此即判文件损坏/异常标定,回退 ROM 并留痕 */
@@ -188,7 +188,7 @@ int adc_cal_set(adc_semantic_t sem, int32_t k_q16, int32_t b_codes);
* v_lo_uv/v_hi_uv - 两点实测电压(µV,v_hi > v_lo,端子/引脚域均可) int32_t * v_lo_uv/v_hi_uv - 两点实测电压(µV,v_hi > v_lo,端子/引脚域均可) int32_t
* p_k_q16 / p_b - 输出:系数(Q16)与零点偏移(码值) int32_t * * p_k_q16 / p_b - 输出:系数(Q16)与零点偏移(码值) int32_t *
* 返 回 值:0 - 成功;-1 - 参数/斜率非法;-2 - 零点越 ±ADC_CAL_B_MAX(先查前端, * 返 回 值:0 - 成功;-1 - 参数/斜率非法;-2 - 零点越 ±ADC_CAL_B_MAX(先查前端,
* 不得用系数凑错斜率,「数据可信」§8 风险表) int * 不得用系数凑错斜率,「数据可信」§4.1 尾注) int
* 限定条件:无(纯整数运算,主机侧可直接单测) * 限定条件:无(纯整数运算,主机侧可直接单测)
* 函数说明:k = (v_hi−v_lo)×65536/(c_hi−c_lo)(四舍五入),b = v_lo×65536/k − c_lo; * 函数说明:k = (v_hi−v_lo)×65536/(c_hi−c_lo)(四舍五入),b = v_lo×65536/k − c_lo;
* 实测注入未做(台架待跑),本函数即「公式齐备」的交付物 * 实测注入未做(台架待跑),本函数即「公式齐备」的交付物
+4 -4
View File
@@ -61,8 +61,8 @@ typedef struct {
* 频率点不适用"额定百分比"(额定附近 0.5 Hz 与旧值同量级,维持 0.5 并随 * 频率点不适用"额定百分比"(额定附近 0.5 Hz 与旧值同量级,维持 0.5 并随
* 运行参数段可调)。自 104 改读快照起本表**只作工厂默认载体**:生效死区 = * 运行参数段可调)。自 104 改读快照起本表**只作工厂默认载体**:生效死区 =
* App/algo/run_par.c 的 [run_par] 引擎副本(运行参数段真源收编,本层不再存副本);削顶五路不再 sem=-1 绑死,而是绑快照槽、由品质 CLIPPED * App/algo/run_par.c 的 [run_par] 引擎副本(运行参数段真源收编,本层不再存副本);削顶五路不再 sem=-1 绑死,而是绑快照槽、由品质 CLIPPED
* 驱动线上 IV——V0.2 削顶消失后点位零改动自动启用(docs/任务规划/ * 驱动线上 IV——V0.2 削顶消失后点位零改动自动启用(口径见 docs/任务规划/
* 数据可信.md §10 的「双转换器无共同采样触发」行)。 * 数据可信.md §4.2 三态可用性表)。
* ⚠ 过渡期(eng=0 引脚电压域,两点标定完成前):上送值本身非二次值,死区 * ⚠ 过渡期(eng=0 引脚电压域,两点标定完成前):上送值本身非二次值,死区
* 数字按本域偏保守(迟报不漏报);标定落地后复核(「数据可信」§2.3 表 * 数字按本域偏保守(迟报不漏报);标定落地后复核(「数据可信」§2.3 表
* 第 2 行)。判定 = 死区连续 2 点确认(104 改读快照),见 iec104_pts.h COV 说明。 */ * 第 2 行)。判定 = 死区连续 2 点确认(104 改读快照),见 iec104_pts.h COV 说明。 */
@@ -176,8 +176,8 @@ uint32_t iec104_pts_yc_ioa(uint8_t idx) {
* 入口参数:q16 - 源侧品质(低字节与线上同值;高字节为 MEAS_QDS_CLIPPED 域内位) * 入口参数:q16 - 源侧品质(低字节与线上同值;高字节为 MEAS_QDS_CLIPPED 域内位)
* 返 回 值:线上 QDS 字节 uint8_t * 返 回 值:线上 QDS 字节 uint8_t
* 函数说明:CLIPPED(硬件削顶,104 无对应位)映射为 IV——「削顶通道 104 恒 * 函数说明:CLIPPED(硬件削顶,104 无对应位)映射为 IV——「削顶通道 104 恒
* IV」口径(docs/任务规划/数据可信.md §8 风险表「削顶通道被当成可测」 * IV」口径(docs/任务规划/数据可信.md §4.2 三态可用性表)
* 行)改由快照品质驱动,不再靠点表绑死 -1;OV/NT/IV 透传,其余高位丢弃。 * 改由快照品质驱动,不再靠点表绑死 -1;OV/NT/IV 透传,其余高位丢弃。
*/ */
static uint8_t s_q_map(uint16_t q16) { static uint8_t s_q_map(uint16_t q16) {
uint8_t w = (uint8_t)(q16 & (uint16_t)(IEC104_QDS_OV | IEC104_QDS_NT uint8_t w = (uint8_t)(q16 & (uint16_t)(IEC104_QDS_OV | IEC104_QDS_NT
+1 -1
View File
@@ -9,7 +9,7 @@
* 测频与遥测快照(App/algo/meas.h,「数据可信」104 改读快照与频率点绑定):电气 8 路绑快照槽, * 测频与遥测快照(App/algo/meas.h,「数据可信」104 改读快照与频率点绑定):电气 8 路绑快照槽,
* 有效性由快照品质驱动——V0.1 削顶路(docs/算法/继电保护功能复现规划.md * 有效性由快照品质驱动——V0.1 削顶路(docs/算法/继电保护功能复现规划.md
* §1.6)快照置 CLIPPED → 本层映射为线上 IV(V0.2 后自动启用,绑定零 * §1.6)快照置 CLIPPED → 本层映射为线上 IV(V0.2 后自动启用,绑定零
* 改动,见 docs/任务规划/数据可信.md §10「双转换器无共同采样触发」行);0x401d 绑频率源, * 改动,见 docs/任务规划/数据可信.md §4.2 三态可用性表);0x401d 绑频率源,
* freq_valid()==0 → IV; * freq_valid()==0 → IV;
* - YX:IOA 1~33(§1.5 表(3));双点 = 开关位置类(YX1~4,本期无硬件 → IV), * - YX:IOA 1~33(§1.5 表(3));双点 = 开关位置类(YX1~4,本期无硬件 → IV),
* 保护动作类 YX15~23 映射 prot_elm 状态,闭锁类 YX31~33 映射 prot_set; * 保护动作类 YX15~23 映射 prot_elm 状态,闭锁类 YX31~33 映射 prot_set;
+7 -3
View File
@@ -443,7 +443,7 @@ void adc_task_func(void *arg) {
/* 测频与遥测快照发布(「数据可信」这一项,道D,M5):200 ms tick 经过分频。 /* 测频与遥测快照发布(「数据可信」这一项,道D,M5):200 ms tick 经过分频。
* 唯一发布者 = 本任务(全仓 meas_tick 调用点数 = 1 为评审判据, * 唯一发布者 = 本任务(全仓 meas_tick 调用点数 = 1 为评审判据,
* 「数据可信」§8 风险表"快照双写"行);只在**压环成功的真新帧拍**发布 * 「数据可信」§4.5 定"唯一发布者 = adc_task");只在**压环成功的真新帧拍**发布
* ——idle/skip 拍压环未推进,发布 = 重复旧窗。品质注入唯一源 = * ——idle/skip 拍压环未推进,发布 = 重复旧窗。品质注入唯一源 =
* adc_cal_flags()(§4.2 三态表;纯读,每 200 ms 才跑一遍)。 */ * adc_cal_flags()(§4.2 三态表;纯读,每 200 ms 才跑一遍)。 */
if ((uint32_t)(now - s_meas_ms) >= MEAS_PERIOD_MS) { if ((uint32_t)(now - s_meas_ms) >= MEAS_PERIOD_MS) {
@@ -585,11 +585,15 @@ void adc_task_func(void *arg) {
s_wave_bench_off = 1u; s_wave_bench_off = 1u;
DBG_INFO("wave bench autocap STOP after %u s", DBG_INFO("wave bench autocap STOP after %u s",
(unsigned int)(WAVE_BENCH_MAX_MS / 1000u)); (unsigned int)(WAVE_BENCH_MAX_MS / 1000u));
} else if ((uint32_t)(now - s_wave_bench_next) >= WAVE_BENCH_PERIOD_MS) { } else if ((int32_t)(now - s_wave_bench_next) >= 0) {
/* 到期判定必须用有符号差值:无符号 (now-next)>=PERIOD 在
* next=now+PERIOD 挂出后立刻成立(now<next 时差值回绕成巨数),
* 2026-11-07 台架实证该写法以 1 kHz 连发请求:ovf 每秒 +1000、
* 段节奏被去重钳到 ~1.5 s/段,违背 ON 行承诺的 1 seg / 2000 ms */
s_wave_bench_next = now + WAVE_BENCH_PERIOD_MS; s_wave_bench_next = now + WAVE_BENCH_PERIOD_MS;
(void)wave_ring_request((uint8_t)WAVE_TRIG_BENCH, 0u); (void)wave_ring_request((uint8_t)WAVE_TRIG_BENCH, 0u);
} else { } else {
/* 本拍未到周期点:无事可做(比较用无符号差值,回绕安全) */ /* 本拍未到周期点:无事可做(有符号差值,半程内回绕安全) */
} }
} }
#endif #endif
+1 -1
View File
@@ -717,7 +717,7 @@ static int ui_task_wave_load_head(uint8_t a_idx) {
* ——判废是低频人工动作,逐次留痕正是取证要的东西(电平 * ——判废是低频人工动作,逐次留痕正是取证要的东西(电平
* ERROR + 不判重两条裁定见设计说明 §10 的 2026-11-07 节)。 * ERROR + 不判重两条裁定见设计说明 §10 的 2026-11-07 节)。
* reject= 原因码表与「reject!=5 时两个 CRC 字段恒 0x0000」 * reject= 原因码表与「reject!=5 时两个 CRC 字段恒 0x0000」
* 判读口径见手册 §3;reject=5 的 stored/calc 与 PC 侧 * 判读口径见手册 §4 步 7 与 §8;reject=5 的 stored/calc 与 PC 侧
* wave_read 的 REJECT 行同名同值、可对值互证。[ERR] 会命中 * wave_read 的 REJECT 行同名同值、可对值互证。[ERR] 会命中
* /serial-boot-test 的 Forbidden 清单 → 坏段轮里按「预期内」 * /serial-boot-test 的 Forbidden 清单 → 坏段轮里按「预期内」
* 点名放行(同手册),正常盘上本行一条都不会出现 */ * 点名放行(同手册),正常盘上本行一条都不会出现 */
+36 -4
View File
@@ -143,6 +143,10 @@ static uint8_t s_cache_dirty;
/* 拷贝临时缓冲区 */ /* 拷贝临时缓冲区 */
static uint8_t s_copy_buf[FTL_PAGE_SIZE]; static uint8_t s_copy_buf[FTL_PAGE_SIZE];
/* 【#85 P0 台架实证】写提交回读探针缓冲 + 计数 */
static uint8_t s_prog_verify_buf[FTL_PAGE_SIZE];
static volatile uint32_t s_prog_verify_mismatch;
/* 初始化状态 */ /* 初始化状态 */
static uint8_t s_initialized; static uint8_t s_initialized;
@@ -276,6 +280,15 @@ static bsp_err_t ftl_flush_cache(void) {
return cls; return cls;
} }
/* 【#85 P0 台架实证】map 状态日志:每次写后打 root/head/tail/epoch/count,
* 对照台架打回时刻的 map 状态,确认 root 是否回退。仅台架实证用,量产前移除。 */
DBG_INFO("map_write: root=%lu head=%lu tail=%lu epoch=%u count=%lu",
(unsigned long)s_map.journal.root,
(unsigned long)s_map.journal.head,
(unsigned long)s_map.journal.tail,
(unsigned)s_map.journal.epoch,
(unsigned long)s_map.count);
s_cache_dirty = 0; s_cache_dirty = 0;
return BSP_OK; return BSP_OK;
} }
@@ -381,10 +394,29 @@ int dhara_nand_prog(const struct dhara_nand *n, dhara_page_t p, const uint8_t *d
return -1; return -1;
} }
/* 编程正确性以 P_FAIL 状态位(gd5f_program_exec 内检查)+ 读时 ECC + /* 【#85 P0 台架实证】写提交回读探针:编程成功后立即回读同 PPN 做字节比对。
* journal 读时门(magic/CRC)为准;数据路径不做整页回读比对—— * 2026-09-20 曾加回读校验(GD5F_PROG_VERIFY),2026-09-21 经评估整体移除。
* 2026-09-20 曾加回读校验(GD5F_PROG_VERIFY),2026-09-21 经评估整体 * 现以低频探针形式恢复:仅台架实证用,量产前移除。
* 移除(依据见 docs/内存管理/存储栈RAM优化调研.md 与 GD5F Trap Records TRAP-GD5F-05) */ * 目的:在 FTL 层直接抓到"编程成功但回读不一致"的窗口,
* 区分"NAND 编程未落地" vs "map 指旧 PPN"。 */
{
int32_t vret;
vret = gd5f_page_read(phy_pg);
if (vret == GD5F_OK) {
vret = gd5f_read_from_cache(0, s_prog_verify_buf, FTL_PAGE_SIZE);
if (vret == GD5F_OK) {
if (gd5f_check_ecc() == GD5F_ECC_ERROR) {
DBG_ERROR("Prog verify: ECC error on readback page=%lu",
(unsigned long)phy_pg);
s_prog_verify_mismatch++;
} else if (memcmp(data, s_prog_verify_buf, FTL_PAGE_SIZE) != 0) {
DBG_ERROR("Prog verify: MISMATCH page=%lu (data differs after prog)",
(unsigned long)phy_pg);
s_prog_verify_mismatch++;
}
}
}
}
return 0; return 0;
} }
+1 -1
View File
@@ -158,7 +158,7 @@ docs/
|---|---| |---|---|
| [`ADC前端注入验证流程.md`](测试说明/专项验证/ADC前端注入验证流程.md) | **ADC 前端与两片转换器的台架注入验证**(已知电压注入验证的执行侧,实测证据 → `docs/硬件平台/ADC通道映射说明.md` §8.1):注入点清单 / 期望码值表 / 零点·线性·映射·极性·节奏五步(每步自带现场记录表,边做边填);**不需示波器与信号源**,一块万用表即可 | | [`ADC前端注入验证流程.md`](测试说明/专项验证/ADC前端注入验证流程.md) | **ADC 前端与两片转换器的台架注入验证**(已知电压注入验证的执行侧,实测证据 → `docs/硬件平台/ADC通道映射说明.md` §8.1):注入点清单 / 期望码值表 / 零点·线性·映射·极性·节奏五步(每步自带现场记录表,边做边填);**不需示波器与信号源**,一块万用表即可 |
| [`启动日志原子性复验流程.md`](测试说明/专项验证/启动日志原子性复验流程.md) | **控制台整行独占 / 崩溃遗言原子性**这类**行级完整性**判据的固定动作与口径(`docs/子系统设计/控制台单写者日志设计说明.md` 的验收侧:那边讲怎么修,这边讲怎么证明修好了、以及为什么"标记全中"不等于"日志没坏") | | [`启动日志原子性复验流程.md`](测试说明/专项验证/启动日志原子性复验流程.md) | **控制台整行独占 / 崩溃遗言原子性**这类**行级完整性**判据的固定动作与口径(`docs/子系统设计/控制台单写者日志设计说明.md` 的验收侧:那边讲怎么修,这边讲怎么证明修好了、以及为什么"标记全中"不等于"日志没坏") |
| [`故障录波板级到场轮执行手册.md`](测试说明/专项验证/故障录波板级到场轮执行手册.md) | **录波剩余台架判据的执行手册**(判据属主是 `docs/子系统设计/故障录波设计说明.md` §10,这里只写"人做什么、说哪句话、会看到什么"):四幕(枚举埋点修复 / 注量对表 / P 触发对时刻含两个用户决定 / bench 自抓占卷)各自标清到场与否,配到场检查清单、现场记录表与收工还原清单 | | [`故障录波板级到场轮执行手册.md`](测试说明/专项验证/故障录波板级到场轮执行手册.md) | **录波剩余台架判据的执行手册**(判据属主是 `docs/子系统设计/故障录波设计说明.md` §10,这里只写"人做什么、说哪句话、会看到什么"):四幕(枚举埋点修复 / 注量对表 / 保护触发对时刻(src=P)含两个用户决定 / bench 自抓占卷)各自标清到场与否,配到场检查清单、现场记录表与收工还原清单 |
| [`链路延迟测试说明.md`](测试说明/专项验证/链路延迟测试说明.md) | 网络链路时延分段定义、判定基线、执行流程 | | [`链路延迟测试说明.md`](测试说明/专项验证/链路延迟测试说明.md) | 网络链路时延分段定义、判定基线、执行流程 |
| [`模拟器差距清单.md`](测试说明/专项验证/模拟器差距清单.md) | **PC 模拟器 vs 真机差距登记册**(保护判据门禁可信度依据;改动涉及网络/日志/硬件层前必查 §3 决策规则) | | [`模拟器差距清单.md`](测试说明/专项验证/模拟器差距清单.md) | **PC 模拟器 vs 真机差距登记册**(保护判据门禁可信度依据;改动涉及网络/日志/硬件层前必查 §3 决策规则) |
| [`存储维护与容量恢复.md`](测试说明/专项验证/存储维护与容量恢复.md) | 全片擦除恢复 dhara 坏块记账 / 容量恢复 | | [`存储维护与容量恢复.md`](测试说明/专项验证/存储维护与容量恢复.md) | 全片擦除恢复 dhara 坏块记账 / 容量恢复 |
+14 -15
View File
@@ -1,7 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1060" height="818" viewBox="0 0 1060 818" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif"> <svg xmlns="http://www.w3.org/2000/svg" width="1060" height="818" viewBox="0 0 1060 818" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif">
<rect x="0" y="0" width="1060" height="818" fill="#ffffff"/> <rect x="0" y="0" width="1060" height="818" fill="#ffffff"/>
<text x="46.0" y="42.0" font-size="21" font-weight="700" fill="#0f172a">同一个针脚,两种证法 —— 直流只证「高度」,正弦才证「形状与节拍」</text> <text x="46.0" y="42.0" font-size="21" font-weight="700" fill="#0f172a">同一个针脚,两种证法 —— 直流只证「高度」,正弦才证「形状与节拍」</text>
<text x="46.0" y="68.0" font-size="13" fill="#475569">上排已做完(2026-10-27 静态注入六项判据全 PASS);下排一次也没做过:正弦波从没进过这条链,所以后面的相量、测频、削顶、谐波对不对,现在无人能答</text> <text x="46.0" y="68.0" font-size="13" fill="#475569">上排 2026-10-27 静态注入六项判据全 PASS;下排 2026-11-02 / 11-04 台架两轮跑完六轮,幅值 / 波形 / 相位 / 测频 / 削顶 / 谐波全部闭合</text>
<text x="46.0" y="87.0" font-size="13" fill="#475569">两排共用同一个注入点、同一套前端、同一份折算代码 —— 差别只在信号源是「平的」还是「会走 20 点/周的正弦」</text> <text x="46.0" y="87.0" font-size="13" fill="#475569">两排共用同一个注入点、同一套前端、同一份折算代码 —— 差别只在信号源是「平的」还是「会走 20 点/周的正弦」</text>
<rect x="34.0" y="108.0" width="992.0" height="160.0" rx="10" fill="#f0fdf4" stroke="#bbf7d0" stroke-width="1.2"/> <rect x="34.0" y="108.0" width="992.0" height="160.0" rx="10" fill="#f0fdf4" stroke="#bbf7d0" stroke-width="1.2"/>
<text x="46.0" y="128.0" font-size="12.5" font-weight="700" fill="#16a34a">上排 · 直流静态标定(已做)</text> <text x="46.0" y="128.0" font-size="12.5" font-weight="700" fill="#16a34a">上排 · 直流静态标定(已做)</text>
@@ -46,7 +46,7 @@
<text x="885.0" y="218.0" font-size="10.5" fill="#475569">R² = 0.9999997,斜率</text> <text x="885.0" y="218.0" font-size="10.5" fill="#475569">R² = 0.9999997,斜率</text>
<text x="885.0" y="232.0" font-size="10.5" fill="#475569">差 −0.14 %</text> <text x="885.0" y="232.0" font-size="10.5" fill="#475569">差 −0.14 %</text>
<rect x="34.0" y="286.0" width="992.0" height="160.0" rx="10" fill="#fff1f2" stroke="#fecdd3" stroke-width="1.2"/> <rect x="34.0" y="286.0" width="992.0" height="160.0" rx="10" fill="#fff1f2" stroke="#fecdd3" stroke-width="1.2"/>
<text x="46.0" y="306.0" font-size="12.5" font-weight="700" fill="#e11d48">下排 · 交流正弦验证(本文新增 · 待做)</text> <text x="46.0" y="306.0" font-size="12.5" font-weight="700" fill="#e11d48">下排 · 交流正弦验证(已做两轮)</text>
<rect x="922.0" y="294.0" width="88.0" height="34.0" rx="6" fill="#ffffff" stroke="#e11d48" stroke-width="1.2"/> <rect x="922.0" y="294.0" width="88.0" height="34.0" rx="6" fill="#ffffff" stroke="#e11d48" stroke-width="1.2"/>
<line x1="926.0" y1="311.0" x2="1006.0" y2="311.0" stroke="#cbd5e1" stroke-width="1" stroke-dasharray="3 3"/> <line x1="926.0" y1="311.0" x2="1006.0" y2="311.0" stroke="#cbd5e1" stroke-width="1" stroke-dasharray="3 3"/>
<polyline points="928.0,311.0 929.3,310.1 930.5,309.1 931.8,308.2 933.1,307.3 934.3,306.5 935.6,305.7 936.9,305.0 938.1,304.3 939.4,303.7 940.7,303.2 941.9,302.8 943.2,302.4 944.5,302.2 945.7,302.0 947.0,302.0 948.3,302.0 949.5,302.2 950.8,302.4 952.1,302.8 953.3,303.2 954.6,303.7 955.9,304.3 957.1,305.0 958.4,305.7 959.7,306.5 960.9,307.3 962.2,308.2 963.5,309.1 964.7,310.1 966.0,311.0 967.3,311.9 968.5,312.9 969.8,313.8 971.1,314.7 972.3,315.5 973.6,316.3 974.9,317.0 976.1,317.7 977.4,318.3 978.7,318.8 979.9,319.2 981.2,319.6 982.5,319.8 983.7,320.0 985.0,320.0 986.3,320.0 987.5,319.8 988.8,319.6 990.1,319.2 991.3,318.8 992.6,318.3 993.9,317.7 995.1,317.0 996.4,316.3 997.7,315.5 998.9,314.7 1000.2,313.8 1001.5,312.9 1002.7,311.9 1004.0,311.0" fill="none" stroke="#e11d48" stroke-width="1.9" stroke-linejoin="round"/> <polyline points="928.0,311.0 929.3,310.1 930.5,309.1 931.8,308.2 933.1,307.3 934.3,306.5 935.6,305.7 936.9,305.0 938.1,304.3 939.4,303.7 940.7,303.2 941.9,302.8 943.2,302.4 944.5,302.2 945.7,302.0 947.0,302.0 948.3,302.0 949.5,302.2 950.8,302.4 952.1,302.8 953.3,303.2 954.6,303.7 955.9,304.3 957.1,305.0 958.4,305.7 959.7,306.5 960.9,307.3 962.2,308.2 963.5,309.1 964.7,310.1 966.0,311.0 967.3,311.9 968.5,312.9 969.8,313.8 971.1,314.7 972.3,315.5 973.6,316.3 974.9,317.0 976.1,317.7 977.4,318.3 978.7,318.8 979.9,319.2 981.2,319.6 982.5,319.8 983.7,320.0 985.0,320.0 986.3,320.0 987.5,319.8 988.8,319.6 990.1,319.2 991.3,318.8 992.6,318.3 993.9,317.7 995.1,317.0 996.4,316.3 997.7,315.5 998.9,314.7 1000.2,313.8 1001.5,312.9 1002.7,311.9 1004.0,311.0" fill="none" stroke="#e11d48" stroke-width="1.9" stroke-linejoin="round"/>
@@ -73,19 +73,19 @@
<rect x="46.0" y="346.0" width="136.0" height="88.0" rx="8" fill="#ffffff" stroke="#e11d48" stroke-width="1.6"/> <rect x="46.0" y="346.0" width="136.0" height="88.0" rx="8" fill="#ffffff" stroke="#e11d48" stroke-width="1.6"/>
<text x="53.0" y="364.0" font-size="12.5" font-weight="700" fill="#0f172a">信号发生器</text> <text x="53.0" y="364.0" font-size="12.5" font-weight="700" fill="#0f172a">信号发生器</text>
<text x="53.0" y="382.0" font-size="10.5" fill="#475569">50 Hz 正弦</text> <text x="53.0" y="382.0" font-size="10.5" fill="#475569">50 Hz 正弦</text>
<text x="53.0" y="396.0" font-size="10.5" fill="#475569">幅度按峰值算,见底部红</text> <text x="53.0" y="396.0" font-size="10.5" fill="#475569">幅度按 Vpp 设定,见底</text>
<text x="53.0" y="410.0" font-size="10.5" fill="#475569">线</text> <text x="53.0" y="410.0" font-size="10.5" fill="#475569">部红线</text>
<path d="M 192.2 386.0 L 201.2 390.0 L 192.2 394.0 Z" fill="#334155"/> <path d="M 192.2 386.0 L 201.2 390.0 L 192.2 394.0 Z" fill="#334155"/>
<line x1="184.0" y1="390.0" x2="194.2" y2="390.0" stroke="#334155" stroke-width="1.6"/> <line x1="184.0" y1="390.0" x2="194.2" y2="390.0" stroke="#334155" stroke-width="1.6"/>
<rect x="212.4" y="346.0" width="136.0" height="88.0" rx="8" fill="#ffffff" stroke="#e11d48" stroke-width="1.6"/> <rect x="212.4" y="346.0" width="136.0" height="88.0" rx="8" fill="#ffffff" stroke="#e11d48" stroke-width="1.6"/>
<text x="219.4" y="364.0" font-size="12.5" font-weight="700" fill="#0f172a">注入点 R31</text> <text x="219.4" y="364.0" font-size="12.5" font-weight="700" fill="#0f172a">注入点 R31</text>
<text x="219.4" y="382.0" font-size="10.5" fill="#475569">同上排同一个点</text> <text x="219.4" y="382.0" font-size="10.5" fill="#475569">同一条注入点</text>
<text x="219.4" y="396.0" font-size="10.5" fill="#475569">外串 10 k、与板共地</text> <text x="219.4" y="396.0" font-size="10.5" fill="#475569">外串 10 k、与板共地</text>
<path d="M 358.6 386.0 L 367.6 390.0 L 358.6 394.0 Z" fill="#334155"/> <path d="M 358.6 386.0 L 367.6 390.0 L 358.6 394.0 Z" fill="#334155"/>
<line x1="350.4" y1="390.0" x2="360.6" y2="390.0" stroke="#334155" stroke-width="1.6"/> <line x1="350.4" y1="390.0" x2="360.6" y2="390.0" stroke="#334155" stroke-width="1.6"/>
<rect x="378.8" y="346.0" width="136.0" height="88.0" rx="8" fill="#ffffff" stroke="#e11d48" stroke-width="1.6"/> <rect x="378.8" y="346.0" width="136.0" height="88.0" rx="8" fill="#ffffff" stroke="#e11d48" stroke-width="1.6"/>
<text x="385.8" y="364.0" font-size="12.5" font-weight="700" fill="#0f172a">前端 + 转换器</text> <text x="385.8" y="364.0" font-size="12.5" font-weight="700" fill="#0f172a">前端 + 转换器</text>
<text x="385.8" y="382.0" font-size="10.5" fill="#475569">同上排同一条链</text> <text x="385.8" y="382.0" font-size="10.5" fill="#475569">同一套前端</text>
<text x="385.8" y="396.0" font-size="10.5" fill="#475569">STM32 五路负半周必削顶</text> <text x="385.8" y="396.0" font-size="10.5" fill="#475569">STM32 五路负半周必削顶</text>
<path d="M 525.0 386.0 L 534.0 390.0 L 525.0 394.0 Z" fill="#334155"/> <path d="M 525.0 386.0 L 534.0 390.0 L 525.0 394.0 Z" fill="#334155"/>
<line x1="516.8" y1="390.0" x2="527.0" y2="390.0" stroke="#334155" stroke-width="1.6"/> <line x1="516.8" y1="390.0" x2="527.0" y2="390.0" stroke="#334155" stroke-width="1.6"/>
@@ -104,10 +104,9 @@
<line x1="849.6" y1="390.0" x2="859.8" y2="390.0" stroke="#334155" stroke-width="1.6"/> <line x1="849.6" y1="390.0" x2="859.8" y2="390.0" stroke="#334155" stroke-width="1.6"/>
<rect x="878.0" y="346.0" width="136.0" height="88.0" rx="8" fill="#ffffff" stroke="#e11d48" stroke-width="1.6"/> <rect x="878.0" y="346.0" width="136.0" height="88.0" rx="8" fill="#ffffff" stroke="#e11d48" stroke-width="1.6"/>
<text x="885.0" y="364.0" font-size="12.5" font-weight="700" fill="#0f172a">读数出口</text> <text x="885.0" y="364.0" font-size="12.5" font-weight="700" fill="#0f172a">读数出口</text>
<text x="885.0" y="382.0" font-size="10.5" fill="#475569">meas 200 ms → 104 YC</text> <text x="885.0" y="382.0" font-size="10.5" fill="#475569">meas 200 ms + 录波段</text>
<text x="885.0" y="396.0" font-size="10.5" fill="#475569"> 0x4011</text> <text x="885.0" y="396.0" font-size="10.5" fill="#475569">文件</text>
<text x="885.0" y="410.0" font-size="10.5" fill="#475569">幅值 + 品质 + 频率(或</text> <text x="885.0" y="410.0" font-size="10.5" fill="#475569">幅值 + 品质 + 频率</text>
<text x="885.0" y="424.0" font-size="10.5" fill="#475569"> UI)</text>
<text x="46.0" y="456.0" font-size="12.5" font-weight="700" fill="#2563eb">只有正弦能证的六件事(直流在构造上就证不到)</text> <text x="46.0" y="456.0" font-size="12.5" font-weight="700" fill="#2563eb">只有正弦能证的六件事(直流在构造上就证不到)</text>
<rect x="46.0" y="466.0" width="151.3" height="74.0" rx="8" fill="#eff6ff"/> <rect x="46.0" y="466.0" width="151.3" height="74.0" rx="8" fill="#eff6ff"/>
<line x1="46.0" y1="466.0" x2="46.0" y2="540.0" stroke="#2563eb" stroke-width="3"/> <line x1="46.0" y1="466.0" x2="46.0" y2="540.0" stroke="#2563eb" stroke-width="3"/>
@@ -140,9 +139,9 @@
<rect x="862.7" y="466.0" width="151.3" height="74.0" rx="8" fill="#eff6ff"/> <rect x="862.7" y="466.0" width="151.3" height="74.0" rx="8" fill="#eff6ff"/>
<line x1="862.7" y1="466.0" x2="862.7" y2="540.0" stroke="#2563eb" stroke-width="3"/> <line x1="862.7" y1="466.0" x2="862.7" y2="540.0" stroke="#2563eb" stroke-width="3"/>
<text x="872.7" y="486.0" font-size="12" font-weight="700" fill="#0f172a">谐波实例 C04 / C05</text> <text x="872.7" y="486.0" font-size="12" font-weight="700" fill="#0f172a">谐波实例 C04 / C05</text>
<text x="872.7" y="504.0" font-size="10" fill="#475569">二次 / 五次相量已建但无消</text> <text x="872.7" y="504.0" font-size="10" fill="#475569">二次 / 五次相量:单注 100</text>
<text x="872.7" y="518.0" font-size="10" fill="#475569">费者:发生器给含谐波信号才</text> <text x="872.7" y="518.0" font-size="10" fill="#475569"> / 250 Hz 已验各认各的次</text>
<text x="872.7" y="532.0" font-size="10" fill="#475569">能验</text> <text x="872.7" y="532.0" font-size="10" fill="#475569">,叠加工况待标准源</text>
<rect x="46.0" y="558.0" width="476.0" height="128.0" rx="10" fill="#fff1f2" stroke="#e11d48" stroke-width="1.6"/> <rect x="46.0" y="558.0" width="476.0" height="128.0" rx="10" fill="#fff1f2" stroke="#e11d48" stroke-width="1.6"/>
<text x="60.0" y="582.0" font-size="12.5" font-weight="700" fill="#e11d48">安全红线(照抄 ADC通道映射说明 §7)</text> <text x="60.0" y="582.0" font-size="12.5" font-weight="700" fill="#e11d48">安全红线(照抄 ADC通道映射说明 §7)</text>
<text x="60.0" y="604.0" font-size="11" fill="#0f172a">TPAFE 侧只到 ±2 V:正弦看峰值不只看有效值 —— 1 Vrms 的峰值已是 1.41 V,再高</text> <text x="60.0" y="604.0" font-size="11" fill="#0f172a">TPAFE 侧只到 ±2 V:正弦看峰值不只看有效值 —— 1 Vrms 的峰值已是 1.41 V,再高</text>
@@ -159,6 +158,6 @@
<text x="552.0" y="657.0" font-size="11" fill="#0f172a">跨转换器相位:UB/UC 与 UA 分属两片转换器、无共同采样触发(V0.1 硬件缺陷),任何</text> <text x="552.0" y="657.0" font-size="11" fill="#0f172a">跨转换器相位:UB/UC 与 UA 分属两片转换器、无共同采样触发(V0.1 硬件缺陷),任何</text>
<text x="552.0" y="672.0" font-size="11" fill="#475569">相位比较都不作数。</text> <text x="552.0" y="672.0" font-size="11" fill="#475569">相位比较都不作数。</text>
<line x1="46.0" y1="700.0" x2="1014.0" y2="700.0" stroke="#cbd5e1" stroke-width="1"/> <line x1="46.0" y1="700.0" x2="1014.0" y2="700.0" stroke="#cbd5e1" stroke-width="1"/>
<text x="46.0" y="722.0" font-size="13" fill="#475569">读数出口现在就有:104 YC(test/host/iec104_master.py,浮点无量化)+ 串口每 10 s 的 phasor(hb) / freq(hb) / meas: 行;但板上没有「把窗里 2</text> <text x="46.0" y="722.0" font-size="13" fill="#475569">读数出口:串口每 10 s 的 phasor(hb) / freq(hb) / meas: 行,加上录波段文件(一次 320 点 / 8 路,PC 侧 wave_read.py 可 dump / fft / shape</text>
<text x="46.0" y="741.0" font-size="13" fill="#475569">0 个点导出来」的出口,正弦只能靠派生标量证,而 phasor 行是 ×0.1 定点(注 1 V 只剩 10 格)。</text> <text x="46.0" y="741.0" font-size="13" fill="#475569"> / plot);心跳行是 ×0.1 定点(注 1 V 只剩 10 格),定量判据一律走段文件重算。</text>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

+8 -9
View File
@@ -1,8 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1060" height="712" viewBox="0 0 1060 712" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif"> <svg xmlns="http://www.w3.org/2000/svg" width="1060" height="712" viewBox="0 0 1060 712" font-family="Microsoft YaHei, Segoe UI, PingFang SC, sans-serif">
<rect x="0" y="0" width="1060" height="712" fill="#ffffff"/> <rect x="0" y="0" width="1060" height="712" fill="#ffffff"/>
<text x="46.0" y="42.0" font-size="21" font-weight="700" fill="#0f172a">「数据可信」是五级台阶 —— 现在踩在第 2 级</text> <text x="46.0" y="42.0" font-size="21" font-weight="700" fill="#0f172a">「数据可信」是五级台阶 —— 现在踩在第 3 级</text>
<text x="46.0" y="68.0" font-size="13" fill="#64748b">每升一级只多答一个问题:通路活 → 静态读数对 → 动态波形对 → 换算到端子 → 精度达标;台阶的高度差 = 下游能多信多少</text> <text x="46.0" y="68.0" font-size="13" fill="#64748b">每升一级只多答一个问题:通路活 → 静态读数对 → 动态波形对 → 换算到端子 → 精度达标;台阶的高度差 = 下游能多信多少</text>
<text x="46.0" y="88.0" font-size="13" fill="#64748b">第 3 级不要标准源、也不要往端子加压:一台信号发生器 + 已有的注入点就能做(判据见 docs/任务规划/数据可信.md §4.6)</text> <text x="46.0" y="88.0" font-size="13" fill="#64748b">第 3 级已台架闭环(2026-11-02 / 11-04 两轮),用的是手边发生器 + 已有的注入点;第 4、5 级在等子板变比与标准源</text>
<rect x="34.0" y="106.0" width="600.0" height="532.0" rx="12" fill="#eff6ff"/> <rect x="34.0" y="106.0" width="600.0" height="532.0" rx="12" fill="#eff6ff"/>
<rect x="46.0" y="370.0" width="196.0" height="96.0" rx="8" fill="#f0fdf4" stroke="#16a34a" stroke-width="2"/> <rect x="46.0" y="370.0" width="196.0" height="96.0" rx="8" fill="#f0fdf4" stroke="#16a34a" stroke-width="2"/>
<circle cx="70.0" cy="396.0" r="13" fill="#16a34a"/> <circle cx="70.0" cy="396.0" r="13" fill="#16a34a"/>
@@ -14,11 +14,11 @@
<text x="272.0" y="337.0" font-size="13" text-anchor="middle" font-weight="700" fill="#ffffff">2</text> <text x="272.0" y="337.0" font-size="13" text-anchor="middle" font-weight="700" fill="#ffffff">2</text>
<text x="292.0" y="338.0" font-size="14.5" font-weight="700" fill="#0f172a">静态引脚电压</text> <text x="292.0" y="338.0" font-size="14.5" font-weight="700" fill="#0f172a">静态引脚电压</text>
<text x="259.0" y="364.0" font-size="11" font-weight="700" fill="#16a34a">已证 · 2026-10-27</text> <text x="259.0" y="364.0" font-size="11" font-weight="700" fill="#16a34a">已证 · 2026-10-27</text>
<rect x="450.0" y="242.0" width="196.0" height="224.0" rx="8" fill="#fff1f2" stroke="#e11d48" stroke-width="2"/> <rect x="450.0" y="242.0" width="196.0" height="224.0" rx="8" fill="#f0fdf4" stroke="#16a34a" stroke-width="2"/>
<circle cx="474.0" cy="268.0" r="13" fill="#e11d48"/> <circle cx="474.0" cy="268.0" r="13" fill="#16a34a"/>
<text x="474.0" y="273.0" font-size="13" text-anchor="middle" font-weight="700" fill="#ffffff">3</text> <text x="474.0" y="273.0" font-size="13" text-anchor="middle" font-weight="700" fill="#ffffff">3</text>
<text x="494.0" y="274.0" font-size="14.5" font-weight="700" fill="#0f172a">动态引脚波形</text> <text x="494.0" y="274.0" font-size="14.5" font-weight="700" fill="#0f172a">动态引脚波形</text>
<text x="461.0" y="300.0" font-size="11" font-weight="700" fill="#e11d48">待做 · 本文新增</text> <text x="461.0" y="300.0" font-size="11" font-weight="700" fill="#16a34a">已证 · 2026-11-04</text>
<rect x="652.0" y="178.0" width="196.0" height="288.0" rx="8" fill="#fffbeb" stroke="#d97706" stroke-width="2"/> <rect x="652.0" y="178.0" width="196.0" height="288.0" rx="8" fill="#fffbeb" stroke="#d97706" stroke-width="2"/>
<circle cx="676.0" cy="204.0" r="13" fill="#d97706"/> <circle cx="676.0" cy="204.0" r="13" fill="#d97706"/>
<text x="676.0" y="209.0" font-size="13" text-anchor="middle" font-weight="700" fill="#ffffff">4</text> <text x="676.0" y="209.0" font-size="13" text-anchor="middle" font-weight="700" fill="#ffffff">4</text>
@@ -41,10 +41,9 @@
<text x="258.0" y="557.0" font-size="11.5" fill="#64748b">,差 −0.14 %</text> <text x="258.0" y="557.0" font-size="11.5" fill="#64748b">,差 −0.14 %</text>
<text x="460.0" y="490.0" font-size="12.5" font-weight="700" fill="#0f172a">注 1 V 正弦,算出来还是不是</text> <text x="460.0" y="490.0" font-size="12.5" font-weight="700" fill="#0f172a">注 1 V 正弦,算出来还是不是</text>
<text x="460.0" y="507.0" font-size="12.5" font-weight="700" fill="#0f172a"> 1 V?</text> <text x="460.0" y="507.0" font-size="12.5" font-weight="700" fill="#0f172a"> 1 V?</text>
<text x="460.0" y="527.0" font-size="11.5" fill="#64748b">注正弦验全周傅氏幅值 / 相位 /</text> <text x="460.0" y="527.0" font-size="11.5" fill="#64748b">幅值 / 波形 / 相位 / 测频 / </text>
<text x="460.0" y="542.0" font-size="11.5" fill="#64748b"> 测频 / 削顶 / 谐波抑制。挡路</text> <text x="460.0" y="542.0" font-size="11.5" fill="#64748b">削顶 / 谐波六轮全跑;测频轮以</text>
<text x="460.0" y="557.0" font-size="11.5" fill="#64748b">:FREQ_AMP_MIN = 50 V 在引</text> <text x="460.0" y="557.0" font-size="11.5" fill="#64748b">「如实报不可测」通过</text>
<text x="460.0" y="572.0" font-size="11.5" fill="#64748b">脚域恒不过 → 测频只能读到 IV</text>
<text x="662.0" y="490.0" font-size="12.5" font-weight="700" fill="#0f172a">引脚上这 1 V 对应端子侧几 V</text> <text x="662.0" y="490.0" font-size="12.5" font-weight="700" fill="#0f172a">引脚上这 1 V 对应端子侧几 V</text>
<text x="662.0" y="507.0" font-size="12.5" font-weight="700" fill="#0f172a">?</text> <text x="662.0" y="507.0" font-size="12.5" font-weight="700" fill="#0f172a">?</text>
<text x="662.0" y="527.0" font-size="11.5" fill="#64748b">④ 子板 / 端子板变比:仓内无原</text> <text x="662.0" y="527.0" font-size="11.5" fill="#64748b">④ 子板 / 端子板变比:仓内无原</text>

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

@@ -1641,7 +1641,7 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
> 唯二例外是 复刻明细 §1.7 标为"不适用"的两条(归一化值上送、主站 IP 白名单),那是**协议语义决定**, > 唯二例外是 复刻明细 §1.7 标为"不适用"的两条(归一化值上送、主站 IP 白名单),那是**协议语义决定**,
> 不是范围裁剪。 > 不是范围裁剪。
> >
> **命名**:本节条目一律用**语义短语**(编号规范 P-8 语义优先),不发字母+数字号—— > **命名**:本节条目一律用**语义短语**,不发字母+数字号(判据见 `docs/文档规范.md` §7.1)——
> 避免与其它文档的 `S`/`A`/`P` 编号族撞名。 > 避免与其它文档的 `S`/`A`/`P` 编号族撞名。
### 9.1 复刻缺口总表 ### 9.1 复刻缺口总表
@@ -1820,7 +1820,7 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
| IEC 60870-5-104 上行 | [`docs/子系统设计/IEC104上行设计说明.md`](../../docs/子系统设计/IEC104上行设计说明.md) | | IEC 60870-5-104 上行 | [`docs/子系统设计/IEC104上行设计说明.md`](../../docs/子系统设计/IEC104上行设计说明.md) |
| 数据可信(标定 / 快照 / 运行参数) | [`docs/任务规划/数据可信.md`](../任务规划/数据可信.md) | | 数据可信(标定 / 快照 / 运行参数) | [`docs/任务规划/数据可信.md`](../任务规划/数据可信.md) |
| 页面补齐规划 | [`docs/UI设计/页面补齐规划.md`](../../docs/UI设计/页面补齐规划.md) | | 页面补齐规划 | [`docs/UI设计/页面补齐规划.md`](../../docs/UI设计/页面补齐规划.md) |
| 编号规范 | [`docs/编号规范.md`](../../docs/编号规范.md) | | 条目命名与编号规则 | [`docs/文档规范.md`](../../docs/文档规范.md) §7.1 |
| 部署环境 | [`docs/环境与部署/项目部署环境要求.md`](../../docs/环境与部署/项目部署环境要求.md) | | 部署环境 | [`docs/环境与部署/项目部署环境要求.md`](../../docs/环境与部署/项目部署环境要求.md) |
| 硬件网表 | [`docs/硬件平台/V0.1_网表详细分析报告.md`](../../docs/硬件平台/V0.1_网表详细分析报告.md) | | 硬件网表 | [`docs/硬件平台/V0.1_网表详细分析报告.md`](../../docs/硬件平台/V0.1_网表详细分析报告.md) |
| 待办登记簿 | [`docs/任务规划/README.md`](../任务规划/README.md) | | 待办登记簿 | [`docs/任务规划/README.md`](../任务规划/README.md) |
@@ -731,7 +731,7 @@ tTimer_NoUI 无压无流判据(CN_
## 11. 屏板链路复刻任务规划 ## 11. 屏板链路复刻任务规划
> **口径**:条目一律用**语义短语**(编号规范 P-8),执行序即表序。 > **口径**:条目一律用**语义短语**(`docs/文档规范.md` §7.1 一律不发编号),执行序即表序。
> 改动范围只含本产品固件与 `DTU-RemoteLCD` 客户端;**屏板固件不在本仓库**, > 改动范围只含本产品固件与 `DTU-RemoteLCD` 客户端;**屏板固件不在本仓库**,
> 其行为以需求档 §5.16 为契约做黑盒验收。 > 其行为以需求档 §5.16 为契约做黑盒验收。
> >
+3 -3
View File
@@ -22,7 +22,7 @@
## 0. 条目与引用规则 ## 0. 条目与引用规则
- **新条目使用语义短语**,一行直接说清是什么事,不再新增字母加数字编号。 - **新条目使用语义短语**,一行直接说清是什么事,不再新增字母加数字编号。
- 旧编号只用于追溯历史,不复用、不重新发号;编号族与冻结规则见 `docs/编号规范.md`。 - 旧编号只用于追溯历史,不复用、不重新发号;规则见 `docs/文档规范.md` §7.1。
- 引用条目时写清所在文档和语义名,例如:`docs/任务规划/登记簿.md` 的 - 引用条目时写清所在文档和语义名,例如:`docs/任务规划/登记簿.md` 的
「net 层跨上下文收口」。不要只写一个短号让读者猜。 「net 层跨上下文收口」。不要只写一个短号让读者猜。
- 任务状态只维护在任务所属文件;本文件不另建一套状态表。 - 任务状态只维护在任务所属文件;本文件不另建一套状态表。
@@ -66,7 +66,7 @@
| **6** | 保护元件与采集增强 | 等待标准源或硬件改版 | 保护先解除未标定闭锁;三相同时刻类功能等 V0.2 硬件 | | **6** | 保护元件与采集增强 | 等待标准源或硬件改版 | 保护先解除未标定闭锁;三相同时刻类功能等 V0.2 硬件 |
| **7** | 验证窗口事项 | 逢条件顺带 | CI runner、PC peer、CH340、负向故障注入条件到位时执行 | | **7** | 验证窗口事项 | 逢条件顺带 | CI runner、PC peer、CH340、负向故障注入条件到位时执行 |
| **8** | 独立模块与暂缓项 | 当前不排 | 开入开出、104 文件传输单独立项(SNTP 已单独立项并于 2026-11-04 落地 #73,:8888 随 #78 退役);RS-485 与内存优化按各自重启条件 | | **8** | 独立模块与暂缓项 | 当前不排 | 开入开出、104 文件传输单独立项(SNTP 已单独立项并于 2026-11-04 落地 #73,:8888 随 #78 退役);RS-485 与内存优化按各自重启条件 |
| **独立** | **故障录波(1 kHz · 8 路原始码值 · 单通道回放)** | **代码面已交付;2026-10-31 远程半轮过六项、2026-11-02 回放页枚举缺陷已修复闭环、2026-11-04 注量对表闭环(#40 §8 交流轮)、2026-11-06 第二幕尾步坏段/空态画面台架远程轮拍毕——回放页三态板级判据全部实证;余 P 触发(需标定解锁决定)、bench T 源与卷占用、`task_prof` 耗时峰值等到场/裁定项** | 用户裁定 2026-10-29 **录波先行**:数据面最小闭环 → 手动与保护启动触发 → 回放页。三块的**代码侧判据已收口**(主机单测 113 / 170 / 110 全 rc=0、双端编译 0 错误 0 警告、板端编码器与 PC 侧解码器字节级互验、手动录波与录波回放两叶已绑页、内容页黄金参考扩至 66 张);**2026-10-31 远程半轮已过六项**(真 FAT 落盘、触发→落盘全部落在 2 s 封存超时窗内、冷却恢复、轮转、PC 侧坏段拒收、冻结窗内 104 并发);同轮发现的缺陷「回放页段表枚举恒空」**已于 2026-11-02 远程修复并板级闭环**(根因 = 读侧 `wave_store_seg_path()` 返回值判错,顺带修键处理缺失效;回放页真段/切段/切道已实测,登记簿条目已销项,证据见设计说明 §10「回放页枚举恒空缺陷修复记录」);**注量对表半轮已于 2026-11-04 由 #40 §8 交流轮闭环**(幅值 / 相位 / 削顶三项实测,`meas:` 行与板上读数逐项核对,104 浮点遥测按用户裁定不作对照证据;`docs/测试说明/测试数据/boot_log_data/20261104_ac_*`);**回放页放坏段与空态画面已于 2026-11-06 台架远程轮拍毕闭环**(同号翻位覆盖→「该段不可读」零波形元素绝不平线;全删→「无录波段」+ 串口 `open fail fr=4` 互证;证据 `docs/测试说明/测试数据/wave_shot_20261106/`,记录见设计说明 §10「回放页坏段/空态画面闭环记录」);**没跑的只剩** P 触发对时刻(先要标定解锁决定)/ bench T 源与卷占用(需 bench 构建)/ `task_prof` 读路径耗时峰值,全部结果与清单见 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」。**板级判据、留痕名清单与执行顺序图的属主 = docs/子系统设计/故障录波设计说明.md §9 与 §10**(原卡片登记簿 2026-10-30 随销项并入后删除);**与 UI 道互斥**(菜单树与中文字库是整文件生成物,同刻只允许一条道写)——本波按此串行执行:UI 道在数据面与接线冻结之后才动生成物 | | **独立** | **故障录波(1 kHz · 8 路原始码值 · 单通道回放)** | **代码面已交付;2026-10-31 远程半轮过六项、2026-11-02 回放页枚举缺陷已修复闭环、2026-11-04 注量对表闭环(#40 §8 交流轮)、2026-11-06 第二幕尾步坏段/空态画面台架远程轮拍毕——回放页三态板级判据全部实证、2026-11-07 #93 两条现场发现修复后台架验收 F1/F2 全过(PR #94);余保护触发(P,需标定解锁决定)、bench 定时自抓(T)与卷占用、`task_prof` 耗时峰值等到场/裁定项** | 用户裁定 2026-10-29 **录波先行**:数据面最小闭环 → 手动与保护启动触发 → 回放页。三块的**代码侧判据已收口**(主机单测 113 / 170 / 110 全 rc=0、双端编译 0 错误 0 警告、板端编码器与 PC 侧解码器字节级互验、手动录波与录波回放两叶已绑页、内容页黄金参考扩至 66 张);**2026-10-31 远程半轮已过六项**(真 FAT 落盘、触发→落盘全部落在 2 s 封存超时窗内、冷却恢复、轮转、PC 侧坏段拒收、冻结窗内 104 并发);同轮发现的缺陷「回放页段表枚举恒空」**已于 2026-11-02 远程修复并板级闭环**(根因 = 读侧 `wave_store_seg_path()` 返回值判错,顺带修键处理缺失效;回放页真段/切段/切道已实测,登记簿条目已销项,证据见设计说明 §10「回放页枚举恒空缺陷修复记录」);**注量对表半轮已于 2026-11-04 由 #40 §8 交流轮闭环**(幅值 / 相位 / 削顶三项实测,`meas:` 行与板上读数逐项核对,104 浮点遥测按用户裁定不作对照证据;`docs/测试说明/测试数据/boot_log_data/20261104_ac_*`);**回放页放坏段与空态画面已于 2026-11-06 台架远程轮拍毕闭环**(同号翻位覆盖→「该段不可读」零波形元素绝不平线;全删→「无录波段」+ 串口 `open fail fr=4` 互证;证据 `docs/测试说明/测试数据/wave_shot_20261106/`,记录见设计说明 §10「回放页坏段/空态画面闭环记录」);**#93 回放页两条现场发现(开页后新段不进表 / CRC 判废串口静默)已于 2026-11-07 按推荐方案修复并台架远程验收 F1 五条 F2 五条全过**(F1 = `wave_enter` 钩子开页作废钉表 + 空态键重探,A+B 同批;F2 = 五类判废汇成单条 `ui wave head idx= reject= stored= calc=` ERROR 级不去重留痕,reject=5 与 PC `wave_read` 同值互证;PR #94,证据 `docs/测试说明/测试数据/wave_fix_20261107/`,记录见设计说明 §10 修复记录);**没跑的只剩** 保护触发(P)对时刻(先要标定解锁决定)/ bench 定时自抓(T)与卷占用(需 bench 构建)/ `task_prof` 读路径耗时峰值,全部结果与清单见 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」。**板级判据、留痕名清单与执行顺序图的属主 = docs/子系统设计/故障录波设计说明.md §9 与 §10**(原卡片登记簿 2026-10-30 随销项并入后删除);**与 UI 道互斥**(菜单树与中文字库是整文件生成物,同刻只允许一条道写)——本波按此串行执行:UI 道在数据面与接线冻结之后才动生成物 |
### 2.1 关键依赖 ### 2.1 关键依赖
@@ -86,7 +86,7 @@
1. **完成即删除待办条目**,同时清理其他文档对它的引用;结论和证据写入模块文档, 1. **完成即删除待办条目**,同时清理其他文档对它的引用;结论和证据写入模块文档,
历史由 `git log` 保留。 历史由 `git log` 保留。
2. **当前任务只改 `UI补齐.md`,后续事项只改 `登记簿.md`**;顺序变化才改本文件 §2。 2. **当前任务只改 `UI补齐.md`,后续事项只改 `登记簿.md`**;顺序变化才改本文件 §2。
3. `数据可信.md` 的 §2、§4、§7~§10 仍被代码头注释引用为设计依据,不能按“已完成” 3. `数据可信.md` 的 §2、§4、§7 仍被代码头注释引用为设计依据,不能按“已完成”
删掉;其待办只认 §5 的任务卡表(标识列用语义短语,卡片增减不改本条口径)。 删掉;其待办只认 §5 的任务卡表(标识列用语义短语,卡片增减不改本条口径)。
4. 专项文档只放**还没闭环的约束**;已落地事项的规格正文归代码头注释或模块文档, 4. 专项文档只放**还没闭环的约束**;已落地事项的规格正文归代码头注释或模块文档,
销项即删文件并把引用改指现行出处(先例:`测试与架构专项.md` 已删除 2026-10-28, 销项即删文件并把引用改指现行出处(先例:`测试与架构专项.md` 已删除 2026-10-28,
+58 -187
View File
@@ -1,15 +1,15 @@
# 数据可信(等待台架与外部资源) # 数据可信(等外部资源:子板变比与标准源)
> **这篇是什么**:把"采集出来的数到底能不能信"一次讲完——已经证到哪一步、按构造还证不到什么、 > **这篇是什么**:把"采集出来的数到底能不能信"一次讲完——已经证到哪一步、按构造还证不到什么、
> 下一跳怎么跨、哪些必须等外部资源。 > 下一跳怎么跨、哪些必须等外部资源。
> **它同时是设计约束的归属文件**:§2.1 / §2.3 / §2.6 / §4.1~§4.5 / §7 / §8 / §9 / §10 被**代码与测试头注释** > **它同时是设计约束的归属文件**:§2.1 / §2.3 / §2.6 / §4.1~§4.5 / §7 被**代码与测试头注释**
> 当口径出处引用(`adc_cal.*` / `meas.*` / `cfg_file.*` / `prot_elm` / `protect_task.c` / `ui_data*` / > 当口径出处引用(`adc_cal.*` / `meas.*` / `cfg_file.*` / `prot_elm` / `protect_task.c` / `ui_data*` /
> `test/host/prot_dim/*`),它们是**现行规范,不是"已完成记录"**。已完成的事项按"完成即销项"只删 §5 表里的行。 > `test/host/prot_dim/*`),它们是**现行规范,不是"已完成记录"**。已完成的事项按"完成即销项"只删 §5 表里的行。
> 排序权威只有一处:`docs/任务规划/README.md` §2;后续事项索引在 `docs/任务规划/登记簿.md` §7。 > 排序权威只有一处:`docs/任务规划/README.md` §2;后续事项索引在 `docs/任务规划/登记簿.md` §7。
> **最该先知道的一条**:保护判据现在处于**未标定闭锁**态。判据 = `App/algo/adc_cal.c` 的 > **最该先知道的一条**:保护判据现在处于**未标定闭锁**态。判据 = `App/algo/adc_cal.c` 的
> `adc_cal_prot_blocked()`——UA / UN / IA 的 `ADC_CAL_F_VALID` **全置位**才放行,`protect_task` 拿它的返回值 > `adc_cal_prot_blocked()`——UA / UN / IA 的 `ADC_CAL_F_VALID` **全置位**才放行,`protect_task` 拿它的返回值
> 停走判据(判据已从 `protect_task.c` 搬进 `adc_cal.c`,旧行号引用作废;只有 `DTU_BENCH` 构建旁路,**且只旁路这一处**)。 > 停走判据(只有 `DTU_BENCH` 构建旁路,**且只旁路这一处**)。
> 用户裁定(2026-10-25):**保持闭锁到标准源到位**,不缩短解锁路径(不用万用表走捷径)。 > 用户裁定(2026-10-25):**保持闭锁到标准源到位**,不缩短解锁路径(不用万用表走捷径)。
--- ---
@@ -18,7 +18,7 @@
图由 `tools/arch_diagram/gen_data_trust_ladder_svg.py` 生成(改图改脚本重跑,勿手改 SVG)。 图由 `tools/arch_diagram/gen_data_trust_ladder_svg.py` 生成(改图改脚本重跑,勿手改 SVG)。
![数据可信是五级台阶,现在踩在第 2 级](../images/数据可信台阶.svg) ![数据可信是五级台阶,现在踩在第 3 级](../images/数据可信台阶.svg)
每升一级只多答一个问题,台阶之间的高度差就是"下游能多信多少": 每升一级只多答一个问题,台阶之间的高度差就是"下游能多信多少":
@@ -26,7 +26,7 @@
|---|---|---| |---|---|---|
| 1 通路活 | 9 路都在转换、没串道、极性没反? | ✅ 2026-10-27 已证 | | 1 通路活 | 9 路都在转换、没串道、极性没反? | ✅ 2026-10-27 已证 |
| 2 静态引脚电压 | 注 1 V 直流,读数是不是 1 V? | ✅ 2026-10-27 已证(六项判据全 PASS,§2.6) | | 2 静态引脚电压 | 注 1 V 直流,读数是不是 1 V? | ✅ 2026-10-27 已证(六项判据全 PASS,§2.6) |
| **3 动态引脚波形** | **注 Vpp 2.828 V 正弦(板上读数 ≈1 V),算出来还是不是 1 V?** | **✅ 2026-11-02 / 11-04 已跑两轮、六轮全部闭合**(削顶 2 Hz 档与复位复核经用户裁定 2026-11-04 关闭;谐波 B 行超差已归因板端前端 RC fc≈796 Hz → §4.6 任务卡;实测结论 `docs/硬件平台/ADC通道映射说明.md` §8.2) | | **3 动态引脚波形** | **注 Vpp 2.828 V 正弦(板上读数 ≈1 V),算出来还是不是 1 V?** | **✅ 2026-11-02 / 11-04 已跑两轮、六轮全部闭合**(削顶 2 Hz 档与复位复核经用户裁定 2026-11-04 关闭;谐波 B 行超差已归因板端前端 RC fc≈796 Hz → §4.6.2 谐波轮;实测结论 `docs/硬件平台/ADC通道映射说明.md` §8.2) |
| 4 端子二次值 | 引脚上这 1 V 对应端子侧几 V? | 🟡 等子板原理图或实物 | | 4 端子二次值 | 引脚上这 1 V 对应端子侧几 V? | 🟡 等子板原理图或实物 |
| 5 精度等级验收 | 额定工况下整条链误差够几级? | 🟡 等标准源 | | 5 精度等级验收 | 额定工况下整条链误差够几级? | 🟡 等标准源 |
@@ -34,9 +34,9 @@
1. **第 1、2 级已闭环**,证据与判据的属主是 `docs/硬件平台/ADC通道映射说明.md` §8.1,执行步骤属主是 1. **第 1、2 级已闭环**,证据与判据的属主是 `docs/硬件平台/ADC通道映射说明.md` §8.1,执行步骤属主是
`docs/测试说明/专项验证/ADC前端注入验证流程.md`——本文不重抄,只写"证到哪、为什么不能再往外推"。 `docs/测试说明/专项验证/ADC前端注入验证流程.md`——本文不重抄,只写"证到哪、为什么不能再往外推"。
2. **第 3 级是当前唯一的空白,而且不需要任何外部资源**:一台能出 50 Hz 正弦的交流信号发生器, 2. **第 3 级已于 2026-11-02 / 11-04 台架闭环,全程没用到任何外部资源**:一台能出 50 Hz 正弦的交流信号发生器,
接在**已经验证过的那个注入点**上就行。它比第 4、5 级安全一个量级——只需 ±2 V 以内的正弦, 接在**已经验证过的那个注入点**上就行。它比第 4、5 级安全一个量级——只需 ±2 V 以内的正弦,
而端子级验证要上 100 V / 220 V 二次值。**不用烧高压、不用标准源,这是把它排最前的理由**(§4.6)。 而端子级验证要上 100 V / 220 V 二次值。
3. **第 4、5 级在等外部**:④ 子板/端子板变比(仓库里没有原理图)与标准源两点标定, 3. **第 4、5 级在等外部**:④ 子板/端子板变比(仓库里没有原理图)与标准源两点标定,
两者完成前 `eng` 保持 0,本波只承诺"ADC 引脚电压"。 两者完成前 `eng` 保持 0,本波只承诺"ADC 引脚电压"。
@@ -46,9 +46,9 @@
|---|---| |---|---|
| 判断现在这些数能信到什么程度 | §1 这张图 + §2.6(静态证到哪)+ §2.7(动态证到哪) | | 判断现在这些数能信到什么程度 | §1 这张图 + §2.6(静态证到哪)+ §2.7(动态证到哪) |
| 改采集 / 算法 / 品质位相关代码 | §2.1 §2.2 §2.3(口径)+ §4.1~§4.5(设计依据) | | 改采集 / 算法 / 品质位相关代码 | §2.1 §2.2 §2.3(口径)+ §4.1~§4.5(设计依据) |
| 上台架做正弦验证 | ✅ 已闭环(2026-11-04);复跑看 §4.6(接法、六轮判据、数字从哪儿读、坑)+ §5 的「信号发生器动态波形验证」卡 | | 复跑六轮交流验证 | §4.6(判据、数字从哪儿读、坑)+ §5 的「信号发生器动态波形验证」卡 |
| 看还差谁、按什么顺序做 | §5 任务卡 + §6 顺序图 | | 看还差谁、按什么顺序做 | §5 任务卡 |
| 确认某件事是**故意不做**而不是漏了 | §9;有没有踩坑风险看 §8 | | 确认某件事是**故意不做**而不是漏了 | §2.7 的「按下游列一遍」表 + §5 任务卡里的未闭合项 |
--- ---
@@ -68,21 +68,21 @@
| IB / IC / IN | STM32 ADC1 | 同上 | 805.66 µV | 同上 | **805.66 µV/码** | ❌ 削顶 | | IB / IC / IN | STM32 ADC1 | 同上 | 805.66 µV | 同上 | **805.66 µV/码** | ❌ 削顶 |
| TEMP | STM32 ADC1 | 同上 | 805.66 µV | 同上 | 热敏非线性 | — 不纳入线性标定 | | TEMP | STM32 ADC1 | 同上 | 805.66 µV | 同上 | 热敏非线性 | — 不纳入线性标定 |
- 通道数 `ADC_SEM_COUNT = 9`(8 电气 + 温度),枚举定义 `App/algo/adc_input.h:38-49`。 - 通道数 `ADC_SEM_COUNT = 9`(8 电气 + 温度),枚举定义 `App/algo/adc_input.h:38-49`(`adc_semantic_t`)。
- 唯一折算点:`App/task/adc_task.c:382` 的 `frame[s] = adc_cal_apply((adc_semantic_t)s, code)`—— - 唯一折算点:`App/task/adc_task.c:425` 的 `frame[s] = adc_cal_apply((adc_semantic_t)s, code)`——
**全仓只有这一处**把码值变成工程量,现单位 = **ADC 引脚电压 V**(`eng = 0`)。 **全仓只有这一处**把码值变成工程量,现单位 = **ADC 引脚电压 V**(`eng = 0`)。
- 端到端链路分四段(① 语义↔网名↔通道、② 引脚电压↔码值、③ `AINn` ↔ 引脚、④ 端子 ↔ `AINn`), - 端到端链路分四段(① 语义↔网名↔通道、② 引脚电压↔码值、③ `AINn` ↔ 引脚、④ 端子 ↔ `AINn`),
属主 `docs/硬件平台/ADC通道映射说明.md` §7.1:①②③ 已定死(③ 变比 1:1),**只有 ④ 是缺口**。 属主 `docs/硬件平台/ADC通道映射说明.md` §7.1:①②③ 已定死(③ 变比 1:1),**只有 ④ 是缺口**。
### 2.2 量纲错配与量纲回归(锚点:`test/host/prot_dim/*`;M4 退出判据⑥) ### 2.2 量纲错配与量纲回归(锚点:`test/host/prot_dim/*`;M4 退出判据⑥)
**这一节为什么必须在**:台架此前"通过",是因为**没有一条判据检查"不该动作时不动作"**。 **没有一条判据检查"不该动作时不动作",台架就会一路"通过"**:"码值当工程量"的错配会让 OC
"码值当工程量"的错配曾让 OC 拿 ~11000 码值去比 10 A 定值 → **恒假动作**。这类错的可怕之处不是 拿 ~11000 码值去比 10 A 定值 → **恒假动作**。这类错不是"测不准",而是**每次都跳**,且三处消费者
"测不准",而是**每次都跳**,而且三处消费者(判据、104、UI)一起错、一处都不报错。 (判据、104、UI)一起错、一处都不报错。
固化它的回归 = `test/host/prot_dim/`:从 **ADC 码值**出发、**显式写出码值↔二次值换算**,走真实的 固化它的回归 = `test/host/prot_dim/`:从 **ADC 码值**出发、**显式写出码值↔二次值换算**,走真实的
折算 → 采样环 → 全周傅氏 → 元件判据链;任何一环把量纲弄丢(例如折算点被旁路),断言立刻翻转 折算 → 采样环 → 全周傅氏 → 元件判据链;任何一环把量纲弄丢(例如折算点被旁路),断言立刻翻转
(TC-PROTDIM-002 就是反错配对照,专门复现那次历史事故)。它用的是**合成系数 10 mV/码**, (TC-PROTDIM-002 就是反错配对照,专门复现那次事故)。它用的是**合成系数 10 mV/码**,
不是板上 152.59 / 805.66 µV/码——**它证的是"链条别丢量纲",不证"变比数值对不对"**(后者归 §2.6 与 §4.6)。 不是板上 152.59 / 805.66 µV/码——**它证的是"链条别丢量纲",不证"变比数值对不对"**(后者归 §2.6 与 §4.6)。
| 量纲档 | 怎么进入这个档 | 现在的处置 | | 量纲档 | 怎么进入这个档 | 现在的处置 |
@@ -101,7 +101,7 @@
| 2 | `App/protocol/iec104/iec104_pts.c:69-80` | `k_yc[].deadband` 已按点重定:电压 0.5 V、电流 0.005 A、频率 0.5 Hz(真源在 `run_par`,UI 可改) | ✅ 已重定;④ 变比到手后需再复核一次量纲 | | 2 | `App/protocol/iec104/iec104_pts.c:69-80` | `k_yc[].deadband` 已按点重定:电压 0.5 V、电流 0.005 A、频率 0.5 Hz(真源在 `run_par`,UI 可改) | ✅ 已重定;④ 变比到手后需再复核一次量纲 |
| 3 | `App/algo/prot_set.c:25-70` | `g_prot_set_meta[]` 定值 = 二次值 A / V(基准 100 V / 1 A):OC1 10 A、OV 120 V、UV 20 V、3U0 15 V… | 🟡 口径对,但**标定前无法在板上验真**;§7 #1 定了精度目标后连同 `min`/`max` 复核 | | 3 | `App/algo/prot_set.c:25-70` | `g_prot_set_meta[]` 定值 = 二次值 A / V(基准 100 V / 1 A):OC1 10 A、OV 120 V、UV 20 V、3U0 15 V… | 🟡 口径对,但**标定前无法在板上验真**;§7 #1 定了精度目标后连同 `min`/`max` 复核 |
### 2.4 / 2.5 —— 2026-10-25 瘦身时删除,编号不复用(防止被重新取走) ### 2.4 / 2.5 已删除,编号不复用
### 2.6 静态验证:已知电压注入已于 2026-10-27 台架闭环(锚点:`adc_cal.*` / `meas.*` / `ui_data*`) ### 2.6 静态验证:已知电压注入已于 2026-10-27 台架闭环(锚点:`adc_cal.*` / `meas.*` / `ui_data*`)
@@ -125,8 +125,7 @@
**这一轮证到的是"一条水平线的高度"**:给定直流电压 → 码值 → 折算,斜率、零点、线性度、极性、 **这一轮证到的是"一条水平线的高度"**:给定直流电压 → 码值 → 折算,斜率、零点、线性度、极性、
通道对位、节拍全在 ±2 % 内。**直流信号在时间轴上没有形状**,所以相位、频率、波形相关性、真实削顶、谐波 通道对位、节拍全在 ±2 % 内。**直流信号在时间轴上没有形状**,所以相位、频率、波形相关性、真实削顶、谐波
这五类**按构造**不在本节证据范围内——逐条列在 §2.7。另有两项**本轮未覆盖**: 这五类**按构造**不在本节证据范围内——逐条列在 §2.7。另有两项**本轮未覆盖**:
串扰(零点步骤时其余七路浮空本身在漂)与"注入进行中"的节奏(只测了注入前后),口径同 串扰(零点步骤时其余七路浮空本身在漂)与"注入进行中"的节奏(只测了注入前后)。
`docs/硬件平台/ADC通道映射说明.md` §8.1 尾注。
**一个必须记住的区分**:`CLIPPED` 位是**来源派生**(`App/algo/adc_cal.c:291-293`:系数来自 STM32 就置位, **一个必须记住的区分**:`CLIPPED` 位是**来源派生**(`App/algo/adc_cal.c:291-293`:系数来自 STM32 就置位,
V0.1 恒命中 UB/UC/IB/IC/IN,位图 `0xE6`),它表示"这路不能测交流",**不等于**"这路此刻正在削顶"。真削顶的签名是 V0.1 恒命中 UB/UC/IB/IC/IN,位图 `0xE6`),它表示"这路不能测交流",**不等于**"这路此刻正在削顶"。真削顶的签名是
@@ -139,32 +138,20 @@ V0.1 恒命中 UB/UC/IB/IC/IN,位图 `0xE6`),它表示"这路不能测交
### 2.7 动态验证:已跑两轮(2026-11-02 / 11-04),六轮实测结论在 `docs/硬件平台/ADC通道映射说明.md` §8.2 ### 2.7 动态验证:已跑两轮(2026-11-02 / 11-04),六轮实测结论在 `docs/硬件平台/ADC通道映射说明.md` §8.2
**一句话**:这一档**不再是空白**——真实交流波形已经台架两轮验证(幅值/波形/相位/测频/谐波/削顶直流档都过了); **一句话**:这一档已台架两轮验证(幅值 / 波形 / 相位 / 测频 / 谐波 / 削顶直流档都过了)。
本节先留"当时为什么判空白"的证据链,下面按下游的表已按两轮实测更新。
当时的证据(逐条可查,全部是各套件自己的自陈,不是推测——正是它们说明 PC 套件自己闭不了这一档): 按下游列一遍"现在能不能信"(数只详述在 `docs/硬件平台/ADC通道映射说明.md` §8.2,此处不抄第二份):
| 出处 | 原话要点 |
|---|---|
| `test/host/phasor/run_unit_test.py` | 「板端**无信号源**,无法注入已知幅值/相位/频率的标准波形,因而无法验证"读数 = 设定有效值"」 |
| `test/host/meas/run_unit_test.py` | 「读数与注入源比对类判据仍归台架(实测采样类,本套件不覆盖)」 |
| `test/host/prot_dim/prot_dim_test.c` | 系数是合成覆写的 10 mV/码,非板上 152.59 / 805.66 µV/码 |
| `App/algo/adc_cal.h` | `adc_cal_two_point()`:「实测注入未做(台架待跑),本函数即"公式齐备"的交付物」 |
| `docs/测试说明/专项验证/ADC前端注入验证流程.md` | 「**只验直流**:零点 / 线性 / 通道映射 / 极性。不验交流有效值——台架无信号源」 |
| `App/task/adc_task.c` 心跳块 | `adc:` 是当拍瞬时码值、`meas:` 是 200 ms 快照——**没有一行能给出波形形状** |
按下游列一遍"现在能不能信"(2026-11-04 按台架两轮更新;数只详述在 `docs/硬件平台/ADC通道映射说明.md` §8.2,此处不抄第二份):
| 下游 | 现在 | 为什么 | | 下游 | 现在 | 为什么 |
|---|---|---| |---|---|---|
| 基波有效值 | ✅ 过(±2 % 内,三档幅值两点复现) | 台架幅值轮 + 波形轮(基波分量口径)实证;端子二次值仍不归这档(§4.6.5) | | 基波有效值 | ✅ 过(±2 % 内,三档幅值两点复现) | 台架幅值轮 + 波形轮(基波分量口径)实证;**端子二次值仍不归这一档**——从引脚到端子还隔着 ④ 段变比 |
| 相位 | ✅ 同片内过(录波档 ≤2° 判据) | 同段 UA/UN 两路实测(0° 与 90° 两工况);**跨转换器仍禁比**——无同刻性是 V0.1 硬件边界(§9),不是待修缺陷 | | 相位 | ✅ 同片内过(录波档 ≤2° 判据) | 同段 UA/UN 两路实测(0° 与 90° 两工况);**跨转换器仍禁比**——两片转换器无共同采样触发,是 V0.1 硬件边界(`docs/硬件平台/ADC通道映射说明.md` §7 通道归属行),不是待修缺陷 |
| 频率 | ✅ 「如实报不可测」成立(这就是现状判据) | 含满幅注入段全不可测、UI 恒 `--`;**45~55 Hz 精度仍未验**——要验须降 `FREQ_AMP_MIN` 单跑一轮 → §7 #8 | | 频率 | ✅ 「如实报不可测」成立(这就是现状判据) | 含满幅注入段全不可测、UI 恒 `--`;**45~55 Hz 精度仍未验**——要验须降 `FREQ_AMP_MIN` 单跑一轮 → §7 #8 |
| 削顶 / 品质 | ✅ DC −1.00 V 档锁存 + sticky 实证;2.0 Hz 低频档与复位复核经用户裁定 2026-11-04 关闭 | `[ERR] rail: edge=0x2 sticky=0x2` 唯一一条、撤注恒持;执行见 §4.6 任务卡 | | 削顶 / 品质 | ✅ DC −1.00 V 档锁存 + sticky 实证;2.0 Hz 低频档与复位复核经用户裁定 2026-11-04 关闭 | `[ERR] rail: edge=0x2 sticky=0x2` 唯一一条、撤注恒持;执行见 §4.6 削顶轮 |
| 谐波 C04 / C05 | 🟡 选择性轨已证(单注 100/250 Hz 分别只进对应桶、纯基波两桶为 0);**仍无消费者、无处上送** | 250 Hz→`Ia5` 行 −4.4 % **已按板端前端真实衰减关闭(2026-11-04)**:IA 前端差分滤波 C35 = 100 nF + R19/R21 各 1 k 构成一阶低通 fc ≈ 796 Hz,板端读数忠实、工频不受影响;谐波产品化需板改(模型与数据 `docs/硬件平台/ADC通道映射说明.md` §8.2,执行手册谐波记录 B 行);接到哪、给谁用归 §9 的谐波轨立项 | | 谐波 C04 / C05 | 🟡 选择性轨已证(单注 100/250 Hz 分别只进对应桶、纯基波两桶为 0);**仍无消费者、无处上送** | 250 Hz→`Ia5` 行 −4.4 % **已按板端前端真实衰减关闭(2026-11-04)**:IA 前端差分滤波 C35 = 100 nF + R19/R21 各 1 k 构成一阶低通 fc ≈ 796 Hz,板端读数忠实、工频不受影响;谐波产品化需板改(模型与数据 `docs/硬件平台/ADC通道映射说明.md` §8.2,执行手册谐波记录 B 行);这两根轨归谁用,见 `docs/算法/继电保护功能复现规划.md` 的「遥测谐波轨(可选)」 |
| 保护判据 | 🔒 闭锁中 | §4.3 | | 保护判据 | 🔒 闭锁中 | §4.3 |
→ 两轮已按 **§4.6** 跑完(从**已验证过的那个注入点**灌正弦);六轮全部闭合(谐波 B 行超差已归因板端前端 RC,见 §2.7 谐波行;削顶 2 Hz 低频档与复位复核经用户裁定 2026-11-04 关闭,见 §2.7 削顶行与执行手册削顶卡步 3 行)。 → 两轮已按 **§4.6** 跑完(从**已验证过的那个注入点**灌正弦);六轮全部闭合(谐波 B 行超差已归因板端前端 RC,削顶 2 Hz 低频档与复位复核经用户裁定 2026-11-04 关闭)。
--- ---
@@ -177,14 +164,14 @@ M4 的六条退出判据(逐条对齐现状,别整格打勾):
| 退出判据 | 状态 | 证据 / 缺口 | | 退出判据 | 状态 | 证据 / 缺口 |
|---|---|---| |---|---|---|
| ① 至少 1 路电压通道经已知电压注入验证,斜率与理论 LSB 偏差 ≤2 % | ✅ 2026-10-27 | UA 6544.2 vs 6553.6 码/V(−0.14 %),`docs/硬件平台/ADC通道映射说明.md` §8.1 | | ① 至少 1 路电压通道经已知电压注入验证,斜率与理论 LSB 偏差 ≤2 % | ✅ 2026-10-27 | UA 6544.2 vs 6553.6 码/V(−0.14 %),`docs/硬件平台/ADC通道映射说明.md` §8.1 |
| ② `adc_cal` 折算落地,采样环里是**引脚电压 V** 而非码值 | ✅ | `App/task/adc_task.c:382`(全仓唯一折算点) | | ② `adc_cal` 折算落地,采样环里是**引脚电压 V** 而非码值 | ✅ | `App/task/adc_task.c:425`(全仓唯一折算点) |
| ③ 8 通道系数 / 零点可落盘,加载失败回退 ROM 默认 | ✅ | `[adc_cal]` / `[adc_cal_ofs]`,见 §4.4 | | ③ 8 通道系数 / 零点可落盘,加载失败回退 ROM 默认 | ✅ | `[adc_cal]` / `[adc_cal_ofs]`,见 §4.4 |
| ④ 三处下游常数按工程量重定并注明依据 | ✅(有尾巴) | §2.3;#1 在 `eng=0` 恒失效已记因于 `freq.h:58-60` | | ④ 三处下游常数按工程量重定并注明依据 | ✅(有尾巴) | §2.3;#1 在 `eng=0` 恒失效已记因于 `freq.h:58-60` |
| ⑤ "未标定 → 保护闭锁"生效 | 🟡 软件道 ✅;**"解锁"这半程要等 `VALID` 置位**才能上台架验 | `adc_cal_prot_blocked()` + `App/task/protect_task.c:245` | | ⑤ "未标定 → 保护闭锁"生效 | 🟡 软件道 ✅;**"解锁"这半程要等 `VALID` 置位**才能上台架验 | `adc_cal_prot_blocked()` + `App/task/protect_task.c:268` |
| ⑥ 量纲回归用例(不该动作时不动作)通过 | ✅ | `test/host/prot_dim/`,见 §2.2 | | ⑥ 量纲回归用例(不该动作时不动作)通过 | ✅ | `test/host/prot_dim/`,见 §2.2 |
**所以 M4 差的是"台架面",而且它分两半**: **所以 M4 差的是"台架面",它分两半**:动态这半(§4.6)已于 2026-11-02 / 11-04 台架闭环;
**动态这半(§4.6)手边就能做、不要外部资源**;端子与精度那半要等子板与标准源(§5 后两张卡)。 端子与精度那半要等子板与标准源(§5 后两张卡)。
**M5 遥测链 / M6 运行参数与点表**:均已达成,口径沉淀在 `App/algo/meas.h`、`App/algo/run_par.h` **M5 遥测链 / M6 运行参数与点表**:均已达成,口径沉淀在 `App/algo/meas.h`、`App/algo/run_par.h`
头注释与 §4.5;其中"104 上送值与**工程量**一致"仍挂在变比确认与两点标定上(注入验证只证到引脚电压口径)。 头注释与 §4.5;其中"104 上送值与**工程量**一致"仍挂在变比确认与两点标定上(注入验证只证到引脚电压口径)。
@@ -212,6 +199,9 @@ M4 的六条退出判据(逐条对齐现状,别整格打勾):
两者都占 4 字节,Q16 把"系数定点舍入"这一项从误差预算里直接抹掉。参考项目用 2^10 是因为定点 DSP 两者都占 4 字节,Q16 把"系数定点舍入"这一项从误差预算里直接抹掉。参考项目用 2^10 是因为定点 DSP
乘法成本,本机有 FPU、运行时本来就是 float。int32 上限可表达 32767 µV/码,远够。 乘法成本,本机有 FPU、运行时本来就是 float。int32 上限可表达 32767 µV/码,远够。
- **运行时不走定点**:`k` 预乘成 `float k_f`,逐点只做一次浮点乘——1 kHz × 9 通道 = 9k 次/秒,可忽略。 - **运行时不走定点**:`k` 预乘成 `float k_f`,逐点只做一次浮点乘——1 kHz × 9 通道 = 9k 次/秒,可忽略。
- **系数合法带**:`adc_cal_set()` / `adc_cal_two_point()` 只接受落在板级 ROM 系数 ×[0.5, 2.0] 内的 `k`。
实测斜率与理论值偏差大时**先查前端**(分压 / 变比 / 焊接),不许用系数把硬件的错凑回来——
那等于把故障固化成"标定值"。零点越 ±`ADC_CAL_B_MAX` 同样直接拒绝(口径在 `App/algo/adc_cal.h`)。
### 4.2 三态可用性:标定 ≠ 可测 ### 4.2 三态可用性:标定 ≠ 可测
@@ -230,16 +220,16 @@ M4 的六条退出判据(逐条对齐现状,别整格打勾):
| TEMP | 0 | 0 | 不参与线性标定,页面显示 `--` | | TEMP | 0 | 0 | 不参与线性标定,页面显示 `--` |
`adc_cal_flags(sem)` 是三处(UI / 104 / 保护)唯一的可用性查询入口;`adc_cal_apply()` **不返回**可用性, `adc_cal_flags(sem)` 是三处(UI / 104 / 保护)唯一的可用性查询入口;`adc_cal_apply()` **不返回**可用性,
所以"只看系数不看 flags"这种用法在接口层就被堵掉(对应 §8 的"削顶通道被当成可测"一行)。 所以"只看系数不看 flags"这种用法在接口层就被堵掉(CLIPPED 通道恒报 IV 的单测见 `test/host/prot_dim/`)。
### 4.3 未标定即闭锁(本波唯一的行为变更) ### 4.3 未标定即闭锁(本波唯一的行为变更)
保护判据拿"ADC 引脚电压"跟"二次值定值"比必然误动作,所以 `protect_task` 多一个闭锁源: 保护判据拿"ADC 引脚电压"跟"二次值定值"比必然误动作,所以 `protect_task` 多一个闭锁源:
**UA / UN / IA 的 `VALID` 未全置位 → 判据停走**(实现已搬进 `App/algo/adc_cal.c` 的 **UA / UN / IA 的 `VALID` 未全置位 → 判据停走**(实现已搬进 `App/algo/adc_cal.c` 的
`adc_cal_prot_blocked()`,`App/task/protect_task.c:268-273` 消费并打 INFO + 记 SOE)。 `adc_cal_prot_blocked()`,`App/task/protect_task.c:268` 消费并打 INFO + 记 SOE)。
- 与"自检失败 / 采样故障闭锁"同构(`PROT_HF_LOCK_MASK` 那一套),**不新增机制**。 - 与"自检失败 / 采样故障闭锁"同构(`PROT_HF_LOCK_MASK` 那一套),**不新增机制**。
- 现有台架 `/serial-boot-test` 的期望会因此变化——**这是有意的**,任务卡里同步更新判据。 - 台架 `/serial-boot-test` 的期望与未闭锁构建不同(判据已同步),这是有意为之。
- 台架调试要旁路只能走编译期开关 `DTU_BENCH`,不进 cfg、不进 104。 - 台架调试要旁路只能走编译期开关 `DTU_BENCH`,不进 cfg、不进 104。
⚠ **`DTU_BENCH` 只旁路这一处**:它**不**旁路 §2.3 #1 的测频幅值门,也不产生任何新的读数通道。 ⚠ **`DTU_BENCH` 只旁路这一处**:它**不**旁路 §2.3 #1 的测频幅值门,也不产生任何新的读数通道。
@@ -256,9 +246,8 @@ M4 的六条退出判据(逐条对齐现状,别整格打勾):
- 系数唯一真源仍是这两段——104 写 k/b 经 `adc_cal_set()` 代理,`run_par` **不存第二份**; - 系数唯一真源仍是这两段——104 写 k/b 经 `adc_cal_set()` 代理,`run_par` **不存第二份**;
落盘链走 `SYS_EVT_RUN_PAR_SAVE`(iec104Task peek 投递 → defaultTask 整档 save),`p_cb` 依旧未用。 落盘链走 `SYS_EVT_RUN_PAR_SAVE`(iec104Task peek 投递 → defaultTask 整档 save),`p_cb` 依旧未用。
- ⚠ **负零点**:引擎原本只有 `CFG_VAL_UINT`(`strtoul` + 上界校验),负的零点偏移会落成 - ⚠ **负零点**:零点偏移是带符号量,引擎只有 `CFG_VAL_UINT`(`strtoul` + 上界校验)时 −5 会落成
`4294967291` 这种现场看不懂的数——**这就是补 `CFG_VAL_INT` 的动因**(§7 #3)。 `4294967291`。所以 `[adc_cal_ofs]` 走 `CFG_VAL_INT`(定案口径 §7 #3)。
备选"零点存码值 + 32768 偏置的 uint16"已否决:绕开引擎却要每个读点记住减偏置,属于给未来埋坑。
### 4.5 遥测快照:让 104 与 UI 共用一份上游 ### 4.5 遥测快照:让 104 与 UI 共用一份上游
@@ -279,12 +268,12 @@ typedef struct {
``` ```
- **发布者 = `adc_task`**,在 `phasor_run()` / `freq_run()` 之后按 200 ms 分频发布;生产者在自己上下文里 - **发布者 = `adc_task`**,在 `phasor_run()` / `freq_run()` 之后按 200 ms 分频发布;生产者在自己上下文里
发布,消费者不组装、不判断新旧。全仓 `meas_tick()` **调用点数 = 1** 是评审判据(§8"快照双写")。 发布,消费者不组装、不判断新旧。全仓 `meas_tick()` **调用点数 = 1** 是评审判据。
- **跨任务读沿用 `phasor` 的双区原子交换**(写侧填非使用区、末尾翻单字节索引;读侧先取索引再整体拷), - **跨任务读沿用 `phasor` 的双区原子交换**(写侧填非使用区、末尾翻单字节索引;读侧先取索引再整体拷),
**不是新机制**、不引入锁。 **不是新机制**、不引入锁。
- 104 与 UI 都读这份快照 → **同一份数据、两个消费者**;104 侧值与品质整体透传,不做本地判断。 - 104 与 UI 都读这份快照 → **同一份数据、两个消费者**;104 侧值与品质整体透传,不做本地判断。
- **200 ms 是上送节拍,不是平均窗**:相量本身已是 1 ms 刷新的基波有效值,再平均只会引入滞后。 - **200 ms 是上送节拍,不是平均窗**:相量本身已是 1 ms 刷新的基波有效值,再平均只会引入滞后。
⚠ 这条在动态验证里有个可读的后果:注入非整 50 Hz 的正弦时,快照轨会呈现拍频式跳动,**属预期**(§8)。 ⚠ 这条在动态验证里有个可读的后果:注入非整 50 Hz 的正弦时,快照轨会呈现拍频式跳动,**属预期**。
### 4.6 动态波形验证:用信号发生器把整条计算链跑一遍 ### 4.6 动态波形验证:用信号发生器把整条计算链跑一遍
@@ -292,26 +281,22 @@ typedef struct {
![上排直流静态标定、下排交流正弦验证:同一个注入点、同一套前端,两种证法](../images/ADC直流标定与交流验证.svg) ![上排直流静态标定、下排交流正弦验证:同一个注入点、同一套前端,两种证法](../images/ADC直流标定与交流验证.svg)
#### 4.6.1 为什么这一跳既不用标准源、也不用烧高压 #### 4.6.1 范围与幅度上限
| 理由 | 依据 | | 边界 | 口径 |
|---|---| |---|---|
| 注入点已经验证过,且就在那儿 | `docs/测试说明/专项验证/ADC前端注入验证流程.md` §3 的注入点清单(串联电阻端子侧 = `U5` 排针);③ 段 1:1 已拿到台架证据(§2.6) | | 注入点 | `docs/测试说明/专项验证/ADC前端注入验证流程.md` §3 的注入点清单(串联电阻端子侧 = `U5` 排针);③ 段 1:1 已拿到台架证据(§2.6) |
| **不知道 ④ 变比也能验算法** | 注入点在 ④ **之前**,发生器给的电压就是引脚电压,算法链要证的正是"引脚域里算得对不对" | | 不知道 ④ 变比也能验 | 注入点在 ④ **之前**,发生器给的电压就是引脚电压,这一轮要证的正是"引脚域里算得对不对" |
| 幅度小两个数量级 | 只需 ±2 V 以内的正弦(TPAFE 侧判据上限);端子二次值验证要上 100 V / 220 V,风险与设备都在那一级 | | 幅度上限 | ±2 V 以内的正弦(TPAFE 侧判据上限);端子二次值验证要上 100 V / 220 V,风险与设备都在那一级 |
| 现有静态验证的读数的地方可直接复用 | 串口心跳,零固件改动(§4.6.3) | | 读数的地方 | 串口心跳,零固件改动(§4.6.3) |
**这一跳证的是功能性**(算得对不对、品质报得实不实、节拍稳不稳),**不是计量**(误差几级)—— **这一轮证的是功能性**(算得对不对、品质报得实不实、节拍稳不稳),**不是计量**(误差几级)——
发生器不当"标准"的界线见 §4.6.5 与 §7 #9。 发生器不当"标准"的界线见 §7 #9。
#### 4.6.2 判据(六轮:幅值 / 波形 / 相位 / 测频 / 削顶 / 谐波) #### 4.6.2 判据(六轮:幅值 / 波形 / 相位 / 测频 / 削顶 / 谐波)
> **分工**:本节定"验什么、过判据是多少";**期望值的算术、接法细节与执行步骤**在 > **分工**:本节定"验什么、过判据是多少";**期望值的算术、接法细节与执行步骤**在
> `docs/测试说明/专项验证/ADC前端注入验证流程.md` §8(同一轮次的手册,两边于 2026-10-29 已对齐)。 > `docs/测试说明/专项验证/ADC前端注入验证流程.md` §8。
>
> **轮次名一律用语义短语(用户裁定 2026-10-30:清退"字母+数字"判据号)**:D1 → 幅值轮、D2 → 波形轮、
> D3 → 相位轮、D4 → 测频轮、D5 → 削顶轮、D6 → 谐波轮;本族旧号作废不得再取走
> (与二极管位号、网络自愈决策记录、链路延迟缺陷编号只是同形,各不相干)。
> >
> **注入幅度一律按峰峰值 Vpp 设定(用户裁定 2026-11-04)**:发生器面板的有效值显示不当设定基准 > **注入幅度一律按峰峰值 Vpp 设定(用户裁定 2026-11-04)**:发生器面板的有效值显示不当设定基准
> (同一个 Vpp 换波形后有效值显示跟着变,切波形瞬间还残留上一波形的值);万用表 AC 档与板上读数 > (同一个 Vpp 换波形后有效值显示跟着变,切波形瞬间还残留上一波形的值);万用表 AC 档与板上读数
@@ -321,13 +306,10 @@ typedef struct {
|---|---|---|---|---| |---|---|---|---|---|
| **幅值轮** | 基波幅值计量 | UA(R31 / `AIN1`)注 Vpp 2.828 V(= 峰值 ±1.414 V)、50.000 Hz 正弦 | `meas:` 的 `ua_mv` | 读数 = 万用表 AC 档读数,偏差 ≤2 %(与静态同档)。⚠ 别用 `phasor(hb)` 行比幅值——那是 ×0.1 定点,注 1 V 只剩 10 格(§4.6.3) | | **幅值轮** | 基波幅值计量 | UA(R31 / `AIN1`)注 Vpp 2.828 V(= 峰值 ±1.414 V)、50.000 Hz 正弦 | `meas:` 的 `ua_mv` | 读数 = 万用表 AC 档读数,偏差 ≤2 %(与静态同档)。⚠ 别用 `phasor(hb)` 行比幅值——那是 ×0.1 定点,注 1 V 只剩 10 格(§4.6.3) |
| **波形轮** | 读数是否只跟基波走 | 同幅值改方波、三角 | 同上 | 期望值 = **基波分量有效值**(同峰值下的基波 / 峰值比:方波 ≈ **0.90**,闭式 4/π ÷ √2 = 0.900、20 点整周期 DFT 实算 0.904;三角 ≈ **0.573**,闭式 8/π² ÷ √2 = 0.573、实算 0.578),**不是**真有效值(方波 = 1.000、三角 = 0.583 峰值);偏差 ≤2 %。算术与逐波形对照表见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §8.5 的波形卡。顺带把"这台仪表读的是基波"这条口径钉进文档——用户拿真有效值表去对会以为差了 10 % | | **波形轮** | 读数是否只跟基波走 | 同幅值改方波、三角 | 同上 | 期望值 = **基波分量有效值**(同峰值下的基波 / 峰值比:方波 ≈ **0.90**,闭式 4/π ÷ √2 = 0.900、20 点整周期 DFT 实算 0.904;三角 ≈ **0.573**,闭式 8/π² ÷ √2 = 0.573、实算 0.578),**不是**真有效值(方波 = 1.000、三角 = 0.583 峰值);偏差 ≤2 %。算术与逐波形对照表见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §8.5 的波形卡。顺带把"这台仪表读的是基波"这条口径钉进文档——用户拿真有效值表去对会以为差了 10 % |
| **相位轮** | 相位 | UA 与 UN 两路**同片**(都走 TPAFE)注同幅、同相 | **录波档**:录波段文件 `test/host/wave_read.py fft`(浮点重算基波相位;段内表序 `UA` = 0、`UN` = 3);**心跳档**:`phasor(hb)` 各行 `Re=` / `Im=` | **录波档**:同段内两路相位差 ≤2°,把发生器相位改 90° 后差值跟到 ≈90°。**心跳档只判"跟随"**(差值落进 80°~100°)——`phasor` 串口行是 ×0.1 定点,Vpp 2.828 V(板上读数 ≈1000 mV)时每格 0.1 V,角度量化最坏 ≈ atan(0.1 / 0.707) ≈ 8°,判不动 2°(§4.6.3)。⚠ 段与发生器**无绝对相位锁定**(触发瞬间钉在段内点 159),只能比**同段内两路**的相对差,跨段比相位或拿发生器相位当绝对基准都不成立。**只许比同片内**——跨转换器无同刻性(§9),STM32 那五路还有 1 拍乒乓滞后 | | **相位轮** | 相位 | UA 与 UN 两路**同片**(都走 TPAFE)注同幅、同相 | **录波档**:录波段文件 `test/host/wave_read.py fft`(浮点重算基波相位;段内表序 `UA` = 0、`UN` = 3);**心跳档**:`phasor(hb)` 各行 `Re=` / `Im=` | **录波档**:同段内两路相位差 ≤2°,把发生器相位改 90° 后差值跟到 ≈90°。**心跳档只判"跟随"**(差值落进 80°~100°)——`phasor` 串口行是 ×0.1 定点,Vpp 2.828 V(板上读数 ≈1000 mV)时每格 0.1 V,角度量化最坏 ≈ atan(0.1 / 0.707) ≈ 8°,判不动 2°(§4.6.3)。⚠ 段与发生器**无绝对相位锁定**(触发瞬间钉在段内点 159),只能比**同段内两路**的相对差,跨段比相位或拿发生器相位当绝对基准都不成立。**只许比同片内**——跨转换器两片没有共同采样触发,比相位无意义(见 `docs/硬件平台/ADC通道映射说明.md` §7 通道归属行),STM32 那五路还有 1 拍乒乓滞后 |
| **测频轮** | 测频 | 同幅值轮的 Vpp 2.828 V / 50 Hz | `freq(hb):` | **预期就是"不出数"**(幅值门 50 V 在引脚域恒不过,§2.3 #1)→ 这条的判据是"如实报不可测"(`freq_valid=0`、UI `Hz` 显示 `--`),**不是**报出一个错误的 50.00。想真验 45~55 Hz 精度(PC 侧判据 0.02 Hz)须临时把 `FREQ_AMP_MIN` 降到引脚域量级(如 0.5 V)单跑一轮 → §7 #8 + §8 风险行 | | **测频轮** | 测频 | 同幅值轮的 Vpp 2.828 V / 50 Hz | `freq(hb):` | **预期就是"不出数"**(幅值门 50 V 在引脚域恒不过,§2.3 #1)→ 这条的判据是"如实报不可测"(`freq_valid=0`、UI `Hz` 显示 `--`),**不是**报出一个错误的 50.00。想真验 45~55 Hz 精度(PC 侧判据 0.02 Hz)须临时把 `FREQ_AMP_MIN` 降到引脚域量级(如 0.5 V)单跑一轮 → §7 #8 |
| **削顶轮** | 削顶与品质路由(**负向用例**) | 给 UB(R52 / `AIN2`)注 **DC −1.00 V 并保持 ≥5 s**;或 Vpp 2.828 V 而频率 **2.0 Hz** 的正弦——两档都能造出"连续贴同一侧轨带"。⚠ **注 50 Hz 同幅正弦造不出锁存,且这是预期而非故障**:1 kHz 下一个周波只 20 点、正半周必落中带,而 `adc_health_rail_watch()` 任何一拍回中带就把计数清零(`App/algo/adc_health.c`),连续贴底最长 ≈ 209/360 × 20 ≈ 11 拍 < 20。TPAFE 侧在 ±2 V 判据上限内造不出这条(轨带 ±32112 码 ≈ ±4.9 V),只有 STM32 那五路能做 | `cal:` 行的 `rail=` / `edge=`;`rail: edge=…` 的 `[ERR]` 行;录波档另加 `wave_read.py shape` 的三把尺子(`--strict` / 再加 `--clip-superset` / 不带),逐条配法见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §8.5 的削顶卡 | 负半周钉下轨 → **连续 20 拍同侧后该路贴轨位锁存**(`ADC_RAIL_N_RUN = 20`,`App/algo/adc_health.h:174`)、`edge` 起沿。锁存另有**释放沿前提**:该通道此前须出现过中带样本 → **先上电见基线摆动、再开发生器输出**,开机就注会测出假不通过。撤掉注入后 `rail` 仍非 0 是 sticky 语义(只有 `adc_health_rail_init()` / 复位清)——**复位后仍不清才是 bug**。⚠ 这条会**故意造出 `[ERR]`**,而 `/serial-boot-test` 的 forbidden 标记含 `[ERR]` → 人工判读、排在最后单独一轮(§8 第一行) | | **削顶轮** | 削顶与品质路由(**负向用例**) | 给 UB(R52 / `AIN2`)注 **DC −1.00 V 并保持 ≥5 s**;或 Vpp 2.828 V 而频率 **2.0 Hz** 的正弦——两档都能造出"连续贴同一侧轨带"。⚠ **注 50 Hz 同幅正弦造不出锁存,且这是预期而非故障**:1 kHz 下一个周波只 20 点、正半周必落中带,而 `adc_health_rail_watch()` 任何一拍回中带就把计数清零(`App/algo/adc_health.c`),连续贴底最长 ≈ 209/360 × 20 ≈ 11 拍 < 20。TPAFE 侧在 ±2 V 判据上限内造不出这条(轨带 ±32112 码 ≈ ±4.9 V),只有 STM32 那五路能做 | `cal:` 行的 `rail=` / `edge=`;`rail: edge=…` 的 `[ERR]` 行;录波档另加 `wave_read.py shape` 的三把尺子(`--strict` / 再加 `--clip-superset` / 不带),逐条配法见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §8.5 的削顶卡 | 负半周钉下轨 → **连续 20 拍同侧后该路贴轨位锁存**(`ADC_RAIL_N_RUN = 20`,`App/algo/adc_health.h:174`)、`edge` 起沿。锁存另有**释放沿前提**:该通道此前须出现过中带样本 → **先上电见基线摆动、再开发生器输出**,开机就注会测出假不通过。撤掉注入后 `rail` 仍非 0 是 sticky 语义(只有 `adc_health_rail_init()` / 复位清)——**复位后仍不清才是 bug**。⚠ 这条会**故意造出 `[ERR]`**,而 `/serial-boot-test` 的 forbidden 标记含 `[ERR]` → 人工判读、排在最后单独一轮,且这一轮的结论不按 `/serial-boot-test` 判 |
| **谐波轮** | 谐波轨 | 基波 + 20 % 二次 + 20 % 五次(IA 上注)。⚠ 峰值预算:Vpp 2.828 V 基波 + 两个 20 % 分量的最坏对齐峰值 ≈ 1.98 V 已顶 ±2 V 红线 → 基波用 **Vpp 2.263 V**、二次与五次各 Vpp 0.453 V | **录波档**:段文件 `test/host/wave_read.py fft --ch 4 --all`(`IA` = 段内表序 4,直接给基波与 2 / 5 次谐波有效值,单位 mV);**旁证**:UI 交流量页 `Ia2` / `Ia5`(1 mV)与 `phasor(hb) C04-IA-F2` / `C05-IA-F5`(×0.1 定点,只证这根轨不是恒 0) | 谐波轨读数 = 注入分量(**±2 %,走录波档**;心跳档判不动:读数 0.160 V 在 ×0.1 串口行上只有 1~2 格)。⚠ 这两根轨**目前没有任何下游消费者**(`prot_elm.c` 无引用、`meas` 只算 `harm=1`),所以谐波轮只证"算得对",**不证"有人用"**——接到哪、给谁用,归 §9 的谐波轨立项 | | **谐波轮** | 谐波轨 | 基波 + 20 % 二次 + 20 % 五次(IA 上注)。⚠ 峰值预算:Vpp 2.828 V 基波 + 两个 20 % 分量的最坏对齐峰值 ≈ 1.98 V 已顶 ±2 V 红线 → 基波用 **Vpp 2.263 V**、二次与五次各 Vpp 0.453 V | **录波档**:段文件 `test/host/wave_read.py fft --ch 4 --all`(`IA` = 段内表序 4,直接给基波与 2 / 5 次谐波有效值,单位 mV);**旁证**:UI 交流量页 `Ia2` / `Ia5`(1 mV)与 `phasor(hb) C04-IA-F2` / `C05-IA-F5`(×0.1 定点,只证这根轨不是恒 0) | 谐波轨读数 = 注入分量(**±2 %,走录波档**;心跳档判不动:读数 0.160 V 在 ×0.1 串口行上只有 1~2 格)。⚠ 这两根轨**目前没有任何下游消费者**(`prot_elm.c` 无引用、`meas` 只算 `harm=1`),所以谐波轮只证"算得对",**不证"有人用"**——接到哪、给谁用,归 `docs/算法/继电保护功能复现规划.md` 的「遥测谐波轨(可选)」 |
**先做幅值 / 波形 / 削顶三轮**(纯读数、无跨通道约定),相位 / 谐波次之,测频轮视 §7 #8 的裁定。每条的两档跑法(心跳档 /
录波档)与触发动作在 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §8.4–§8.5 的注入卡里(耗时排布与失败分诊两节已随 2026-11-04 轮次收尾删除,将来复跑照卡自行排程)。
#### 4.6.3 数字能从哪儿读(零固件改动) #### 4.6.3 数字能从哪儿读(零固件改动)
@@ -335,79 +317,22 @@ typedef struct {
|---|---|---| |---|---|---|
| 串口每 10 s 心跳(`App/task/adc_task.c` 心跳块) | `adc:`(9 路码值)、`cal:`(三路 mV + `vl`/`cl`/`rail`/`edge` 位图)、`phasor(hb)`(逐实例 `Re` / `Im` / `rms`)、`freq(hb)`、`meas:`(快照轨) | MicroLIB 无 `%f`,全是定点:`phasor` ×0.1(**1 V 注入只剩 10 格**)、`freq` ×0.01 Hz、`cal:` / `meas:` ×1000(1 mV)。10 s 一行的单点瞬时值对 50 Hz 等价于随机相位抽样 | | 串口每 10 s 心跳(`App/task/adc_task.c` 心跳块) | `adc:`(9 路码值)、`cal:`(三路 mV + `vl`/`cl`/`rail`/`edge` 位图)、`phasor(hb)`(逐实例 `Re` / `Im` / `rms`)、`freq(hb)`、`meas:`(快照轨) | MicroLIB 无 `%f`,全是定点:`phasor` ×0.1(**1 V 注入只剩 10 格**)、`freq` ×0.01 Hz、`cal:` / `meas:` ×1000(1 mV)。10 s 一行的单点瞬时值对 50 Hz 等价于随机相位抽样 |
| UI 交流量页 | `Ua` / `U0` / `Ia` / `Ia2` / `Ia5` / `Hz` / 标定徽标 共 7 行 | 160×160 单色;`--` **同时**表示"没数"和"有数但不可信" → 不能当判据,只能当旁证 | | UI 交流量页 | `Ua` / `U0` / `Ia` / `Ia2` / `Ia5` / `Hz` / 标定徽标 共 7 行 | 160×160 单色;`--` **同时**表示"没数"和"有数但不可信" → 不能当判据,只能当旁证 |
| **段文件(原始样本,代码侧已落地,2026-10-29)** | 每次触发一段:`/wave/WAVE00.BIN` 起共 100 个号轮转(FTP 根下可见),8 路 × 320 点原始码值加封存瞬间的标定与品质快照;PC 侧 `test/host/wave_read.py` 提供 dump / fft / shape / plot 四个子命令(bench 工具,纯标准库,自带 `--selftest`) | 「比对派生标量」已可升级成「PC 独立重算 vs 板上读数」对表(判据与执行步骤见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §4,格式属主见 `docs/子系统设计/故障录波设计说明.md` §6.2 与 §6.3)。**板级注入对表已随交流六轮跑过两轮**(2026-11-02 / 11-04,注 Vpp 2.828 V / 50 Hz、fft 与 `meas:` 互合,结论 `docs/硬件平台/ADC通道映射说明.md` §8.2;CRC 不符必须拒收的实测更早、2026-10-31 远程半轮已绿),余下板级判据(周波数 / 极性等逐项)见 `docs/子系统设计/故障录波设计说明.md` §10;示波器仍旧只作旁证、不当判据。段内点序:触发瞬间落在段内点 159(预触发 160 点的最后一点),段的绝对相位与发生器无锁定关系,可核对的是相对相位与极性 | | **段文件(原始样本)** | 每次触发一段:`/wave/WAVE00.BIN` 起共 100 个号轮转(FTP 根下可见),8 路 × 320 点原始码值加封存瞬间的标定与品质快照;PC 侧 `test/host/wave_read.py` 提供 dump / fft / shape / plot 四个子命令(bench 工具,纯标准库,自带 `--selftest`) | 判据是「PC 独立重算 vs 板上读数」对表(执行步骤见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §4,格式属主见 `docs/子系统设计/故障录波设计说明.md` §6.2 与 §6.3)。**板级注入对表已随交流六轮跑过两轮**(2026-11-02 / 11-04,注 Vpp 2.828 V / 50 Hz、fft 与 `meas:` 互合,结论 `docs/硬件平台/ADC通道映射说明.md` §8.2;CRC 不符必须拒收的判据也在 2026-10-31 远程半轮验过),余下板级判据(周波数 / 极性等逐项)见 `docs/子系统设计/故障录波设计说明.md` §10;示波器只作旁证、不当判据。段内点序:触发瞬间落在段内点 159(预触发 160 点的最后一点),段的绝对相位与发生器无锁定关系,可核对的是相对相位与极性 |
| **仍然没有的(2026-10-29 更新)** | 没有命令控制台、也没有「把窗里 20 / 40 个点导出来」的定点 dump 子命令——**但原始样本这条通道本身已成立**(上一行的段文件:一次 320 点 / 8 路,比原来规划的 20 / 40 点窗更宽) | 现场取回一律走现成 FTP(21 端口),形状就地看回放页单通道、或在 PC 侧用同一脚本出图;示波器只对照发生器、不当判据。**判据已升级为「PC 独立重算 vs 板上读数」对表**,对表的执行轮次待台架(见 `docs/子系统设计/故障录波设计说明.md` §11) | | **没有的** | 没有命令控制台,也没有「把窗里 20 / 40 个点导出来」的定点 dump 子命令——原始样本走上一行的段文件(一次 320 点 / 8 路) | 现场取回一律走现成 FTP(21 端口),形状就地看回放页单通道、或在 PC 侧用同一脚本出图 |
#### 4.6.4 接法与红线(照抄既有红线,不新发明)
- 注入点:串联电阻的**端子侧**焊盘(`U5` 排针),逐路清单见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §3;
引脚侧没有串阻保护,必须外串 **10 k** 限流。
- 幅度按**峰峰值 / 峰值**核,别看有效值数字:Vpp 2.828 V 正弦峰值已 ±1.414 V;TPAFE 侧按判据只到 **±2 V 峰值(= Vpp 4 V)**(满量程 ±5 V),
STM32 那五路是 **0~3.3 V 单极性**——给它们注交流只能是削顶轮那种"故意削顶"的用例,峰值同样不得超 3.3 V。
- 发生器与板**必须共地**(否则量到的是两地之间的差),且不形成地环:优先单点共地、必要时发生器浮地。
- **不许**因为"反正发生器便宜"就往端子侧上额定电压——那是 §5 第二张卡(要变比)与 §9(要标准源)的范围。
#### 4.6.5 这台发生器证不到什么(别让读数长得像证据)
| 证不到 | 为什么 | 归属 |
|---|---|---|
| 端子二次值 | 注入点在 ④ 之前,算出来还是引脚域 | §5「端子/子板变比确认」 |
| 精度等级(0.5 级 / 1 级) | 发生器自己的幅值误差本身就是要被校的量,不能冒充标准源 | §5「两点标定与精度验收」+ §7 #1 |
| 跨转换器相位 / 功率 / 对称分量 | 两片转换器无共同采样触发(V0.1 硬件缺陷)+ STM32 侧 1 拍乒乓滞后;量纲链路口径见通道映射说明的链路分段一节 | §9(本波不做矢量类运算) |
| THD / 谐波方和根 | 固件里只有两根谐波轨,没有合成后的数送出去 | §9(挂谐波轨立项) |
| 温升、EMC、长时间漂移 | 单轮台架不覆盖 | 送检与型式试验 |
---
## 5. 任务卡(完成即销项删行;标识列用语义短语,不配编号) ## 5. 任务卡(完成即销项删行;标识列用语义短语,不配编号)
> 资源图例:🔴 台架(COM3 / ST-LINK,`bench.lock` 独占)· 🟡 外部(标准源 / 子板原理图)· 🟢 纯软件。 > 资源图例:🔴 台架(COM3 / ST-LINK,`bench.lock` 独占)· 🟡 外部(标准源 / 子板原理图)· 🟢 纯软件。
> 状态:⬜ 未开始 · 🟦 进行中。**已闭环 = 直接删行**。 > 状态:⬜ 未开始 · 🟦 进行中。**已闭环 = 直接删行**。
> 本表**只写判据**;执行步骤在 `docs/测试说明/专项验证/ADC前端注入验证流程.md`,实测结论在 > 本表**只写判据**;执行步骤在 `docs/测试说明/专项验证/ADC前端注入验证流程.md`,实测结论在
> `docs/硬件平台/ADC通道映射说明.md` §8.1(动态实测结论开在其后)。 > `docs/硬件平台/ADC通道映射说明.md` §8.1(静态)与 §8.2(动态)。
| 标识(任务名)| DoD(可验证验收判据) | 硬依赖 | 资源 | 写范围 | 状态 | | 标识(任务名)| DoD(可验证验收判据) | 硬依赖 | 资源 | 写范围 | 状态 |
|---|---|---|---|---|---| |---|---|---|---|---|---|
| **信号发生器动态波形验证** | 按 §4.6.2 跑完六轮(测频轮允许以"如实报不可测"通过),逐条记实测 / 判据 / 结论;执行步骤与判据表**新增到** `docs/测试说明/专项验证/ADC前端注入验证流程.md`(直流节之后开一节"交流"),实测结论在 `docs/硬件平台/ADC通道映射说明.md` §8.1 之后新开一节;证据(串口日志 + 录波段文件)归档 `docs/测试说明/测试数据/boot_log_data/` | 静态注入闭环(✅ 2026-10-27)+ 一台能出 50 Hz 正弦、幅度可调到 Vpp 2.828 V 的交流信号发生器(**不需要标准源、不需要端子加压**) | 🔴 台架 + 手边发生器 | `docs/测试说明/`、`docs/硬件平台/` | ✅ **已验证(2026-11-02 / 11-04 两轮、六轮全部闭合;用户裁定 2026-11-04 打勾保留本行)**:实测已回填执行手册各轮记录表、结论新开 `docs/硬件平台/ADC通道映射说明.md` §8.2、证据已归档 `boot_log_data`。**未闭合项(均已裁定不做或另登记)**:① 谐波叠加工况(基波+二次+五次同段)未跑——发生器无谐波叠加/ARB 功能,属设备缺口;算法侧由 `test/host/phasor/phasor_test.c` TC-PHASOR-006 覆盖,待有谐波功能标准源复跑;② 削顶 2 Hz 低频档与 sticky 复位复核——用户裁定 2026-11-04 关闭;③ 测频"降幅值门证 0.02 Hz 测准"的改码档未做(现状档以如实报不可测通过);④ 谐波 B 行归因一阶低通模型(fc≈796 Hz)未做绝对仪器证伪(预测 250 Hz 额外滞后 ≈17°,示波器到手复核);谐波功能产品化需板改(C35 换小 + 清点各路容值),已登记 `docs/任务规划/登记簿.md` §3 | | **信号发生器动态波形验证** | 按 §4.6.2 跑完六轮(测频轮允许以"如实报不可测"通过),逐条记实测 / 判据 / 结论;执行步骤与判据表在 `docs/测试说明/专项验证/ADC前端注入验证流程.md` 的交流节,实测结论在 `docs/硬件平台/ADC通道映射说明.md` §8.2;证据(串口日志 + 录波段文件)归档 `docs/测试说明/测试数据/boot_log_data/` | 静态注入闭环(✅ 2026-10-27)+ 一台能出 50 Hz 正弦、幅度可调到 Vpp 2.828 V 的交流信号发生器(**不需要标准源、不需要端子加压**) | 🔴 台架 + 手边发生器 | `docs/测试说明/`、`docs/硬件平台/` | ✅ **已验证(2026-11-02 / 11-04 两轮、六轮全部闭合)**:实测已回填执行手册各轮记录表、结论在 `docs/硬件平台/ADC通道映射说明.md` §8.2、证据已归档 `boot_log_data`。**未闭合项(均已裁定不做或另登记)**:① 谐波叠加工况(基波+二次+五次同段)未跑——发生器无谐波叠加/ARB 功能,属设备缺口;算法侧由 `test/host/phasor/phasor_test.c` TC-PHASOR-006 覆盖,待有谐波功能标准源复跑;② 削顶 2 Hz 低频档与 sticky 复位复核——用户裁定 2026-11-04 关闭;③ 测频"降幅值门证 0.02 Hz 测准"的改码档未做(现状档以如实报不可测通过);④ 谐波 B 行归因一阶低通模型(fc≈796 Hz)未做绝对仪器证伪(预测 250 Hz 额外滞后 ≈17°,示波器到手复核);谐波功能产品化需板改(C35 换小 + 清点各路容值),已登记 `docs/任务规划/登记簿.md` §3 |
| **端子/子板变比确认** | 给出"端子电压 → ADC 引脚电压"的比值(万用表同时量端子与引脚,或查子板原理图后实测核对),写入 `docs/硬件平台/ADC通道映射说明.md`;据此判定 `eng` 能否置 1;数据缺失则本波只交付引脚电压并登记缺口 | 已知电压注入验证(✅);**与动态验证无依赖关系**,可并行 | 🟡 子板实物或原理图 | `docs/硬件平台/` | ⬜ | | **端子/子板变比确认** | 给出"端子电压 → ADC 引脚电压"的比值(万用表同时量端子与引脚,或查子板原理图后实测核对),写入 `docs/硬件平台/ADC通道映射说明.md`;据此判定 `eng` 能否置 1;数据缺失则本波只交付引脚电压并登记缺口 | 已知电压注入验证(✅);**与动态验证无依赖关系**,可并行 | 🟡 子板实物或原理图 | `docs/硬件平台/` | ⬜ |
| **两点标定与精度验收** | 电压 4 路(UA/UB/UC/UN)+ 电流 4 路(IA/IB/IC/IN)各做两点标定(零点 + 满度,温度不纳入),写入 `[adc_cal]` 并置 `VALID`;误差 ≤ 目标精度(待定:0.5 级 / 1 级 → §7 #1);证据归档 | 端子/子板变比确认;削顶五路的处置结论(削顶轮) | 🟡 标准源 / 继保测试仪 | `docs/算法/`、`docs/测试说明/测试数据/boot_log_data/` | ⬜ | | **两点标定与精度验收** | 电压 4 路(UA/UB/UC/UN)+ 电流 4 路(IA/IB/IC/IN)各做两点标定(零点 + 满度,温度不纳入),写入 `[adc_cal]` 并置 `VALID`;误差 ≤ 目标精度(待定:0.5 级 / 1 级 → §7 #1);证据归档 | 端子/子板变比确认;削顶五路的处置结论(削顶轮) | 🟡 标准源 / 继保测试仪 | `docs/算法/`、`docs/测试说明/测试数据/boot_log_data/` | ⬜ |
**为什么把动态验证排在第一**(不是因为它最重要,而是因为它把后面两张卡踩实):
1. 它**不依赖任何外部资源**,而另两张卡都在等东西;等待期正好做它。
2. 它复用刚闭环的注入点与读数的地方,**边际成本几乎为零**。
3. 它会先把削顶轮那类"预期内的 `[ERR]`"暴露在台架规程里并写清判读,避免第二、三张卡跑到一半
才发现"自动化测试把这轮读成 FAIL"。
4. 它顺手把"发生器能证 / 不能证"的界线钉住,两点标定开跑时判据不会串档。
---
## 6. 并行与顺序
主干一条道,两处等外部资源(自环 = 等待),动态那一步不阻塞后面的卡:
```mermaid
flowchart TD
S([静态注入 2026-10-27 已闭环]) --> Q1{发生器在手?}
Q1 -- 否 --> W1[等待:发生器到位<br/>不动端子、不烧高压]
W1 --> Q1
Q1 -- 是 --> DYN[信号发生器动态波形验证<br/>幅值 · 波形 · 削顶 三轮先做]
DYN --> WB[回写:测试说明加「交流」一节<br/>通道映射补动态实测节]
WB --> Q2{变比到手?}
Q2 -- 否 --> W2[等待:子板实物或原理图]
W2 --> Q2
Q2 -- 是 --> CAL[两点标定与精度验收<br/>标准源 / 继保测试仪]
CAL --> V[电气 8 路 VALID 全置位]
V --> R[保护自动解卡<br/>闭锁 → 解锁台架验证]
R --> E([标准源送检 + 第三方 104 主站验收])
W1 -. 并行不阻塞 .-> ENG[eng 保持 0<br/>本波只承诺「ADC 引脚电压」]
ENG -.-> E
```
- **实测斜率偏差规则**:实测斜率与理论 LSB 偏差 >2 % 时**先查前端(分压 / 变比 / 焊接)再改系数**——
用系数凑斜率会把硬件的错固化成"标定值"。这条对动态同样成立(幅值轮偏差 >2 % 先查接线与共地)。
- 并行度规则见 `docs/环境与部署/并行任务工作树方案.md` §7.3。
--- ---
## 7. 前置决策 ## 7. 前置决策
@@ -419,64 +344,10 @@ flowchart TD
|---|---|---|---|---| |---|---|---|---|---|
| 1 | **精度目标** | 0.5 级 / 1 级 | 决定两点标定的判据。**两点标定开跑前必须定**,否则"误差 ≤ 目标精度"这条 DoD 无法判定。保护判据本身只需 3~5 %,0.5 级是计量口径 | 🟡 开放 | | 1 | **精度目标** | 0.5 级 / 1 级 | 决定两点标定的判据。**两点标定开跑前必须定**,否则"误差 ≤ 目标精度"这条 DoD 无法判定。保护判据本身只需 3~5 %,0.5 级是计量口径 | 🟡 开放 |
| 2 | **端子 / 子板变比从哪来** | ① 有子板原理图(直接算)② 只有子板实物(万用表同时量端子与引脚)③ 都没有 | 决定 `eng` 能否置 1。② 同样可行且够用;③ 则本波只交付"ADC 引脚电压",二次值登记为缺口 | 🟡 开放 | | 2 | **端子 / 子板变比从哪来** | ① 有子板原理图(直接算)② 只有子板实物(万用表同时量端子与引脚)③ 都没有 | 决定 `eng` 能否置 1。② 同样可行且够用;③ 则本波只交付"ADC 引脚电压",二次值登记为缺口 | 🟡 开放 |
| 3 | **`CFG_VAL_INT`(有符号零点)** | 补引擎值类型 / 零点改 uint16 + 32768 偏置 | 已定案:补值类型(`strtol` + `ERANGE` + 宽度上下界,`s_encode()` 带负号)。偏置方案否决理由见 §4.4 尾注 | ✅ 已定案 | | 3 | **`CFG_VAL_INT`(有符号零点)** | 补引擎值类型 / 零点改 uint16 + 32768 偏置 | 已定案:补值类型(`strtol` + `ERANGE` + 宽度上下界,`s_encode()` 带负号) | ✅ 已定案 |
| 4 | 未标定即闭锁 | 保持闭锁 / 用万用表走捷径提前解锁 | 已定案:用户裁定 2026-10-25 **保持闭锁到标准源到位**,不缩短解锁路径 | ✅ 已定案 | | 4 | 未标定即闭锁 | 保持闭锁 / 用万用表走捷径提前解锁 | 已定案:用户裁定 2026-10-25 **保持闭锁到标准源到位**,不缩短解锁路径 | ✅ 已定案 |
| 5 | 遥测快照发布权 | `adc_task` 分频发布 / 消费者各自计时组装 | 已定案:`adc_task` 唯一发布者(§4.5),调用点数 = 1 由评审守 | ✅ 已定案 | | 5 | 遥测快照发布权 | `adc_task` 分频发布 / 消费者各自计时组装 | 已定案:`adc_task` 唯一发布者(§4.5),调用点数 = 1 由评审守 | ✅ 已定案 |
| 6 | 温度是否纳入线性标定 | 纳入 / 不纳入 | 已定案:不纳入,`adc_cal_flags(TEMP)` 恒 0,页面 `--` | ✅ 已定案 | | 6 | 温度是否纳入线性标定 | 纳入 / 不纳入 | 已定案:不纳入,`adc_cal_flags(TEMP)` 恒 0,页面 `--` | ✅ 已定案 |
| 7 | 注入层级与上限 | 引脚侧 / `U5` 排针端子侧 | 已定案:端子侧(③ 段的"端子侧"),≤2 V 直流——`U5` 排针是可安全接触的最低一级,引脚侧要拆子板 | ✅ 已定案 | | 7 | 注入层级与上限 | 引脚侧 / `U5` 排针端子侧 | 已定案:端子侧(③ 段的"端子侧"),≤2 V 直流——`U5` 排针是可安全接触的最低一级,引脚侧要拆子板 | ✅ 已定案 |
| 8 | **`eng = 0` 期间的测频幅值门怎么处置** | A 保持恒失效(现状,UI 恒 `--`)/ B 台架临时把 `FREQ_AMP_MIN` 降到引脚域量级跑一轮测频轮再还原 / C 换成"相对量"门限(如帧内最大值的一定时比例) | 建议 **A 为常态 + B 为一次性台架**,C 需要重新论证别在过渡期改。**跑之前先定**,还原由 §8 风险行盯 | 🟡 开放 | | 8 | **`eng = 0` 期间的测频幅值门怎么处置** | 保持恒失效(现状,UI 恒 `--`)/ 台架临时把 `FREQ_AMP_MIN` 降到引脚域量级跑一轮测频轮再还原 / 换成"相对量"门限(如帧内最大值的一定时比例) | 建议**常态保持恒失效 + 需要时临时降门跑一轮**,换成相对量门限要先重新论证、别在过渡期改。**跑之前先定**;临时降门会改动产品头文件,收尾必须还原到 `git diff` 为空并重跑 `/keil-build` | 🟡 开放 |
| 9 | **动态验证的基准与发生器要求** | 万用表 AC 档 / 发生器自报刻度 / 借标准源 | 建议:以**万用表 AC 档为基准**,发生器只要求"波形干净、幅度稳定、频率能锁 50.000 Hz",**不拿它的刻度当精度**;判据档沿用静态 ±2 % | 🟡 开放 | | 9 | **动态验证的基准与发生器要求** | 万用表 AC 档 / 发生器自报刻度 / 借标准源 | 建议:以**万用表 AC 档为基准**,发生器只要求"波形干净、幅度稳定、频率能锁 50.000 Hz",**不拿它的刻度当精度**;判据档沿用静态 ±2 % | 🟡 开放 |
---
## 8. 风险
> 引用本表某一行时**写行名**(例:「削顶通道被当成可测」行),别写「末行 / 第 N 行」——本表会插行。
| 风险 | 触发条件 | 缓解 |
|---|---|---|
| **削顶负向用例被当成固件 bug** | 做削顶轮时 STM32 那五路必然钉下轨 → `rail: edge=…` 是 `[ERR]` 行,而 `/serial-boot-test` 的 forbidden 标记含 `[ERR]` → 整轮被判 FAIL | 判读规则写进流程文档:"做削顶轮的这一轮 `[ERR] rail:` 属预期,只人工判读、不计入 `/serial-boot-test` 结论",或把这五路排在最后单独一轮并事先声明。同时别忘 `cl=0xE6` 是**来源派生**(§2.6),不是本轮新削出来的 |
| **拿发生器的精度当标准用** | 用发生器自报的有效值数字当基准值去比 | 基准 = 万用表 AC 档实测(§7 #9);发生器只当"波形干净、频率可锁"的信号源,它自己的幅值误差正是要被校的量 |
| **临时改了 `FREQ_AMP_MIN` 忘了还原** | 走 §7 #8 的 B 方案 | 改动落在产品头文件里、会编进固件。单列一条收尾判据:还原后 `/keil-build` 0 错误 0 警告 + `git diff` 里 `App/algo/freq.h` 必须为空;并在 §7 #8 那行留一句"本轮台架已还原" |
| **峰值当成有效值,顶到量程外** | 只看面板有效值数字:正弦有效值 1.000 V = Vpp 2.828 V,峰值已 ±1.414 V | 接线前按**峰值**核一遍:TPAFE 侧 ≤±2 V、STM32 侧峰值必须 <3.3 V(且负半周本就钉轨,只作削顶轮用) |
| **发生器与板不共地 / 地环** | 两台设备各自接电网地 | 单点共地,必要时发生器浮地;读数漂或出现与幅度无关的偏置先查这里 |
| **非整 50 Hz 注入被当成 `meas` 抖动 bug** | 注 49.5 / 50.5 Hz | `meas` 是**瞬时基波有效值透传、200 ms 是上送节拍不是平均窗**(§4.5)→ 快照轨会有拍频式周期间跳动,属预期。测频腿要扫频时读 `freq(hb)`,别读 `meas:` |
| **`cfg` 键数顶格** | 后续给 `[adc_cal]` 加键 | 已按 8+1 / 8 拆段;加键前先看 `CFG_FILE_MAX_KEYS`,必要时再拆 |
| **标定值把保护"调坏"** | 两点标定写入错误系数 | `adc_cal_set()` 校验范围(`k` 必须在板级系数 ×[0.5, 2.0] 内)+ 写入后回读校验;越界拒绝并留 `[ERR]` |
| **削顶通道被当成可测** | 消费者只看 `k` 不看 `flags` | `adc_cal_flags()` 是唯一查询入口,`adc_cal_apply()` 不返回可用性;单测覆盖"CLIPPED 通道 104 恒 IV" |
| **快照双写** | 104 或 UI 侧也加一个 200 ms 计时器 | 设计约定"唯一发布者 = `adc_task`";评审时数 `meas_tick()` 调用点 = 1 |
| **加压烧板** | 变比未确认就往端子加额定电压 | **端子级上额定值必须在变比确认之后**,且先量"端子对地通断"确认无直流通路。动态验证只在 `U5` 排针侧 ≤±2 V 做,正就是为了绕开这条风险 |
---
## 9. 范围边界(本波不做)
| 不做 | 理由 / 归属 |
|---|---|
| THD / 谐波方和根真有效值、快照 4 点平均 | 挂 `docs/算法/继电保护功能复现规划.md` 的「遥测谐波轨(可选)」一起做;快照保持"基波有效值 + 直取相量"口径(§4.5) |
| **谐波轨被谁消费**(C04 / C05 目前无人消费) | 谐波轮只证"算得对";接线到判据或上送属谐波轨立项范围,本波不动 |
| 端子级额定电压、绝缘耐压、温升 | 要标准源 / 型式试验条件;本波所有注入都在 `U5` 排针侧 ±2 V 以内 |
| 录波(原始码值段文件) | **已交付代码面**(2026-10-29 立项并当日落地;判据属主 `docs/子系统设计/故障录波设计说明.md` §10,原卡片登记簿 2026-10-30 销项并入)本卡「动态波形验证」的原始样本**已**由录波段文件承担(§4.6.3 读数地点表已改),排序也随之调整(`docs/子系统设计/故障录波设计说明.md` §11);**没跑的是板级那一轮**(§10) |
| 104 文件传输(规约侧读文件) | 仍独立待排;现场与台架取回一律走现成 FTP(21 端口),规约侧文件服务等送检或第三方交接需求再议 |
| 等周波调频 | 与标定正交、无标准源时判据不可达,见 `docs/算法/继电保护功能复现规划.md` §3.1 |
| 功率 / 相位跨相比较 / 功率因数 / 对称分量 | **V0.1 硬件禁止**:跨转换器无同一时刻性,`docs/硬件平台/ADC通道映射说明.md` §7 通道归属行 |
| PT 断线判据 | 需要 `flags` 与遥信配合,而 V0.1 **无开入硬件** → 归开入波次 |
| 开入 / 开出固件 | 固件里**完全没有**这两类代码(`docs/问题记录/采集与数据处理短板评测.md` 登记),是另一个波次的量级 |
| 温度非线性折算 | §7 已定案行"温度不纳入线性标定" |
| 端子二次值(一次/二次变比换算) | **条件项**:变比确认拿到变比才做;拿不到则本波只到"ADC 引脚电压",`eng` 保持 0,缺口登记进 `docs/任务规划/登记簿.md` |
| UI 页面(含交流量回炉) | 归「UI 补齐」;本波只保证 `meas_snap_t` 与 `adc_cal_flags()` 可被其消费 |
---
## 10. 与其它工作的关系
| 工作 / 文档 | 关系 |
|---|---|
| **`docs/测试说明/专项验证/ADC前端注入验证流程.md`** | **执行步骤的属主**。本文只写"证到哪、判据是什么、为什么这么排";怎么接表笔、读哪一行、填哪张表一律在那篇里。动态验证的**步骤**同样落那篇(新开"交流"节),本文 §4.6 只留判据 |
| **通道映射说明** | `docs/硬件平台/ADC通道映射说明.md` §7.1(①②③④ 链路分段)与 §8.1(静态六项实测)是**量纲与实测记录的属主**;本文 §2.1 / §2.6 是它的**消费者**,不另立口径,动态实测结论也回写该文件 |
| **`docs/子系统设计/故障录波设计说明.md`** | 录波段文件是本卡「动态波形验证」的**原始样本来源**,数据面代码侧已落地(2026-10-29:环与段格式在 `App/algo/wave_ring.c` / `App/algo/wave_store.c`,PC 侧 `test/host/wave_read.py`);判据从「比对派生标量」升级为「PC 独立重算 vs 板上读数」对表的**执行轮次待台架**,动态验证的排序已因此让位给录波数据面(用户裁定 2026-10-29,理由与三处口径变更见 docs/子系统设计/故障录波设计说明.md §11) |
| **`docs/算法/采集与算法层设计说明.md`** | 算法与判据正文(全周傅氏、测频、保护元件);本文只规定"这些算法的信度到什么程度" |
| **`docs/子系统设计/IEC104上行设计说明.md`** | 104 上行协议本体(点表 `0x4011`~`0x4018` + `0x401D`、品质位绑定)——送检与验收的参照;**不是本验证轮的读数通道**;送检验收索引在 `docs/任务规划/登记簿.md` §7 |
| **送检验收** | 标准源送检依赖本文「两点标定与精度验收」;顺序不可倒(先变比 → 再标定 → 才解卡 → 才送检,§6) |
| **UI 补齐** | 已交付的 `meas_snap_t` + `adc_cal_flags()` 供 `ui_data_rt_t` 填 `eng`:现为 0 = 引脚电压,变比确认拿到变比后才升 1 = 二次值。**UI 不必等本文任何一张卡** |
| **双转换器无共同采样触发(V0.2 硬件改版)** | 本波的 `CLIPPED` 位就是这条硬件缺陷在软件里的可见形态;V0.2 改版后该位恒 0,页面与 104 绑定零改动 |
@@ -47,10 +47,10 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1`
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py --> <!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
| 区域 | 用量 | 容量 | 占比 | | 区域 | 用量 | 容量 | 占比 |
|---|---|---|---| |---|---|---|---|
| ER_IROM1 | 285,940 B (279.24 KB) | 1,048,576 B (1024 KB) | 27.3% | | ER_IROM1 | 286,364 B (279.65 KB) | 1,048,576 B (1024 KB) | 27.3% |
| RW_IRAM1 | 94,752 B (92.53 KB) | 131,072 B (128 KB) | 72.3% | | RW_IRAM1 | 96,808 B (94.54 KB) | 131,072 B (128 KB) | 73.9% |
| RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% | | RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
| **Flash (ROM 合计)** | **288,012 B (281.3 KB)** | 1,048,576 B (1024 KB) | **27.5%** | | **Flash (ROM 合计)** | **288,444 B (281.7 KB)** | 1,048,576 B (1024 KB) | **27.5%** |
<!-- MEM_SNAPSHOT:END --> <!-- MEM_SNAPSHOT:END -->
各区的容量与常量来源: 各区的容量与常量来源:
+3 -3
View File
@@ -15,15 +15,15 @@
<!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py --> <!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py -->
| 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) | | 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) |
|---|---|---|---|---| |---|---|---|---|---|
| ER_IROM1 (Flash) | 285,940 B | 1,048,576 B | 27.3% | 参考 | | ER_IROM1 (Flash) | 286,364 B | 1,048,576 B | 27.3% | 参考 |
| RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS | | RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS |
| UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 | | UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 |
| RW_IRAM1 | 94,752 B | 131,072 B | 72.3% | PASS | | RW_IRAM1 | 96,808 B | 131,072 B | 73.9% | PASS |
| 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 | | 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 |
|---|---|---|---| |---|---|---|---|
| 网络 | 13,958 B | 12 KB | ⚠ 超 1.6 KB | | 网络 | 13,958 B | 12 KB | ⚠ 超 1.6 KB |
| 存储 | 7,092 B | 12 KB | OK | | 存储 | 9,144 B | 12 KB | OK |
| UI | 36,475 B | 16 KB | ⚠ 超 19.6 KB | | UI | 36,475 B | 16 KB | ⚠ 超 19.6 KB |
| RTOS 堆 | 57,376 B | 56 KB | 堆=配额 | | RTOS 堆 | 57,376 B | 56 KB | 堆=配额 |
| 应用 | 26,433 B | 8 KB | ⚠ 超 17.8 KB | | 应用 | 26,433 B | 8 KB | ⚠ 超 17.8 KB |
@@ -49,7 +49,8 @@
折算层 2026-10-25 落地;二次值等两点标定置 VALID)。槽位值/品质整体透传,本层 折算层 2026-10-25 落地;二次值等两点标定置 VALID)。槽位值/品质整体透传,本层
**不再自行判新旧**(快照 `seq` 仅供 COV 去重)。 **不再自行判新旧**(快照 `seq` 仅供 COV 去重)。
- 品质映射:快照 `MEAS_QDS_*` 低字节与线上 QDS 同值直传;**CLIPPED → IV**(「削顶通道 - 品质映射:快照 `MEAS_QDS_*` 低字节与线上 QDS 同值直传;**CLIPPED → IV**(「削顶通道
恒 IV」口径不变、改由品质驱动,docs/任务规划/数据可信.md §8 风险表「削顶通道被当成可测」行的单测要求); 恒 IV」口径不变、改由品质驱动,`docs/任务规划/数据可信.md` §4.2 三态可用性表 +
`test/host/prot_dim/` 的「CLIPPED 通道恒 IV」单测);
快照从未发布(开机 <200 ms)→ IV|NT;判定顺序 IV 优先于 NT。 快照从未发布(开机 <200 ms)→ IV|NT;判定顺序 IV 优先于 NT。
- 死区(104 改读快照):从「越死区即报」改为**连续 2 个新测量点越限才确认**——板端测量点 = - 死区(104 改读快照):从「越死区即报」改为**连续 2 个新测量点越限才确认**——板端测量点 =
快照换帧(100 ms 轮询 vs 200 ms 快照按 `seq` 去重,防同一帧把单点噪声重复计满 2 点; 快照换帧(100 ms 轮询 vs 200 ms 快照按 `seq` 去重,防同一帧把单点噪声重复计满 2 点;
@@ -160,7 +160,7 @@ flowchart TD
| **取窗竞态** | `App/algo/sample_ring.c` 的 `sample_ring_window()` 没有临界区(读 `s_head` 后逐点拷),现在只有 adcTask 同任务调用才安全 | 录波**不复用它**:adcTask 在自己的节拍里取「本拍帧」压专用环;跨任务只传递「已封存」标志,杜绝跨任务读活缓冲 | | **取窗竞态** | `App/algo/sample_ring.c` 的 `sample_ring_window()` 没有临界区(读 `s_head` 后逐点拷),现在只有 adcTask 同任务调用才安全 | 录波**不复用它**:adcTask 在自己的节拍里取「本拍帧」压专用环;跨任务只传递「已封存」标志,杜绝跨任务读活缓冲 |
| **FatFs 追加写** | 该移植 `FA_OPEN_APPEND` 不含 `FA_WRITE`,且 `f_write` 簇分配失败时返回 `FR_OK` 加短写、无错误码(`docs/架构设计/STM32F4-Base存储架构说明.md` §10.1) | 打开一律 `FA_WRITE\|FA_OPEN_APPEND`;**判成功必须比对写回字节数**,短写按失败处理(丢段 + 日志),绝不当成功记账 | | **FatFs 追加写** | 该移植 `FA_OPEN_APPEND` 不含 `FA_WRITE`,且 `f_write` 簇分配失败时返回 `FR_OK` 加短写、无错误码(`docs/架构设计/STM32F4-Base存储架构说明.md` §10.1) | 打开一律 `FA_WRITE\|FA_OPEN_APPEND`;**判成功必须比对写回字节数**,短写按失败处理(丢段 + 日志),绝不当成功记账 |
| **只能 8.3 短名** | 出处同一张存储架构说明的短名限制:`FF_USE_LFN=0`,不得以点开头、不得长名 | 文件名 = WAVE 加两位十进制再加 .BIN,共 100 个名字轮转覆盖;目录 /wave(与 /log 平级,FTP 根下可见) | | **只能 8.3 短名** | 出处同一张存储架构说明的短名限制:`FF_USE_LFN=0`,不得以点开头、不得长名 | 文件名 = WAVE 加两位十进制再加 .BIN,共 100 个名字轮转覆盖;目录 /wave(与 /log 平级,FTP 根下可见) |
| **落盘途中环被解冻、甚至已换段**(实现期复核新增第四条,2026-10-29) | adcTask 优先级高于 defaultTask:搬段窗口里 adcTask 可能正好走到 SEALED 滞留 2 s 自弃,甚至已经封出下一段。**数据区 CRC 是对「本道实际读到的字节」算的**,半新半旧的段照样自洽——长度等式照过、两个 CRC 照对,文件骗得过任何读者,也骗过我们自己 | 写完关档后**复检环侧身份**:`wave_ring_sealed()` 仍为 1,且 `wave_ring_get_stat()` 的 `last_t0_ms` 与 `last_seq` 跟本道开始搬时那份段头一致;不符即走既有失败路——unlink 本道开过的文件 + `write_done(-1)`(此时多半回 `E_STATE`,环侧 `err` 已由自弃计过,不重复补账)+ 段号不推进(下一段同号重写覆盖)+ 单条 `[ERR] … seg drop: ring abandoned` 留痕。落点 `App/task/default_task.c`:786 到 796 行。**当前只有代码与单测面,板级未测**;可观察项见 §10 板级行 | | **落盘途中环被解冻、甚至已换段**(实现期复核新增第四条,2026-10-29) | adcTask 优先级高于 defaultTask:搬段窗口里 adcTask 可能正好走到 SEALED 滞留 2 s 自弃,甚至已经封出下一段。**数据区 CRC 是对「本道实际读到的字节」算的**,半新半旧的段照样自洽——长度等式照过、两个 CRC 照对,文件骗得过任何读者,也骗过我们自己 | 写完关档后**复检环侧身份**:`wave_ring_sealed()` 仍为 1,且 `wave_ring_get_stat()` 的 `last_t0_ms` 与 `last_seq` 跟本道开始搬时那份段头一致;不符即走既有失败路——unlink 本道开过的文件 + `write_done(-1)`(此时多半回 `E_STATE`,环侧 `err` 已由自弃计过,不重复补账)+ 段号不推进(下一段同号重写覆盖)+ 单条 `[ERR] … seg drop: ring abandoned` 留痕。落点 `App/task/default_task.c`:818 到 823 行(复检与弃段处置),统一留痕打印在 843 行。**2026-11-07 板级已闭环**(#84 台架远程轮:临界占卷命中三判据逐条对上,见 §10「bench 定时自抓与占卷弃段观察闭环记录」小节) |
![录波数据的四个所有者与跨任务边界:adcTask 只写环,defaultTask 独占落盘,uiTask 与 PC 只读](../images/故障录波数据流.svg) ![录波数据的四个所有者与跨任务边界:adcTask 只写环,defaultTask 独占落盘,uiTask 与 PC 只读](../images/故障录波数据流.svg)
@@ -233,7 +233,7 @@ flowchart TD
1. `flags_seq` 的 V0.1 真值一度被写成 `0x27`:那是把「按来源派生的 CLIPPED」当成了 VALID。按 `App/algo/adc_cal.c` 280 到 298 行,未标定态就是 `0x00`(见上面真值表第一行)。凡引用这个数字的地方一律以真值表为准。 1. `flags_seq` 的 V0.1 真值一度被写成 `0x27`:那是把「按来源派生的 CLIPPED」当成了 VALID。按 `App/algo/adc_cal.c` 280 到 298 行,未标定态就是 `0x00`(见上面真值表第一行)。凡引用这个数字的地方一律以真值表为准。
2. 一版互验夹具写成 `eng` = 0 而 `flags_seq` = `0xFF`——违反上面的 eng 派生式,是一串**真机写不出来**的字节。已改为按派生式自洽,并在 `test/host/wave_store` 那套单测里加了夹具自洽断言防复发。教训一句话:**互验夹具的资格来自「真机能写出这串字节」**,一份不可能状态的字节只能验证两个读者对幻觉的一致反应,正好掩盖真分歧。 2. 一版互验夹具写成 `eng` = 0 而 `flags_seq` = `0xFF`——违反上面的 eng 派生式,是一串**真机写不出来**的字节。已改为按派生式自洽,并在 `test/host/wave_store` 那套单测里加了夹具自洽断言防复发。教训一句话:**互验夹具的资格来自「真机能写出这串字节」**,一份不可能状态的字节只能验证两个读者对幻觉的一致反应,正好掩盖真分歧。
3. 顺带钉一条因果,免得后文写反:PC 侧早期一次 `shape` 子命令在 `--strict` 下 rc=1,与品质位**无关**,那是「实测触轨路数 vs 段头 `clip_mask`」对表不符(合成夹具的波形本来就没真触轨)。那条对表是 `docs/任务规划/数据可信.md` §4.6 与本文 §10 板级判据的本职,不是解码器的判废扩展。 3. 顺带钉一条因果,免得后文写反:PC 侧早期一次 `shape` 子命令在 `--strict` 下 rc=1,与品质位**无关**,那是「实测触轨路数 vs 段头 `clip_mask`」对表不符(合成夹具的波形本来就没真触轨)。那条对表是 `docs/任务规划/数据可信.md` §4.6.2 削顶轮与 `docs/子系统设计/故障录波设计说明.md` §10 板级判据的本职,不是解码器的判废扩展。
--- ---
@@ -309,7 +309,7 @@ flowchart TD
- `err` 是落盘失败或 CRC 自弃次数(**字节数不符就算失败**,见 §5.2);`ovf` 是冷却期丢弃的触发数;`drop` 是冻结窗口丢掉的录波点数; - `err` 是落盘失败或 CRC 自弃次数(**字节数不符就算失败**,见 §5.2);`ovf` 是冷却期丢弃的触发数;`drop` 是冻结窗口丢掉的录波点数;
- **实际落地形态(逐字)**:打印点在 `App/task/adc_task.c`:782 行,格式串 `"wave: seg=%lu armed=%u src=%s pts=%u err=%lu ovf=%lu drop=%lu"`——**字段名与顺序就是上面的模板**(台架与 PC 脚本按行名 grep,动它就断脚本);`src` 取 M(手动)/ P(保护)/ T(定时自抓)/ `-`(本次上电还没触发过);`armed` 只在 FREEZE 与 SEALED 为 1(COOL 期只挡新触发不录新段,画进 armed 会被台架误读);`seg` 是累计**成功回执**的段数、不是轮转号;`err` = 落盘失败 + SEALED 滞留超时自弃(含 §5.2 第四条的 ring abandoned 判废),由环内计数收口,落盘道不数第二份账。`err` 与 `ovf` 的**已知容差**(lead 裁定 2026-10-29,不修只入档):这两个计数是跨上下文的读-改-自增(`ovf` 由任意上下文的拒绝路径加、`err` 由 adcTask 的滞留自弃与 defaultTask 的落盘失败分别加),本层双端编译、不许引 FreeRTOS / CMSIS 的临界区内在函数,所以并发拒绝或并发失败时**理论上可能少计一次**。定性为**观测计数的已知容差**:只用于趋势与判读,**不作为任何判据的唯一依据**——要坐实「冷却期内确实来了第二次触发」,同时看 `armed` 与那一刻 `/log/start.log` 的时刻。契约原文见 `App/algo/wave_ring.h` 文件头「观测计数的已知容差」段; - **实际落地形态(逐字)**:打印点在 `App/task/adc_task.c`:782 行,格式串 `"wave: seg=%lu armed=%u src=%s pts=%u err=%lu ovf=%lu drop=%lu"`——**字段名与顺序就是上面的模板**(台架与 PC 脚本按行名 grep,动它就断脚本);`src` 取 M(手动)/ P(保护)/ T(定时自抓)/ `-`(本次上电还没触发过);`armed` 只在 FREEZE 与 SEALED 为 1(COOL 期只挡新触发不录新段,画进 armed 会被台架误读);`seg` 是累计**成功回执**的段数、不是轮转号;`err` = 落盘失败 + SEALED 滞留超时自弃(含 §5.2 第四条的 ring abandoned 判废),由环内计数收口,落盘道不数第二份账。`err` 与 `ovf` 的**已知容差**(lead 裁定 2026-10-29,不修只入档):这两个计数是跨上下文的读-改-自增(`ovf` 由任意上下文的拒绝路径加、`err` 由 adcTask 的滞留自弃与 defaultTask 的落盘失败分别加),本层双端编译、不许引 FreeRTOS / CMSIS 的临界区内在函数,所以并发拒绝或并发失败时**理论上可能少计一次**。定性为**观测计数的已知容差**:只用于趋势与判读,**不作为任何判据的唯一依据**——要坐实「冷却期内确实来了第二次触发」,同时看 `armed` 与那一刻 `/log/start.log` 的时刻。契约原文见 `App/algo/wave_ring.h` 文件头「观测计数的已知容差」段;
- **落盘道失败留痕名清单(2026-10-30 并入原卡片登记簿;台架判读按名索引,不新增第二种形态)**:单板上一律一行 `[WAVE] seg drop: <原因> (idx=… written=…)`,统一打印点 `App/task/default_task.c`:816——`crc selftest FAIL` / `mkdir /wave` / `opendir /wave` / `readdir /wave` / `seg_path` / `pack_start` / `f_open` / `pack_next` / `f_write short` / `pack stall` / `f_close` / `len mismatch` / **`ring abandoned`**(最后一条即 §5.2 第四条陷阱的处置留痕,代码与主机单测面已有、板级未测,观察项见 §10);另有一条非失败的慢段留痕 `[WAVE][WARN] seg held <毫秒> ms (idx=…)`(`App/task/default_task.c`:831)——搬得慢不是错,真失败才走 `seg drop`。 - **落盘道失败留痕名清单(2026-10-30 并入原卡片登记簿;台架判读按名索引,不新增第二种形态)**:单板上一律一行 `[WAVE] seg drop: <原因> (idx=… written=…)`,统一打印点 `App/task/default_task.c`:843——`crc selftest FAIL` / `mkdir /wave` / `opendir /wave` / `readdir /wave` / `seg_path` / `pack_start` / `f_open` / `pack_next` / `f_write short` / `pack stall` / `f_close` / `len mismatch` / **`ring abandoned`**(最后一条即 §5.2 第四条陷阱的处置留痕,2026-11-07 板级已闭环,留痕原文与三判据实证见 §10「bench 定时自抓与占卷弃段观察闭环记录」);另有一条非失败的慢段留痕 `[WAVE][WARN] seg held <毫秒> ms (idx=…)`(`App/task/default_task.c`:858)——搬得慢不是错,真失败才走 `seg drop`。
- 只在原先静默的黑洞处补锚点,别重复已有步骤——每条 DBG 日志约 90 B Flash 加 216 B 栈(`AGENTS.md` 的日志与工具链节); - 只在原先静默的黑洞处补锚点,别重复已有步骤——每条 DBG 日志约 90 B Flash 加 216 B 栈(`AGENTS.md` 的日志与工具链节);
- 该行已同步进 `docs/测试说明/专项验证/ADC前端注入验证流程.md` 的读数地点表(2026-10-29;同一张表还登记了录波段文件与 PC 侧读段工具)。 - 该行已同步进 `docs/测试说明/专项验证/ADC前端注入验证流程.md` 的读数地点表(2026-10-29;同一张表还登记了录波段文件与 PC 侧读段工具)。
@@ -322,7 +322,7 @@ flowchart TD
| 主机侧纯逻辑单测(新增,进 `test/host/`) | ① 环:预触发与后触发点数、冻结与解冻、冷却丢弃计数;② 段格式编解码往返,含 CRC 不符、零长度、字节数不符三条失败路径;③ 触发状态机三条来路(手动 / 保护 / bench)。**环与格式必须是纯逻辑**(不碰寄存器、不碰 RTOS)才能这样测——这是 `App/algo/` 既有分层纪律 | | 主机侧纯逻辑单测(新增,进 `test/host/`) | ① 环:预触发与后触发点数、冻结与解冻、冷却丢弃计数;② 段格式编解码往返,含 CRC 不符、零长度、字节数不符三条失败路径;③ 触发状态机三条来路(手动 / 保护 / bench)。**环与格式必须是纯逻辑**(不碰寄存器、不碰 RTOS)才能这样测——这是 `App/algo/` 既有分层纪律 |
| PC 侧工具的定性 | `test/host/wave_read.py` 是 **bench 工具**(`test/host/` 下的 loose .py,先例 `test/host/ftp_capture.py`),**不是**主机单测套件 → 不建 `run_unit_test.py`、不加 pre-commit 专属钩子(专属钩子默认不补,按 Lead 裁定 2026-10-27);它自带 `--selftest` 就是它的自带回归,跑法与四个子命令见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §4 | | PC 侧工具的定性 | `test/host/wave_read.py` 是 **bench 工具**(`test/host/` 下的 loose .py,先例 `test/host/ftp_capture.py`),**不是**主机单测套件 → 不建 `run_unit_test.py`、不加 pre-commit 专属钩子(专属钩子默认不补,按 Lead 裁定 2026-10-27);它自带 `--selftest` 就是它的自带回归,跑法与四个子命令见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §4 |
| 跨工具链分叉(实证,写进来是为了下一个模块别重踩) | 两份录波 .c 只 include 自身头(链上只有 stdint.h)时,ARMCC 报 22 条 identifier "NULL" is undefined;而主机 MSVC / gcc 会传递性把 stddef.h 拉进来,**主机单测完全照不出这个分叉** → 新增模块需要用 NULL 就自己 include stddef.h(与 `App/algo/sample_ring.c` 同口径,别塞公共头) | | 跨工具链分叉(实证,写进来是为了下一个模块别重踩) | 两份录波 .c 只 include 自身头(链上只有 stdint.h)时,ARMCC 报 22 条 identifier "NULL" is undefined;而主机 MSVC / gcc 会传递性把 stddef.h 拉进来,**主机单测完全照不出这个分叉** → 新增模块需要用 NULL 就自己 include stddef.h(与 `App/algo/sample_ring.c` 同口径,别塞公共头) |
| 板级 | 信号发生器注 1 V / 50 Hz → 手动一段 → FTP 拉回 → PC 脚本量出周波数、幅值、极性与注入一致;再把 PC 重算的基波有效值与板上 `meas:` 对表。**判据只量四样:周波数、幅值、极性、钉轨路数——不比绝对相位**(理由见 §4.2「段内点序」:触发瞬间在工频周期内任意落点,段字节里没有绝对时间参考;真要比相位必须让发生器给同步触发,本波不做)。**钉轨对表的合格判据 = 头位图 ⊇ 实测钉轨路数,且差异必须能由注入条件解释**——因为 `clip_mask` 是按来源派生的链路可信性标记(§6.2 偏移 24 行),不是本段实测值:只加直流或小幅注入时那五路本就不该钉轨,硬取等式会假红。**同段另起一条强观察项**:V0.1 下这五路若在做**交流注入**时反而没钉轨,先怀疑接线或该路根本没被驱动——这是告警面,不是失败面(等式仍作为默认尺子留在 PC 侧 `shape --strict` 里,因为它有这个信号价值;要放行差异用那条判据的解释权,不靠改尺子)。**§5.2 第四条的板级观察项(代码与单测面已有、板级未测)**:bench 连续自抓期间人为把卷占住 2 s 以上(例如同一段跑 FTP 大文件读),看串口 `wave:` 行的 `err` 是否加一、是否只出现**一条** `[ERR] … seg drop: ring abandoned` 留痕(不是每拍刷屏)、且段号不推进(下一段仍写同号文件) | | 板级 | 信号发生器注 1 V / 50 Hz → 手动一段 → FTP 拉回 → PC 脚本量出周波数、幅值、极性与注入一致;再把 PC 重算的基波有效值与板上 `meas:` 对表。**判据只量四样:周波数、幅值、极性、钉轨路数——不比绝对相位**(理由见 §4.2「段内点序」:触发瞬间在工频周期内任意落点,段字节里没有绝对时间参考;真要比相位必须让发生器给同步触发,本波不做)。**钉轨对表的合格判据 = 头位图 ⊇ 实测钉轨路数,且差异必须能由注入条件解释**——因为 `clip_mask` 是按来源派生的链路可信性标记(§6.2 偏移 24 行),不是本段实测值:只加直流或小幅注入时那五路本就不该钉轨,硬取等式会假红。**同段另起一条强观察项**:V0.1 下这五路若在做**交流注入**时反而没钉轨,先怀疑接线或该路根本没被驱动——这是告警面,不是失败面(等式仍作为默认尺子留在 PC 侧 `shape --strict` 里,因为它有这个信号价值;要放行差异用那条判据的解释权,不靠改尺子)。**§5.2 第四条的板级观察项(代码与单测面已有、板级未测)**:bench 连续自抓期间人为把卷占住 2 s 以上(例如同一段跑 FTP 大文件读),看串口 `wave:` 行的 `err` 是否加一、是否只出现**一条** `[ERR] … seg drop: ring abandoned` 留痕(不是每拍刷屏)、且段号不推进(下一段仍写同号文件)——**2026-11-07 已闭环**:bench 定时自抓与临界占卷三判据台架远程轮逐条对上,长占卷静默自弃(72.6 s 连续占卷 `err` 1→15 零留痕)与临界命中唯一留痕(`err` 恰 +1、同号重写)两种形态都有实证,见下「bench 定时自抓与占卷弃段观察闭环记录」小节 |
| 板级·触发来路(2026-10-30 并入原卡「手动触发与保护启动接线」板级段) | 真机面板按一次「手动录波」出一段;造一次过流,段号与该时刻 `/log/start.log` 事件对齐;冷却期内二次触发只加 `ovf` 不重录(**同时看 `armed` 与那一刻 start.log 的时刻,不要只盯 `ovf` 数字**——容差见 §9);冻结窗口内 104 上送与保护判据不受影响(这条是「丢录波样本不丢采集」的验收) | | 板级·触发来路(2026-10-30 并入原卡「手动触发与保护启动接线」板级段) | 真机面板按一次「手动录波」出一段;造一次过流,段号与该时刻 `/log/start.log` 事件对齐;冷却期内二次触发只加 `ovf` 不重录(**同时看 `armed` 与那一刻 start.log 的时刻,不要只盯 `ovf` 数字**——容差见 §9);冻结窗口内 104 上送与保护判据不受影响(这条是「丢录波样本不丢采集」的验收) |
| 板级·回放页(2026-10-30 并入原卡「现场单通道回放页」板级段) | 真机上放一段真波(不是模拟器合成节拍);远端看图能拍到该页做留证(只作留证,不是波形通路,§8.4);**空态与 CRC 失败态绝不允许画成一条直线**——用坏段在真机复现一次。**2026-10-31 远程半轮进展见下「板级远程半轮记录」小节**:PC 侧坏段拒收已过;回放页坏段/空态画面的测试面**已于 2026-11-02 枚举缺陷修复后打开**(真机已验证真段显示 + 切段切道,见下「回放页枚举恒空缺陷修复记录」小节),坏段/空态两画面本身**已于 2026-11-06 台架远程轮拍毕闭环——见下「回放页坏段/空态画面闭环记录」小节,本行判据全部板级实证完毕** | | 板级·回放页(2026-10-30 并入原卡「现场单通道回放页」板级段) | 真机上放一段真波(不是模拟器合成节拍);远端看图能拍到该页做留证(只作留证,不是波形通路,§8.4);**空态与 CRC 失败态绝不允许画成一条直线**——用坏段在真机复现一次。**2026-10-31 远程半轮进展见下「板级远程半轮记录」小节**:PC 侧坏段拒收已过;回放页坏段/空态画面的测试面**已于 2026-11-02 枚举缺陷修复后打开**(真机已验证真段显示 + 切段切道,见下「回放页枚举恒空缺陷修复记录」小节),坏段/空态两画面本身**已于 2026-11-06 台架远程轮拍毕闭环——见下「回放页坏段/空态画面闭环记录」小节,本行判据全部板级实证完毕** |
| UI | `ui-verify` 五步;回放页入 `ui-golden` 黄金参考(**参考图一旦入库只能改代码对齐,禁止刷参考掩盖**);新叶走 `gen_menu.py` 重生成 + 字库链 | | UI | `ui-verify` 五步;回放页入 `ui-golden` 黄金参考(**参考图一旦入库只能改代码对齐,禁止刷参考掩盖**);新叶走 `gen_menu.py` 重生成 + 字库链 |
@@ -382,7 +382,8 @@ try 锁纪律)照常读出并显示 ⇒ try 锁读径正常;`manual_req` 作
**本半轮没跑的(人到场轮清单)**:注量对表(周波数 / 幅值 / 极性 / 钉轨路数)、`meas:` **本半轮没跑的(人到场轮清单)**:注量对表(周波数 / 幅值 / 极性 / 钉轨路数)、`meas:`
浮点数值对表、两个待台架核数值(封存超时窗 §4.2 兜底行与冷却时长 `App/algo/wave_ring.h`)、P 触发与 start.log 对齐(还得先解标定闭锁)、 浮点数值对表、两个待台架核数值(封存超时窗 §4.2 兜底行与冷却时长 `App/algo/wave_ring.h`)、P 触发与 start.log 对齐(还得先解标定闭锁)、
bench T 源与卷占用 2 s 的 `ring abandoned` 观察(需 bench 构建)、~~回放页坏段画面与空态画面 ~~bench T 源与卷占用 2 s 的 `ring abandoned` 观察(需 bench 构建)~~ **(2026-11-07 台架远程轮已闭环,见下「bench
定时自抓与占卷弃段观察闭环记录」小节)**、~~回放页坏段画面与空态画面
(等枚举缺陷修复后才有测试面)~~ **(2026-11-02 枚举缺陷修复后测试面已开,见下小节;2026-11-06 (等枚举缺陷修复后才有测试面)~~ **(2026-11-02 枚举缺陷修复后测试面已开,见下小节;2026-11-06
台架远程轮两画面已拍毕闭环,见「回放页坏段/空态画面闭环记录」小节)**、 台架远程轮两画面已拍毕闭环,见「回放页坏段/空态画面闭环记录」小节)**、
`task_prof` 读路径耗时峰值。**执行动作侧**(到场的人做什么、 `task_prof` 读路径耗时峰值。**执行动作侧**(到场的人做什么、
@@ -477,6 +478,116 @@ stored 0xF991 calc 0xB111 …nothing drawn`(rc=1),画面与解码器两份
跑完(幅值 / 相位 / 削顶,104 浮点遥测按用户裁定不作对照证据),尾步两画面 2026-11-06 拍毕; 跑完(幅值 / 相位 / 削顶,104 浮点遥测按用户裁定不作对照证据),尾步两画面 2026-11-06 拍毕;
手册第二幕状态与 `docs/任务规划/README.md` §2.0「独立」行已同步销项。 手册第二幕状态与 `docs/任务规划/README.md` §2.0「独立」行已同步销项。
### bench 定时自抓与占卷弃段观察闭环记录(2026-11-07,台架远程轮,#84 第四幕)
bench 锁全程持有(任务 `exec-issue-84`,`_wt` 规范锁区手工获取、收工 `--bench-pass`
释放);烧写按 2026-11-02 常授权执行(手册 §6 步骤 1 的「等你回“烧”」按常授权跳过)。
临时开关(`App/task/adc_task.c` 的本地宏 `WAVE_BENCH_AUTOCAP` 翻 1、`uvprojx` 加
`DTU_BENCH` 定义)全程不入仓、收工还原。证据目录
`docs/测试说明/测试数据/wave_bench_20261107/`(串口摘录、各轮 JSON、目录清单、构建日志)。
**执行链(时间序)**:
1. bench 构建首烧即暴露 **F0 缺陷**(见下现场发现)。修复重烧后 T 源定时自抓对上判据:
心跳 `wave: seg=NN armed=0 src=T pts=320` 每 10 s 恰 +5 段(2 s 节奏)、err 平段稳定,
启动即打 `[WARN] wave bench autocap ON: 1 seg / 2000 ms, auto-stop 300 s`。
2. 占卷造法:FTP 根 `FILLER.BIN`(2 MB,RETR ≈7.2 s)与 `FILL3.BIN`(600 KB,≈2.2–2.5 s)。
lftpd 从 open 到 close 全程持卷锁(`Drivers/BSP/NET/lftpd/lftpd_io.c`),主机侧 RETR 完成
时刻与串口 `[FTP] DOWNLOAD … OK` 行 ±5 ms 对齐,可互证时间戳。
3. **长占卷 → 静默自弃分支**:连续 9 轮 RETR 共占卷 72.6 s(`phase1.json`),期间 `err` 1→15、
`ovf` 1→18、seg 13→27(只有轮间零点几秒空隙抢到盘)——被占覆盖的落盘尝试各在 SEALED 滞留
2000 tick 后自弃并各给 `err` +1,**串口零留痕(全窗 0 条 `[ERR] [WAVE]`)**:「不是每拍刷屏」
判据以最严形态成立。
4. **临界占卷 → 唯一留痕**:δ 阶梯扫占卷窗内放锁落点(锚 = ON 行 +2.01 s、周期 2.0005 s、
步距 25 ms),第 11 发命中:`[ERR] [WAVE] seg drop: ring abandoned (idx=36 written=5250)`,
同毫秒 `[WAVE][WARN] seg held 124 ms (idx=36)`;全窗串口仅此一条 `[ERR] [WAVE]` 行
(打印由一次性闩锁 `s_wfail_latch` 把关,设计即如此)。心跳对 `err=4 ovf=10` → 10 s 后
`err=5 ovf=11`:**命中本身给 err 恰 +1**(同窗此前 4 发 LATE 类静默自弃与 ovf 各笔均有
逐发归因表)。弃段后段号不推进:弃段路径先 unlink 该槽文件,P1(+3.4 s)即见同号
`WAVE36.BIN` 重建 5250 B 全新单段(对照在档 WAVE00.BIN 已累计 126000 B),P3(+15.4 s)
同号仍在,sha256 `b12e130e80fb4d8b…2a0a11ca`。三判据(err+1 / 只有一条留痕 / 同号不推进)
全部板级实证。
5. **占卷期间活性**:104 端口 2404 TCP 探测在占卷中段收到 `68 04 0b 00 00 00`(STARTDT 确认)、
7003 UI 链路 status 正常应答(主菜单 MENU)、串口 `meas:`/`wave:` 心跳不断——
「丢录波不丢采集」在占卷场景再添实证(冻结窗口场景见上「板级远程半轮记录」)。
6. 收工:卷上占卷文件三处全删(ROOT 只剩 V5_UP/CONFIG.INI/PROT_SET/LOG//WAVE/)、`/WAVE`
只剩真实轮转段 → 重烧产品构建全量重建 → /serial-boot-test 全锚点判定(结论与逐锚点表见
证据目录 README)→ bench 锁释放。
**现场发现**:
- **F0(bench 构建定时器判据缺陷,已修复并硬件实证)**:`App/task/adc_task.c`:588 原无符号判据
`(uint32_t)(now - s_wave_bench_next) >= WAVE_BENCH_PERIOD_MS` 在 `next = now + PERIOD` 挂出后
立刻成立(now<next 时差值回绕成巨数),台架实测以 1 kHz tick 连发请求:`ovf` 每秒 +1000、
段节奏被去重钳到 ~1.5 s/段,违背 ON 行承诺的「1 seg / 2000 ms」。改有符号判定
`(int32_t)(now - s_wave_bench_next) >= 0`(半程内回绕安全)后节奏恰 +5/10 s。产品影像零漂移:
该段本就整块在 `#if defined(DTU_BENCH)` 闸内(旁证:bench 产物 Code 255284 vs 产品 254820,
差 464 B,bench 代码确被裁掉)。
- **F1(单发、未复现、只记不断)**:20:28:57 占卷扫荡窗口一次 `reset cause: software
(NVIC_SystemReset)`,无前置 `[ERR]`/断言/fault 打印(列明的四条软件复位路径都先打印再复位——
打印丢失或存在打印外调用点,未定位);此后 6+ 窗口、约 50 min 同等负载未复现。留作观察项,
再现第二例再升级排查。
- **F2(占卷方法学)**:lftpd 放卷锁比串口 `[FTP] DOWNLOAD … OK` 行早约 0.11–0.14 s(由放锁后
writer 首次抢到盘的时点反推)。临界命中要按「DOWNLOAD 行时刻 − 0.13 s + δ」摆放锁落点——
此常数是此前多轮全空手、改后 11 发即中的钥匙。
- **F3(同一竞态的另一留痕名,非新增缺陷)**:20:30:31 长占卷窗内一条 `[ERR] [WAVE] seg drop:
pack_next (idx=28 written=1920)`:与 §5.2 第四条同族——写到一半环已换段,该分支先按旧槽号
报 `pack_next` 再走统一弃段。属上表既有留痕名的板级首见,记例不另开缺陷。
- **i104 bind FAIL 每次上电复现**:`[ERR][I104] i104: bind port 2404 FAIL, retry in loop` 台架与
产品构建同现,静默重试后套接字实际绑定成功(TCP 探测 STARTDT 为证)——#53 既有面(见上
「回放页坏段/空态画面闭环记录」末段),不新开。
**至此第四幕(bench 定时自抓 + 占卷弃段观察)板级闭环**:§5.2 第四条与 §10 板级行的观察项
销项;手册 §1 第四幕行与 §6 状态已同步。本票唯一入库代码改动 = F0 有符号判定修复
(bench 闸内,产品行为零变化)。
### 回放页开页作废重扫与判废留痕修复记录(2026-11-07,#93 → PR #94)
11-06「回放页坏段/空态画面闭环记录」的两条现场发现由 #93 钉成工单后经用户裁定「按推荐方案实施」(A+B 同批 + F2 留痕,级别
裁定 = ERROR + 手册补判读行,不扩 serial-boot-test 豁免面)。代码面:
- **F1**:`ui_data_wave_ops_t` 扩第七件 `void (*wave_enter)(void)`(与 `manual_req` 同族动作位、
不产三态;`ui_data_wave_bind` NULL 链同步拒残表);`ui_task_wave_enter()` = 清 `s_wave_scanned`
+ 清 `s_wave_cache_ok`(与 `manual_req` 同纪律——同名文件被顶掉后旧段头不能拿旧尺子量新段);
`ui_page_wave_play.c` 的 `pg_init` 与 IDLE 态按键(方案 B,兑现「新段可能已落」的再探承诺)
各调一次;`simulator/main.c` 空壳桩保七件同形状。**重扫仍懒在首帧,开页链零 I/O 不破**,
页内 `UD/LR` 不新增重扫(11-02 钉表防抖原样)。**残余纪律(#93 §A+B 尾段口径)**:
开页是唯一作废时机——**页开着投放的新段要再开一次页才可见**;空态按键即投即见。
- **F2**:`ui_task_wave_load_head()` 五类 BAD 出口收敛为原因码 `UI_WAVE_REJ_{HEAD,LEN,WIN,
TAIL,CRC}=1..5`(宏值域按「接口只增不改」纪律钉死),判废时单点
`DBG_ERROR("ui wave head idx=%u reject=%u stored=0x%04X calc=0x%04X")` **逐次一条不去重**
(频控天然 = 每次进入坏段一行,与按键、画面一一对应;判废是低频人工动作,逐次留痕正是
取证要的)。第 5 类附 stored/calc 两组值、与 PC 侧 `test/host/wave_read.py` 的 REJECT 行
**同名同值互证**,其余四类该两字段打 `0x0000` 占位。级别 ERROR 与同函数 `open fail` 同面;
`/serial-boot-test` 的 `[ERR]` Forbidden 会命中**故意投坏段的轮次**——判读行已补进手册
§4 与 §8(坏段轮 reject 行 = 预期内,其余 `[ERR]` 照旧停幕)。画面零改动:判废态仍
「该段不可读」逐比特不变(ui-golden `wave_play_bad` 零刷新实证)。
主机面:ui-golden 全绿(内容页 74 张 + 菜单行 + 水位;三态帧零刷新);主机套件 ui_data 295 /
ui_sink 17 / wave_ring 113 / wave_store 170 / wave_trig 110 全过;Keil 0 错误 0 警告
(ER_IROM1 285,716→285,940 B:判废留痕单调用点含格式串常量共 +224 B,与 #93「每调用点约
90 B」的账同量级)。
台架环境新事实(本轮到场盘点,与修复无关但记档):`/WAVE` 长期台架会话下每个段文件被
跨开机**追加**成 2~27 段拼接(写者 `FA_OPEN_APPEND` + 长度等式只验本次写入量,
`default_task.c` 落盘道;11-06 的 STOR 全删全建掩盖了生长面)——拼接件对回放页单段读侧
(`size == total`)逐件判长度废,1866 段逐段过 `wave_read` 校验**全部合法**(零损坏,纯口径
相抵)。该面是否收口(写者截断 vs 读侧多段感知)是新的产品决定,本轮只如实记账,不并票。
板级验收(2026-11-07 台架远程轮,烧录经口头「烧」确认;证据
`docs/测试说明/测试数据/wave_fix_20261107/`):**F1 五条 / F2 五条全过**——F1-1 页关投放
重开即见新段(光标落数值最大段);F1-2 空态键重探「即投即见」,空态帧与 11-06 归档逐比特
一致;F1-3 页内连踩 ×12 零新增扫描锚点(防抖纪律未破);F1-4 手动录波回归(ACK
`src=M`、FTP 侧 +5250 落盘,作废路径由主机 295 项套件回归);F1-5 同号覆盖切出切入即见新
字节(单槽段头缓存切换中自然重读)。F2:坏段三进三行 `reject=5` 不去重且
`stored=0xC204 calc=0x8A84` 与 PC `wave_read` REJECT 行同值互证、画面与 11-06 拒收帧逐比特
一致;`reject=1/2` 面 CRC 字段 `0x0000` 占位;收工还原到场拼接盘态重开页,画面同旧固件、
串口多出行判废留痕 = 修复前后直接对照面。F2-3 启动门禁:零录波类 `[ERR]`;唯一 `[ERR]`
为既有 `[I104] bind port 2404 FAIL, retry in loop`——第四幕已把「软复位首绑失败、重试成功静默」归入 #53
既有面不新开(本轮经手的启动窗全部命中该行,STARTDT con 实测服务存活、链路可用),`listening` 标记
缺失即其重试成功不打日志的一面;间歇边界(是否断电重连可消)未在本轮验证。详见证据目录 README 的
Before/After 表与串口原文。
--- ---
## 11. 与 `docs/任务规划/数据可信.md` 的口径变更(三处) ## 11. 与 `docs/任务规划/数据可信.md` 的口径变更(三处)
@@ -496,7 +607,7 @@ stored 0xF991 calc 0xB111 …nothing drawn`(rc=1),画面与解码器两份
| 风险 | 后果 | 处置 | | 风险 | 后果 | 处置 |
|---|---|---| |---|---|---|
| 削顶五路被读成「系统有零序 / 有谐波」 | 现场误判 | 头里 `clip_mask` + 页面「削」徽标 + 空态不许画直线(§8.1) | | 削顶五路被读成「系统有零序 / 有谐波」 | 现场误判 | 头里 `clip_mask` + 页面「削」徽标 + 空态不许画直线(§8.1) |
| 有人把 U 与 I 两段叠图比相位 | 得出**没有物理意义**的相位差 | 回放不做多路叠加;头里写明来源转换器;与 `docs/任务规划/数据可信.md` §9 的 V0.1 禁止行同源 | | 有人把 U 与 I 两段叠图比相位 | 得出**没有物理意义**的相位差 | 回放不做多路叠加;头里写明来源转换器;与 `docs/硬件平台/ADC通道映射说明.md` §7 通道归属行的 V0.1 禁止行同源 |
| 落盘把 defaultTask 拖住 | 日志与配置引擎变慢(defaultTask 是两者唯一写者) | 分次写(256 B 双缓冲)、一次心跳最多一段、`f_write` 前后有耗时观测;不做整段驻留再写 | | 落盘把 defaultTask 拖住 | 日志与配置引擎变慢(defaultTask 是两者唯一写者) | 分次写(256 B 双缓冲)、一次心跳最多一段、`f_write` 前后有耗时观测;不做整段驻留再写 |
| **回放读路径把 uiTask 拖住**(2026-10-29 lead 评审补,此前风险表只有写侧没有读侧) | 一次渲染的实码 I/O(`App/task/ui_task.c` 376 到 398 行):段表刷新 1 次 `f_opendir` + 至多 100 次 `f_readdir`;未缓存段的段头装载 = 1 次 `f_open` + 1 次 128 B 头读 + **20 次 256 B 数据区读并边读边算数据 CRC** + 尾 2 B 一次 = **最坏 22 次小读**;已验过则只剩窗装载 = 1 次 `f_open` + 1 次 `f_lseek` + 1 次 80 B 窗读 + 40 点解码与峰值扫描(**一屏只碰一路通道一个窗,不是 8 路 320 点**)。uiTask 在 IWDG `required_mask` 内、窗 800 ms(口径同 `docs/子系统设计/看门狗设计说明.md` §11.3 的解耦心跳)→ **现象先是 LVGL 停摆与远程推流缺席,不是复位**(心跳与画屏解耦) | 卷锁 try 非阻塞(拿不到就显示「存储忙」,不等)+ 256 B 分次读 + 已验段结果缓存(同段同道不重复验)+ 只在首次进页 / 切段 / 切道时读。**单轮耗时上界未实测**:不新加埋点,用现成的 `task_prof` 读数(板级动作见 §10) | | **回放读路径把 uiTask 拖住**(2026-10-29 lead 评审补,此前风险表只有写侧没有读侧) | 一次渲染的实码 I/O(`App/task/ui_task.c` 376 到 398 行):段表刷新 1 次 `f_opendir` + 至多 100 次 `f_readdir`;未缓存段的段头装载 = 1 次 `f_open` + 1 次 128 B 头读 + **20 次 256 B 数据区读并边读边算数据 CRC** + 尾 2 B 一次 = **最坏 22 次小读**;已验过则只剩窗装载 = 1 次 `f_open` + 1 次 `f_lseek` + 1 次 80 B 窗读 + 40 点解码与峰值扫描(**一屏只碰一路通道一个窗,不是 8 路 320 点**)。uiTask 在 IWDG `required_mask` 内、窗 800 ms(口径同 `docs/子系统设计/看门狗设计说明.md` §11.3 的解耦心跳)→ **现象先是 LVGL 停摆与远程推流缺席,不是复位**(心跳与画屏解耦) | 卷锁 try 非阻塞(拿不到就显示「存储忙」,不等)+ 256 B 分次读 + 已验段结果缓存(同段同道不重复验)+ 只在首次进页 / 切段 / 切道时读。**单轮耗时上界未实测**:不新加埋点,用现成的 `task_prof` 读数(板级动作见 §10) |
| 触发风暴 + 轮转覆盖 | 现场唯一一段有效波形被后到的抖动冲掉 | 冷却期 + `ovf` 计数;「最新段号」进快照;分段优先级属二期 | | 触发风暴 + 轮转覆盖 | 现场唯一一段有效波形被后到的抖动冲掉 | 冷却期 + `ovf` 计数;「最新段号」进快照;分段优先级属二期 |
+48
View File
@@ -394,6 +394,54 @@
| 图 | 拓扑类用 Mermaid 代码块;技术配图走 SVG 生成器(见 [`架构设计/图形绘制流程.md`](架构设计/图形绘制流程.md)) | | 图 | 拓扑类用 Mermaid 代码块;技术配图走 SVG 生成器(见 [`架构设计/图形绘制流程.md`](架构设计/图形绘制流程.md)) |
| 状态标记 | ✅ 已完成 / ⚠️ 注意事项 / ❌ 禁止 / 📌 要点(克制使用,不滥用 emoji) | | 状态标记 | ✅ 已完成 / ⚠️ 注意事项 / ❌ 禁止 / 📌 要点(克制使用,不滥用 emoji) |
### 7.1 条目与编号:一律不发
**规则只有一句:新条目一律不配「字母+数字」编号,写语义短语。** 判「能不能发号」不看形态,
答案恒为否——`2026-10-29` 用户裁定「啥号都不发」,`2026-11-02` 又收一句:人读文档里的存量编号也清退。
理由是同形多义:号看不懂只能去查表,短语看不懂还能靠上下文猜。
| 场景 | 怎么做 |
|---|---|
| 想给新需求 / 新踩坑 / 新用例 / 新待办配号 | 不发,直接写清是什么事,登记表那一行的行名就是标识。例:`双转换器无共同采样触发`、`FTP 鉴权` |
| 文档内的步骤 / 阶段 / 设计原则条目 | 写「步骤 3」「阶段 7」「DMA 边界安全」,不写 `S3` / `TM-…` / `DP-…` |
| 指某篇文档的某节 | 写「`docs/网络/网络自愈架构设计.md` §4.10」。文档名与 `§` 必须紧邻,否则门禁判不了目标(见「链接规范」一节) |
| 碰到查不到定义的号 | 删号留事实,**不要补一个定义** |
| 新东西确实要被脚本按字面量匹配 | **先问用户**(Ask first)。批下来才允许破例 |
三条硬规矩(管既有号的引用):**号不承载语义**(严重度、优先级、模块名都不写进号里,事实一变号就开始撒谎);
**号不回收、不复用**(销项 = 删登记行 + 清掉所有引用,历史上"销掉的号被重新取走"撞过两次);
**引用必须带语义**(号旁边要有人话,别让读者被迫查表才看懂一句话)。
**存量族(只读)**——下表是仓库里仅剩还带编号的族,既有号继续被脚本按字面量匹配、继续被引用,
**但族里新增内容不配号**,写语义行名:
| 族 | 形态 | 属主登记处 |
|---|---|---|
| `TRAP-*` | `TRAP-<域>-<nn>` | `docs/问题记录/*_Trap_Records.md` |
| `FR-*` | 需求 | `docs/产品需求/产品需求设计文档.md` §5 |
| `CODE-RULE-<nn>` | 代码规范条款 | `scripts/check_coding_standard.py` |
| `MENU-STATE-<nn>` | UI 状态机键 | `simulator/tests/check_menu_rows.py` |
**已停发、只读的旧号**:登记簿 `N-x`/`S-x`/`T-x`、专项 `A-x`、网络设计条目 `F-<模块>-<nn>`、
保护功能号 `L<n>-<nn>`、台架阶段裸形(字母 T 紧跟一位数字)、审计 `E-xx` 与 `P0-x`~`P3-x`、
复审残号 `S1~S14`、「数据可信」任务卡号(中文前缀「卡」+ 数字)、测试验证层级号 `L0`~`L3`。
它们不回收、不复用;旧号 → 现行短语的换算表与逐批流水见 `scripts/archive/id_gate/编号治理历史.md`,
个别族的别名在 `scripts/archive/id_gate/id_aliases.json`(标 `retired-to-phrase` / `void`)。
**这些不是编号,别顺手清**:元器件位号与网名(`U5`/`C12`/`R3`/`PB12`)、数学与协议记号(`N-1`、正序 /
负序分量 `S1`/`S2`、`SHA-256`、`RS-485`、`ADC1_IN14`)、版本号(`V0.1`/`V0.2`)、协议号(`IEC 104`、`2404`)、
活表代号(网络自愈 §5.2 的 `E0~E19`,无连字符)、Socket 状态组合 `U1~U15`、文件路径与原始日志。
判据只有一条:**带连字符、且能在属主登记表查到定义**才叫编号;查不到的就是普通文本。
**清理动作**:绝不全局查找替换——同一裸形字面量可能同时是任务号、引脚名、MAC 地址或图节点 ID;
先判族、再限定 scope,每处断言命中数;改名走 `scripts/rename_ids.py`,别手工扫。
冻结的历史证据(`docs/测试说明/测试数据/`、历史串口日志、仍设变更记录的 5 篇台账)不回改。
**没有机器门禁兜底**:两道编号门禁(全库八项校验、只查新增行)已分别于 2026-10-28 / 2026-10-29 退役,
脚本移入 `scripts/archive/id_gate/`,判据只剩本节 + 评审。要手工扫一批改动或恢复机器面,
命令与成本见那个目录的 `README.md`;两道门禁查过什么、为什么退,见 `docs/门禁说明/id-check.md`
与 `docs/门禁说明/id-check-new.md`。
--- ---
## 8. 常见错误速查 ## 8. 常见错误速查
@@ -768,4 +768,3 @@ defaultTask(喂狗点)内也不饿狗,残留形态收敛为「有界时长
2026-10-25 F2/F3 探针轮、2026-11-02 录波枚举台架轮(卷锁 try 超时 0 次)、 2026-10-25 F2/F3 探针轮、2026-11-02 录波枚举台架轮(卷锁 try 超时 0 次)、
2026-11-05 PR #82 补验 soak(STOR 密集)均无该签名。重开判据不变:**台架再出 2026-11-05 PR #82 补验 soak(STOR 密集)均无该签名。重开判据不变:**台架再出
存储侧喂狗饥饿才排期**;观察行留登记簿 §2。 存储侧喂狗饥饿才排期**;观察行留登记簿 §2。
@@ -1,6 +1,6 @@
# ADC 前端注入验证流程(台架) # ADC 前端注入验证流程(台架)
> **这篇是什么**:已知电压注入验证的**执行侧**——怎么写表笔、读哪行日志、填哪张表、结果往哪回写。判据与实测记录在属主文档:直流轮 `docs/硬件平台/ADC通道映射说明.md` §8.1、交流轮 `docs/任务规划/数据可信.md` §4.6.2;**本文只写怎么跑**,分叉时判据从属主。证不到什么见 `docs/任务规划/数据可信.md` §4.6.1 与 §4.6.5,本文不重抄。 > **这篇是什么**:已知电压注入验证的**执行侧**——怎么写表笔、读哪行日志、填哪张表、结果往哪回写。判据与实测记录在属主文档:直流轮 `docs/硬件平台/ADC通道映射说明.md` §8.1、交流轮 `docs/任务规划/数据可信.md` §4.6.2;**本文只写怎么跑**,分叉时判据从属主。证不到什么见 `docs/硬件平台/ADC通道映射说明.md` 的 §8.1 结论与「边界」段,本文不重抄。
> >
> **两个轮次**:§1~§7 = **直流轮次**(2026-10-27 六项 PASS,只需万用表 + 电位器 + 串口日志);§8 = **交流轮次**(幅值 / 波形 / 相位 / 测频 / 削顶 / 谐波),一台信号发生器接 §3 同一批注入点就能跑,等标准源的只有**精度等级**。V0.1 五路单极性削顶(`UB/UC/IB/IC/IN`)在交流轮次只作"预期削顶"负向用例。 > **两个轮次**:§1~§7 = **直流轮次**(2026-10-27 六项 PASS,只需万用表 + 电位器 + 串口日志);§8 = **交流轮次**(幅值 / 波形 / 相位 / 测频 / 削顶 / 谐波),一台信号发生器接 §3 同一批注入点就能跑,等标准源的只有**精度等级**。V0.1 五路单极性削顶(`UB/UC/IB/IC/IN`)在交流轮次只作"预期削顶"负向用例。
@@ -353,7 +353,7 @@ TPAFE 双极性补码可注负压;STM32 单极性负半周测不了。UA/UN/IA
| 期望(现状固件) | **就是不出数**:幅值门 `FREQ_AMP_MIN 50.0f`(`App/algo/freq.h:62`,`App/algo/freq.c:231` 拿它与基波有效值比)在引脚电压域恒不过 → `valid=0`、`f=0`、UI `Hz` 显 `--` | | 期望(现状固件) | **就是不出数**:幅值门 `FREQ_AMP_MIN 50.0f`(`App/algo/freq.h:62`,`App/algo/freq.c:231` 拿它与基波有效值比)在引脚电压域恒不过 → `valid=0`、`f=0`、UI `Hz` 显 `--` |
| 判据 | **如实报不可测**,而不是报一个看起来对的 50.00。若门限没改却报出 50.00 → 反而是 bug,停下查 `App/algo/freq.c` | | 判据 | **如实报不可测**,而不是报一个看起来对的 50.00。若门限没改却报出 50.00 → 反而是 bug,停下查 `App/algo/freq.c` |
| 另有一档(需先取得同意) | 临时把 `FREQ_AMP_MIN` 由 `50.0f` 降到 `0.5f` → 重编(`/keil-build`,要 build 锁)+ 重烧 → 扫 45.000 / 50.000 / 55.000 Hz 三点,PC 侧判据 0.02 Hz → 跑完**必须还原**(撤销补丁 + 重编 + 重烧,`git diff` 核对干净)。这一档要改固件重烧,动它之前先问过你;不做也不影响上面那条判据成立 | | 另有一档(需先取得同意) | 临时把 `FREQ_AMP_MIN` 由 `50.0f` 降到 `0.5f` → 重编(`/keil-build`,要 build 锁)+ 重烧 → 扫 45.000 / 50.000 / 55.000 Hz 三点,PC 侧判据 0.02 Hz → 跑完**必须还原**(撤销补丁 + 重编 + 重烧,`git diff` 核对干净)。这一档要改固件重烧,动它之前先问过你;不做也不影响上面那条判据成立 |
| 坑 | 非整 50 Hz 时 `meas:` 拍频式跳动属预期 → **扫频读 `freq(hb)` 别读 `meas:`**(`docs/任务规划/数据可信.md` §8 同一条);取源先 `UA`(C02)再退 `IA`(C01)(`App/algo/freq.c:47`)——注 `UA` 走 UA 源;若只注 `IA`,测频跟 IA 走 | | 坑 | 非整 50 Hz 时 `meas:` 拍频式跳动属预期 → **扫频读 `freq(hb)` 别读 `meas:`**(`docs/任务规划/数据可信.md` §4.5:200 ms 是上送节拍不是平均窗);取源先 `UA`(C02)再退 `IA`(C01)(`App/algo/freq.c:47`)——注 `UA` 走 UA 源;若只注 `IA`,测频跟 IA 走 |
记录表: 记录表:
@@ -401,7 +401,7 @@ TPAFE 双极性补码可注负压;STM32 单极性负半周测不了。UA/UN/IA
| 期望与判据 | 板上读数(有效值刻度)≈ 各分量 0.160 V(对应设定 Vpp 0.453 V)±2 % | | 期望与判据 | 板上读数(有效值刻度)≈ 各分量 0.160 V(对应设定 Vpp 0.453 V)±2 % |
| 旁证 | `phasor(hb) C04-IA-F2`/`C05-IA-F5` 的 `rms=`:×0.1 只 1~2 格,**只能证"该轨非恒 0"**,判不了 ±2 %(§8.1) | | 旁证 | `phasor(hb) C04-IA-F2`/`C05-IA-F5` 的 `rms=`:×0.1 只 1~2 格,**只能证"该轨非恒 0"**,判不了 ±2 %(§8.1) |
| 无谐波叠加功能时 | 三次单注:只注 Vpp 0.453 V / 100 Hz → `Ia2` 有数(读数 ≈0.160 V)、`Ia5` 应 ≈0;只注 Vpp 0.453 V / 250 Hz → `Ia5` 有数、`Ia2` 应 ≈0;再注纯基波 Vpp 2.263 V → 两轨都 ≈0。这一档证"两轨各认各的次",**不证叠加工况**,结论里写清 | | 无谐波叠加功能时 | 三次单注:只注 Vpp 0.453 V / 100 Hz → `Ia2` 有数(读数 ≈0.160 V)、`Ia5` 应 ≈0;只注 Vpp 0.453 V / 250 Hz → `Ia5` 有数、`Ia2` 应 ≈0;再注纯基波 Vpp 2.263 V → 两轨都 ≈0。这一档证"两轨各认各的次",**不证叠加工况**,结论里写清 |
| 口径 | 这两轨**当前无下游消费者**(`App/algo/prot_elm.c` 无引用、`meas` 只算基波)→ 谐波轮只证"算得对",不证"有人用";这两轨归谁用,见 `docs/任务规划/数据可信.md` §9 谐波轨立项 | | 口径 | 这两轨**当前无下游消费者**(`App/algo/prot_elm.c` 无引用、`meas` 只算基波)→ 谐波轮只证"算得对",不证"有人用";这两轨归谁用,见 `docs/算法/继电保护功能复现规划.md` 的「遥测谐波轨(可选)」 |
记录表: 记录表:
@@ -420,4 +420,4 @@ TPAFE 双极性补码可注负压;STM32 单极性负半周测不了。UA/UN/IA
& '.venv\Scripts\python.exe' test/host/wave_read.py fft WAVE<NN>.BIN --ch 4 --all & '.venv\Scripts\python.exe' test/host/wave_read.py fft WAVE<NN>.BIN --ch 4 --all
``` ```
`fft` 每整周波给基波与 2 次/5 次谐波有效值(mV,浮点重算),±2 % 是定量判据;`--ch` = 段内通道表序,`IA` = 4(`UA UB UC UN IA IB IC IN`,TEMP 不录,`App/algo/wave_ring.h:216`)。UI 目检只是**旁证**(证"板上与脚本算的是同一个东西"),不是替代判据。THD 与根均方不在本轮(`docs/任务规划/数据可信.md` §4.6.5)。 `fft` 每整周波给基波与 2 次/5 次谐波有效值(mV,浮点重算),±2 % 是定量判据;`--ch` = 段内通道表序,`IA` = 4(`UA UB UC UN IA IB IC IN`,TEMP 不录,`App/algo/wave_ring.h:216`)。UI 目检只是**旁证**(证"板上与脚本算的是同一个东西"),不是替代判据。THD 与根均方不在本轮(谐波轨要做 THD 归 `docs/算法/继电保护功能复现规划.md` 的「遥测谐波轨(可选)」)。
@@ -3,6 +3,7 @@
> **这份手册解决什么**:录波的判据里剩下的那半轮——需要**有人的手和信号发生器**的验证——把它拆成"你做什么、说哪句话、会看到什么"。 > **这份手册解决什么**:录波的判据里剩下的那半轮——需要**有人的手和信号发生器**的验证——把它拆成"你做什么、说哪句话、会看到什么"。
> **它不是判据属主**:判据、留痕名清单、执行顺序图全在 `docs/子系统设计/故障录波设计说明.md` §9 与 §10;本文只写**执行动作**。已完成部分(2026-10-31 远程半轮六项 PASS + 2026-11-02 缺陷「回放页段表枚举恒空」修复闭环 + 2026-11-04 第二幕注量对表闭环(#40 交流轮)+ 2026-11-06 坏段/空态两画面台架远程轮拍毕)见 §10「板级远程半轮记录」与 §10「回放页枚举恒空缺陷修复记录」「回放页坏段/空态画面闭环记录」。 > **它不是判据属主**:判据、留痕名清单、执行顺序图全在 `docs/子系统设计/故障录波设计说明.md` §9 与 §10;本文只写**执行动作**。已完成部分(2026-10-31 远程半轮六项 PASS + 2026-11-02 缺陷「回放页段表枚举恒空」修复闭环 + 2026-11-04 第二幕注量对表闭环(#40 交流轮)+ 2026-11-06 坏段/空态两画面台架远程轮拍毕)见 §10「板级远程半轮记录」与 §10「回放页枚举恒空缺陷修复记录」「回放页坏段/空态画面闭环记录」。
> **一句话预算**:你到场约 1.5~2 小时;其中真正动手的只有**接三次线、按不超过六次键、拍两个决定**——其余全部由会话里的 agent 跑脚本。 > **一句话预算**:你到场约 1.5~2 小时;其中真正动手的只有**接三次线、按不超过六次键、拍两个决定**——其余全部由会话里的 agent 跑脚本。
> **触发源字母速查**(串口 `wave:` 心跳与回放页顶部的 `src` 字段,四个取值一次记全;契约定义属主 = `docs/子系统设计/故障录波设计说明.md` §9):**M=手动录波**(面板「装置维护 → 手动录波」按出来的)· **P=保护启动触发**(保护元件动作那一拍自动录的,本手册第三幕验的就是这条来路)· **T=定时自抓**(只在 bench 构建里周期自录,第四幕)· **`-`=本次上电还没触发过**。这四个字母是串口与台架脚本的 grep 契约、不会改成汉字;人读文案一律写「保护触发(P)」这类汉字在前的形式。
--- ---
@@ -12,8 +13,8 @@
|---|---|---|---|---|---| |---|---|---|---|---|---|
| 第一幕 | 枚举埋点与修复上板 | **已完成(2026-11-02,远程)** | 无 | 改码加埋点 → 构建 → 烧录回读 → 远程开回放页 → 读 FR 码定性 → 修复重烧 | `docs/子系统设计/故障录波设计说明.md` §10「回放页枚举恒空缺陷修复记录」 | | 第一幕 | 枚举埋点与修复上板 | **已完成(2026-11-02,远程)** | 无 | 改码加埋点 → 构建 → 烧录回读 → 远程开回放页 → 读 FR 码定性 → 修复重烧 | `docs/子系统设计/故障录波设计说明.md` §10「回放页枚举恒空缺陷修复记录」 |
| 第二幕 | 注量对表 | **已闭环(2026-11-06)**——注量对表 2026-11-04 由 #40 交流轮跑完;坏段/空态画面 2026-11-06 台架远程轮拍毕,本幕现场无需重做 | ~~接 UA 发生器线 1 次、拔 1 次;面板按 2 次键(或让 agent 远程注键)~~ 已由远程轮与 #40 消化 | 记心跳基准 → FTP 拉段 → `wave_read` 量四样 → `meas:`/104 YC 对表 → 削顶注大一遍 → 坏段上板看回放页绝不平线 | `docs/子系统设计/故障录波设计说明.md` §10「板级」行 +「板级·回放页」行后半 +「回放页坏段/空态画面闭环记录」 | | 第二幕 | 注量对表 | **已闭环(2026-11-06)**——注量对表 2026-11-04 由 #40 交流轮跑完;坏段/空态画面 2026-11-06 台架远程轮拍毕,本幕现场无需重做 | ~~接 UA 发生器线 1 次、拔 1 次;面板按 2 次键(或让 agent 远程注键)~~ 已由远程轮与 #40 消化 | 记心跳基准 → FTP 拉段 → `wave_read` 量四样 → `meas:`/104 YC 对表 → 削顶注大一遍 → 坏段上板看回放页绝不平线 | `docs/子系统设计/故障录波设计说明.md` §10「板级」行 +「板级·回放页」行后半 +「回放页坏段/空态画面闭环记录」 |
| 第三幕 | P 触发对时刻 | **要到场**,还含**两个由你拍板的决定** | IA 两点标定各接一次线 + 过流加大到 UI 见数值过 2 A | 读码算 k/b → 写配置生效 → 验证解锁 → 触发后对 start.log 时刻/段号/src=P | `docs/子系统设计/故障录波设计说明.md` §10「板级·触发来路」行 | | 第三幕 | 保护触发对时刻(src=P) | **要到场**,还含**两个由你拍板的决定** | IA 两点标定各接一次线 + 过流加大到 UI 见数值过 2 A | 读码算 k/b → 写配置生效 → 验证解锁 → 触发后对 start.log 时刻/段号/src=P | `docs/子系统设计/故障录波设计说明.md` §10「板级·触发来路」行 |
| 第四幕 | bench 自抓与卷占用 | **可远程**(烧录同上;占卷用 FTP 造) | 无 | 烧 bench 构建 → 造占卷 ≥2 s → 看 `err`+1、**一条** `ring abandoned`、同号重写 → 还原产品构建 | `docs/子系统设计/故障录波设计说明.md` §10 板级行的 `ring abandoned` 观察项 | | 第四幕 | bench 自抓与卷占用 | **已完成(2026-11-07,远程)**——三判据逐条对上,且顺手修掉 bench 定时器判据缺陷一枚(F0,见闭环记录);无需重做 | ~~烧 bench 构建 → 造占卷 ≥2 s → 看 `err`+1、**一条** `ring abandoned`、同号重写 → 还原产品构建~~ 已由远程轮消化 | 同左(已全部执行:长占卷 72.6 s 静默自弃 err 1→15 零留痕 + 临界命中唯一留痕 err 恰 +1 同号重写 + 104/UI 占卷中照常) | `docs/子系统设计/故障录波设计说明.md` §10「bench 定时自抓与占卷弃段观察闭环记录」 |
幕间依赖:**第二幕的"坏段上板看回放页"一步已不再被阻塞**(第一幕 2026-11-02 已修好并板级闭环);其余各幕互相独立,可以先做不用等的。 幕间依赖:**第二幕的"坏段上板看回放页"一步已不再被阻塞**(第一幕 2026-11-02 已修好并板级闭环);其余各幕互相独立,可以先做不用等的。
@@ -21,7 +22,7 @@
flowchart LR flowchart LR
A[第一幕: 枚举埋点修复 可远程] -->|修好才有测试面| B2[第二幕尾: 坏段与空态画面] A[第一幕: 枚举埋点修复 可远程] -->|修好才有测试面| B2[第二幕尾: 坏段与空态画面]
B[第二幕: 注量对表 到场接线] --> B2 B[第二幕: 注量对表 到场接线] --> B2
C[第三幕: P触发 到场+两个决定] C[第三幕: 保护触发 到场+两个决定]
D[第四幕: bench占卷 可远程] D[第四幕: bench占卷 可远程]
``` ```
@@ -72,6 +73,13 @@ flowchart LR
5. **换点再来一遍**:发生器升到能钉住 UB/UC/IB/IC/IN 任一路的量级(削顶的老口径见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §8.5 削顶卡;片内 ADC 五路单极性、负半周钉 0 的机理在 `docs/硬件平台/ADC通道映射说明.md`)——**这一遍你只拧幅值键**,录波触发重复第 3~4 步,钉轨对表应见 ≥1 路实测钉轨且能由注入解释。 5. **换点再来一遍**:发生器升到能钉住 UB/UC/IB/IC/IN 任一路的量级(削顶的老口径见 `docs/测试说明/专项验证/ADC前端注入验证流程.md` §8.5 削顶卡;片内 ADC 五路单极性、负半周钉 0 的机理在 `docs/硬件平台/ADC通道映射说明.md`)——**这一遍你只拧幅值键**,录波触发重复第 3~4 步,钉轨对表应见 ≥1 路实测钉轨且能由注入解释。
6. **[agent]** `meas:` 与 104 浮点遥测对表:参考主站 `test/host/iec104_master.py` 读 YC 浮点,和 `meas:` 行、和你注入的 1.000 V 三方对齐——**你只需报万用表读数**。 6. **[agent]** `meas:` 与 104 浮点遥测对表:参考主站 `test/host/iec104_master.py` 读 YC 浮点,和 `meas:` 行、和你注入的 1.000 V 三方对齐——**你只需报万用表读数**。
7. **坏段画面(这一幕的收尾,要第一幕修好)**:[agent] 造一份位翻转坏段上板(`RETR→翻一位→STOR 回同号`)→ 开回放页翻到该段——**判据:绝不许画成一条直线**,该显拒收态;agent 抓屏给你目检。 7. **坏段画面(这一幕的收尾,要第一幕修好)**:[agent] 造一份位翻转坏段上板(`RETR→翻一位→STOR 回同号`)→ 开回放页翻到该段——**判据:绝不许画成一条直线**,该显拒收态;agent 抓屏给你目检。
- **2026-11-07 起(#93/#94)串口同步留痕**:每一次进入判废段,串口出一条
`[ERR][UI_TASK] ui wave head idx=<段号> reject=<1..5> stored=0x%04X calc=0x%04X`——
原因码 1 头解析 / 2 长度等式 / 3 窗读 / 4 尾读 / **5 数据 CRC 不符**(第 5 类附两组 CRC,
可与 PC 侧 `test/host/wave_read.py dump` 的 REJECT 行同名同值互证;1~4 类两字段打 `0x0000`)。
坏段轮这些 `[ERR]` 行 = **预期内**,不算停幕(见 §8);恢复原字节后再进该段应零 reject 行、放波正常。
- **开页作废纪律(#93 F1)**:回放页**每次开页**重扫段表(页开着投放的新段要**再开一次页**才见;
空态按 `LR` 即投即见)。页内 `UD/LR` 连按不产生重扫,也不新增 `ui wave scan` 锚点。
8. **到你拔线**。 8. **到你拔线**。
**现场记录表**(agent 会打印这张表逐行填,你核对签字即可): **现场记录表**(agent 会打印这张表逐行填,你核对签字即可):
@@ -91,11 +99,11 @@ flowchart LR
--- ---
## 5. 第三幕「P 触发对时刻」——含两个只能你拍板的决定 ## 5. 第三幕「保护触发对时刻」(src=P)——含两个只能你拍板的决定
**先讲人话**:过流启动录波的代码路已接在 `protect_task.c` 的启动边沿上(判据一 picked,录波同拍请求),但**保护判据现在整机闭锁**——`adc_cal_flags()` 的 VALID 位对 UA/UN/IA 三路都没置位,`protect_task` 直接停走判据。要让保护真出口,**必须先把这三路标定**;这正是 2026-10-25 你裁定"保持闭锁、不用万用表走捷径"守着的那道门。 **先讲人话**:过流启动录波的代码路已接在 `protect_task.c` 的启动边沿上(判据一 picked,录波同拍请求),但**保护判据现在整机闭锁**——`adc_cal_flags()` 的 VALID 位对 UA/UN/IA 三路都没置位,`protect_task` 直接停走判据。要让保护真出口,**必须先把这三路标定**;这正是 2026-10-25 你裁定"保持闭锁、不用万用表走捷径"守着的那道门。
- **决定一(解锁)**:这一幕要不要用**发生器为参考**给 UA/UN/IA 做两点标定换 P 路验证?它**不是送检级标定**(端子变比还挂着 `docs/任务规划/数据可信.md` §5 的原理图确认),做出来的工程量是"发生器刻度下的近似值"。**点头 → 往下走;摇头 → 第三幕整体顺延到标准源轮,本文其余各幕照做。** - **决定一(解锁)**:这一幕要不要用**发生器为参考**给 UA/UN/IA 做两点标定换保护触发路(src=P)验证?它**不是送检级标定**(端子变比还挂着 `docs/任务规划/数据可信.md` §5 的原理图确认),做出来的工程量是"发生器刻度下的近似值"。**点头 → 往下走;摇头 → 第三幕整体顺延到标准源轮,本文其余各幕照做。**
- **决定二(还锁)**:这一幕验完,把标定清回闭锁(还原出厂系数)还是**留着 valid** 让保护继续在线(此后 UI 显示与 104 遥测的二次值都按这份近似标定出数——**留着就要在台账注明非送检级**)。 - **决定二(还锁)**:这一幕验完,把标定清回闭锁(还原出厂系数)还是**留着 valid** 让保护继续在线(此后 UI 显示与 104 遥测的二次值都按这份近似标定出数——**留着就要在台账注明非送检级**)。
步骤(决定一通过后): 步骤(决定一通过后):
@@ -118,6 +126,15 @@ flowchart LR
3. **判据三件套(agent 读串口与目录,给你摘要)**:`wave:` 行 `err` +1;串口**只有一条** `[ERR] [WAVE] seg drop: ring abandoned`;被弃段号**不推进**,下一段写同号;期间 104 链路与 UI 心跳照常(丢了录波不丢采集)。 3. **判据三件套(agent 读串口与目录,给你摘要)**:`wave:` 行 `err` +1;串口**只有一条** `[ERR] [WAVE] seg drop: ring abandoned`;被弃段号**不推进**,下一段写同号;期间 104 链路与 UI 心跳照常(丢了录波不丢采集)。
4. **[agent]** 删掉 `FILLER.BIN` → 重烧**产品构建**(等"烧"确认)→ 跑一遍启动锚点校验(`/serial-boot-test` 的 required/forbidden 全套)→ 释放 bench 锁。 4. **[agent]** 删掉 `FILLER.BIN` → 重烧**产品构建**(等"烧"确认)→ 跑一遍启动锚点校验(`/serial-boot-test` 的 required/forbidden 全套)→ 释放 bench 锁。
> **2026-11-07 本幕已由远程轮跑完闭环(#84)**:步骤 1/4 的等"烧"按 2026-11-02 常授权跳过;
> 判据三件套逐条对上——长占卷 72.6 s 静默自弃 `err` 1→15 零留痕(「不是每拍刷屏」的最严形态)、
> 临界占卷命中唯一留痕 `ring abandoned` 且 `err` 恰 +1、弃段槽号不推进同号重写、占卷期间 104
> 链路(STARTDT 实测应答)与 UI(7003 status 主菜单)照常;另修掉 bench 定时器判据缺陷一枚
> (F0,产品构建字节零漂移)。收工项:占卷文件三处全删、`/WAVE` 只剩真实轮转段、设备已回产品
> 构建。全程证据与逐数字实证见 `docs/子系统设计/故障录波设计说明.md` §10
> 「bench 定时自抓与占卷弃段观察闭环记录」+ 证据目录
> `docs/测试说明/测试数据/wave_bench_20261107/`。
--- ---
## 7. 收工还原清单(一项不落,agent 逐条过给你看) ## 7. 收工还原清单(一项不落,agent 逐条过给你看)
@@ -132,7 +149,7 @@ flowchart LR
- **页面看着"不动"**:九成是远程注键的帧流滞后(ACK 与推流同一条 TCP)——让 agent 按 `scripts/board_ui_nav.py` 文件头的三条纪律排空重取,不是板子死了。 - **页面看着"不动"**:九成是远程注键的帧流滞后(ACK 与推流同一条 TCP)——让 agent 按 `scripts/board_ui_nav.py` 文件头的三条纪律排空重取,不是板子死了。
- **FTP 报 425**:两条 LIST 之间隔 0.5 s 再发(lftpd 单连接语义,老坑)。 - **FTP 报 425**:两条 LIST 之间隔 0.5 s 再发(lftpd 单连接语义,老坑)。
- **串口见任何 `[ERR]` 开头行或装置自己复位了**:**停止当前幕**,原样贴给 agent——`[ERR]` 是门禁级信号,别重试掩盖现场。 - **串口见任何 `[ERR]` 开头行或装置自己复位了**:**停止当前幕**,原样贴给 agent——`[ERR]` 是门禁级信号,别重试掩盖现场。**唯一例外(2026-11-07 #93/#94 起)**:故意投坏段的轮次里 `[ERR][UI_TASK] ui wave head idx=… reject=…` 判废留痕行 = 预期内、逐段逐次一条,不触发停幕(判读表见 §4 步 7;除此之外任何 `[ERR]` 照旧停幕)。
## 9. 时间与顺序建议 ## 9. 时间与顺序建议
@@ -140,7 +157,7 @@ flowchart LR
|---|---|---|---| |---|---|---|---|
| 先 | 第一幕(埋点→定性→修复) | 30~45 min | 否(远程可跑,烧录要口头确认) | | 先 | 第一幕(埋点→定性→修复) | 30~45 min | 否(远程可跑,烧录要口头确认) |
| 中 | 第二幕(注量对表) | 40~60 min | **是**(接拔线 + 一次按键) | | 中 | 第二幕(注量对表) | 40~60 min | **是**(接拔线 + 一次按键) |
| 中 | 第三幕(P 触发) | 30~60 min(含两个决定) | **是**(多点注入接线 + 加流) | | 中 | 第三幕(保护触发) | 30~60 min(含两个决定) | **是**(多点注入接线 + 加流) |
| 后 | 第四幕(bench 占卷) | 20~30 min | 否 | | 后 | 第四幕(bench 占卷) | 20~30 min | 否 |
第二、三幕共用同一次到场(都在 UA/IA 端子上做文章);第一、四幕可以排在任意工作日远程做。**四幕全过 = 录波本波收口**——`docs/任务规划/README.md` §2.0「独立」行的"一轮未跑"字样就可以清了。 第二、三幕共用同一次到场(都在 UA/IA 端子上做文章);第一、四幕可以排在任意工作日远程做。**四幕全过 = 录波本波收口**——`docs/任务规划/README.md` §2.0「独立」行的"一轮未跑"字样就可以清了。
@@ -70,9 +70,9 @@
| `TC-BOOTSTAT-030c` | init 后连读 100 次,三类 I2C 调用计数**纹丝不动** | "任意上下文可读"不是口头承诺 | | `TC-BOOTSTAT-030c` | init 后连读 100 次,三类 I2C 调用计数**纹丝不动** | "任意上下文可读"不是口头承诺 |
> ⚠ 这些号是**主机侧用例号**,不是板端用例号,也不是需求号;族口径沿用 > ⚠ 这些号是**主机侧用例号**,不是板端用例号,也不是需求号;族口径沿用
> `docs/编号规范.md` 的 TC 族(既有号只读),所以**本文就是定义位**: > `docs/文档规范.md` §7.1 的 TC 族口径(既有号只读),所以**本文就是定义位**:
> 新增/删除用例必须同步改本表——`id-check` 已于 2026-10-28 退役,悬空与孤儿**不再有机器警报**,只靠评审; > 新增/删除用例必须同步改本表——`id-check` 已于 2026-10-28 退役,悬空与孤儿**不再有机器警报**,只靠评审;
> 新增用例本身不再配号(`docs/编号规范.md` §4.1 一律停发),用语义化测试函数名。 > 新增用例本身不再配号(`docs/文档规范.md` §7.1 一律停发),用语义化测试函数名。
--- ---
@@ -107,7 +107,7 @@ test/host/time_sync/time_sync_test.c
## 2. 测试用例 ## 2. 测试用例
> **编号停发口径**:本文档不再使用 `TC-TIMESYNC-NNN`(新条目一律语义短语, > **编号停发口径**:本文档不再使用 `TC-TIMESYNC-NNN`(新条目一律语义短语,
> [`../../编号规范.md`](../../编号规范.md) §0);旧编号族已随退役整批作废,不复用。 > [`../../文档规范.md`](../../文档规范.md) §7.1);旧编号族已随退役整批作废,不复用。
> 断言用**语义标签**命名。桩状态在每用例前由 `fakes_reset()` 复位。 > 断言用**语义标签**命名。桩状态在每用例前由 `fakes_reset()` 复位。
### 2.1 `time_sync_delay_fed` — 分片喂心跳延时(`tc_delay_fed`) ### 2.1 `time_sync_delay_fed` — 分片喂心跳延时(`tc_delay_fed`)
@@ -152,7 +152,7 @@
TC-{MOD}-{NNN} TC-{MOD}-{NNN}
``` ```
> ⚠ **本族的号已于 2026-10-27 停发**(用户裁定「批次三,不坐」→ `docs/编号规范.md` §4.1):**新用例不再配 > ⚠ **本族的号已于 2026-10-27 停发**(用户裁定「批次三,不坐」→ `docs/文档规范.md` §7.1):**新用例不再配
> TC 号**,标识 = 语义化测试函数名 + 本文档用例表的行名(§6.4 同口径)。下面的形态约定是**读现存号**用的, > TC 号**,标识 = 语义化测试函数名 + 本文档用例表的行名(§6.4 同口径)。下面的形态约定是**读现存号**用的,
> 不是起新号的模板。现存号保留、不清、不复用——测试追溯门禁按字面量读它。 > 不是起新号的模板。现存号保留、不清、不复用——测试追溯门禁按字面量读它。
@@ -0,0 +1,87 @@
# wave_bench_20261107 —— 第四幕「bench 定时自抓与占卷弃段观察」证据(#84,台架远程轮)
**一句话**:bench 自抓与「卷被占住时弃段」两条路径都拿到了板级实证——临界占卷命中恰好**一条**
`[ERR] [WAVE] seg drop: ring abandoned`、`err` 恰 +1、段号不推进同号重写;长占卷 72.6 s 静默
自弃 err 1→15 零留痕;期间 104 链路与 UI 照常;顺手修掉 bench 定时器判据缺陷一枚(F0)。
产品构建已还烧,除 #53 跟踪中的 i104 首绑 FAIL 行外全锚点过(端口实测活,见「已知限制」)。
## 1. 判据对照(手册 §6 步骤 3 三件套 + 活度)
| 判据 | 结果 | 实证 |
| --- | --- | --- |
| `wave:` 行 `err` +1 | ✅ 恰 +1 | `serial_excerpt_sweep7_window.txt`:`seg=36 … err=4` (21:15:32) → `seg=39 … err=5` (21:15:42);err 全窗归因 = 4 次静默自弃 + 1 次命中 = 5 ✓ |
| 只出现**一条** `ring abandoned`(不是每拍刷屏) | ✅ 唯一 | 同 excerpt:21:13–21:19 全窗 `[ERR]` 共 2 条 = 命中 1 条 + `[ERR][I104] bind FAIL`(#53 启动面,非落盘留痕);命中行:`seg drop: ring abandoned (idx=36 written=5250)` |
| 段号不推进、下一段仍写同号文件 | ✅ | `sweep7_211352.json` P1/P2/P3:命中即 unlink WAVE36.BIN → +3.4 s 起该槽 5250 B 全新单段(同刻邻槽 WAVE00=126000 B 累积对照),sha256 `b12e130e…2a0a11ca`;心跳 seg 36→39 但**文件 idx 恒 36** |
| 长占卷静默侧(err+N 零留痕,「不刷屏」最严形态) | ✅ | `phase1.json`:72.61 s 连续 FILLER 占卷,err 1→15(+14 = 覆盖 14 次封存的自弃),`err_lines=0` |
| 期间 104 链路与 UI 心跳照常 | ✅ | `phase1.json` probes(占卷中转储中):i104 TCP 2404 → `68040b000000`(STARTDT 确认)、7003 UI status=**MENU**(主菜单)ok |
| 收工:FILLER 删净 / /WAVE 只剩真实段 / 产品构建 / 锁空闲 | ✅ | `final_wave_listing.txt`(根 = LOG、WAVE、V5_UP.BIN、CONFIG.INI、PROT_SET.BIN,FILLER/FILL2/FILL3 全删);产品构建 `fw build: Nov 7 2026 21:32:52`,`boot_log_fail2_*` 除 i104 行外 8/9 required 全过 + readback OK;bench 锁以 `--bench-pass` 释放 |
## 2. 命中窗口时间线(`sweep7_probes_211352.jsonl` 逐拍)
bootstrap stlink 复位 21:13:52 → `wave bench autocap ON` 21:13:53.357(锚 0=ON+2.01 s,
周期实测 2.0005 s)→ 探针 1–10(`/FILL3.BIN` 600 KB RETR ≈2.4 s,δ 阶梯 −150…+160 ms,
锚只被 LATE 类更新防自污染):LATE 4 次(rel 2.019/2.007/1.932/1.812 = 释放点在弃段边界后,
各自静默自弃 err+1 零留痕)、E 6 次(rel −0.02…−0.12 = 提前干净落盘)→ **探针 11
δ=−90 ms,rel=−0.011 s 命中**:21:15:35.576 `[ERR] seg drop: ring abandoned (idx=36)`,
同刻 `seg held 124 ms (idx=36)`(临界抓段全程含住边界,写毕复检判死自删)。
方法要点(F2):lftpd 交还卷锁比 `[FTP] DOWNLOAD … OK` 串口落账行**早约 0.11–0.135 s**,
δ 阶梯常数 C_BASE=2.19 s 已把该提前量烧进目标式;锚自 LATE 探针回收(grab_rx − (2P+0.16+QP))。
## 3. 现场发现
- **F0(已修,本 PR 唯一代码改动)**:`App/task/adc_task.c` bench 周期到期判定用无符号差值,
`next=now+PERIOD` 挂出后 `(now−next)>=2000` 因回绕**每拍成立**——首个 bench 构建台架实证
以 ~1 kHz 连发请求(ovf 每秒 +1000、段节奏钳到 ~1.5 s/段、drop 计数狂涨),违背 ON 行
承诺的 `1 seg / 2000 ms`。改有符号比较后实测 seg 精确 +5/10 s。产品镜像字节零漂移
(bench 段在 `#if DTU_BENCH` 门内;bench Code=255284 vs 产品 254820,差 464 B 即门控旁证)。
首烧 run_boot_test 的 FAIL(i104 MISS + bind FAIL)与本缺陷无关,属 #53 面。
- **F1(单次未复现,仅记录)**:20:28:57 板载 `reset cause: software (NVIC_SystemReset)`
无任何打印前导;四个复位调用点均「先打印后复位」。其后 6+ 个 autocap 窗(含 72.6 s 连续
占卷)未复现。复原摘录与来源声明见 `serial_excerpt_sweep5_f1f3.txt`。
- **F3(同族分支板级首见)**:20:30:31 `seg drop: pack_next (idx=28 written=1920)`——复检
判死的「落盘中途」分支(对照命中走的是「落盘前解冻」分支),同一段竞态家族,同套处置
(删文件、号不推进、统一打印点),见设计说明 §5.2 第四条 / §10 留痕名清单。
- **i104 首绑 FAIL(#53 既有跟踪)**:每次上电/复位 +2.7 s 复现一行 `[ERR][I104] bind port
2404 FAIL, retry in loop`,net 层 reconcile 静默重挂后端口实测活(本窗 21:37:09 探针
`68040b000000` + `serial_excerpt_product_final_2133plus.txt` 的 relisten 三连行)。
本轮不新开(11-06 第二幕轮先例同此,设计说明 §10 回放页记录有注)。
## 4. 复现要点
1. bench 构建:`STM32F407-Demo.uvprojx` Define 加 `DTU_BENCH` + `adc_task.c` 的
`WAVE_BENCH_AUTOCAP` 置 1(两枚临时开关都不入库),烧写,串口见
`wave bench autocap ON`(300 s 自动停,reset 可重挂窗)。
2. 根目录 STOR 占卷文件(8.3 名,本窗用 2 MB `FILLER.BIN` ≈7.1 s/次 与 600 KB
`FILL3.BIN` ≈2.4 s/次);RETR 释放点按 §2 方法贴到弃段边界前 ~110 ms 带内。
3. 看串口 `[ERR] [WAVE] seg drop:` 唯一行 + `wave:` 心跳 err 增量 + `/WAVE` 同号槽重写。
4. 收工按手册 §6 步骤 4。驱动脚本为票据级(未入库),关键常数见 §2;台架常授权下免「等烧」。
## 5. 已知限制
- **串口持久日志被后续 run_boot_test 的 open+clear 清空**(21:33:07 gen=3):sweep5 窗口
(20:2x)原始切片未及整段归档,`serial_excerpt_sweep5_f1f3.txt` 为**逐字复原件**(来源
声明在文件头);sweep7 窗口与产品终窗为原始切片。
- `/WAVE` 是 100 槽轮转覆盖,命中时刻 WAVE36 的 5250 B 样本无法事后单独归档(后续真实段
继续同号重写属设计行为);命中时状态以 P1/P2/P3 三点尺寸+sha + 目录清单固化。
- 启动锚点校验在产品构建上因 #53 行判 FAIL(两次复跑同因);该行是唯一 MISS/HIT,
端口活度以 TCP STARTDT 实测补偿,定性沿用 11-06 轮先例。
- F1 复位不定性、不复现即不追(观察面),如现场再见按 `boot_stats` CSR 值起单。
## 6. 文件清单
| 文件 | 内容 |
| --- | --- |
| `sweep7_211352.json` | 命中窗总结(锚链、P1/P2/P3 采样、心跳对、唯一性核验) |
| `sweep7_probes_211352.jsonl` | 命中轮 11 探针逐拍记录(δ/rel/cls/err_lines_new) |
| `sweep7_probes_210925.jsonl` | 前一轮(网格自污染教训,探针 1–2 回收陈旧封存) |
| `serial_excerpt_sweep7_window.txt` | 命中窗串口原始切片(21:13:52–21:15:59,噪声过滤) |
| `phase1.json` | 72.6 s 连续占卷 + 占卷中 104/UI 探针 + err 1→15 心跳链 |
| `serial_excerpt_sweep5_f1f3.txt` | F1 复位 + F3 pack_next 复原摘录(含来源声明) |
| `serial_excerpt_product_final_2133plus.txt` | 产品终窗串口切片(bind FAIL→relisten→探针应答) |
| `boot_log_fail1/fail2_20261107_*.txt` | 产品构建两次启动锚点校验全日志(唯一 FAIL 项 = #53 行) |
| `final_wave_listing.txt` | 收工态 /WAVE 计数与抽样尺寸、WAVE36=10500 注记 |
| `sweep_1794051196.json` | 更早 58 拍扫相位轮(全 E 类零 err——「1.6 s 占卷结构上够不着边界」的方法学反证) |
关联:`docs/子系统设计/故障录波设计说明.md` §10「bench 定时自抓与占卷弃段观察闭环记录」;
`docs/测试说明/专项验证/故障录波板级到场轮执行手册.md` §1/§6/§7;Gitea #84。
@@ -0,0 +1,157 @@
[+0ms] [----/--/-- --:--:--][APP] boot: syslog init OK
[+0ms] [----/--/-- --:--:--][APP] fw build: Nov 7 2026 21:28:55 suite=NONE dstr=off
[+10ms] [----/--/-- --:--:--][APP] reset cause: software (NVIC_SystemReset) (CSR=0x14000000)
[+10ms] PREVRUN seg=2 seq=2101112827 t=436031
[+21ms] TICKRUN uw=436055 n=436055 duw=24
[+21ms] [----/--/-- --:--:--][RTC] sd2506_init: OK
[+31ms] [----/--/-- --:--:--][APP] SD2506 init: OK (ret=0)
[+42ms] [2026-11-07 21:29:18][CLK] sys_clock_init: RTC initial time 2026-11-07 21:29:18
[+42ms] [2026-11-07 21:29:18][CLK] sys_clock_init: wall clock base = unix 1794086958, base_tick=142
[+52ms] [2026-11-07 21:29:18][APP] RS485 init: OK (UART4, DE=PA15)
[+63ms] [2026-11-07 21:29:18][APP] ScreenLink init: OK (ret=0, USART1 700000 baud, BRR=0x0078)
[+73ms] [2026-11-07 21:29:18][NAND] Resetting NAND...
[+94ms] [2026-11-07 21:29:18][NAND] Reading NAND ID...
[+94ms] [2026-11-07 21:29:18][NAND] NAND ID: MID=0xC8, DID=0x52
[+105ms] [2026-11-07 21:29:18][NAND] Scanning bad blocks...
[+240ms] [2026-11-07 21:29:18][NAND] BBT scan: 0 bad blocks found
[+240ms] [2026-11-07 21:29:18][NAND] Enabling ECC...
[+240ms] [2026-11-07 21:29:18][NAND] Unlocking block protection...
[+250ms] [2026-11-07 21:29:18][NAND] Locating BBT pool...
[+250ms] [2026-11-07 21:29:18][NAND] Loading persisted BBT...
[+261ms] [2026-11-07 21:29:18][NAND] NAND init OK
[+261ms] [2026-11-07 21:29:18][APP] NAND init: OK
[+271ms] [2026-11-07 21:29:18][ADC] Init OK
[+271ms] [2026-11-07 21:29:18][APP] ADC init: OK
[+271ms] [2026-11-07 21:29:18][APP] ADC input layer init: OK
[+282ms] [2026-11-07 21:29:18][APP] phasor layer init: OK (inst=5)
[+282ms] [2026-11-07 21:29:18][APP] freq layer init: OK
[+292ms] [2026-11-07 21:29:18][CFG] register: section 'adc_cal' (9 keys)
[+292ms] [2026-11-07 21:29:18][CFG] register: section 'adc_cal_ofs' (8 keys)
[+303ms] [2026-11-07 21:29:18][APP] adc cal init: OK (k_q16 tpafe=10000000 stm32=52800000)
[+313ms] [2026-11-07 21:29:18][CFG] register: section 'run_par' (9 keys)
[+313ms] [2026-11-07 21:29:18][APP] run par init: OK (db9 k/b via adc_cal, evt=1<<8)
[+323ms] [2026-11-07 21:29:18][CFG] register: section 'comm' (2 keys)
[+333ms] [2026-11-07 21:29:18][APP] comm init: OK (ca=1 port=2404)
[+333ms] [2026-11-07 21:29:18][APP] protection init: OK (set=40 elm=9)
[+344ms] [2026-11-07 21:29:18][APP] SD2506 ID: 2512153425482405
[+344ms] [2026-11-07 21:29:18][APP] SD2506 time: 2026-11-07 21:29:19 (week 6)
[+354ms] [2026-11-07 21:29:18][APP] SD2506 temp: 24 C
[+354ms] [2026-11-07 21:29:18][APP] SD2506 battery: 3.12 V
[+365ms] [2026-11-07 21:29:18][APP] App init OK
[+365ms] [2026-11-07 21:29:18][NAND_FTL] Initializing NAND FTL...
[+386ms] [2026-11-07 21:29:18][PROT] uncalibrated -> protection blocked (UA/UN/IA VALID not all set)
[+469ms] [2026-11-07 21:29:18] [FS] FATFS mounted
[+532ms] [2026-11-07 21:29:18][SYSLOG] runlog boot entry: reboot
[+532ms] [2026-11-07 21:29:18][CFG] register: section 'network' (4 keys)
[+542ms] [2026-11-07 21:29:18][CFG] register: section 'ftp' (3 keys)
[+553ms] [2026-11-07 21:29:18][CFG] register: section 'sntp' (4 keys)
[+563ms] [2026-11-07 21:29:18][CFG] load: OK (1064B, heap free 16552B)
[+563ms] [2026-11-07 21:29:18][NET_CFG] load: OK ip=192.168.31.100
[+574ms] [2026-11-07 21:29:18] [CFG] prot set loaded (/prot_set.bin)
[+595ms] [2026-11-07 21:29:18][NAND_FTL] Map resumed: 46942/93232 sectors used
[+605ms] [2026-11-07 21:29:18][NAND_FTL] Map head=36160 tail=91677 epoch=8
[+605ms] [2026-11-07 21:29:18][NAND_FTL] NAND FTL ready (capacity: 93232 pages = 182 MB)
[+616ms] [2026-11-07 21:29:18][ADC_TASK] first: UA=-19 UB=414 UC=518 UN=-18 IA=-16 IB=0 IC=768 IN=901 T=713
[+626ms] [2026-11-07 21:29:18][ADC_TASK] phasor(first) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+626ms] [2026-11-07 21:29:18][ADC_TASK] phasor(first) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+636ms] [2026-11-07 21:29:18][ADC_TASK] phasor(first) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+646ms] [2026-11-07 21:29:18][ADC_TASK] phasor(first) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+656ms] [2026-11-07 21:29:18][ADC_TASK] phasor(first) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+656ms] [2026-11-07 21:29:18][ADC_TASK] freq(first): f=0 valid=0 (x0.01)
[+667ms] [2026-11-07 21:29:18][PROT] protect task start: cycle=20ms elm=9
[+667ms] [2026-11-07 21:29:18][NET_TASK] === Network Init ===
[+677ms] [2026-11-07 21:29:18][NET] ch395f ver=0x4A fun_para=0x08
[+677ms] [2026-11-07 21:29:18][NET_TASK] net init: OK
[+688ms] [2026-11-07 21:29:18][NET_TASK] MAC: 3C:AB:72:53:2B:12
[+688ms] MISS start snap=0x000001E7 req=0x000001F7 t=794
[+688ms] [2026-11-07 21:29:18][WD] [WD] armed: timeout ~2498ms (worst ~1701ms), miss_tol=800ms
[+698ms] [2026-11-07 21:29:18][NET_TASK] IP_INF: IP=192.168.31.100 GW=192.168.31.1 MASK=255.255.255.0
[+751ms] [2026-11-07 21:29:18][UI_TASK] UI task: started, wait net ready
[+2642ms] [2026-11-07 21:29:20][NET_TASK] PHY: 100M FULL
[+2663ms] [2026-11-07 21:29:20][NET_TASK] netTask: started (single-socket mode)
[+2694ms] [2026-11-07 21:29:20][ERR][I104] i104: bind port 2404 FAIL, retry in loop
[+2725ms] [2026-11-07 21:29:20] [FTP] using factory default password
[+2735ms] MISS start snap=0x000001E7 req=0x000001F7 t=2839
[+2735ms] [PROF] t=2843 uic=0 uip=0 uipn=0 uil=0 uiw=0 uis=0 uisn=0 adc=2370 adcm=1997 adcn=0 gl=0
[+2746ms] [PROF2] t=2843 defd=92186 defs=37170 netp=1004 netn=387 adcp=8 adcq=0 gl=0
[+2756ms] [2026-11-07 21:29:20] [FTP] waiting for connection...
[+2756ms] [2026-11-07 21:29:20][UI_TASK] UI task: net ready, init port
[+2766ms] [2026-11-07 21:29:20][UI_TASK] UI task: ui_port_init enter
[+2777ms] [2026-11-07 21:29:20][UI_PORT] theme: mono dark_bg=true applied
[+2777ms] [2026-11-07 21:29:20][UI_TASK] UI port init: OK
[+2787ms] [2026-11-07 21:29:20][UI_TASK] UI task: ui_menu_init enter
[+2787ms] [2026-11-07 21:29:20][UI_MENU] menu build start: total=15136 free=12692 big=12692
[+2798ms] [2026-11-07 21:29:20][UI_MENU_VIEW] view init: root frame w=66 h=107
[+2808ms] [2026-11-07 21:29:20][UI_MENU] menu build done: total=15020 free=11828 big=11816 used=3192
[+2818ms] [2026-11-07 21:29:20][UI_TASK] UI menu init: OK
[+2818ms] [2026-11-07 21:29:20][UI_STANDBY] standby: ready (idle=60000ms)
[+2829ms] [2026-11-07 21:29:20][UI_TASK] UI standby: ready (idle=60s)
[+2871ms] [2026-11-07 21:29:20][UI_TASK] UI net sink: started (port 7003)
[+2892ms] [2026-11-07 21:29:20][SBLINK] first frame: size=6 cmd=1 key=0
[+4898ms] [PROF] t=5005 uic=181 uip=29627 uipn=5854 uil=10999 uiw=19608 uis=1139 uisn=0 adc=4531 adcm=1997 adcn=0 gl=0
[+4909ms] [PROF2] t=5005 defd=92186 defs=37170 netp=1024 netn=0 adcp=9 adcq=0 gl=0
[+5368ms] [2026-11-07 21:29:23][SBLINK] rx=19 ok=19 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+5379ms] [2026-11-07 21:29:23] [STACK] default peak_used=2176/5120 free_min=2944 (57%)
[+5389ms] [2026-11-07 21:29:23] [STACK] net peak_used=1116/3840 free_min=2724 (70%)
[+5389ms] [2026-11-07 21:29:23] [STACK] ftp peak_used=740/4096 free_min=3356 (81%)
[+5400ms] [2026-11-07 21:29:23] [STACK] ui peak_used=4104/16384 free_min=12280 (74%)
[+5410ms] [2026-11-07 21:29:23] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[+5410ms] [2026-11-07 21:29:23] [STACK] adc peak_used=1024/2560 free_min=1536 (60%)
[+5421ms] [2026-11-07 21:29:23] [STACK] iec104 peak_used=540/2560 free_min=2020 (78%)
[+5432ms] [2026-11-07 21:29:23] [STACK] protect peak_used=492/2048 free_min=1556 (75%)
[+5442ms] [2026-11-07 21:29:23] [STACK] heap free=15624 min_ever=8464
[+5442ms] [2026-11-07 21:29:23][SBLINK] tx=9 done=8 drop=10 kerr=0 abor=0 fb=5 bad=0 us=511 max=513 kq=0 off=0 dfok=0 dfold=0
[+6902ms] [PROF] t=7008 uic=354 uip=94941 uipn=5854 uil=11000 uiw=85308 uis=1139 uisn=0 adc=6534 adcm=1997 adcn=0 gl=0
[+6912ms] [PROF2] t=7008 defd=92186 defs=37170 netp=1984 netn=0 adcp=9 adcq=0 gl=0
[+8918ms] [PROF] t=9025 uic=536 uip=94941 uipn=4855 uil=10998 uiw=85308 uis=1139 uisn=0 adc=8551 adcm=1997 adcn=0 gl=0
[+8929ms] [PROF2] t=9025 defd=92186 defs=37170 netp=1984 netn=0 adcp=9 adcq=0 gl=0
[+10368ms] [2026-11-07 21:29:28][ADC_TASK] frames=10000 idle=0 skip=1 seq=10006 frst_err=0 ring=9999 adc1_rc=0 adc1_err=0 adc1_seq=10005 adc1_gap=5 adc1_hw=0 tgap=1
[+10379ms] [2026-11-07 21:29:28][ADC_TASK] phasor(hb) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+10389ms] [2026-11-07 21:29:28][ADC_TASK] phasor(hb) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+10399ms] [2026-11-07 21:29:28][ADC_TASK] phasor(hb) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+10410ms] [2026-11-07 21:29:28][ADC_TASK] phasor(hb) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+10410ms] [2026-11-07 21:29:28][ADC_TASK] phasor(hb) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+10420ms] [2026-11-07 21:29:28][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[+10420ms] [2026-11-07 21:29:28][ADC_TASK] adc: UA=-20 UB=404 UC=618 UN=-19 IA=-20 IB=0 IC=760 IN=893 T=730
[+10431ms] [2026-11-07 21:29:28][ADC_TASK] cal: ua_mv=-3 un_mv=-2 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[+10441ms] [2026-11-07 21:29:28][ADC_TASK] meas: seq=50 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[+10452ms] [2026-11-07 21:29:28][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[+10462ms] [2026-11-07 21:29:28][SBLINK] rx=37 ok=37 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+10473ms] [2026-11-07 21:29:28][SBLINK] tx=27 done=27 drop=10 kerr=0 abor=0 fb=16 bad=0 us=674 max=674 kq=0 off=0 dfok=0 dfold=0
[+10928ms] [PROF] t=11033 uic=707 uip=98476 uipn=9855 uil=10997 uiw=85308 uis=1139 uisn=0 adc=10557 adcm=3430 adcn=0 gl=0
[+10939ms] [PROF2] t=11033 defd=92186 defs=37170 netp=5002 netn=0 adcp=9 adcq=0 gl=0
[+12948ms] [PROF] t=13051 uic=889 uip=98476 uipn=5859 uil=10999 uiw=85308 uis=1139 uisn=0 adc=12575 adcm=3430 adcn=0 gl=0
[+12958ms] [PROF2] t=13051 defd=92186 defs=37170 netp=5002 netn=0 adcp=9 adcq=0 gl=0
[+14969ms] [PROF] t=15069 uic=1071 uip=98476 uipn=5855 uil=10997 uiw=85308 uis=1139 uisn=0 adc=14593 adcm=3430 adcn=0 gl=0
[+14969ms] [PROF2] t=15069 defd=92186 defs=37170 netp=5002 netn=0 adcp=9 adcq=0 gl=0
[+15467ms] [2026-11-07 21:29:33][SBLINK] rx=55 ok=55 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+15477ms] [2026-11-07 21:29:33][SBLINK] tx=45 done=44 drop=10 kerr=0 abor=0 fb=26 bad=0 us=513 max=674 kq=0 off=0 dfok=0 dfold=0
[+16986ms] [PROF] t=17094 uic=1252 uip=98476 uipn=1853 uil=11000 uiw=85308 uis=1139 uisn=0 adc=16618 adcm=3430 adcn=0 gl=0
[+16996ms] [PROF2] t=17094 defd=92186 defs=37170 netp=5002 netn=0 adcp=9 adcq=0 gl=0
[+19005ms] [PROF] t=19112 uic=1434 uip=98476 uipn=5855 uil=10998 uiw=85308 uis=1139 uisn=0 adc=18636 adcm=3430 adcn=0 gl=0
[+19015ms] [PROF2] t=19112 defd=92186 defs=37170 netp=5002 netn=0 adcp=9 adcq=0 gl=0
[+20371ms] [2026-11-07 21:29:38][ADC_TASK] frames=19998 idle=0 skip=2 seq=20006 frst_err=0 ring=19996 adc1_rc=0 adc1_err=0 adc1_seq=20005 adc1_gap=8 adc1_hw=0 tgap=3
[+20382ms] [2026-11-07 21:29:38][ADC_TASK] phasor(hb) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+20393ms] [2026-11-07 21:29:38][ADC_TASK] phasor(hb) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+20393ms] [2026-11-07 21:29:38][ADC_TASK] phasor(hb) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+20403ms] [2026-11-07 21:29:38][ADC_TASK] phasor(hb) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+20413ms] [2026-11-07 21:29:38][ADC_TASK] phasor(hb) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+20424ms] [2026-11-07 21:29:38][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[+20424ms] [2026-11-07 21:29:38][ADC_TASK] adc: UA=-21 UB=403 UC=618 UN=-20 IA=-19 IB=0 IC=769 IN=885 T=752
[+20435ms] [2026-11-07 21:29:38][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-2 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[+20445ms] [2026-11-07 21:29:38][ADC_TASK] meas: seq=100 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[+20445ms] [2026-11-07 21:29:38][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[+20466ms] [2026-11-07 21:29:38][SBLINK] rx=72 ok=72 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+20476ms] [2026-11-07 21:29:38][SBLINK] tx=62 done=62 drop=10 kerr=0 abor=0 fb=36 bad=0 us=692 max=692 kq=0 off=0 dfok=0 dfold=0
[+21043ms] [PROF] t=21144 uic=1607 uip=99653 uipn=10854 uil=10999 uiw=85308 uis=1139 uisn=0 adc=20666 adcm=3453 adcn=0 gl=0
[+21054ms] [PROF2] t=21144 defd=92186 defs=37170 netp=5002 netn=0 adcp=9 adcq=0 gl=0
[+23054ms] [PROF] t=23162 uic=1789 uip=99653 uipn=5854 uil=11000 uiw=85308 uis=1139 uisn=0 adc=22684 adcm=3453 adcn=0 gl=0
[+23065ms] [PROF2] t=23162 defd=92186 defs=37170 netp=5002 netn=0 adcp=9 adcq=0 gl=0
[+25075ms] [PROF] t=25180 uic=1971 uip=99653 uipn=5853 uil=10984 uiw=85308 uis=1139 uisn=0 adc=24702 adcm=3453 adcn=0 gl=0
[+25085ms] [PROF2] t=25180 defd=92186 defs=37170 netp=5002 netn=0 adcp=9 adcq=0 gl=0
[+25478ms] [2026-11-07 21:29:43][SBLINK] rx=90 ok=90 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+25489ms] [2026-11-07 21:29:43][SBLINK] tx=80 done=80 drop=10 kerr=0 abor=0 fb=46 bad=0 us=513 max=692 kq=0 off=0 dfok=0 dfold=0
[+27105ms] [PROF] t=27205 uic=2152 uip=99653 uipn=3850 uil=11003 uiw=85308 uis=1139 uisn=0 adc=26727 adcm=3453 adcn=0 gl=0
[+27105ms] [PROF2] t=27205 defd=92186 defs=37170 netp=5002 netn=0 adcp=9 adcq=0 gl=0
[+29124ms] [PROF] t=29223 uic=2334 uip=99653 uipn=5854 uil=10999 uiw=85308 uis=1139 uisn=0 adc=28745 adcm=3453 adcn=0 gl=0
[+29124ms] [PROF2] t=29223 defd=92186 defs=37170 netp=5002 netn=0 adcp=9 adcq=0 gl=0
@@ -0,0 +1,157 @@
[+0ms] [----/--/-- --:--:--][APP] boot: syslog init OK
[+10ms] [----/--/-- --:--:--][APP] fw build: Nov 7 2026 21:32:52 suite=NONE dstr=off
[+10ms] [----/--/-- --:--:--][APP] reset cause: software (NVIC_SystemReset) (CSR=0x14000000)
[+21ms] PREVRUN seg=2 seq=2101145323 t=196140
[+21ms] TICKRUN uw=196153 n=196153 duw=13
[+31ms] [----/--/-- --:--:--][RTC] sd2506_init: OK
[+31ms] [----/--/-- --:--:--][APP] SD2506 init: OK (ret=0)
[+42ms] [2026-11-07 21:33:15][CLK] sys_clock_init: RTC initial time 2026-11-07 21:33:15
[+52ms] [2026-11-07 21:33:15][CLK] sys_clock_init: wall clock base = unix 1794087195, base_tick=142
[+62ms] [2026-11-07 21:33:15][APP] RS485 init: OK (UART4, DE=PA15)
[+62ms] [2026-11-07 21:33:15][APP] ScreenLink init: OK (ret=0, USART1 700000 baud, BRR=0x0078)
[+83ms] [2026-11-07 21:33:15][NAND] Resetting NAND...
[+94ms] [2026-11-07 21:33:15][NAND] Reading NAND ID...
[+104ms] [2026-11-07 21:33:15][NAND] NAND ID: MID=0xC8, DID=0x52
[+104ms] [2026-11-07 21:33:15][NAND] Scanning bad blocks...
[+240ms] [2026-11-07 21:33:15][NAND] BBT scan: 0 bad blocks found
[+240ms] [2026-11-07 21:33:15][NAND] Enabling ECC...
[+250ms] [2026-11-07 21:33:15][NAND] Unlocking block protection...
[+250ms] [2026-11-07 21:33:15][NAND] Locating BBT pool...
[+261ms] [2026-11-07 21:33:15][NAND] Loading persisted BBT...
[+271ms] [2026-11-07 21:33:15][NAND] NAND init OK
[+271ms] [2026-11-07 21:33:15][APP] NAND init: OK
[+271ms] [2026-11-07 21:33:15][ADC] Init OK
[+271ms] [2026-11-07 21:33:15][APP] ADC init: OK
[+281ms] [2026-11-07 21:33:15][APP] ADC input layer init: OK
[+281ms] [2026-11-07 21:33:15][APP] phasor layer init: OK (inst=5)
[+292ms] [2026-11-07 21:33:15][APP] freq layer init: OK
[+292ms] [2026-11-07 21:33:15][CFG] register: section 'adc_cal' (9 keys)
[+302ms] [2026-11-07 21:33:15][CFG] register: section 'adc_cal_ofs' (8 keys)
[+302ms] [2026-11-07 21:33:15][APP] adc cal init: OK (k_q16 tpafe=10000000 stm32=52800000)
[+313ms] [2026-11-07 21:33:15][CFG] register: section 'run_par' (9 keys)
[+324ms] [2026-11-07 21:33:15][APP] run par init: OK (db9 k/b via adc_cal, evt=1<<8)
[+324ms] [2026-11-07 21:33:15][CFG] register: section 'comm' (2 keys)
[+334ms] [2026-11-07 21:33:15][APP] comm init: OK (ca=1 port=2404)
[+334ms] [2026-11-07 21:33:15][APP] protection init: OK (set=40 elm=9)
[+345ms] [2026-11-07 21:33:15][APP] SD2506 ID: 2512153425482405
[+355ms] [2026-11-07 21:33:15][APP] SD2506 time: 2026-11-07 21:33:16 (week 6)
[+355ms] [2026-11-07 21:33:15][APP] SD2506 temp: 23 C
[+365ms] [2026-11-07 21:33:15][APP] SD2506 battery: 3.12 V
[+365ms] [2026-11-07 21:33:15][APP] App init OK
[+376ms] [2026-11-07 21:33:15][NAND_FTL] Initializing NAND FTL...
[+397ms] [2026-11-07 21:33:15][PROT] uncalibrated -> protection blocked (UA/UN/IA VALID not all set)
[+480ms] [2026-11-07 21:33:15] [FS] FATFS mounted
[+542ms] [2026-11-07 21:33:15][SYSLOG] runlog boot entry: reboot
[+542ms] [2026-11-07 21:33:15][CFG] register: section 'network' (4 keys)
[+553ms] [2026-11-07 21:33:15][CFG] register: section 'ftp' (3 keys)
[+563ms] [2026-11-07 21:33:15][CFG] register: section 'sntp' (4 keys)
[+574ms] [2026-11-07 21:33:15][CFG] load: OK (1064B, heap free 16552B)
[+574ms] [2026-11-07 21:33:15][NET_CFG] load: OK ip=192.168.31.100
[+584ms] [2026-11-07 21:33:15] [CFG] prot set loaded (/prot_set.bin)
[+605ms] [2026-11-07 21:33:15][NAND_FTL] Map resumed: 46942/93232 sectors used
[+615ms] [2026-11-07 21:33:15][NAND_FTL] Map head=36288 tail=91795 epoch=8
[+615ms] [2026-11-07 21:33:15][NAND_FTL] NAND FTL ready (capacity: 93232 pages = 182 MB)
[+625ms] [2026-11-07 21:33:15][ADC_TASK] first: UA=-19 UB=414 UC=518 UN=-17 IA=-17 IB=0 IC=764 IN=898 T=718
[+636ms] [2026-11-07 21:33:15][ADC_TASK] phasor(first) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+636ms] [2026-11-07 21:33:15][ADC_TASK] phasor(first) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+646ms] [2026-11-07 21:33:15][ADC_TASK] phasor(first) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+657ms] [2026-11-07 21:33:15][ADC_TASK] phasor(first) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+667ms] [2026-11-07 21:33:15][ADC_TASK] phasor(first) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+667ms] [2026-11-07 21:33:15][ADC_TASK] freq(first): f=0 valid=0 (x0.01)
[+677ms] [2026-11-07 21:33:15][NET_TASK] === Network Init ===
[+677ms] [2026-11-07 21:33:15][PROT] protect task start: cycle=20ms elm=9
[+688ms] [2026-11-07 21:33:15][NET] ch395f ver=0x4A fun_para=0x08
[+688ms] [2026-11-07 21:33:15][NET_TASK] net init: OK
[+688ms] [2026-11-07 21:33:15][NET_TASK] MAC: 3C:AB:72:53:2B:12
[+698ms] MISS start snap=0x000001E7 req=0x000001F7 t=799
[+698ms] [2026-11-07 21:33:15][WD] [WD] armed: timeout ~2498ms (worst ~1701ms), miss_tol=800ms
[+709ms] [2026-11-07 21:33:15][NET_TASK] IP_INF: IP=192.168.31.100 GW=192.168.31.1 MASK=255.255.255.0
[+761ms] [2026-11-07 21:33:15][UI_TASK] UI task: started, wait net ready
[+2654ms] [2026-11-07 21:33:17][NET_TASK] PHY: 100M FULL
[+2675ms] [2026-11-07 21:33:17][NET_TASK] netTask: started (single-socket mode)
[+2706ms] [2026-11-07 21:33:17][ERR][I104] i104: bind port 2404 FAIL, retry in loop
[+2738ms] [2026-11-07 21:33:17] [FTP] using factory default password
[+2738ms] MISS start snap=0x000001E7 req=0x000001F7 t=2845
[+2748ms] [PROF] t=2849 uic=0 uip=0 uipn=0 uil=0 uiw=0 uis=0 uisn=0 adc=2376 adcm=2000 adcn=0 gl=0
[+2758ms] [PROF2] t=2849 defd=92190 defs=37462 netp=1004 netn=393 adcp=8 adcq=0 gl=0
[+2758ms] [2026-11-07 21:33:17] [FTP] waiting for connection...
[+2769ms] [2026-11-07 21:33:17][UI_TASK] UI task: net ready, init port
[+2779ms] [2026-11-07 21:33:17][UI_TASK] UI task: ui_port_init enter
[+2779ms] [2026-11-07 21:33:17][UI_PORT] theme: mono dark_bg=true applied
[+2790ms] [2026-11-07 21:33:17][UI_TASK] UI port init: OK
[+2790ms] [2026-11-07 21:33:17][UI_TASK] UI task: ui_menu_init enter
[+2801ms] [2026-11-07 21:33:17][UI_MENU] menu build start: total=15136 free=12692 big=12692
[+2811ms] [2026-11-07 21:33:17][UI_MENU_VIEW] view init: root frame w=66 h=107
[+2821ms] [2026-11-07 21:33:17][UI_MENU] menu build done: total=15020 free=11828 big=11816 used=3192
[+2821ms] [2026-11-07 21:33:17][UI_TASK] UI menu init: OK
[+2832ms] [2026-11-07 21:33:17][UI_STANDBY] standby: ready (idle=60000ms)
[+2832ms] [2026-11-07 21:33:17][UI_TASK] UI standby: ready (idle=60s)
[+2884ms] [2026-11-07 21:33:17][UI_TASK] UI net sink: started (port 7003)
[+2905ms] [2026-11-07 21:33:17][SBLINK] first frame: size=6 cmd=1 key=0
[+4909ms] [PROF] t=5010 uic=181 uip=29627 uipn=5850 uil=11004 uiw=19639 uis=1138 uisn=0 adc=4536 adcm=2000 adcn=0 gl=0
[+4920ms] [PROF2] t=5010 defd=92190 defs=37462 netp=1983 netn=0 adcp=8 adcq=0 gl=0
[+5375ms] [2026-11-07 21:33:20] [STACK] default peak_used=2176/5120 free_min=2944 (57%)
[+5385ms] [2026-11-07 21:33:20] [STACK] net peak_used=1116/3840 free_min=2724 (70%)
[+5385ms] [2026-11-07 21:33:20] [STACK] ftp peak_used=740/4096 free_min=3356 (81%)
[+5396ms] [2026-11-07 21:33:20] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[+5406ms] [2026-11-07 21:33:20] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[+5416ms] [2026-11-07 21:33:20] [STACK] adc peak_used=1024/2560 free_min=1536 (60%)
[+5416ms] [2026-11-07 21:33:20] [STACK] iec104 peak_used=540/2560 free_min=2020 (78%)
[+5427ms] [2026-11-07 21:33:20] [STACK] protect peak_used=492/2048 free_min=1556 (75%)
[+5438ms] [2026-11-07 21:33:20] [STACK] heap free=15624 min_ever=8464
[+5438ms] [2026-11-07 21:33:20][SBLINK] rx=19 ok=19 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+5448ms] [2026-11-07 21:33:20][SBLINK] tx=9 done=9 drop=10 kerr=0 abor=0 fb=6 bad=0 us=676 max=676 kq=0 off=0 dfok=0 dfold=0
[+6915ms] [PROF] t=7011 uic=354 uip=72696 uipn=6850 uil=11004 uiw=21657 uis=1138 uisn=0 adc=6537 adcm=2000 adcn=0 gl=0
[+6915ms] [PROF2] t=7011 defd=92190 defs=37462 netp=1984 netn=0 adcp=8 adcq=0 gl=0
[+8931ms] [PROF] t=9028 uic=536 uip=72696 uipn=6855 uil=10997 uiw=21657 uis=1139 uisn=0 adc=8554 adcm=2000 adcn=0 gl=0
[+8941ms] [PROF2] t=9028 defd=92190 defs=37462 netp=1984 netn=0 adcp=8 adcq=0 gl=0
[+10372ms] [2026-11-07 21:33:25][ADC_TASK] frames=10000 idle=0 skip=1 seq=10006 frst_err=0 ring=9999 adc1_rc=0 adc1_err=0 adc1_seq=10005 adc1_gap=5 adc1_hw=0 tgap=1
[+10392ms] [2026-11-07 21:33:25][ADC_TASK] phasor(hb) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+10392ms] [2026-11-07 21:33:25][ADC_TASK] phasor(hb) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+10403ms] [2026-11-07 21:33:25][ADC_TASK] phasor(hb) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+10413ms] [2026-11-07 21:33:25][ADC_TASK] phasor(hb) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+10413ms] [2026-11-07 21:33:25][ADC_TASK] phasor(hb) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+10424ms] [2026-11-07 21:33:25][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[+10434ms] [2026-11-07 21:33:25][ADC_TASK] adc: UA=-21 UB=404 UC=618 UN=-21 IA=-22 IB=0 IC=757 IN=890 T=732
[+10434ms] [2026-11-07 21:33:25][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[+10445ms] [2026-11-07 21:33:25][ADC_TASK] meas: seq=50 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[+10455ms] [2026-11-07 21:33:25][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[+10465ms] [2026-11-07 21:33:25][SBLINK] rx=37 ok=37 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+10476ms] [2026-11-07 21:33:25][SBLINK] tx=27 done=27 drop=10 kerr=0 abor=0 fb=16 bad=0 us=674 max=676 kq=0 off=0 dfok=0 dfold=0
[+10931ms] [PROF] t=11033 uic=707 uip=94476 uipn=9855 uil=10982 uiw=22171 uis=1139 uisn=0 adc=10557 adcm=3434 adcn=0 gl=0
[+10941ms] [PROF2] t=11033 defd=92190 defs=37462 netp=4024 netn=0 adcp=8 adcq=0 gl=0
[+12949ms] [PROF] t=13051 uic=889 uip=94476 uipn=5854 uil=10999 uiw=22171 uis=1155 uisn=0 adc=12575 adcm=3434 adcn=0 gl=0
[+12959ms] [PROF2] t=13051 defd=92190 defs=37462 netp=4024 netn=0 adcp=8 adcq=0 gl=0
[+14973ms] [PROF] t=15069 uic=1071 uip=94476 uipn=5855 uil=10981 uiw=22171 uis=1155 uisn=0 adc=14593 adcm=3434 adcn=0 gl=0
[+14983ms] [PROF2] t=15069 defd=92190 defs=37462 netp=4024 netn=0 adcp=8 adcq=0 gl=0
[+15472ms] [2026-11-07 21:33:30][SBLINK] rx=55 ok=55 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+15482ms] [2026-11-07 21:33:30][SBLINK] tx=45 done=45 drop=10 kerr=0 abor=0 fb=26 bad=0 us=513 max=676 kq=0 off=0 dfok=0 dfold=0
[+16994ms] [PROF] t=17092 uic=1252 uip=94476 uipn=1862 uil=11000 uiw=22171 uis=1155 uisn=0 adc=16616 adcm=3434 adcn=0 gl=0
[+17005ms] [PROF2] t=17092 defd=92190 defs=37462 netp=4024 netn=0 adcp=8 adcq=0 gl=0
[+19016ms] [PROF] t=19110 uic=1434 uip=94476 uipn=5851 uil=10919 uiw=22171 uis=1155 uisn=0 adc=18634 adcm=3434 adcn=0 gl=0
[+19016ms] [PROF2] t=19110 defd=92190 defs=37462 netp=4024 netn=0 adcp=8 adcq=0 gl=0
[+20371ms] [2026-11-07 21:33:35][ADC_TASK] frames=19998 idle=0 skip=2 seq=20006 frst_err=0 ring=19996 adc1_rc=0 adc1_err=0 adc1_seq=20005 adc1_gap=8 adc1_hw=0 tgap=3
[+20392ms] [2026-11-07 21:33:35][ADC_TASK] phasor(hb) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+20392ms] [2026-11-07 21:33:35][ADC_TASK] phasor(hb) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+20403ms] [2026-11-07 21:33:35][ADC_TASK] phasor(hb) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+20413ms] [2026-11-07 21:33:35][ADC_TASK] phasor(hb) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+20413ms] [2026-11-07 21:33:35][ADC_TASK] phasor(hb) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+20424ms] [2026-11-07 21:33:35][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[+20435ms] [2026-11-07 21:33:35][ADC_TASK] adc: UA=-22 UB=403 UC=619 UN=-22 IA=-22 IB=0 IC=761 IN=894 T=752
[+20435ms] [2026-11-07 21:33:35][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[+20445ms] [2026-11-07 21:33:35][ADC_TASK] meas: seq=100 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[+20455ms] [2026-11-07 21:33:35][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[+20476ms] [2026-11-07 21:33:35][SBLINK] rx=73 ok=73 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+20487ms] [2026-11-07 21:33:35][SBLINK] tx=63 done=63 drop=10 kerr=0 abor=0 fb=36 bad=0 us=676 max=676 kq=0 off=0 dfok=0 dfold=0
[+21046ms] [PROF] t=21144 uic=1608 uip=94476 uipn=10854 uil=11000 uiw=22171 uis=1155 uisn=0 adc=20666 adcm=3457 adcn=0 gl=0
[+21056ms] [PROF2] t=21144 defd=92190 defs=37462 netp=4984 netn=0 adcp=8 adcq=0 gl=0
[+23067ms] [PROF] t=23162 uic=1790 uip=94476 uipn=5854 uil=11000 uiw=22171 uis=1155 uisn=0 adc=22684 adcm=3457 adcn=0 gl=0
[+23067ms] [PROF2] t=23162 defd=92190 defs=37462 netp=4984 netn=0 adcp=8 adcq=0 gl=0
[+25081ms] [PROF] t=25180 uic=1972 uip=94476 uipn=5853 uil=11000 uiw=22171 uis=1155 uisn=0 adc=24702 adcm=3457 adcn=0 gl=0
[+25091ms] [PROF2] t=25180 defd=92190 defs=37462 netp=4984 netn=0 adcp=8 adcq=0 gl=0
[+25485ms] [2026-11-07 21:33:40][SBLINK] rx=91 ok=91 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+25495ms] [2026-11-07 21:33:40][SBLINK] tx=81 done=81 drop=10 kerr=0 abor=0 fb=46 bad=0 us=513 max=676 kq=0 off=0 dfok=0 dfold=0
[+27110ms] [PROF] t=27205 uic=2153 uip=94476 uipn=3777 uil=11082 uiw=22171 uis=1155 uisn=0 adc=26727 adcm=3457 adcn=0 gl=0
[+27110ms] [PROF2] t=27205 defd=92190 defs=37462 netp=4984 netn=0 adcp=8 adcq=0 gl=0
[+29128ms] [PROF] t=29223 uic=2335 uip=94476 uipn=5854 uil=10999 uiw=22171 uis=1155 uisn=0 adc=28745 adcm=3457 adcn=0 gl=0
[+29128ms] [PROF2] t=29223 defd=92190 defs=37462 netp=4984 netn=0 adcp=8 adcq=0 gl=0
@@ -0,0 +1,28 @@
== build_log_verify.txt ==
Program Size line: Program Size: Code=255292 RO-data=30992 RW-data=2080 ZI-data=150104
linking...
Program Size: Code=255292 RO-data=30992 RW-data=2080 ZI-data=150104
FromELF: creating hex file...
".\STM32F407-Demo\STM32F407-Demo.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:16
== build_log_fix.txt ==
Program Size line: Program Size: Code=255284 RO-data=30992 RW-data=2080 ZI-data=150104
linking...
Program Size: Code=255284 RO-data=30992 RW-data=2080 ZI-data=150104
FromELF: creating hex file...
".\STM32F407-Demo\STM32F407-Demo.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:16
== build_log_final.txt ==
Program Size line: Program Size: Code=254820 RO-data=30896 RW-data=2072 ZI-data=150104
linking...
Program Size: Code=254820 RO-data=30896 RW-data=2072 ZI-data=150104
FromELF: creating hex file...
".\STM32F407-Demo\STM32F407-Demo.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:15
== build_log_final2.txt ==
Program Size line: Program Size: Code=254820 RO-data=30896 RW-data=2072 ZI-data=150104
linking...
Program Size: Code=254820 RO-data=30896 RW-data=2072 ZI-data=150104
FromELF: creating hex file...
".\STM32F407-Demo\STM32F407-Demo.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:15
@@ -0,0 +1,123 @@
{
"mode": "phase1",
"t_start": "2026-11-07T21:22:16.703+08:00",
"before": {
"ts": "2026-11-07T21:22:16.789+08:00",
"list": "226 Closing data connection.",
"root": "226 Closing data connection."
},
"probes_mid_occupation": {
"ui": {
"ok": true,
"status": {
"ver": 1,
"kind": "MENU",
"depth": 0,
"path": [
0
],
"sel": [
0
],
"page": null
},
"ts": "2026-11-07T21:22:41.356+08:00"
},
"i104": {
"ok": true,
"resp_hex": "68040b000000",
"ts": "2026-11-07T21:22:42.486+08:00"
}
},
"rounds": [
{
"start": "2026-11-07T21:22:17.852+08:00",
"start_epoch": 1794057737.8524384,
"end": "2026-11-07T21:22:25.113+08:00",
"dur_ms": 7261,
"gap_after_s": 0.15
},
{
"start": "2026-11-07T21:22:25.862+08:00",
"start_epoch": 1794057745.8617094,
"end": "2026-11-07T21:22:33.129+08:00",
"dur_ms": 7268,
"gap_after_s": 0.15
},
{
"start": "2026-11-07T21:22:33.870+08:00",
"start_epoch": 1794057753.8708818,
"end": "2026-11-07T21:22:41.116+08:00",
"dur_ms": 7246,
"gap_after_s": 0.15
},
{
"start": "2026-11-07T21:22:42.566+08:00",
"start_epoch": 1794057762.566658,
"end": "2026-11-07T21:22:49.991+08:00",
"dur_ms": 7425,
"gap_after_s": 0.15
},
{
"start": "2026-11-07T21:22:50.735+08:00",
"start_epoch": 1794057770.735756,
"end": "2026-11-07T21:22:57.922+08:00",
"dur_ms": 7187,
"gap_after_s": 0.15
},
{
"start": "2026-11-07T21:22:58.661+08:00",
"start_epoch": 1794057778.6610878,
"end": "2026-11-07T21:23:05.916+08:00",
"dur_ms": 7255,
"gap_after_s": 0.15
},
{
"start": "2026-11-07T21:23:06.653+08:00",
"start_epoch": 1794057786.653875,
"end": "2026-11-07T21:23:13.797+08:00",
"dur_ms": 7144,
"gap_after_s": 0.15
},
{
"start": "2026-11-07T21:23:14.538+08:00",
"start_epoch": 1794057794.5386658,
"end": "2026-11-07T21:23:21.772+08:00",
"dur_ms": 7234,
"gap_after_s": 0.15
},
{
"start": "2026-11-07T21:23:22.512+08:00",
"start_epoch": 1794057802.5123067,
"end": "2026-11-07T21:23:29.767+08:00",
"dur_ms": 7255,
"gap_after_s": 0.15
}
],
"occupation_total_s": 72.61,
"after": {
"ts": "2026-11-07T21:23:55.964+08:00",
"list": "226 Closing data connection.",
"root": "226 Closing data connection."
},
"events": {
"err_line_count": 0,
"err_lines": [],
"other_err": [],
"autocap_on": [],
"hb_first": "[RX] 2026-11-07T21:22:25.266+08:00 [2026-11-07 21:22:24][ADC_TASK] wave: seg=13 armed=0 src=T pts=320 err=1 ovf=1 drop=38616",
"hb_last": "[RX] 2026-11-07T21:23:55.263+08:00 [2026-11-07 21:23:54][ADC_TASK] wave: seg=27 armed=0 src=T pts=320 err=15 ovf=18 drop=293616",
"hb_all": [
"[RX] 2026-11-07T21:22:25.266+08:00 [2026-11-07 21:22:24][ADC_TASK] wave: seg=13 armed=0 src=T pts=320 err=1 ovf=1 drop=38616",
"[RX] 2026-11-07T21:22:35.275+08:00 [2026-11-07 21:22:34][ADC_TASK] wave: seg=14 armed=0 src=T pts=320 err=2 ovf=4 drop=65472",
"[RX] 2026-11-07T21:22:45.268+08:00 [2026-11-07 21:22:44][ADC_TASK] wave: seg=15 armed=1 src=T pts=320 err=3 ovf=6 drop=105368",
"[RX] 2026-11-07T21:22:55.271+08:00 [2026-11-07 21:22:54][ADC_TASK] wave: seg=15 armed=0 src=T pts=320 err=6 ovf=9 drop=141040",
"[RX] 2026-11-07T21:23:05.272+08:00 [2026-11-07 21:23:04][ADC_TASK] wave: seg=15 armed=1 src=T pts=320 err=8 ovf=11 drop=185368",
"[RX] 2026-11-07T21:23:15.273+08:00 [2026-11-07 21:23:14][ADC_TASK] wave: seg=15 armed=0 src=T pts=320 err=11 ovf=14 drop=221040",
"[RX] 2026-11-07T21:23:25.276+08:00 [2026-11-07 21:23:24][ADC_TASK] wave: seg=15 armed=1 src=T pts=320 err=13 ovf=16 drop=265368",
"[RX] 2026-11-07T21:23:35.270+08:00 [2026-11-07 21:23:34][ADC_TASK] wave: seg=17 armed=0 src=T pts=320 err=15 ovf=18 drop=286464",
"[RX] 2026-11-07T21:23:45.268+08:00 [2026-11-07 21:23:44][ADC_TASK] wave: seg=22 armed=0 src=T pts=320 err=15 ovf=18 drop=290040",
"[RX] 2026-11-07T21:23:55.263+08:00 [2026-11-07 21:23:54][ADC_TASK] wave: seg=27 armed=0 src=T pts=320 err=15 ovf=18 drop=293616"
]
}
}
@@ -0,0 +1,40 @@
# exec-issue-84 产品构建最终窗口(daemon 持久日志 gen=3,21:33:07 起,噪声行过滤):
# 含 boot-test #2 捕获(bind FAIL L72 行)、net 层 reconcile/relisten、104 探针窗口。
[RX] 2026-11-07T21:33:16.263+08:00 [----/--/-- --:--:--][APP] reset cause: software (NVIC_SystemReset) (CSR=0x14000000)
[RX] 2026-11-07T21:33:16.618+08:00 [2026-11-07 21:33:15][APP] App init OK
[RX] 2026-11-07T21:33:16.941+08:00 [2026-11-07 21:33:15][NET_TASK] net init: OK
[RX] 2026-11-07T21:33:18.959+08:00 [2026-11-07 21:33:17][ERR][I104] i104: bind port 2404 FAIL, retry in loop
[RX] 2026-11-07T21:33:26.708+08:00 [2026-11-07 21:33:25][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:33:36.708+08:00 [2026-11-07 21:33:35][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:33:48.639+08:00 [----/--/-- --:--:--][APP] reset cause: software (NVIC_SystemReset) (CSR=0x14000000)
[RX] 2026-11-07T21:33:48.994+08:00 [2026-11-07 21:33:48][APP] App init OK
[RX] 2026-11-07T21:33:49.348+08:00 [2026-11-07 21:33:48][NET_TASK] net init: OK
[RX] 2026-11-07T21:33:50.303+08:00 [2026-11-07 21:33:49][I104] i104: listening on 2404
[RX] 2026-11-07T21:33:59.074+08:00 [2026-11-07 21:33:58][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:34:09.076+08:00 [2026-11-07 21:34:08][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:34:19.076+08:00 [2026-11-07 21:34:18][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:34:29.077+08:00 [2026-11-07 21:34:28][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:34:39.073+08:00 [2026-11-07 21:34:38][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:34:49.074+08:00 [2026-11-07 21:34:48][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:34:59.080+08:00 [2026-11-07 21:34:58][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:35:09.079+08:00 [2026-11-07 21:35:08][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:35:19.079+08:00 [2026-11-07 21:35:18][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:35:29.078+08:00 [2026-11-07 21:35:28][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:35:39.075+08:00 [2026-11-07 21:35:38][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:35:49.075+08:00 [2026-11-07 21:35:48][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:35:59.079+08:00 [2026-11-07 21:35:58][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:36:09.071+08:00 [2026-11-07 21:36:08][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:36:19.072+08:00 [2026-11-07 21:36:18][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:36:29.075+08:00 [2026-11-07 21:36:28][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:36:39.098+08:00 [2026-11-07 21:36:38][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:36:49.080+08:00 [2026-11-07 21:36:48][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:36:59.078+08:00 [2026-11-07 21:36:58][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:37:08.597+08:00 [2026-11-07 21:37:07][I104] i104: accepted fd=0
[RX] 2026-11-07T21:37:09.078+08:00 [2026-11-07 21:37:08][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:37:09.719+08:00 [2026-11-07 21:37:09] sock0 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:37:09.729+08:00 [2026-11-07 21:37:09][NET] sock0 reconcile: chip not listening (0x00/0xFF, was state=0) -> relisten
[RX] 2026-11-07T21:37:09.885+08:00 [2026-11-07 21:37:09] sock0 auto-relisten ok (eof)
[RX] 2026-11-07T21:37:19.074+08:00 [2026-11-07 21:37:18][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:37:29.070+08:00 [2026-11-07 21:37:28][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:37:39.078+08:00 [2026-11-07 21:37:38][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T21:37:49.078+08:00 [2026-11-07 21:37:48][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
@@ -0,0 +1,30 @@
# exec-issue-84 sweep5 窗口取证摘录(F1 复位异常 + F3 pack_next 留痕 + 静默自弃心跳链)
#
# 【来源声明】本文件非原始 serial.log 切片:会话用 daemon 持久日志于 21:33:07 被
# run_boot_test 的 open+clear 步骤清空(log cleared (gen=3)),20:27–20:36 窗口的
# 原始行未能赶在清空前整段归档。以下行为当时(20:28–20:30)从 live 日志逐字抓取
# 进会话记录的关键行,按时间序复原;行内 [RX] 主机时戳与板载时戳均为原始值,
# 个别噪声行(xx 占位)为复原时精度缺失标注,事实与时间戳未经改写。
## F1:单次未复现的板载软件复位(20:28:57,无任何打印前导)
# 复位前最后一条业务线(正常抓段 WARN):
[RX] 2026-11-07T20:28:56.5xx+08:00 [2026-11-07 20:28:56] [WAVE][WARN] seg held 59 ms (idx=37)
# 约 1.1 s 后,无 [ERR]、无 ASSERT/ERROR/堆栈溢出打印,直接出现冷启动横幅:
[RX] 2026-11-07T20:28:57.xx+08:00 reset cause: software (NVIC_SystemReset) (CSR=0x14000000)
# 复位时刻无 RETR 在飞(上一条 DOWNLOAD 落账 20:28:09,下一条 20:29:31 起)。
# 全仓四个 NVIC_SystemReset 调用点(Error_Handler / 栈溢出钩子 / ASSERT / 故障处理器)
# 均先打印后复位,本次一条都没落进日志——调用点未定。此后 6+ 个 autocap 窗、
# 含 72.6 s 连续占卷在内未再复现,按单次未复现异常记录,不下结论(设计说明 §10 F1)。
## F3:落盘中途弃段留痕 pack_next(20:30:31,与 ring abandoned 同族、不同分支)
# 该刻处于 7.1 s FILLER 占卷的锁已交还、writer 抓段慢尾期:
[RX] 2026-11-07T20:30:3x+08:00 [2026-11-07 20:30:31][ERR] [WAVE] seg drop: pack_next (idx=28 written=1920)
# written=1920 B 为半程停笔(满段 5250 B):落盘途中复检判死→删文件→同号不推进,
# 与 §5.2 第四条同族竞态的「落盘中途」分支,板级首见(设计说明 §10 F3)。
## 静默自弃类伴行证据(同类留痕唯一性对照)
# 20:2x 窗口内 err 计数 0→1→2 两次跳变,各自对应一次被占卷覆盖封存的静默自弃:
[RX] 2026-11-07T20:28:4x+08:00 wave: seg=… src=T err=1
[RX] 2026-11-07T20:29:4x+08:00 wave: seg=… src=T err=2
# 全程无 [ERR][WAVE] 伴随(除 20:30:31 的 pack_next)——「err+1 静默、留痕只此一条」
# 的静默侧实证,与 21:15:35 sweep7 命中(留痕侧)互补,两形态齐。
@@ -0,0 +1,469 @@
[RX] 2026-11-07T21:13:00.716+08:00 [2026-11-07 21:12:59] [WAVE][WARN] seg held 60 ms (idx=97)
[RX] 2026-11-07T21:13:02.715+08:00 [2026-11-07 21:13:01] [WAVE][WARN] seg held 62 ms (idx=98)
[RX] 2026-11-07T21:13:04.708+08:00 [2026-11-07 21:13:03] [WAVE][WARN] seg held 61 ms (idx=99)
[RX] 2026-11-07T21:13:06.211+08:00 [2026-11-07 21:13:05][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:13:06.211+08:00 [2026-11-07 21:13:05][ADC_TASK] adc: UA=-21 UB=404 UC=609 UN=-20 IA=-20 IB=0 IC=764 IN=899 T=752
[RX] 2026-11-07T21:13:06.221+08:00 [2026-11-07 21:13:05][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:13:06.231+08:00 [2026-11-07 21:13:05][ADC_TASK] meas: seq=1100 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:13:06.242+08:00 [2026-11-07 21:13:05][ADC_TASK] wave: seg=99 armed=0 src=T pts=320 err=1 ovf=10 drop=240680
[RX] 2026-11-07T21:13:06.707+08:00 [2026-11-07 21:13:05] [WAVE][WARN] seg held 59 ms (idx=0)
[RX] 2026-11-07T21:13:08.701+08:00 [2026-11-07 21:13:07] [WAVE][WARN] seg held 64 ms (idx=1)
[RX] 2026-11-07T21:13:10.694+08:00 [2026-11-07 21:13:09] [WAVE][WARN] seg held 67 ms (idx=2)
[RX] 2026-11-07T21:13:12.682+08:00 [2026-11-07 21:13:11] [WAVE][WARN] seg held 62 ms (idx=3)
[RX] 2026-11-07T21:13:14.723+08:00 [2026-11-07 21:13:13] [WAVE][WARN] seg held 63 ms (idx=4)
[RX] 2026-11-07T21:13:16.212+08:00 [2026-11-07 21:13:15][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:13:16.212+08:00 [2026-11-07 21:13:15][ADC_TASK] adc: UA=-21 UB=404 UC=608 UN=-20 IA=-21 IB=0 IC=763 IN=900 T=750
[RX] 2026-11-07T21:13:16.222+08:00 [2026-11-07 21:13:15][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:13:16.233+08:00 [2026-11-07 21:13:15][ADC_TASK] meas: seq=1150 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:13:16.233+08:00 [2026-11-07 21:13:15][ADC_TASK] wave: seg=104 armed=0 src=T pts=320 err=1 ovf=10 drop=244008
[RX] 2026-11-07T21:13:16.709+08:00 [2026-11-07 21:13:15] [WAVE][WARN] seg held 65 ms (idx=5)
[RX] 2026-11-07T21:13:18.721+08:00 [2026-11-07 21:13:17] [WAVE][WARN] seg held 63 ms (idx=6)
[RX] 2026-11-07T21:13:20.698+08:00 [2026-11-07 21:13:19] [WAVE][WARN] seg held 60 ms (idx=7)
[RX] 2026-11-07T21:13:22.702+08:00 [2026-11-07 21:13:21] [WAVE][WARN] seg held 63 ms (idx=8)
[RX] 2026-11-07T21:13:24.687+08:00 [2026-11-07 21:13:23] [WAVE][WARN] seg held 60 ms (idx=9)
[RX] 2026-11-07T21:13:26.204+08:00 [2026-11-07 21:13:25][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:13:26.215+08:00 [2026-11-07 21:13:25][ADC_TASK] adc: UA=-20 UB=405 UC=610 UN=-21 IA=-20 IB=0 IC=763 IN=898 T=751
[RX] 2026-11-07T21:13:26.225+08:00 [2026-11-07 21:13:25][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:13:26.225+08:00 [2026-11-07 21:13:25][ADC_TASK] meas: seq=1200 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:13:26.235+08:00 [2026-11-07 21:13:25][ADC_TASK] wave: seg=109 armed=0 src=T pts=320 err=1 ovf=10 drop=247464
[RX] 2026-11-07T21:13:26.711+08:00 [2026-11-07 21:13:25] [WAVE][WARN] seg held 65 ms (idx=10)
[RX] 2026-11-07T21:13:28.724+08:00 [2026-11-07 21:13:27] [WAVE][WARN] seg held 59 ms (idx=11)
[RX] 2026-11-07T21:13:30.711+08:00 [2026-11-07 21:13:29] [WAVE][WARN] seg held 60 ms (idx=12)
[RX] 2026-11-07T21:13:32.683+08:00 [2026-11-07 21:13:31] [WAVE][WARN] seg held 61 ms (idx=13)
[RX] 2026-11-07T21:13:34.723+08:00 [2026-11-07 21:13:33] [WAVE][WARN] seg held 63 ms (idx=14)
[RX] 2026-11-07T21:13:36.205+08:00 [2026-11-07 21:13:35][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:13:36.215+08:00 [2026-11-07 21:13:35][ADC_TASK] adc: UA=-21 UB=403 UC=609 UN=-20 IA=-20 IB=0 IC=763 IN=897 T=750
[RX] 2026-11-07T21:13:36.215+08:00 [2026-11-07 21:13:35][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:13:36.226+08:00 [2026-11-07 21:13:35][ADC_TASK] meas: seq=1250 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:13:36.236+08:00 [2026-11-07 21:13:35][ADC_TASK] wave: seg=114 armed=0 src=T pts=320 err=1 ovf=10 drop=251080
[RX] 2026-11-07T21:13:36.724+08:00 [2026-11-07 21:13:35] [WAVE][WARN] seg held 60 ms (idx=15)
[RX] 2026-11-07T21:13:38.682+08:00 [2026-11-07 21:13:37] [WAVE][WARN] seg held 62 ms (idx=16)
[RX] 2026-11-07T21:13:40.719+08:00 [2026-11-07 21:13:39] [WAVE][WARN] seg held 60 ms (idx=17)
[RX] 2026-11-07T21:13:42.704+08:00 [2026-11-07 21:13:41] [WAVE][WARN] seg held 64 ms (idx=18)
[RX] 2026-11-07T21:13:44.320+08:00 [2026-11-07 21:13:43][SNTP] off=547ms within deadband, no step
[RX] 2026-11-07T21:13:44.548+08:00 [2026-11-07 21:13:43] [STACK] default peak_used=2188/5120 free_min=2932 (57%)
[RX] 2026-11-07T21:13:44.559+08:00 [2026-11-07 21:13:43] [STACK] net peak_used=1188/3840 free_min=2652 (69%)
[RX] 2026-11-07T21:13:44.559+08:00 [2026-11-07 21:13:43] [STACK] ftp peak_used=2300/4096 free_min=1796 (43%)
[RX] 2026-11-07T21:13:44.569+08:00 [2026-11-07 21:13:43] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[RX] 2026-11-07T21:13:44.580+08:00 [2026-11-07 21:13:43] [STACK] timesync peak_used=952/2560 free_min=1608 (62%)
[RX] 2026-11-07T21:13:44.590+08:00 [2026-11-07 21:13:43] [STACK] adc peak_used=1000/2560 free_min=1560 (60%)
[RX] 2026-11-07T21:13:44.590+08:00 [2026-11-07 21:13:43] [STACK] iec104 peak_used=544/2560 free_min=2016 (78%)
[RX] 2026-11-07T21:13:44.600+08:00 [2026-11-07 21:13:43] [STACK] protect peak_used=828/2048 free_min=1220 (59%)
[RX] 2026-11-07T21:13:44.600+08:00 [2026-11-07 21:13:43] [STACK] heap free=15624 min_ever=8464
[RX] 2026-11-07T21:13:44.725+08:00 [2026-11-07 21:13:43] [WAVE][WARN] seg held 59 ms (idx=19)
[RX] 2026-11-07T21:13:46.207+08:00 [2026-11-07 21:13:45][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:13:46.207+08:00 [2026-11-07 21:13:45][ADC_TASK] adc: UA=-21 UB=404 UC=609 UN=-20 IA=-20 IB=0 IC=763 IN=898 T=751
[RX] 2026-11-07T21:13:46.217+08:00 [2026-11-07 21:13:45][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:13:46.228+08:00 [2026-11-07 21:13:45][ADC_TASK] meas: seq=1300 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:13:46.238+08:00 [2026-11-07 21:13:45][ADC_TASK] wave: seg=119 armed=0 src=T pts=320 err=1 ovf=10 drop=254800
[RX] 2026-11-07T21:13:46.724+08:00 [2026-11-07 21:13:45] [WAVE][WARN] seg held 60 ms (idx=20)
[RX] 2026-11-07T21:13:48.706+08:00 [2026-11-07 21:13:47] [WAVE][WARN] seg held 61 ms (idx=21)
[RX] 2026-11-07T21:13:50.698+08:00 [2026-11-07 21:13:49] [WAVE][WARN] seg held 62 ms (idx=22)
[RX] 2026-11-07T21:13:52.638+08:00 [----/--/-- --:--:--][APP] boot: syslog init OK
[RX] 2026-11-07T21:13:52.638+08:00 [----/--/-- --:--:--][APP] fw build: Nov 7 2026 19:15:10 suite=NONE dstr=off
[RX] 2026-11-07T21:13:52.649+08:00 [----/--/-- --:--:--][APP] reset cause: software (NVIC_SystemReset) (CSR=0x14000000)
[RX] 2026-11-07T21:13:52.649+08:00 PREVRUN seg=2 seq=2100979038 t=266652
[RX] 2026-11-07T21:13:52.659+08:00 TICKRUN uw=266674 n=266674 duw=22
[RX] 2026-11-07T21:13:52.659+08:00 [----/--/-- --:--:--][RTC] sd2506_init: OK
[RX] 2026-11-07T21:13:52.669+08:00 [----/--/-- --:--:--][APP] SD2506 init: OK (ret=0)
[RX] 2026-11-07T21:13:52.680+08:00 [2026-11-07 21:13:52][CLK] sys_clock_init: RTC initial time 2026-11-07 21:13:52
[RX] 2026-11-07T21:13:52.680+08:00 [2026-11-07 21:13:52][CLK] sys_clock_init: wall clock base = unix 1794086032, base_tick=142
[RX] 2026-11-07T21:13:52.690+08:00 [2026-11-07 21:13:52][APP] RS485 init: OK (UART4, DE=PA15)
[RX] 2026-11-07T21:13:52.701+08:00 [2026-11-07 21:13:52][APP] ScreenLink init: OK (ret=0, USART1 700000 baud, BRR=0x0078)
[RX] 2026-11-07T21:13:52.711+08:00 [2026-11-07 21:13:52][NAND] Resetting NAND...
[RX] 2026-11-07T21:13:52.732+08:00 [2026-11-07 21:13:52][NAND] Reading NAND ID...
[RX] 2026-11-07T21:13:52.732+08:00 [2026-11-07 21:13:52][NAND] NAND ID: MID=0xC8, DID=0x52
[RX] 2026-11-07T21:13:52.743+08:00 [2026-11-07 21:13:52][NAND] Scanning bad blocks...
[RX] 2026-11-07T21:13:52.878+08:00 [2026-11-07 21:13:52][NAND] BBT scan: 0 bad blocks found
[RX] 2026-11-07T21:13:52.878+08:00 [2026-11-07 21:13:52][NAND] Enabling ECC...
[RX] 2026-11-07T21:13:52.878+08:00 [2026-11-07 21:13:52][NAND] Unlocking block protection...
[RX] 2026-11-07T21:13:52.888+08:00 [2026-11-07 21:13:52][NAND] Locating BBT pool...
[RX] 2026-11-07T21:13:52.888+08:00 [2026-11-07 21:13:52][NAND] Loading persisted BBT...
[RX] 2026-11-07T21:13:52.899+08:00 [2026-11-07 21:13:52][NAND] NAND init OK
[RX] 2026-11-07T21:13:52.899+08:00 [2026-11-07 21:13:52][APP] NAND init: OK
[RX] 2026-11-07T21:13:52.909+08:00 [2026-11-07 21:13:52][ADC] Init OK
[RX] 2026-11-07T21:13:52.909+08:00 [2026-11-07 21:13:52][APP] ADC init: OK
[RX] 2026-11-07T21:13:52.909+08:00 [2026-11-07 21:13:52][APP] ADC input layer init: OK
[RX] 2026-11-07T21:13:52.919+08:00 [2026-11-07 21:13:52][APP] freq layer init: OK
[RX] 2026-11-07T21:13:52.930+08:00 [2026-11-07 21:13:52][CFG] register: section 'adc_cal' (9 keys)
[RX] 2026-11-07T21:13:52.930+08:00 [2026-11-07 21:13:52][CFG] register: section 'adc_cal_ofs' (8 keys)
[RX] 2026-11-07T21:13:52.941+08:00 [2026-11-07 21:13:52][APP] adc cal init: OK (k_q16 tpafe=10000000 stm32=52800000)
[RX] 2026-11-07T21:13:52.951+08:00 [2026-11-07 21:13:52][CFG] register: section 'run_par' (9 keys)
[RX] 2026-11-07T21:13:52.951+08:00 [2026-11-07 21:13:52][APP] run par init: OK (db9 k/b via adc_cal, evt=1<<8)
[RX] 2026-11-07T21:13:52.961+08:00 [2026-11-07 21:13:52][CFG] register: section 'comm' (2 keys)
[RX] 2026-11-07T21:13:52.961+08:00 [2026-11-07 21:13:52][APP] comm init: OK (ca=1 port=2404)
[RX] 2026-11-07T21:13:52.972+08:00 [2026-11-07 21:13:52][APP] protection init: OK (set=40 elm=9)
[RX] 2026-11-07T21:13:52.982+08:00 [2026-11-07 21:13:52][APP] SD2506 ID: 2512153425482405
[RX] 2026-11-07T21:13:52.982+08:00 [2026-11-07 21:13:52][APP] SD2506 time: 2026-11-07 21:13:52 (week 6)
[RX] 2026-11-07T21:13:52.993+08:00 [2026-11-07 21:13:52][APP] SD2506 temp: 23 C
[RX] 2026-11-07T21:13:52.993+08:00 [2026-11-07 21:13:52][APP] SD2506 battery: 3.12 V
[RX] 2026-11-07T21:13:53.003+08:00 [2026-11-07 21:13:52][APP] App init OK
[RX] 2026-11-07T21:13:53.003+08:00 [2026-11-07 21:13:52][NAND_FTL] Initializing NAND FTL...
[RX] 2026-11-07T21:13:53.138+08:00 [2026-11-07 21:13:52][NAND_FTL] Map resumed: 46942/93232 sectors used
[RX] 2026-11-07T21:13:53.148+08:00 [2026-11-07 21:13:52][NAND_FTL] Map head=31888 tail=90356 epoch=8
[RX] 2026-11-07T21:13:53.148+08:00 [2026-11-07 21:13:52][NAND_FTL] NAND FTL ready (capacity: 93232 pages = 182 MB)
[RX] 2026-11-07T21:13:53.231+08:00 [2026-11-07 21:13:52] [FS] FATFS mounted
[RX] 2026-11-07T21:13:53.294+08:00 [2026-11-07 21:13:52][SYSLOG] runlog boot entry: reboot
[RX] 2026-11-07T21:13:53.294+08:00 [2026-11-07 21:13:52][CFG] register: section 'network' (4 keys)
[RX] 2026-11-07T21:13:53.305+08:00 [2026-11-07 21:13:52][CFG] register: section 'ftp' (3 keys)
[RX] 2026-11-07T21:13:53.315+08:00 [2026-11-07 21:13:52][CFG] register: section 'sntp' (4 keys)
[RX] 2026-11-07T21:13:53.326+08:00 [2026-11-07 21:13:52][CFG] load: OK (1064B, heap free 16552B)
[RX] 2026-11-07T21:13:53.326+08:00 [2026-11-07 21:13:52][NET_CFG] load: OK ip=192.168.31.100
[RX] 2026-11-07T21:13:53.336+08:00 [2026-11-07 21:13:52] [CFG] prot set loaded (/prot_set.bin)
[RX] 2026-11-07T21:13:53.357+08:00 [2026-11-07 21:13:52][ADC_TASK] [WARN] wave bench autocap ON: 1 seg / 2000 ms, auto-stop 300 s (BENCH BUILD ONLY)
[RX] 2026-11-07T21:13:53.368+08:00 [2026-11-07 21:13:52][ADC_TASK] first: UA=-17 UB=404 UC=594 UN=-17 IA=-17 IB=0 IC=763 IN=899 T=747
[RX] 2026-11-07T21:13:53.410+08:00 [2026-11-07 21:13:52][ADC_TASK] freq(first): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:13:53.420+08:00 [2026-11-07 21:13:52][PROT] protect task start: cycle=20ms elm=9
[RX] 2026-11-07T21:13:53.420+08:00 [2026-11-07 21:13:52][NET_TASK] === Network Init ===
[RX] 2026-11-07T21:13:53.431+08:00 [2026-11-07 21:13:52][NET] ch395f ver=0x4A fun_para=0x08
[RX] 2026-11-07T21:13:53.431+08:00 [2026-11-07 21:13:52][NET_TASK] net init: OK
[RX] 2026-11-07T21:13:53.441+08:00 MISS start snap=0x000001E7 req=0x000001F7 t=906
[RX] 2026-11-07T21:13:53.441+08:00 [2026-11-07 21:13:52][WD] [WD] armed: timeout ~2498ms (worst ~1701ms), miss_tol=800ms
[RX] 2026-11-07T21:13:53.452+08:00 [2026-11-07 21:13:52][NET_TASK] MAC: 3C:AB:72:53:2B:12
[RX] 2026-11-07T21:13:53.567+08:00 [2026-11-07 21:13:52][NET_TASK] IP_INF: IP=192.168.31.100 GW=192.168.31.1 MASK=255.255.255.0
[RX] 2026-11-07T21:13:53.577+08:00 [2026-11-07 21:13:52] [WAVE][WARN] seg held 79 ms (idx=1)
[RX] 2026-11-07T21:13:53.577+08:00 [2026-11-07 21:13:52][UI_TASK] UI task: started, wait net ready
[RX] 2026-11-07T21:13:55.414+08:00 [2026-11-07 21:13:54][NET_TASK] PHY: 100M FULL
[RX] 2026-11-07T21:13:55.424+08:00 [2026-11-07 21:13:54][NET_TASK] netTask: started (single-socket mode)
[RX] 2026-11-07T21:13:55.455+08:00 [2026-11-07 21:13:54][ERR][I104] i104: bind port 2404 FAIL, retry in loop
[RX] 2026-11-07T21:13:55.497+08:00 [2026-11-07 21:13:54] [FTP] using factory default password
[RX] 2026-11-07T21:13:55.497+08:00 [2026-11-07 21:13:54] [FTP] waiting for connection...
[RX] 2026-11-07T21:13:55.570+08:00 [2026-11-07 21:13:54] [WAVE][WARN] seg held 65 ms (idx=2)
[RX] 2026-11-07T21:13:55.570+08:00 [2026-11-07 21:13:54][UI_TASK] UI task: net ready, init port
[RX] 2026-11-07T21:13:55.580+08:00 [2026-11-07 21:13:54][UI_TASK] UI task: ui_port_init enter
[RX] 2026-11-07T21:13:55.591+08:00 [2026-11-07 21:13:54][UI_PORT] theme: mono dark_bg=true applied
[RX] 2026-11-07T21:13:55.591+08:00 [2026-11-07 21:13:54][UI_TASK] UI port init: OK
[RX] 2026-11-07T21:13:55.601+08:00 MISS start snap=0x000001E7 req=0x000001F7 t=3067
[RX] 2026-11-07T21:13:55.622+08:00 [2026-11-07 21:13:54][UI_TASK] UI task: ui_menu_init enter
[RX] 2026-11-07T21:13:55.622+08:00 [2026-11-07 21:13:54][UI_MENU] menu build start: total=15136 free=12692 big=12692
[RX] 2026-11-07T21:13:55.632+08:00 [2026-11-07 21:13:54][UI_MENU_VIEW] view init: root frame w=66 h=107
[RX] 2026-11-07T21:13:55.642+08:00 [2026-11-07 21:13:54][UI_MENU] menu build done: total=15020 free=11828 big=11816 used=3192
[RX] 2026-11-07T21:13:55.653+08:00 [2026-11-07 21:13:54][UI_TASK] UI menu init: OK
[RX] 2026-11-07T21:13:55.653+08:00 [2026-11-07 21:13:54][UI_STANDBY] standby: ready (idle=60000ms)
[RX] 2026-11-07T21:13:55.663+08:00 [2026-11-07 21:13:54][UI_TASK] UI standby: ready (idle=60s)
[RX] 2026-11-07T21:13:55.715+08:00 [2026-11-07 21:13:55][UI_TASK] UI net sink: started (port 7003)
[RX] 2026-11-07T21:13:57.598+08:00 [2026-11-07 21:13:56] [WAVE][WARN] seg held 63 ms (idx=3)
[RX] 2026-11-07T21:13:58.024+08:00 [2026-11-07 21:13:57] [STACK] default peak_used=2188/5120 free_min=2932 (57%)
[RX] 2026-11-07T21:13:58.034+08:00 [2026-11-07 21:13:57] [STACK] net peak_used=1116/3840 free_min=2724 (70%)
[RX] 2026-11-07T21:13:58.034+08:00 [2026-11-07 21:13:57] [STACK] ftp peak_used=764/4096 free_min=3332 (81%)
[RX] 2026-11-07T21:13:58.045+08:00 [2026-11-07 21:13:57] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[RX] 2026-11-07T21:13:58.055+08:00 [2026-11-07 21:13:57] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[RX] 2026-11-07T21:13:58.055+08:00 [2026-11-07 21:13:57] [STACK] adc peak_used=1000/2560 free_min=1560 (60%)
[RX] 2026-11-07T21:13:58.066+08:00 [2026-11-07 21:13:57] [STACK] iec104 peak_used=540/2560 free_min=2020 (78%)
[RX] 2026-11-07T21:13:58.076+08:00 [2026-11-07 21:13:57] [STACK] protect peak_used=540/2048 free_min=1508 (73%)
[RX] 2026-11-07T21:13:58.076+08:00 [2026-11-07 21:13:57] [STACK] heap free=15624 min_ever=8464
[RX] 2026-11-07T21:13:59.614+08:00 [2026-11-07 21:13:58] [WAVE][WARN] seg held 67 ms (idx=4)
[RX] 2026-11-07T21:14:01.600+08:00 [2026-11-07 21:14:00] [WAVE][WARN] seg held 64 ms (idx=5)
[RX] 2026-11-07T21:14:03.061+08:00 [2026-11-07 21:14:02][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:14:03.061+08:00 [2026-11-07 21:14:02][ADC_TASK] adc: UA=-21 UB=404 UC=617 UN=-20 IA=-21 IB=0 IC=771 IN=882 T=752
[RX] 2026-11-07T21:14:03.071+08:00 [2026-11-07 21:14:02][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:14:03.082+08:00 [2026-11-07 21:14:02][ADC_TASK] meas: seq=50 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:14:03.082+08:00 [2026-11-07 21:14:02][ADC_TASK] wave: seg=5 armed=0 src=T pts=320 err=0 ovf=0 drop=6024
[RX] 2026-11-07T21:14:03.092+08:00 [2026-11-07 21:14:02][PROT] elm UV-UA asserted=1 picked=1
[RX] 2026-11-07T21:14:03.581+08:00 [2026-11-07 21:14:02] [WAVE][WARN] seg held 69 ms (idx=6)
[RX] 2026-11-07T21:14:04.109+08:00 [2026-11-07 21:14:03] [STACK] default peak_used=2188/5120 free_min=2932 (57%)
[RX] 2026-11-07T21:14:04.109+08:00 [2026-11-07 21:14:03] [STACK] net peak_used=1116/3840 free_min=2724 (70%)
[RX] 2026-11-07T21:14:04.119+08:00 [2026-11-07 21:14:03] [STACK] ftp peak_used=764/4096 free_min=3332 (81%)
[RX] 2026-11-07T21:14:04.129+08:00 [2026-11-07 21:14:03] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[RX] 2026-11-07T21:14:04.129+08:00 [2026-11-07 21:14:03] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[RX] 2026-11-07T21:14:04.140+08:00 [2026-11-07 21:14:03] [STACK] adc peak_used=1000/2560 free_min=1560 (60%)
[RX] 2026-11-07T21:14:04.151+08:00 [2026-11-07 21:14:03] [STACK] iec104 peak_used=540/2560 free_min=2020 (78%)
[RX] 2026-11-07T21:14:04.151+08:00 [2026-11-07 21:14:03] [STACK] protect peak_used=624/2048 free_min=1424 (69%)
[RX] 2026-11-07T21:14:04.161+08:00 [2026-11-07 21:14:03] [STACK] heap free=15624 min_ever=8464
[RX] 2026-11-07T21:14:05.579+08:00 [2026-11-07 21:14:04] [WAVE][WARN] seg held 64 ms (idx=7)
[RX] 2026-11-07T21:14:07.578+08:00 [2026-11-07 21:14:06] [WAVE][WARN] seg held 65 ms (idx=8)
[RX] 2026-11-07T21:14:09.585+08:00 [2026-11-07 21:14:08] [WAVE][WARN] seg held 62 ms (idx=9)
[RX] 2026-11-07T21:14:11.572+08:00 [2026-11-07 21:14:10] [WAVE][WARN] seg held 64 ms (idx=10)
[RX] 2026-11-07T21:14:13.053+08:00 [2026-11-07 21:14:12][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:14:13.063+08:00 [2026-11-07 21:14:12][ADC_TASK] adc: UA=-21 UB=404 UC=611 UN=-21 IA=-20 IB=0 IC=772 IN=848 T=759
[RX] 2026-11-07T21:14:13.073+08:00 [2026-11-07 21:14:12][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:14:13.084+08:00 [2026-11-07 21:14:12][ADC_TASK] meas: seq=100 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:14:13.084+08:00 [2026-11-07 21:14:12][ADC_TASK] wave: seg=10 armed=0 src=T pts=320 err=0 ovf=0 drop=8960
[RX] 2026-11-07T21:14:13.228+08:00 [2026-11-07 21:14:12][NET] sock1 standalone accept
[RX] 2026-11-07T21:14:13.259+08:00 [2026-11-07 21:14:12] [FTP] connection received from 192.168.31.161:60724...
[RX] 2026-11-07T21:14:13.269+08:00 [2026-11-07 21:14:12] [FTP] CMD USER admin
[RX] 2026-11-07T21:14:13.269+08:00 [2026-11-07 21:14:12] [FTP] CMD PASS admin
[RX] 2026-11-07T21:14:13.280+08:00 [2026-11-07 21:14:12] [FTP] CMD TYPE I
[RX] 2026-11-07T21:14:13.290+08:00 [2026-11-07 21:14:12] [FTP] CMD PASV
[RX] 2026-11-07T21:14:13.332+08:00 [2026-11-07 21:14:12][NET] sock3 standalone accept
[RX] 2026-11-07T21:14:13.353+08:00 [2026-11-07 21:14:12] [FTP] CMD RETR /FILL3.BIN
[RX] 2026-11-07T21:14:14.287+08:00 [2026-11-07 21:14:13] [STACK] default peak_used=2188/5120 free_min=2932 (57%)
[RX] 2026-11-07T21:14:14.287+08:00 [2026-11-07 21:14:13] [STACK] net peak_used=1116/3840 free_min=2724 (70%)
[RX] 2026-11-07T21:14:14.298+08:00 [2026-11-07 21:14:13] [STACK] ftp peak_used=2028/4096 free_min=2068 (50%)
[RX] 2026-11-07T21:14:14.308+08:00 [2026-11-07 21:14:13] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[RX] 2026-11-07T21:14:14.308+08:00 [2026-11-07 21:14:13] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[RX] 2026-11-07T21:14:14.319+08:00 [2026-11-07 21:14:13] [STACK] adc peak_used=1000/2560 free_min=1560 (60%)
[RX] 2026-11-07T21:14:14.329+08:00 [2026-11-07 21:14:13] [STACK] iec104 peak_used=540/2560 free_min=2020 (78%)
[RX] 2026-11-07T21:14:14.340+08:00 [2026-11-07 21:14:13] [STACK] protect peak_used=624/2048 free_min=1424 (69%)
[RX] 2026-11-07T21:14:14.350+08:00 [2026-11-07 21:14:13] [STACK] heap free=15600 min_ever=8464
[RX] 2026-11-07T21:14:14.454+08:00 MISS start snap=0x00000177 req=0x000001F7 t=21918
[RX] 2026-11-07T21:14:15.593+08:00 [2026-11-07 21:14:14] [FTP] DOWNLOAD '/FILL3.BIN' OK
[RX] 2026-11-07T21:14:15.603+08:00 [2026-11-07 21:14:14] [FTP] CMD QUIT
[RX] 2026-11-07T21:14:15.603+08:00 [2026-11-07 21:14:14][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:14:15.614+08:00 [2026-11-07 21:14:14] [FTP] waiting for connection...
[RX] 2026-11-07T21:14:15.635+08:00 [2026-11-07 21:14:14] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:14:15.645+08:00 MISS start snap=0x000001E7 req=0x000001F7 t=23112
[RX] 2026-11-07T21:14:15.800+08:00 [2026-11-07 21:14:15] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:14:15.800+08:00 [2026-11-07 21:14:15][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:14:16.286+08:00 [2026-11-07 21:14:15] [STACK] default peak_used=2188/5120 free_min=2932 (57%)
[RX] 2026-11-07T21:14:16.286+08:00 [2026-11-07 21:14:15] [STACK] net peak_used=1120/3840 free_min=2720 (70%)
[RX] 2026-11-07T21:14:16.297+08:00 [2026-11-07 21:14:15] [STACK] ftp peak_used=2028/4096 free_min=2068 (50%)
[RX] 2026-11-07T21:14:16.307+08:00 [2026-11-07 21:14:15] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[RX] 2026-11-07T21:14:16.307+08:00 [2026-11-07 21:14:15] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[RX] 2026-11-07T21:14:16.318+08:00 [2026-11-07 21:14:15] [STACK] adc peak_used=1000/2560 free_min=1560 (60%)
[RX] 2026-11-07T21:14:16.328+08:00 [2026-11-07 21:14:15] [STACK] iec104 peak_used=540/2560 free_min=2020 (78%)
[RX] 2026-11-07T21:14:16.328+08:00 [2026-11-07 21:14:15] [STACK] protect peak_used=624/2048 free_min=1424 (69%)
[RX] 2026-11-07T21:14:16.338+08:00 [2026-11-07 21:14:15] [STACK] heap free=15624 min_ever=8464
[RX] 2026-11-07T21:14:17.612+08:00 [2026-11-07 21:14:16] [WAVE][WARN] seg held 64 ms (idx=11)
[RX] 2026-11-07T21:14:18.327+08:00 [2026-11-07 21:14:17] [STACK] default peak_used=2188/5120 free_min=2932 (57%)
[RX] 2026-11-07T21:14:18.338+08:00 [2026-11-07 21:14:17] [STACK] net peak_used=1120/3840 free_min=2720 (70%)
[RX] 2026-11-07T21:14:18.338+08:00 [2026-11-07 21:14:17] [STACK] ftp peak_used=2028/4096 free_min=2068 (50%)
[RX] 2026-11-07T21:14:18.348+08:00 [2026-11-07 21:14:17] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[RX] 2026-11-07T21:14:18.359+08:00 [2026-11-07 21:14:17] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[RX] 2026-11-07T21:14:18.369+08:00 [2026-11-07 21:14:17] [STACK] adc peak_used=1000/2560 free_min=1560 (60%)
[RX] 2026-11-07T21:14:18.369+08:00 [2026-11-07 21:14:17] [STACK] iec104 peak_used=544/2560 free_min=2016 (78%)
[RX] 2026-11-07T21:14:18.379+08:00 [2026-11-07 21:14:17] [STACK] protect peak_used=624/2048 free_min=1424 (69%)
[RX] 2026-11-07T21:14:18.390+08:00 [2026-11-07 21:14:17] [STACK] heap free=15624 min_ever=8464
[RX] 2026-11-07T21:14:19.611+08:00 [2026-11-07 21:14:18] [WAVE][WARN] seg held 62 ms (idx=12)
[RX] 2026-11-07T21:14:21.235+08:00 [2026-11-07 21:14:20][NET] sock1 standalone accept
[RX] 2026-11-07T21:14:21.246+08:00 [2026-11-07 21:14:20] [FTP] connection received from 192.168.31.161:50978...
[RX] 2026-11-07T21:14:21.267+08:00 [2026-11-07 21:14:20] [FTP] CMD USER admin
[RX] 2026-11-07T21:14:21.267+08:00 [2026-11-07 21:14:20] [FTP] CMD PASS admin
[RX] 2026-11-07T21:14:21.277+08:00 [2026-11-07 21:14:20] [FTP] CMD TYPE I
[RX] 2026-11-07T21:14:21.277+08:00 [2026-11-07 21:14:20] [FTP] CMD PASV
[RX] 2026-11-07T21:14:21.329+08:00 [2026-11-07 21:14:20][NET] sock3 standalone accept
[RX] 2026-11-07T21:14:21.340+08:00 [2026-11-07 21:14:20] [FTP] CMD RETR /FILL3.BIN
[RX] 2026-11-07T21:14:23.059+08:00 [2026-11-07 21:14:22][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:14:23.070+08:00 [2026-11-07 21:14:22][ADC_TASK] adc: UA=-21 UB=405 UC=611 UN=-21 IA=-20 IB=0 IC=769 IN=836 T=757
[RX] 2026-11-07T21:14:23.081+08:00 [2026-11-07 21:14:22][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:14:23.092+08:00 [2026-11-07 21:14:22][ADC_TASK] meas: seq=150 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:14:23.092+08:00 [2026-11-07 21:14:22][ADC_TASK] wave: seg=12 armed=1 src=T pts=320 err=1 ovf=1 drop=38656
[RX] 2026-11-07T21:14:23.610+08:00 [2026-11-07 21:14:22] [FTP] DOWNLOAD '/FILL3.BIN' OK
[RX] 2026-11-07T21:14:23.620+08:00 [2026-11-07 21:14:22] [FTP] CMD QUIT
[RX] 2026-11-07T21:14:23.620+08:00 [2026-11-07 21:14:22][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:14:23.631+08:00 [2026-11-07 21:14:22] [FTP] waiting for connection...
[RX] 2026-11-07T21:14:23.652+08:00 [2026-11-07 21:14:22] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:14:23.662+08:00 MISS start snap=0x000001E7 req=0x000001F7 t=31130
[RX] 2026-11-07T21:14:23.818+08:00 [2026-11-07 21:14:23] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:14:23.818+08:00 [2026-11-07 21:14:23][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:14:25.617+08:00 [2026-11-07 21:14:24] [WAVE][WARN] seg held 63 ms (idx=13)
[RX] 2026-11-07T21:14:27.606+08:00 [2026-11-07 21:14:26] [WAVE][WARN] seg held 63 ms (idx=14)
[RX] 2026-11-07T21:14:29.148+08:00 [2026-11-07 21:14:28][NET] sock1 standalone accept
[RX] 2026-11-07T21:14:29.158+08:00 [2026-11-07 21:14:28] [FTP] connection received from 192.168.31.161:60337...
[RX] 2026-11-07T21:14:29.158+08:00 [2026-11-07 21:14:28] [FTP] CMD USER admin
[RX] 2026-11-07T21:14:29.169+08:00 [2026-11-07 21:14:28] [FTP] CMD PASS admin
[RX] 2026-11-07T21:14:29.169+08:00 [2026-11-07 21:14:28] [FTP] CMD TYPE I
[RX] 2026-11-07T21:14:29.179+08:00 [2026-11-07 21:14:28] [FTP] CMD PASV
[RX] 2026-11-07T21:14:29.220+08:00 [2026-11-07 21:14:28][NET] sock3 standalone accept
[RX] 2026-11-07T21:14:29.231+08:00 [2026-11-07 21:14:28] [FTP] CMD RETR /FILL3.BIN
[RX] 2026-11-07T21:14:31.368+08:00 [2026-11-07 21:14:30] [WAVE][WARN] seg held 63 ms (idx=15)
[RX] 2026-11-07T21:14:31.410+08:00 [2026-11-07 21:14:30] [FTP] DOWNLOAD '/FILL3.BIN' OK
[RX] 2026-11-07T21:14:31.420+08:00 [2026-11-07 21:14:30] [FTP] CMD QUIT
[RX] 2026-11-07T21:14:31.420+08:00 [2026-11-07 21:14:30][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:14:31.420+08:00 [2026-11-07 21:14:30] [FTP] waiting for connection...
[RX] 2026-11-07T21:14:31.451+08:00 [2026-11-07 21:14:30] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:14:31.514+08:00 MISS start snap=0x00000177 req=0x000001F7 t=38974
[RX] 2026-11-07T21:14:31.609+08:00 [2026-11-07 21:14:30] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:14:31.619+08:00 [2026-11-07 21:14:30][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:14:33.058+08:00 [2026-11-07 21:14:32][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:14:33.058+08:00 [2026-11-07 21:14:32][ADC_TASK] adc: UA=-23 UB=404 UC=608 UN=-22 IA=-23 IB=0 IC=772 IN=834 T=753
[RX] 2026-11-07T21:14:33.069+08:00 [2026-11-07 21:14:32][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:14:33.079+08:00 [2026-11-07 21:14:32][ADC_TASK] meas: seq=200 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:14:33.089+08:00 [2026-11-07 21:14:32][ADC_TASK] wave: seg=15 armed=0 src=T pts=320 err=2 ovf=3 drop=59256
[RX] 2026-11-07T21:14:33.566+08:00 [2026-11-07 21:14:32] [WAVE][WARN] seg held 62 ms (idx=16)
[RX] 2026-11-07T21:14:35.610+08:00 [2026-11-07 21:14:34] [WAVE][WARN] seg held 62 ms (idx=17)
[RX] 2026-11-07T21:14:37.331+08:00 [2026-11-07 21:14:36][NET] sock1 standalone accept
[RX] 2026-11-07T21:14:37.352+08:00 [2026-11-07 21:14:36] [FTP] connection received from 192.168.31.161:61067...
[RX] 2026-11-07T21:14:37.362+08:00 [2026-11-07 21:14:36] [FTP] CMD USER admin
[RX] 2026-11-07T21:14:37.362+08:00 [2026-11-07 21:14:36] [FTP] CMD PASS admin
[RX] 2026-11-07T21:14:37.373+08:00 [2026-11-07 21:14:36] [FTP] CMD TYPE I
[RX] 2026-11-07T21:14:37.373+08:00 [2026-11-07 21:14:36] [FTP] CMD PASV
[RX] 2026-11-07T21:14:37.424+08:00 [2026-11-07 21:14:36][NET] sock3 standalone accept
[RX] 2026-11-07T21:14:37.445+08:00 [2026-11-07 21:14:36] [FTP] CMD RETR /FILL3.BIN
[RX] 2026-11-07T21:14:39.641+08:00 [2026-11-07 21:14:38] [FTP] DOWNLOAD '/FILL3.BIN' OK
[RX] 2026-11-07T21:14:39.641+08:00 MISS start snap=0x000001E7 req=0x000001F7 t=47112
[RX] 2026-11-07T21:14:39.662+08:00 [2026-11-07 21:14:38] [FTP] CMD QUIT
[RX] 2026-11-07T21:14:39.673+08:00 [2026-11-07 21:14:38][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:14:39.673+08:00 [2026-11-07 21:14:38] [FTP] waiting for connection...
[RX] 2026-11-07T21:14:39.694+08:00 [2026-11-07 21:14:39] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:14:39.850+08:00 MISS start snap=0x00000177 req=0x000001F7 t=47317
[RX] 2026-11-07T21:14:39.871+08:00 [2026-11-07 21:14:39] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:14:39.882+08:00 [2026-11-07 21:14:39][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:14:41.573+08:00 [2026-11-07 21:14:40] [WAVE][WARN] seg held 64 ms (idx=18)
[RX] 2026-11-07T21:14:43.053+08:00 [2026-11-07 21:14:42][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:14:43.064+08:00 [2026-11-07 21:14:42][ADC_TASK] adc: UA=-21 UB=404 UC=608 UN=-19 IA=-20 IB=0 IC=772 IN=832 T=753
[RX] 2026-11-07T21:14:43.074+08:00 [2026-11-07 21:14:42][ADC_TASK] cal: ua_mv=-3 un_mv=-2 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:14:43.074+08:00 [2026-11-07 21:14:42][ADC_TASK] meas: seq=250 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:14:43.084+08:00 [2026-11-07 21:14:42][ADC_TASK] wave: seg=18 armed=0 src=T pts=320 err=3 ovf=4 drop=77160
[RX] 2026-11-07T21:14:43.582+08:00 [2026-11-07 21:14:42] [WAVE][WARN] seg held 68 ms (idx=19)
[RX] 2026-11-07T21:14:45.104+08:00 [2026-11-07 21:14:44][NET] sock1 standalone accept
[RX] 2026-11-07T21:14:45.197+08:00 [2026-11-07 21:14:44] [FTP] connection received from 192.168.31.161:64880...
[RX] 2026-11-07T21:14:45.207+08:00 [2026-11-07 21:14:44] [FTP] CMD USER admin
[RX] 2026-11-07T21:14:45.207+08:00 [2026-11-07 21:14:44] [FTP] CMD PASS admin
[RX] 2026-11-07T21:14:45.217+08:00 [2026-11-07 21:14:44] [FTP] CMD TYPE I
[RX] 2026-11-07T21:14:45.217+08:00 [2026-11-07 21:14:44] [FTP] CMD PASV
[RX] 2026-11-07T21:14:45.269+08:00 [2026-11-07 21:14:44][NET] sock3 standalone accept
[RX] 2026-11-07T21:14:45.280+08:00 [2026-11-07 21:14:44] [FTP] CMD RETR /FILL3.BIN
[RX] 2026-11-07T21:14:47.420+08:00 [2026-11-07 21:14:46] [WAVE][WARN] seg held 62 ms (idx=20)
[RX] 2026-11-07T21:14:47.461+08:00 [2026-11-07 21:14:46] [FTP] DOWNLOAD '/FILL3.BIN' OK
[RX] 2026-11-07T21:14:47.461+08:00 [2026-11-07 21:14:46] [FTP] CMD QUIT
[RX] 2026-11-07T21:14:47.461+08:00 [2026-11-07 21:14:46][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:14:47.471+08:00 [2026-11-07 21:14:46] [FTP] waiting for connection...
[RX] 2026-11-07T21:14:47.503+08:00 [2026-11-07 21:14:46] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:14:47.556+08:00 MISS start snap=0x00000177 req=0x000001F7 t=55024
[RX] 2026-11-07T21:14:47.660+08:00 [2026-11-07 21:14:46] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:14:47.670+08:00 [2026-11-07 21:14:46][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:14:49.596+08:00 [2026-11-07 21:14:48] [WAVE][WARN] seg held 62 ms (idx=21)
[RX] 2026-11-07T21:15:26.136+08:00 MISS start snap=0x000001E7 req=0x000001F7 t=93607
[RX] 2026-11-07T21:15:27.392+08:00 [2026-11-07 21:15:26] [WAVE][WARN] seg held 61 ms (idx=34)
[RX] 2026-11-07T21:15:27.433+08:00 [2026-11-07 21:15:26] [FTP] DOWNLOAD '/FILL3.BIN' OK
[RX] 2026-11-07T21:15:27.433+08:00 [2026-11-07 21:15:26] [FTP] CMD QUIT
[RX] 2026-11-07T21:15:27.433+08:00 [2026-11-07 21:15:26][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:15:27.444+08:00 [2026-11-07 21:15:26] [FTP] waiting for connection...
[RX] 2026-11-07T21:15:27.475+08:00 [2026-11-07 21:15:26] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:15:27.631+08:00 [2026-11-07 21:15:26] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:15:27.642+08:00 [2026-11-07 21:15:26][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:15:29.610+08:00 [2026-11-07 21:15:28] [WAVE][WARN] seg held 61 ms (idx=35)
[RX] 2026-11-07T21:15:31.597+08:00 [2026-11-07 21:15:30] [WAVE][WARN] seg held 60 ms (idx=36)
[RX] 2026-11-07T21:15:33.060+08:00 [2026-11-07 21:15:32][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:15:33.070+08:00 [2026-11-07 21:15:32][ADC_TASK] adc: UA=-19 UB=404 UC=608 UN=-19 IA=-19 IB=0 IC=770 IN=835 T=751
[RX] 2026-11-07T21:15:33.081+08:00 [2026-11-07 21:15:32][ADC_TASK] cal: ua_mv=-2 un_mv=-2 ia_mv=-2 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:15:33.091+08:00 [2026-11-07 21:15:32][ADC_TASK] meas: seq=500 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:15:33.091+08:00 [2026-11-07 21:15:32][ADC_TASK] wave: seg=36 armed=0 src=T pts=320 err=4 ovf=10 drop=178416
[RX] 2026-11-07T21:15:33.205+08:00 [2026-11-07 21:15:32][NET] sock1 standalone accept
[RX] 2026-11-07T21:15:33.267+08:00 [2026-11-07 21:15:32] [FTP] connection received from 192.168.31.161:50846...
[RX] 2026-11-07T21:15:33.278+08:00 [2026-11-07 21:15:32] [FTP] CMD USER admin
[RX] 2026-11-07T21:15:33.288+08:00 [2026-11-07 21:15:32] [FTP] CMD PASS admin
[RX] 2026-11-07T21:15:33.288+08:00 [2026-11-07 21:15:32] [FTP] CMD TYPE I
[RX] 2026-11-07T21:15:33.299+08:00 [2026-11-07 21:15:32] [FTP] CMD PASV
[RX] 2026-11-07T21:15:33.351+08:00 [2026-11-07 21:15:32][NET] sock3 standalone accept
[RX] 2026-11-07T21:15:33.351+08:00 [2026-11-07 21:15:32] [FTP] CMD RETR /FILL3.BIN
[RX] 2026-11-07T21:15:35.576+08:00 [2026-11-07 21:15:34][ERR] [WAVE] seg drop: ring abandoned (idx=36 written=5250)
[RX] 2026-11-07T21:15:35.576+08:00 [2026-11-07 21:15:34] [WAVE][WARN] seg held 124 ms (idx=36)
[RX] 2026-11-07T21:15:35.587+08:00 [2026-11-07 21:15:34] [FTP] DOWNLOAD '/FILL3.BIN' OK
[RX] 2026-11-07T21:15:35.587+08:00 [2026-11-07 21:15:34] [FTP] CMD QUIT
[RX] 2026-11-07T21:15:35.597+08:00 [2026-11-07 21:15:34][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:15:35.597+08:00 [2026-11-07 21:15:34] [FTP] waiting for connection...
[RX] 2026-11-07T21:15:35.628+08:00 [2026-11-07 21:15:34] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:15:35.784+08:00 MISS start snap=0x00000177 req=0x000001F7 t=103250
[RX] 2026-11-07T21:15:35.805+08:00 [2026-11-07 21:15:35] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:15:35.816+08:00 [2026-11-07 21:15:35][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:15:38.900+08:00 [2026-11-07 21:15:38][NET] sock1 standalone accept
[RX] 2026-11-07T21:15:38.921+08:00 [2026-11-07 21:15:38] [FTP] connection received from 192.168.31.161:56248...
[RX] 2026-11-07T21:15:38.921+08:00 [2026-11-07 21:15:38] [FTP] CMD USER admin
[RX] 2026-11-07T21:15:38.931+08:00 [2026-11-07 21:15:38] [FTP] CMD PASS admin
[RX] 2026-11-07T21:15:38.941+08:00 [2026-11-07 21:15:38] [FTP] CMD SIZE /WAVE/WAVE36.BIN
[RX] 2026-11-07T21:15:38.941+08:00 [2026-11-07 21:15:38] [FTP] CMD QUIT
[RX] 2026-11-07T21:15:38.941+08:00 [2026-11-07 21:15:38][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:15:38.952+08:00 [2026-11-07 21:15:38] [FTP] waiting for connection...
[RX] 2026-11-07T21:15:38.982+08:00 [2026-11-07 21:15:38] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:15:39.149+08:00 [2026-11-07 21:15:38] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:15:39.149+08:00 [2026-11-07 21:15:38][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:15:39.459+08:00 [2026-11-07 21:15:38][NET] sock1 standalone accept
[RX] 2026-11-07T21:15:39.470+08:00 [2026-11-07 21:15:38] [FTP] connection received from 192.168.31.161:56249...
[RX] 2026-11-07T21:15:39.480+08:00 [2026-11-07 21:15:38] [FTP] CMD USER admin
[RX] 2026-11-07T21:15:39.480+08:00 [2026-11-07 21:15:38] [FTP] CMD PASS admin
[RX] 2026-11-07T21:15:39.491+08:00 [2026-11-07 21:15:38] [FTP] CMD SIZE /WAVE/WAVE00.BIN
[RX] 2026-11-07T21:15:39.501+08:00 [2026-11-07 21:15:38] [FTP] CMD QUIT
[RX] 2026-11-07T21:15:39.501+08:00 [2026-11-07 21:15:38][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:15:39.501+08:00 [2026-11-07 21:15:38] [FTP] waiting for connection...
[RX] 2026-11-07T21:15:39.574+08:00 [2026-11-07 21:15:38] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:15:39.584+08:00 [2026-11-07 21:15:38] [WAVE][WARN] seg held 61 ms (idx=38)
[RX] 2026-11-07T21:15:39.698+08:00 [2026-11-07 21:15:39] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:15:41.371+08:00 [2026-11-07 21:15:40] [STACK] default peak_used=2188/5120 free_min=2932 (57%)
[RX] 2026-11-07T21:15:41.382+08:00 [2026-11-07 21:15:40] [STACK] net peak_used=1188/3840 free_min=2652 (69%)
[RX] 2026-11-07T21:15:41.382+08:00 [2026-11-07 21:15:40] [STACK] ftp peak_used=2028/4096 free_min=2068 (50%)
[RX] 2026-11-07T21:15:41.392+08:00 [2026-11-07 21:15:40] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[RX] 2026-11-07T21:15:41.403+08:00 [2026-11-07 21:15:40] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[RX] 2026-11-07T21:15:41.413+08:00 [2026-11-07 21:15:40] [STACK] adc peak_used=1000/2560 free_min=1560 (60%)
[RX] 2026-11-07T21:15:41.413+08:00 [2026-11-07 21:15:40] [STACK] iec104 peak_used=544/2560 free_min=2016 (78%)
[RX] 2026-11-07T21:15:41.424+08:00 [2026-11-07 21:15:40] [STACK] protect peak_used=624/2048 free_min=1424 (69%)
[RX] 2026-11-07T21:15:41.434+08:00 [2026-11-07 21:15:40] [STACK] heap free=15624 min_ever=8464
[RX] 2026-11-07T21:15:41.599+08:00 [2026-11-07 21:15:40] [WAVE][WARN] seg held 60 ms (idx=39)
[RX] 2026-11-07T21:15:41.796+08:00 [2026-11-07 21:15:41][NET] sock1 standalone accept
[RX] 2026-11-07T21:15:41.828+08:00 [2026-11-07 21:15:41] [FTP] connection received from 192.168.31.161:56562...
[RX] 2026-11-07T21:15:41.838+08:00 [2026-11-07 21:15:41] [FTP] CMD USER admin
[RX] 2026-11-07T21:15:41.838+08:00 [2026-11-07 21:15:41] [FTP] CMD PASS admin
[RX] 2026-11-07T21:15:41.849+08:00 [2026-11-07 21:15:41] [FTP] CMD SIZE /WAVE/WAVE36.BIN
[RX] 2026-11-07T21:15:41.859+08:00 [2026-11-07 21:15:41] [FTP] CMD QUIT
[RX] 2026-11-07T21:15:41.859+08:00 [2026-11-07 21:15:41][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:15:41.869+08:00 [2026-11-07 21:15:41] [FTP] waiting for connection...
[RX] 2026-11-07T21:15:41.891+08:00 [2026-11-07 21:15:41] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:15:42.056+08:00 [2026-11-07 21:15:41] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:15:42.056+08:00 [2026-11-07 21:15:41][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:15:43.051+08:00 [2026-11-07 21:15:42][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:15:43.061+08:00 [2026-11-07 21:15:42][ADC_TASK] adc: UA=-20 UB=403 UC=609 UN=-20 IA=-20 IB=0 IC=773 IN=832 T=751
[RX] 2026-11-07T21:15:43.072+08:00 [2026-11-07 21:15:42][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:15:43.082+08:00 [2026-11-07 21:15:42][ADC_TASK] meas: seq=550 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:15:43.082+08:00 [2026-11-07 21:15:42][ADC_TASK] wave: seg=39 armed=0 src=T pts=320 err=5 ovf=11 drop=196424
[RX] 2026-11-07T21:15:43.590+08:00 [2026-11-07 21:15:42] [WAVE][WARN] seg held 64 ms (idx=40)
[RX] 2026-11-07T21:15:45.578+08:00 [2026-11-07 21:15:44] [WAVE][WARN] seg held 59 ms (idx=41)
[RX] 2026-11-07T21:15:47.607+08:00 [2026-11-07 21:15:46] [WAVE][WARN] seg held 62 ms (idx=42)
[RX] 2026-11-07T21:15:49.610+08:00 [2026-11-07 21:15:48] [WAVE][WARN] seg held 63 ms (idx=43)
[RX] 2026-11-07T21:15:50.866+08:00 [2026-11-07 21:15:50][NET] sock1 standalone accept
[RX] 2026-11-07T21:15:50.907+08:00 [2026-11-07 21:15:50] [FTP] connection received from 192.168.31.161:64624...
[RX] 2026-11-07T21:15:50.907+08:00 [2026-11-07 21:15:50] [FTP] CMD USER admin
[RX] 2026-11-07T21:15:50.918+08:00 [2026-11-07 21:15:50] [FTP] CMD PASS admin
[RX] 2026-11-07T21:15:50.929+08:00 [2026-11-07 21:15:50] [FTP] CMD SIZE /WAVE/WAVE36.BIN
[RX] 2026-11-07T21:15:50.929+08:00 [2026-11-07 21:15:50] [FTP] CMD QUIT
[RX] 2026-11-07T21:15:50.929+08:00 [2026-11-07 21:15:50][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:15:50.939+08:00 [2026-11-07 21:15:50] [FTP] waiting for connection...
[RX] 2026-11-07T21:15:50.971+08:00 [2026-11-07 21:15:50] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:15:51.127+08:00 [2026-11-07 21:15:50] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:15:51.127+08:00 [2026-11-07 21:15:50][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:15:51.439+08:00 [2026-11-07 21:15:50][NET] sock1 standalone accept
[RX] 2026-11-07T21:15:51.459+08:00 [2026-11-07 21:15:50] [FTP] connection received from 192.168.31.161:64625...
[RX] 2026-11-07T21:15:51.470+08:00 [2026-11-07 21:15:50] [FTP] CMD USER admin
[RX] 2026-11-07T21:15:51.470+08:00 [2026-11-07 21:15:50] [FTP] CMD PASS admin
[RX] 2026-11-07T21:15:51.470+08:00 [2026-11-07 21:15:50] [FTP] CMD TYPE I
[RX] 2026-11-07T21:15:51.480+08:00 [2026-11-07 21:15:50] [FTP] CMD PASV
[RX] 2026-11-07T21:15:51.532+08:00 [2026-11-07 21:15:50][NET] sock3 standalone accept
[RX] 2026-11-07T21:15:51.594+08:00 [2026-11-07 21:15:50] [FTP] CMD RETR /WAVE/WAVE36.BIN
[RX] 2026-11-07T21:15:51.604+08:00 [2026-11-07 21:15:50] [WAVE][WARN] seg held 62 ms (idx=44)
[RX] 2026-11-07T21:15:51.781+08:00 [2026-11-07 21:15:51] [FTP] DOWNLOAD '/WAVE/WAVE36.BIN' OK
[RX] 2026-11-07T21:15:51.781+08:00 [2026-11-07 21:15:51] [FTP] CMD QUIT
[RX] 2026-11-07T21:15:51.791+08:00 [2026-11-07 21:15:51][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:15:51.791+08:00 [2026-11-07 21:15:51] [FTP] waiting for connection...
[RX] 2026-11-07T21:15:51.822+08:00 [2026-11-07 21:15:51] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:15:51.822+08:00 MISS start snap=0x000001E7 req=0x000001F7 t=119296
[RX] 2026-11-07T21:15:51.979+08:00 [2026-11-07 21:15:51] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:15:52.301+08:00 [2026-11-07 21:15:51][NET] sock1 standalone accept
[RX] 2026-11-07T21:15:52.312+08:00 [2026-11-07 21:15:51] [FTP] connection received from 192.168.31.161:54362...
[RX] 2026-11-07T21:15:52.312+08:00 [2026-11-07 21:15:51] [FTP] CMD USER admin
[RX] 2026-11-07T21:15:52.323+08:00 [2026-11-07 21:15:51] [FTP] CMD PASS admin
[RX] 2026-11-07T21:15:52.333+08:00 [2026-11-07 21:15:51] [FTP] CMD CWD /WAVE
[RX] 2026-11-07T21:15:52.333+08:00 [2026-11-07 21:15:51] [FTP] CMD TYPE A
[RX] 2026-11-07T21:15:52.333+08:00 [2026-11-07 21:15:51] [FTP] CMD PASV
[RX] 2026-11-07T21:15:52.385+08:00 [2026-11-07 21:15:51][NET] sock3 standalone accept
[RX] 2026-11-07T21:15:52.406+08:00 [2026-11-07 21:15:51] [FTP] CMD LIST
[RX] 2026-11-07T21:15:52.582+08:00 [2026-11-07 21:15:51] [FTP] CMD CWD /
[RX] 2026-11-07T21:15:52.582+08:00 [2026-11-07 21:15:51] [FTP] CMD TYPE A
[RX] 2026-11-07T21:15:52.593+08:00 [2026-11-07 21:15:51] [FTP] CMD PASV
[RX] 2026-11-07T21:15:52.635+08:00 [2026-11-07 21:15:51][NET] sock3 standalone accept
[RX] 2026-11-07T21:15:52.635+08:00 MISS start snap=0x00000177 req=0x000001F7 t=120110
[RX] 2026-11-07T21:15:52.666+08:00 [2026-11-07 21:15:51] [FTP] CMD LIST
[RX] 2026-11-07T21:15:52.781+08:00 [2026-11-07 21:15:52] [FTP] CMD QUIT
[RX] 2026-11-07T21:15:52.791+08:00 [2026-11-07 21:15:52][NET] sock1 DISCONNECTED, releasing (chip st=0x05/0x00)
[RX] 2026-11-07T21:15:52.791+08:00 [2026-11-07 21:15:52] [FTP] waiting for connection...
[RX] 2026-11-07T21:15:52.823+08:00 [2026-11-07 21:15:52] sock1 relisten settle (sock=0x00 tcp=0x00)
[RX] 2026-11-07T21:15:52.886+08:00 MISS start snap=0x00000177 req=0x000001F7 t=120348
[RX] 2026-11-07T21:15:52.989+08:00 [2026-11-07 21:15:52] sock1 auto-relisten ok (accept)
[RX] 2026-11-07T21:15:52.989+08:00 [2026-11-07 21:15:52][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T21:15:53.052+08:00 [2026-11-07 21:15:52][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[RX] 2026-11-07T21:15:53.062+08:00 [2026-11-07 21:15:52][ADC_TASK] adc: UA=-21 UB=404 UC=607 UN=-20 IA=-20 IB=0 IC=772 IN=831 T=751
[RX] 2026-11-07T21:15:53.073+08:00 [2026-11-07 21:15:52][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[RX] 2026-11-07T21:15:53.073+08:00 [2026-11-07 21:15:52][ADC_TASK] meas: seq=600 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[RX] 2026-11-07T21:15:53.083+08:00 [2026-11-07 21:15:52][ADC_TASK] wave: seg=44 armed=0 src=T pts=320 err=5 ovf=11 drop=200120
[RX] 2026-11-07T21:15:53.581+08:00 [2026-11-07 21:15:52] [WAVE][WARN] seg held 51 ms (idx=45)
[RX] 2026-11-07T21:15:53.632+08:00 [2026-11-07 21:15:52] [STACK] default peak_used=2188/5120 free_min=2932 (57%)
[RX] 2026-11-07T21:15:53.642+08:00 [2026-11-07 21:15:52] [STACK] net peak_used=1188/3840 free_min=2652 (69%)
[RX] 2026-11-07T21:15:53.653+08:00 [2026-11-07 21:15:52] [STACK] ftp peak_used=2356/4096 free_min=1740 (42%)
[RX] 2026-11-07T21:15:53.653+08:00 [2026-11-07 21:15:52] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[RX] 2026-11-07T21:15:53.663+08:00 [2026-11-07 21:15:52] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[RX] 2026-11-07T21:15:53.674+08:00 [2026-11-07 21:15:52] [STACK] adc peak_used=1000/2560 free_min=1560 (60%)
[RX] 2026-11-07T21:15:53.674+08:00 [2026-11-07 21:15:53] [STACK] iec104 peak_used=544/2560 free_min=2016 (78%)
[RX] 2026-11-07T21:15:53.684+08:00 [2026-11-07 21:15:53] [STACK] protect peak_used=624/2048 free_min=1424 (69%)
[RX] 2026-11-07T21:15:53.695+08:00 [2026-11-07 21:15:53] [STACK] heap free=15624 min_ever=8464
[RX] 2026-11-07T21:15:55.573+08:00 [2026-11-07 21:15:54] [WAVE][WARN] seg held 58 ms (idx=46)
[RX] 2026-11-07T21:15:57.611+08:00 [2026-11-07 21:15:56] [WAVE][WARN] seg held 57 ms (idx=47)
[RX] 2026-11-07T21:15:59.560+08:00 [2026-11-07 21:15:58] [WAVE][WARN] seg held 58 ms (idx=48)
@@ -0,0 +1,259 @@
{
"mode": "sweep7",
"remote": "/FILL3.BIN",
"t_start": "2026-11-07T21:13:52.246+08:00",
"probes": [
{
"n": 1,
"fe": 1794057253.3715,
"delta": 0.16,
"lad": 0.0,
"anchor": 1794057235.367,
"meas": false,
"start_at": 1794057253.2115,
"dur_ema": 2.35,
"dur_ms": 2384,
"start_epoch": 1794057253.2117734,
"err_lines_new": [],
"dl_rx": 1794057255.593,
"grab": "[RX] 2026-11-07T21:14:17.612+08:00 [2026-11-07 21:14:16] [WAVE][WARN] seg held 64 ms (idx=11)",
"rel": 2.019,
"cls": "LATE",
"anchor_after": 1794057253.3569999
},
{
"n": 2,
"fe": 1794057261.359,
"delta": 0.1286,
"lad": -0.045,
"anchor": 1794057253.3569999,
"meas": true,
"start_at": 1794057261.2304,
"dur_ema": 2.364,
"dur_ms": 2383,
"start_epoch": 1794057261.2308095,
"err_lines_new": [],
"dl_rx": 1794057263.61,
"grab": "[RX] 2026-11-07T21:14:25.617+08:00 [2026-11-07 21:14:24] [WAVE][WARN] seg held 63 ms (idx=13)",
"rel": 2.007,
"cls": "LATE",
"anchor_after": 1794057261.3630002
},
{
"n": 3,
"fe": 1794057269.3650002,
"delta": 0.2264,
"lad": 0.045,
"anchor": 1794057261.3630002,
"meas": true,
"start_at": 1794057269.1386402,
"dur_ema": 2.371,
"dur_ms": 2269,
"start_epoch": 1794057269.1391664,
"err_lines_new": [],
"dl_rx": 1794057271.41,
"grab": "[RX] 2026-11-07T21:14:31.368+08:00 [2026-11-07 21:14:30] [WAVE][WARN] seg held 63 ms (idx=15)",
"rel": -0.042,
"cls": "E",
"anchor_after": 1794057261.3630002
},
{
"n": 4,
"fe": 1794057277.367,
"delta": 0.0504,
"lad": -0.09,
"anchor": 1794057261.3630002,
"meas": true,
"start_at": 1794057277.316584,
"dur_ema": 2.33,
"dur_ms": 2325,
"start_epoch": 1794057277.3168,
"err_lines_new": [],
"dl_rx": 1794057279.641,
"grab": "[RX] 2026-11-07T21:14:41.573+08:00 [2026-11-07 21:14:40] [WAVE][WARN] seg held 64 ms (idx=18)",
"rel": 1.932,
"cls": "LATE",
"anchor_after": 1794057277.3179998
},
{
"n": 5,
"fe": 1794057285.32,
"delta": 0.2282,
"lad": 0.09,
"anchor": 1794057277.3179998,
"meas": true,
"start_at": 1794057285.0917504,
"dur_ema": 2.328,
"dur_ms": 2366,
"start_epoch": 1794057285.092287,
"err_lines_new": [],
"dl_rx": 1794057287.461,
"grab": "[RX] 2026-11-07T21:14:47.420+08:00 [2026-11-07 21:14:46] [WAVE][WARN] seg held 62 ms (idx=20)",
"rel": -0.041,
"cls": "E",
"anchor_after": 1794057277.3179998
},
{
"n": 6,
"fe": 1794057293.3219998,
"delta": 0.1733,
"lad": 0.02,
"anchor": 1794057277.3179998,
"meas": true,
"start_at": 1794057293.14865,
"dur_ema": 2.343,
"dur_ms": 2246,
"start_epoch": 1794057293.1490636,
"err_lines_new": [],
"dl_rx": 1794057295.401,
"grab": "[RX] 2026-11-07T21:14:55.380+08:00 [2026-11-07 21:14:54] [WAVE][WARN] seg held 62 ms (idx=23)",
"rel": -0.021,
"cls": "E",
"anchor_after": 1794057277.3179998
},
{
"n": 7,
"fe": 1794057301.324,
"delta": 0.0944,
"lad": -0.02,
"anchor": 1794057277.3179998,
"meas": true,
"start_at": 1794057301.22959,
"dur_ema": 2.304,
"dur_ms": 2545,
"start_epoch": 1794057301.2299962,
"err_lines_new": [],
"dl_rx": 1794057303.773,
"grab": "[RX] 2026-11-07T21:15:05.585+08:00 [2026-11-07 21:15:04] [WAVE][WARN] seg held 69 ms (idx=26)",
"rel": 1.812,
"cls": "LATE",
"anchor_after": 1794057301.325
},
{
"n": 8,
"fe": 1794057309.3270001,
"delta": 0.2106,
"lad": 0.0,
"anchor": 1794057301.325,
"meas": true,
"start_at": 1794057309.1163542,
"dur_ema": 2.401,
"dur_ms": 2462,
"start_epoch": 1794057309.116947,
"err_lines_new": [],
"dl_rx": 1794057311.575,
"grab": "[RX] 2026-11-07T21:15:11.472+08:00 [2026-11-07 21:15:10] [WAVE][WARN] seg held 62 ms (idx=28)",
"rel": -0.103,
"cls": "E",
"anchor_after": 1794057301.325
},
{
"n": 9,
"fe": 1794057317.329,
"delta": 0.1902,
"lad": -0.045,
"anchor": 1794057301.325,
"meas": true,
"start_at": 1794057317.1388125,
"dur_ema": 2.425,
"dur_ms": 2453,
"start_epoch": 1794057317.1393352,
"err_lines_new": [],
"dl_rx": 1794057319.594,
"grab": "[RX] 2026-11-07T21:15:19.470+08:00 [2026-11-07 21:15:18] [WAVE][WARN] seg held 64 ms (idx=31)",
"rel": -0.124,
"cls": "E",
"anchor_after": 1794057301.325
},
{
"n": 10,
"fe": 1794057325.331,
"delta": 0.2913,
"lad": 0.045,
"anchor": 1794057301.325,
"meas": true,
"start_at": 1794057325.0396876,
"dur_ema": 2.436,
"dur_ms": 2389,
"start_epoch": 1794057325.039925,
"err_lines_new": [],
"dl_rx": 1794057327.433,
"grab": "[RX] 2026-11-07T21:15:27.392+08:00 [2026-11-07 21:15:26] [WAVE][WARN] seg held 61 ms (idx=34)",
"rel": -0.041,
"cls": "E",
"anchor_after": 1794057301.325
},
{
"n": 11,
"fe": 1794057333.333,
"delta": 0.1374,
"lad": -0.09,
"anchor": 1794057301.325,
"meas": true,
"start_at": 1794057333.1956124,
"dur_ema": 2.417,
"dur_ms": 2388,
"start_epoch": 1794057333.195739,
"err_lines_new": [
"[RX] 2026-11-07T21:15:35.576+08:00 [2026-11-07 21:15:34][ERR] [WAVE] seg drop: ring abandoned (idx=36 written=5250)"
],
"dl_rx": 1794057335.587,
"grab": "[RX] 2026-11-07T21:15:35.576+08:00 [2026-11-07 21:15:34] [WAVE][WARN] seg held 124 ms (idx=36)",
"rel": -0.011,
"cls": "HIT",
"anchor_after": 1794057301.325
}
],
"hits": [
"[RX] 2026-11-07T21:15:35.576+08:00 [2026-11-07 21:15:34][ERR] [WAVE] seg drop: ring abandoned (idx=36 written=5250)"
],
"windows": [],
"resets": [],
"bootstrap_reset": {
"rc": 0,
"out": "ware reset\nDevice ID: 0x413 \nDevice flash Size: 1024 Kbytes\nDevice family: STM32F405xx/F407xx/F415xx/F417xx\n\nMCU Reset.\n\nrun application to exit\nApplication started.\nRC: 0 elapsed_ms=233\nSTLINK_RC=0\n",
"err": "",
"ts": "2026-11-07T21:13:52.527+08:00"
},
"anchor0": 1794057235.367,
"hit_slot": "/WAVE/WAVE36.BIN",
"P1": {
"slot": {
"path": "/WAVE/WAVE36.BIN",
"size": 5250,
"ts": "2026-11-07T21:15:38.934+08:00"
},
"ctrl": {
"path": "/WAVE/WAVE00.BIN",
"size": 126000,
"ts": "2026-11-07T21:15:39.486+08:00"
}
},
"P2": {
"slot": {
"path": "/WAVE/WAVE36.BIN",
"size": 5250,
"ts": "2026-11-07T21:15:41.848+08:00"
}
},
"P3": {
"slot": {
"path": "/WAVE/WAVE36.BIN",
"size": 5250,
"ts": "2026-11-07T21:15:50.920+08:00"
},
"sha": {
"path": "/WAVE/WAVE36.BIN",
"bytes": 5250,
"sha256": "b12e130e80fb4d8b5f47498af153294dc54856ed961056dd9851ceec2a0a11ca",
"ts": "2026-11-07T21:15:51.779+08:00"
},
"hb_after": "[RX] 2026-11-07T21:15:43.082+08:00 [2026-11-07 21:15:42][ADC_TASK] wave: seg=39 armed=0 src=T pts=320 err=5 ovf=11 drop=196424"
},
"dir_after": {
"ts": "2026-11-07T21:15:52.316+08:00",
"list": "226 Closing data connection.",
"root": "226 Closing data connection."
},
"t_end": "2026-11-07T21:15:52.779+08:00"
}
@@ -0,0 +1,17 @@
{"n": 1, "fe": 1794056986.4975, "delta": 0.23, "lad": 0.0, "anchor": 1794056968.493, "meas": false, "start_at": 1794056986.2675, "dur_ema": 2.35, "dur_ms": 2324, "start_epoch": 1794056986.268142, "err_lines_new": [], "dl_rx": 1794056988.594, "grab": "[RX] 2026-11-07T21:09:48.583+08:00 [2026-11-07 21:09:47] [WAVE][WARN] seg held 63 ms (idx=11)", "rel": -0.011, "cls": "E", "anchor_after": 1794056988.33}
{"n": 2, "fe": 1794056994.3314998, "delta": 0.1746, "lad": -0.045, "anchor": 1794056988.33, "meas": true, "start_at": 1794056994.1569, "dur_ema": 2.34, "dur_ms": 2339, "start_epoch": 1794056994.157187, "err_lines_new": [], "dl_rx": 1794056996.498, "grab": "[RX] 2026-11-07T21:09:56.425+08:00 [2026-11-07 21:09:55] [WAVE][WARN] seg held 61 ms (idx=14)", "rel": -0.073, "cls": "E", "anchor_after": 1794056996.174}
{"n": 3, "fe": 1794057002.1755, "delta": 0.2644, "lad": 0.045, "anchor": 1794056996.174, "meas": true, "start_at": 1794057001.91114, "dur_ema": 2.339, "dur_ms": 2237, "start_epoch": 1794057001.9116395, "err_lines_new": [], "dl_rx": 1794057004.154, "grab": "[RX] 2026-11-07T21:10:04.133+08:00 [2026-11-07 21:10:03] [WAVE][WARN] seg held 63 ms (idx=17)", "rel": -0.021, "cls": "E", "anchor_after": 1794057003.8799999}
{"n": 4, "fe": 1794057009.8814998, "delta": 0.2684, "lad": 0.09, "anchor": 1794057003.8799999, "meas": true, "start_at": 1794057009.6130838, "dur_ema": 2.298, "dur_ms": 2382, "start_epoch": 1794057009.6133535, "err_lines_new": [], "dl_rx": 1794057011.995, "grab": "[RX] 2026-11-07T21:10:11.964+08:00 [2026-11-07 21:10:11] [WAVE][WARN] seg held 59 ms (idx=20)", "rel": -0.031, "cls": "E", "anchor_after": 1794057011.715}
{"n": 5, "fe": 1794057017.7164998, "delta": 0.1218, "lad": -0.09, "anchor": 1794057011.715, "meas": true, "start_at": 1794057017.5946503, "dur_ema": 2.332, "dur_ms": 2302, "start_epoch": 1794057017.595509, "err_lines_new": [], "dl_rx": 1794057019.896, "grab": "[RX] 2026-11-07T21:10:19.854+08:00 [2026-11-07 21:10:19] [WAVE][WARN] seg held 62 ms (idx=23)", "rel": -0.042, "cls": "E", "anchor_after": 1794057019.602}
{"n": 6, "fe": 1794057025.6035, "delta": 0.3349, "lad": 0.135, "anchor": 1794057019.602, "meas": true, "start_at": 1794057025.2685902, "dur_ema": 2.32, "dur_ms": 2428, "start_epoch": 1794057025.2690685, "err_lines_new": [], "dl_rx": 1794057027.7, "grab": "[RX] 2026-11-07T21:10:27.668+08:00 [2026-11-07 21:10:26] [WAVE][WARN] seg held 61 ms (idx=27)", "rel": -0.032, "cls": "E", "anchor_after": 1794057027.417}
{"n": 7, "fe": 1794057033.4185, "delta": 0.1081, "lad": -0.135, "anchor": 1794057027.417, "meas": true, "start_at": 1794057033.310354, "dur_ema": 2.363, "dur_ms": 2389, "start_epoch": 1794057033.3105276, "err_lines_new": [], "dl_rx": 1794057035.695, "grab": "[RX] 2026-11-07T21:10:35.582+08:00 [2026-11-07 21:10:34] [WAVE][WARN] seg held 59 ms (idx=31)", "rel": -0.113, "cls": "E", "anchor_after": 1794057035.333}
{"n": 8, "fe": 1794057041.3344998, "delta": 0.2535, "lad": 0.0, "anchor": 1794057035.333, "meas": true, "start_at": 1794057041.0810122, "dur_ema": 2.373, "dur_ms": 2304, "start_epoch": 1794057041.0815556, "err_lines_new": [], "dl_rx": 1794057043.393, "grab": "[RX] 2026-11-07T21:10:43.372+08:00 [2026-11-07 21:10:42] [WAVE][WARN] seg held 59 ms (idx=35)", "rel": -0.021, "cls": "E", "anchor_after": 1794057043.123}
{"n": 9, "fe": 1794057049.1244998, "delta": 0.1807, "lad": -0.045, "anchor": 1794057043.123, "meas": true, "start_at": 1794057048.9438074, "dur_ema": 2.346, "dur_ms": 2355, "start_epoch": 1794057048.9439747, "err_lines_new": [], "dl_rx": 1794057051.301, "grab": "[RX] 2026-11-07T21:10:51.239+08:00 [2026-11-07 21:10:50] [WAVE][WARN] seg held 57 ms (idx=39)", "rel": -0.062, "cls": "E", "anchor_after": 1794057050.992}
{"n": 10, "fe": 1794057056.9935, "delta": 0.2744, "lad": 0.045, "anchor": 1794057050.992, "meas": true, "start_at": 1794057056.7190845, "dur_ema": 2.349, "dur_ms": 2271, "start_epoch": 1794057056.7191944, "err_lines_new": [], "dl_rx": 1794057058.995, "grab": "[RX] 2026-11-07T21:10:58.985+08:00 [2026-11-07 21:10:58] [WAVE][WARN] seg held 60 ms (idx=43)", "rel": -0.01, "cls": "E", "anchor_after": 1794057058.735}
{"n": 11, "fe": 1794057064.7364998, "delta": 0.288, "lad": 0.09, "anchor": 1794057058.735, "meas": true, "start_at": 1794057064.4484506, "dur_ema": 2.318, "dur_ms": 2452, "start_epoch": 1794057064.4488025, "err_lines_new": [], "dl_rx": 1794057066.901, "grab": "[RX] 2026-11-07T21:11:08.682+08:00 [2026-11-07 21:11:07] [WAVE][WARN] seg held 59 ms (idx=46)", "rel": 1.781, "cls": "LATE", "anchor_after": 1794057064.432}
{"n": 12, "fe": 1794057072.434, "delta": 0.1616, "lad": -0.09, "anchor": 1794057064.432, "meas": true, "start_at": 1794057072.2723703, "dur_ema": 2.372, "dur_ms": 2311, "start_epoch": 1794057072.2729049, "err_lines_new": [], "dl_rx": 1794057074.588, "grab": "[RX] 2026-11-07T21:11:14.537+08:00 [2026-11-07 21:11:13] [WAVE][WARN] seg held 54 ms (idx=48)", "rel": -0.051, "cls": "E", "anchor_after": 1794057074.293}
{"n": 13, "fe": 1794057080.2944999, "delta": 0.3624, "lad": 0.135, "anchor": 1794057074.293, "meas": true, "start_at": 1794057079.9321222, "dur_ema": 2.347, "dur_ms": 2368, "start_epoch": 1794057079.9323525, "err_lines_new": [], "dl_rx": 1794057082.306, "grab": "[RX] 2026-11-07T21:11:22.254+08:00 [2026-11-07 21:11:21] [WAVE][WARN] seg held 54 ms (idx=51)", "rel": -0.052, "cls": "E", "anchor_after": 1794057082.01}
{"n": 14, "fe": 1794057088.0115, "delta": 0.1006, "lad": -0.135, "anchor": 1794057082.01, "meas": true, "start_at": 1794057087.9108732, "dur_ema": 2.356, "dur_ms": 2257, "start_epoch": 1794057087.9113526, "err_lines_new": [], "dl_rx": 1794057090.172, "grab": "[RX] 2026-11-07T21:11:30.161+08:00 [2026-11-07 21:11:29] [WAVE][WARN] seg held 58 ms (idx=54)", "rel": -0.011, "cls": "E", "anchor_after": 1794057089.913}
{"n": 15, "fe": 1794057095.9145, "delta": 0.1962, "lad": 0.0, "anchor": 1794057089.913, "meas": true, "start_at": 1794057095.718324, "dur_ema": 2.316, "dur_ms": 2591, "start_epoch": 1794057095.7185712, "err_lines_new": [], "dl_rx": 1794057098.318, "grab": "[RX] 2026-11-07T21:11:38.193+08:00 [2026-11-07 21:11:37] [WAVE][WARN] seg held 57 ms (idx=57)", "rel": -0.125, "cls": "E", "anchor_after": 1794057097.946}
{"n": 16, "fe": 1794057103.9475, "delta": 0.2611, "lad": -0.045, "anchor": 1794057097.946, "meas": true, "start_at": 1794057103.6863945, "dur_ema": 2.426, "dur_ms": 2414, "start_epoch": 1794057103.6871831, "err_lines_new": [], "dl_rx": 1794057106.107, "grab": "[RX] 2026-11-07T21:11:46.014+08:00 [2026-11-07 21:11:45] [WAVE][WARN] seg held 54 ms (idx=60)", "rel": -0.093, "cls": "E", "anchor_after": 1794057105.77}
{"n": 17, "fe": 1794057111.7714999, "delta": 0.3463, "lad": 0.045, "anchor": 1794057105.77, "meas": true, "start_at": 1794057111.4252365, "dur_ema": 2.421, "dur_ms": 2349, "start_epoch": 1794057111.4257514, "err_lines_new": [], "dl_rx": 1794057113.772, "grab": "[RX] 2026-11-07T21:11:53.741+08:00 [2026-11-07 21:11:52] [WAVE][WARN] seg held 57 ms (idx=63)", "rel": -0.031, "cls": "E", "anchor_after": 1794057113.494}
@@ -0,0 +1,11 @@
{"n": 1, "fe": 1794057253.3715, "delta": 0.16, "lad": 0.0, "anchor": 1794057235.367, "meas": false, "start_at": 1794057253.2115, "dur_ema": 2.35, "dur_ms": 2384, "start_epoch": 1794057253.2117734, "err_lines_new": [], "dl_rx": 1794057255.593, "grab": "[RX] 2026-11-07T21:14:17.612+08:00 [2026-11-07 21:14:16] [WAVE][WARN] seg held 64 ms (idx=11)", "rel": 2.019, "cls": "LATE", "anchor_after": 1794057253.3569999}
{"n": 2, "fe": 1794057261.359, "delta": 0.1286, "lad": -0.045, "anchor": 1794057253.3569999, "meas": true, "start_at": 1794057261.2304, "dur_ema": 2.364, "dur_ms": 2383, "start_epoch": 1794057261.2308095, "err_lines_new": [], "dl_rx": 1794057263.61, "grab": "[RX] 2026-11-07T21:14:25.617+08:00 [2026-11-07 21:14:24] [WAVE][WARN] seg held 63 ms (idx=13)", "rel": 2.007, "cls": "LATE", "anchor_after": 1794057261.3630002}
{"n": 3, "fe": 1794057269.3650002, "delta": 0.2264, "lad": 0.045, "anchor": 1794057261.3630002, "meas": true, "start_at": 1794057269.1386402, "dur_ema": 2.371, "dur_ms": 2269, "start_epoch": 1794057269.1391664, "err_lines_new": [], "dl_rx": 1794057271.41, "grab": "[RX] 2026-11-07T21:14:31.368+08:00 [2026-11-07 21:14:30] [WAVE][WARN] seg held 63 ms (idx=15)", "rel": -0.042, "cls": "E", "anchor_after": 1794057261.3630002}
{"n": 4, "fe": 1794057277.367, "delta": 0.0504, "lad": -0.09, "anchor": 1794057261.3630002, "meas": true, "start_at": 1794057277.316584, "dur_ema": 2.33, "dur_ms": 2325, "start_epoch": 1794057277.3168, "err_lines_new": [], "dl_rx": 1794057279.641, "grab": "[RX] 2026-11-07T21:14:41.573+08:00 [2026-11-07 21:14:40] [WAVE][WARN] seg held 64 ms (idx=18)", "rel": 1.932, "cls": "LATE", "anchor_after": 1794057277.3179998}
{"n": 5, "fe": 1794057285.32, "delta": 0.2282, "lad": 0.09, "anchor": 1794057277.3179998, "meas": true, "start_at": 1794057285.0917504, "dur_ema": 2.328, "dur_ms": 2366, "start_epoch": 1794057285.092287, "err_lines_new": [], "dl_rx": 1794057287.461, "grab": "[RX] 2026-11-07T21:14:47.420+08:00 [2026-11-07 21:14:46] [WAVE][WARN] seg held 62 ms (idx=20)", "rel": -0.041, "cls": "E", "anchor_after": 1794057277.3179998}
{"n": 6, "fe": 1794057293.3219998, "delta": 0.1733, "lad": 0.02, "anchor": 1794057277.3179998, "meas": true, "start_at": 1794057293.14865, "dur_ema": 2.343, "dur_ms": 2246, "start_epoch": 1794057293.1490636, "err_lines_new": [], "dl_rx": 1794057295.401, "grab": "[RX] 2026-11-07T21:14:55.380+08:00 [2026-11-07 21:14:54] [WAVE][WARN] seg held 62 ms (idx=23)", "rel": -0.021, "cls": "E", "anchor_after": 1794057277.3179998}
{"n": 7, "fe": 1794057301.324, "delta": 0.0944, "lad": -0.02, "anchor": 1794057277.3179998, "meas": true, "start_at": 1794057301.22959, "dur_ema": 2.304, "dur_ms": 2545, "start_epoch": 1794057301.2299962, "err_lines_new": [], "dl_rx": 1794057303.773, "grab": "[RX] 2026-11-07T21:15:05.585+08:00 [2026-11-07 21:15:04] [WAVE][WARN] seg held 69 ms (idx=26)", "rel": 1.812, "cls": "LATE", "anchor_after": 1794057301.325}
{"n": 8, "fe": 1794057309.3270001, "delta": 0.2106, "lad": 0.0, "anchor": 1794057301.325, "meas": true, "start_at": 1794057309.1163542, "dur_ema": 2.401, "dur_ms": 2462, "start_epoch": 1794057309.116947, "err_lines_new": [], "dl_rx": 1794057311.575, "grab": "[RX] 2026-11-07T21:15:11.472+08:00 [2026-11-07 21:15:10] [WAVE][WARN] seg held 62 ms (idx=28)", "rel": -0.103, "cls": "E", "anchor_after": 1794057301.325}
{"n": 9, "fe": 1794057317.329, "delta": 0.1902, "lad": -0.045, "anchor": 1794057301.325, "meas": true, "start_at": 1794057317.1388125, "dur_ema": 2.425, "dur_ms": 2453, "start_epoch": 1794057317.1393352, "err_lines_new": [], "dl_rx": 1794057319.594, "grab": "[RX] 2026-11-07T21:15:19.470+08:00 [2026-11-07 21:15:18] [WAVE][WARN] seg held 64 ms (idx=31)", "rel": -0.124, "cls": "E", "anchor_after": 1794057301.325}
{"n": 10, "fe": 1794057325.331, "delta": 0.2913, "lad": 0.045, "anchor": 1794057301.325, "meas": true, "start_at": 1794057325.0396876, "dur_ema": 2.436, "dur_ms": 2389, "start_epoch": 1794057325.039925, "err_lines_new": [], "dl_rx": 1794057327.433, "grab": "[RX] 2026-11-07T21:15:27.392+08:00 [2026-11-07 21:15:26] [WAVE][WARN] seg held 61 ms (idx=34)", "rel": -0.041, "cls": "E", "anchor_after": 1794057301.325}
{"n": 11, "fe": 1794057333.333, "delta": 0.1374, "lad": -0.09, "anchor": 1794057301.325, "meas": true, "start_at": 1794057333.1956124, "dur_ema": 2.417, "dur_ms": 2388, "start_epoch": 1794057333.195739, "err_lines_new": ["[RX] 2026-11-07T21:15:35.576+08:00 [2026-11-07 21:15:34][ERR] [WAVE] seg drop: ring abandoned (idx=36 written=5250)"], "dl_rx": 1794057335.587, "grab": "[RX] 2026-11-07T21:15:35.576+08:00 [2026-11-07 21:15:34] [WAVE][WARN] seg held 124 ms (idx=36)", "rel": -0.011, "cls": "HIT", "anchor_after": 1794057301.325}
@@ -0,0 +1,770 @@
{
"mode": "sweep2",
"remote": "/FILL2.BIN",
"t_start": "2026-11-07T19:28:54.668+08:00",
"rounds": [
{
"start": "2026-11-07T19:29:15.824+08:00",
"start_epoch": 1794050955.8246725,
"end": "2026-11-07T19:29:17.440+08:00",
"dur_ms": 1616,
"round": 1,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:15.503+08:00 [2026-11-07 19:29:14][ADC_TASK] wave: seg=10 armed=0 src=T pts=320 err=0 ovf=0 drop=8016",
"held": [
"[RX] 2026-11-07T19:29:05.982+08:00 [2026-11-07 19:29:04] [WAVE][WARN] seg held 52 ms (idx=6)",
"[RX] 2026-11-07T19:29:09.986+08:00 [2026-11-07 19:29:08] [WAVE][WARN] seg held 52 ms (idx=8)"
]
},
{
"start": "2026-11-07T19:29:20.388+08:00",
"start_epoch": 1794050960.3885086,
"end": "2026-11-07T19:29:21.979+08:00",
"dur_ms": 1591,
"round": 2,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:15.503+08:00 [2026-11-07 19:29:14][ADC_TASK] wave: seg=10 armed=0 src=T pts=320 err=0 ovf=0 drop=8016",
"held": [
"[RX] 2026-11-07T19:29:05.982+08:00 [2026-11-07 19:29:04] [WAVE][WARN] seg held 52 ms (idx=6)",
"[RX] 2026-11-07T19:29:09.986+08:00 [2026-11-07 19:29:08] [WAVE][WARN] seg held 52 ms (idx=8)"
]
},
{
"start": "2026-11-07T19:29:25.411+08:00",
"start_epoch": 1794050965.4118137,
"end": "2026-11-07T19:29:26.993+08:00",
"dur_ms": 1581,
"round": 3,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:25.502+08:00 [2026-11-07 19:29:24][ADC_TASK] wave: seg=15 armed=0 src=T pts=320 err=0 ovf=0 drop=10480",
"held": [
"[RX] 2026-11-07T19:29:09.986+08:00 [2026-11-07 19:29:08] [WAVE][WARN] seg held 52 ms (idx=8)",
"[RX] 2026-11-07T19:29:27.961+08:00 [2026-11-07 19:29:26] [WAVE][WARN] seg held 51 ms (idx=17)"
]
},
{
"start": "2026-11-07T19:29:30.137+08:00",
"start_epoch": 1794050970.1374831,
"end": "2026-11-07T19:29:31.763+08:00",
"dur_ms": 1627,
"round": 4,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:25.502+08:00 [2026-11-07 19:29:24][ADC_TASK] wave: seg=15 armed=0 src=T pts=320 err=0 ovf=0 drop=10480",
"held": [
"[RX] 2026-11-07T19:29:27.961+08:00 [2026-11-07 19:29:26] [WAVE][WARN] seg held 51 ms (idx=17)",
"[RX] 2026-11-07T19:29:32.024+08:00 [2026-11-07 19:29:30] [WAVE][WARN] seg held 99 ms (idx=19)"
]
},
{
"start": "2026-11-07T19:29:34.012+08:00",
"start_epoch": 1794050974.0120728,
"end": "2026-11-07T19:29:35.564+08:00",
"dur_ms": 1553,
"round": 5,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:35.503+08:00 [2026-11-07 19:29:34][ADC_TASK] wave: seg=20 armed=0 src=T pts=320 err=0 ovf=0 drop=21800",
"held": [
"[RX] 2026-11-07T19:29:27.961+08:00 [2026-11-07 19:29:26] [WAVE][WARN] seg held 51 ms (idx=17)",
"[RX] 2026-11-07T19:29:32.024+08:00 [2026-11-07 19:29:30] [WAVE][WARN] seg held 99 ms (idx=19)"
]
},
{
"start": "2026-11-07T19:29:38.711+08:00",
"start_epoch": 1794050978.7110798,
"end": "2026-11-07T19:29:40.210+08:00",
"dur_ms": 1499,
"round": 6,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:35.503+08:00 [2026-11-07 19:29:34][ADC_TASK] wave: seg=20 armed=0 src=T pts=320 err=0 ovf=0 drop=21800",
"held": [
"[RX] 2026-11-07T19:29:27.961+08:00 [2026-11-07 19:29:26] [WAVE][WARN] seg held 51 ms (idx=17)",
"[RX] 2026-11-07T19:29:32.024+08:00 [2026-11-07 19:29:30] [WAVE][WARN] seg held 99 ms (idx=19)"
]
},
{
"start": "2026-11-07T19:29:43.054+08:00",
"start_epoch": 1794050983.0540175,
"end": "2026-11-07T19:29:44.595+08:00",
"dur_ms": 1541,
"round": 7,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:45.617+08:00 [2026-11-07 19:29:44][ADC_TASK] wave: seg=25 armed=0 src=T pts=320 err=0 ovf=0 drop=31320",
"held": [
"[RX] 2026-11-07T19:29:27.961+08:00 [2026-11-07 19:29:26] [WAVE][WARN] seg held 51 ms (idx=17)",
"[RX] 2026-11-07T19:29:32.024+08:00 [2026-11-07 19:29:30] [WAVE][WARN] seg held 99 ms (idx=19)"
]
},
{
"start": "2026-11-07T19:29:46.945+08:00",
"start_epoch": 1794050986.945817,
"end": "2026-11-07T19:29:48.445+08:00",
"dur_ms": 1499,
"round": 8,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:45.617+08:00 [2026-11-07 19:29:44][ADC_TASK] wave: seg=25 armed=0 src=T pts=320 err=0 ovf=0 drop=31320",
"held": [
"[RX] 2026-11-07T19:29:27.961+08:00 [2026-11-07 19:29:26] [WAVE][WARN] seg held 51 ms (idx=17)",
"[RX] 2026-11-07T19:29:32.024+08:00 [2026-11-07 19:29:30] [WAVE][WARN] seg held 99 ms (idx=19)"
]
},
{
"start": "2026-11-07T19:29:50.486+08:00",
"start_epoch": 1794050990.4860992,
"end": "2026-11-07T19:29:52.015+08:00",
"dur_ms": 1529,
"round": 9,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:45.617+08:00 [2026-11-07 19:29:44][ADC_TASK] wave: seg=25 armed=0 src=T pts=320 err=0 ovf=0 drop=31320",
"held": [
"[RX] 2026-11-07T19:29:32.024+08:00 [2026-11-07 19:29:30] [WAVE][WARN] seg held 99 ms (idx=19)",
"[RX] 2026-11-07T19:29:52.000+08:00 [2026-11-07 19:29:50] [WAVE][WARN] seg held 51 ms (idx=29)"
]
},
{
"start": "2026-11-07T19:29:55.061+08:00",
"start_epoch": 1794050995.0619583,
"end": "2026-11-07T19:29:56.660+08:00",
"dur_ms": 1599,
"round": 10,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:55.508+08:00 [2026-11-07 19:29:54][ADC_TASK] wave: seg=30 armed=0 src=T pts=320 err=0 ovf=0 drop=38144",
"held": [
"[RX] 2026-11-07T19:29:32.024+08:00 [2026-11-07 19:29:30] [WAVE][WARN] seg held 99 ms (idx=19)",
"[RX] 2026-11-07T19:29:52.000+08:00 [2026-11-07 19:29:50] [WAVE][WARN] seg held 51 ms (idx=29)"
]
},
{
"start": "2026-11-07T19:29:59.917+08:00",
"start_epoch": 1794050999.9178953,
"end": "2026-11-07T19:30:01.565+08:00",
"dur_ms": 1648,
"round": 11,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:29:55.508+08:00 [2026-11-07 19:29:54][ADC_TASK] wave: seg=30 armed=0 src=T pts=320 err=0 ovf=0 drop=38144",
"held": [
"[RX] 2026-11-07T19:29:59.975+08:00 [2026-11-07 19:29:58] [WAVE][WARN] seg held 52 ms (idx=33)",
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)"
]
},
{
"start": "2026-11-07T19:30:03.406+08:00",
"start_epoch": 1794051003.4064732,
"end": "2026-11-07T19:30:04.965+08:00",
"dur_ms": 1559,
"round": 12,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:05.504+08:00 [2026-11-07 19:30:04][ADC_TASK] wave: seg=35 armed=0 src=T pts=320 err=0 ovf=0 drop=54168",
"held": [
"[RX] 2026-11-07T19:29:59.975+08:00 [2026-11-07 19:29:58] [WAVE][WARN] seg held 52 ms (idx=33)",
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)"
]
},
{
"start": "2026-11-07T19:30:07.609+08:00",
"start_epoch": 1794051007.6099582,
"end": "2026-11-07T19:30:09.168+08:00",
"dur_ms": 1558,
"round": 13,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:05.504+08:00 [2026-11-07 19:30:04][ADC_TASK] wave: seg=35 armed=0 src=T pts=320 err=0 ovf=0 drop=54168",
"held": [
"[RX] 2026-11-07T19:29:59.975+08:00 [2026-11-07 19:29:58] [WAVE][WARN] seg held 52 ms (idx=33)",
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)"
]
},
{
"start": "2026-11-07T19:30:12.732+08:00",
"start_epoch": 1794051012.7321181,
"end": "2026-11-07T19:30:14.366+08:00",
"dur_ms": 1634,
"round": 14,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:15.504+08:00 [2026-11-07 19:30:14][ADC_TASK] wave: seg=40 armed=0 src=T pts=320 err=0 ovf=0 drop=68528",
"held": [
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)",
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)"
]
},
{
"start": "2026-11-07T19:30:17.116+08:00",
"start_epoch": 1794051017.1160338,
"end": "2026-11-07T19:30:18.598+08:00",
"dur_ms": 1482,
"round": 15,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:15.504+08:00 [2026-11-07 19:30:14][ADC_TASK] wave: seg=40 armed=0 src=T pts=320 err=0 ovf=0 drop=68528",
"held": [
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)",
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)"
]
},
{
"start": "2026-11-07T19:30:20.945+08:00",
"start_epoch": 1794051020.9456198,
"end": "2026-11-07T19:30:22.455+08:00",
"dur_ms": 1510,
"round": 16,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:15.504+08:00 [2026-11-07 19:30:14][ADC_TASK] wave: seg=40 armed=0 src=T pts=320 err=0 ovf=0 drop=68528",
"held": [
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)",
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)"
]
},
{
"start": "2026-11-07T19:30:25.297+08:00",
"start_epoch": 1794051025.297716,
"end": "2026-11-07T19:30:26.965+08:00",
"dur_ms": 1668,
"round": 17,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:25.512+08:00 [2026-11-07 19:30:24][ADC_TASK] wave: seg=45 armed=0 src=T pts=320 err=0 ovf=0 drop=79704",
"held": [
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)",
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)"
]
},
{
"start": "2026-11-07T19:30:29.510+08:00",
"start_epoch": 1794051029.5106008,
"end": "2026-11-07T19:30:31.067+08:00",
"dur_ms": 1557,
"round": 18,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:25.512+08:00 [2026-11-07 19:30:24][ADC_TASK] wave: seg=45 armed=0 src=T pts=320 err=0 ovf=0 drop=79704",
"held": [
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)",
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)"
]
},
{
"start": "2026-11-07T19:30:32.913+08:00",
"start_epoch": 1794051032.9134269,
"end": "2026-11-07T19:30:34.472+08:00",
"dur_ms": 1559,
"round": 19,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:35.502+08:00 [2026-11-07 19:30:34][ADC_TASK] wave: seg=50 armed=0 src=T pts=320 err=0 ovf=0 drop=102496",
"held": [
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)",
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)"
]
},
{
"start": "2026-11-07T19:30:37.116+08:00",
"start_epoch": 1794051037.1162913,
"end": "2026-11-07T19:30:38.766+08:00",
"dur_ms": 1651,
"round": 20,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:35.502+08:00 [2026-11-07 19:30:34][ADC_TASK] wave: seg=50 armed=0 src=T pts=320 err=0 ovf=0 drop=102496",
"held": [
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)",
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)"
]
},
{
"start": "2026-11-07T19:30:41.939+08:00",
"start_epoch": 1794051041.9395332,
"end": "2026-11-07T19:30:43.567+08:00",
"dur_ms": 1628,
"round": 21,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:35.502+08:00 [2026-11-07 19:30:34][ADC_TASK] wave: seg=50 armed=0 src=T pts=320 err=0 ovf=0 drop=102496",
"held": [
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)",
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)"
]
},
{
"start": "2026-11-07T19:30:45.614+08:00",
"start_epoch": 1794051045.6142116,
"end": "2026-11-07T19:30:47.173+08:00",
"dur_ms": 1559,
"round": 22,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:45.500+08:00 [2026-11-07 19:30:44][ADC_TASK] wave: seg=55 armed=0 src=T pts=320 err=0 ovf=0 drop=111056",
"held": [
"[RX] 2026-11-07T19:30:01.985+08:00 [2026-11-07 19:30:00] [WAVE][WARN] seg held 52 ms (idx=34)",
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)"
]
},
{
"start": "2026-11-07T19:30:50.223+08:00",
"start_epoch": 1794051050.2224383,
"end": "2026-11-07T19:30:51.809+08:00",
"dur_ms": 1587,
"round": 23,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:45.500+08:00 [2026-11-07 19:30:44][ADC_TASK] wave: seg=55 armed=0 src=T pts=320 err=0 ovf=0 drop=111056",
"held": [
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)",
"[RX] 2026-11-07T19:30:51.987+08:00 [2026-11-07 19:30:50] [WAVE][WARN] seg held 55 ms (idx=59)"
]
},
{
"start": "2026-11-07T19:30:55.154+08:00",
"start_epoch": 1794051055.1541958,
"end": "2026-11-07T19:30:56.772+08:00",
"dur_ms": 1619,
"round": 24,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:55.509+08:00 [2026-11-07 19:30:54][ADC_TASK] wave: seg=60 armed=0 src=T pts=320 err=0 ovf=0 drop=123016",
"held": [
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)",
"[RX] 2026-11-07T19:30:51.987+08:00 [2026-11-07 19:30:50] [WAVE][WARN] seg held 55 ms (idx=59)"
]
},
{
"start": "2026-11-07T19:30:59.114+08:00",
"start_epoch": 1794051059.114208,
"end": "2026-11-07T19:31:00.772+08:00",
"dur_ms": 1658,
"round": 25,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:30:55.509+08:00 [2026-11-07 19:30:54][ADC_TASK] wave: seg=60 armed=0 src=T pts=320 err=0 ovf=0 drop=123016",
"held": [
"[RX] 2026-11-07T19:30:14.239+08:00 [2026-11-07 19:30:13] [WAVE][WARN] seg held 51 ms (idx=40)",
"[RX] 2026-11-07T19:30:51.987+08:00 [2026-11-07 19:30:50] [WAVE][WARN] seg held 55 ms (idx=59)"
]
},
{
"start": "2026-11-07T19:31:03.120+08:00",
"start_epoch": 1794051063.1209435,
"end": "2026-11-07T19:31:04.767+08:00",
"dur_ms": 1647,
"round": 26,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:05.500+08:00 [2026-11-07 19:31:04][ADC_TASK] wave: seg=65 armed=0 src=T pts=320 err=0 ovf=0 drop=143056",
"held": [
"[RX] 2026-11-07T19:30:51.987+08:00 [2026-11-07 19:30:50] [WAVE][WARN] seg held 55 ms (idx=59)",
"[RX] 2026-11-07T19:31:04.680+08:00 [2026-11-07 19:31:03] [WAVE][WARN] seg held 92 ms (idx=65)"
]
},
{
"start": "2026-11-07T19:31:07.821+08:00",
"start_epoch": 1794051067.8214972,
"end": "2026-11-07T19:31:09.410+08:00",
"dur_ms": 1589,
"round": 27,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:05.500+08:00 [2026-11-07 19:31:04][ADC_TASK] wave: seg=65 armed=0 src=T pts=320 err=0 ovf=0 drop=143056",
"held": [
"[RX] 2026-11-07T19:31:07.990+08:00 [2026-11-07 19:31:06] [WAVE][WARN] seg held 76 ms (idx=67)",
"[RX] 2026-11-07T19:31:10.081+08:00 [2026-11-07 19:31:08] [WAVE][WARN] seg held 146 ms (idx=68)"
]
},
{
"start": "2026-11-07T19:31:12.365+08:00",
"start_epoch": 1794051072.3654168,
"end": "2026-11-07T19:31:13.985+08:00",
"dur_ms": 1621,
"round": 28,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:05.500+08:00 [2026-11-07 19:31:04][ADC_TASK] wave: seg=65 armed=0 src=T pts=320 err=0 ovf=0 drop=143056",
"held": [
"[RX] 2026-11-07T19:31:12.047+08:00 [2026-11-07 19:31:10] [WAVE][WARN] seg held 122 ms (idx=69)",
"[RX] 2026-11-07T19:31:14.108+08:00 [2026-11-07 19:31:12] [WAVE][WARN] seg held 127 ms (idx=70)"
]
},
{
"start": "2026-11-07T19:31:16.151+08:00",
"start_epoch": 1794051076.1515968,
"end": "2026-11-07T19:31:17.770+08:00",
"dur_ms": 1619,
"round": 29,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:15.507+08:00 [2026-11-07 19:31:14][ADC_TASK] wave: seg=70 armed=0 src=T pts=320 err=0 ovf=0 drop=148656",
"held": [
"[RX] 2026-11-07T19:31:16.054+08:00 [2026-11-07 19:31:14] [WAVE][WARN] seg held 123 ms (idx=71)",
"[RX] 2026-11-07T19:31:18.290+08:00 [2026-11-07 19:31:17] [WAVE][WARN] seg held 350 ms (idx=72)"
]
},
{
"start": "2026-11-07T19:31:20.429+08:00",
"start_epoch": 1794051080.4295971,
"end": "2026-11-07T19:31:21.987+08:00",
"dur_ms": 1558,
"round": 30,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:15.507+08:00 [2026-11-07 19:31:14][ADC_TASK] wave: seg=70 armed=0 src=T pts=320 err=0 ovf=0 drop=148656",
"held": [
"[RX] 2026-11-07T19:31:20.003+08:00 [2026-11-07 19:31:18] [WAVE][WARN] seg held 94 ms (idx=73)",
"[RX] 2026-11-07T19:31:21.998+08:00 [2026-11-07 19:31:20] [WAVE][WARN] seg held 96 ms (idx=74)"
]
},
{
"start": "2026-11-07T19:31:24.743+08:00",
"start_epoch": 1794051084.7433267,
"end": "2026-11-07T19:31:26.386+08:00",
"dur_ms": 1643,
"round": 31,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:25.505+08:00 [2026-11-07 19:31:24][ADC_TASK] wave: seg=75 armed=0 src=T pts=320 err=0 ovf=0 drop=155648",
"held": [
"[RX] 2026-11-07T19:31:24.033+08:00 [2026-11-07 19:31:22] [WAVE][WARN] seg held 98 ms (idx=75)",
"[RX] 2026-11-07T19:31:26.445+08:00 [2026-11-07 19:31:25] [WAVE][WARN] seg held 152 ms (idx=76)"
]
},
{
"start": "2026-11-07T19:31:27.955+08:00",
"start_epoch": 1794051087.955911,
"end": "2026-11-07T19:31:29.574+08:00",
"dur_ms": 1618,
"round": 32,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:25.505+08:00 [2026-11-07 19:31:24][ADC_TASK] wave: seg=75 armed=0 src=T pts=320 err=0 ovf=0 drop=155648",
"held": [
"[RX] 2026-11-07T19:31:28.091+08:00 [2026-11-07 19:31:26] [WAVE][WARN] seg held 157 ms (idx=77)",
"[RX] 2026-11-07T19:31:30.088+08:00 [2026-11-07 19:31:29] [WAVE][WARN] seg held 189 ms (idx=78)"
]
},
{
"start": "2026-11-07T19:31:32.734+08:00",
"start_epoch": 1794051092.7341805,
"end": "2026-11-07T19:31:34.255+08:00",
"dur_ms": 1522,
"round": 33,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:25.505+08:00 [2026-11-07 19:31:24][ADC_TASK] wave: seg=75 armed=0 src=T pts=320 err=0 ovf=0 drop=155648",
"held": [
"[RX] 2026-11-07T19:31:32.012+08:00 [2026-11-07 19:31:30] [WAVE][WARN] seg held 113 ms (idx=79)",
"[RX] 2026-11-07T19:31:34.250+08:00 [2026-11-07 19:31:33] [WAVE][WARN] seg held 109 ms (idx=80)"
]
},
{
"start": "2026-11-07T19:31:36.404+08:00",
"start_epoch": 1794051096.4041886,
"end": "2026-11-07T19:31:37.987+08:00",
"dur_ms": 1583,
"round": 34,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:35.494+08:00 [2026-11-07 19:31:34][ADC_TASK] wave: seg=80 armed=0 src=T pts=320 err=0 ovf=0 drop=166696",
"held": [
"[RX] 2026-11-07T19:31:36.032+08:00 [2026-11-07 19:31:34] [WAVE][WARN] seg held 102 ms (idx=81)",
"[RX] 2026-11-07T19:31:38.101+08:00 [2026-11-07 19:31:36] [WAVE][WARN] seg held 122 ms (idx=82)"
]
},
{
"start": "2026-11-07T19:31:40.547+08:00",
"start_epoch": 1794051100.5470848,
"end": "2026-11-07T19:31:42.091+08:00",
"dur_ms": 1545,
"round": 35,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:35.494+08:00 [2026-11-07 19:31:34][ADC_TASK] wave: seg=80 armed=0 src=T pts=320 err=0 ovf=0 drop=166696",
"held": [
"[RX] 2026-11-07T19:31:40.066+08:00 [2026-11-07 19:31:38] [WAVE][WARN] seg held 126 ms (idx=83)",
"[RX] 2026-11-07T19:31:42.106+08:00 [2026-11-07 19:31:41] [WAVE][WARN] seg held 87 ms (idx=84)"
]
},
{
"start": "2026-11-07T19:31:45.548+08:00",
"start_epoch": 1794051105.5484278,
"end": "2026-11-07T19:31:47.052+08:00",
"dur_ms": 1504,
"round": 36,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:45.495+08:00 [2026-11-07 19:31:44][ADC_TASK] wave: seg=85 armed=0 src=T pts=320 err=0 ovf=0 drop=173616",
"held": [
"[RX] 2026-11-07T19:31:47.048+08:00 [2026-11-07 19:31:45] [WAVE][WARN] seg held 115 ms (idx=86)",
"[RX] 2026-11-07T19:31:48.029+08:00 [2026-11-07 19:31:46] [WAVE][WARN] seg held 87 ms (idx=87)"
]
},
{
"start": "2026-11-07T19:31:48.796+08:00",
"start_epoch": 1794051108.7965755,
"end": "2026-11-07T19:31:50.369+08:00",
"dur_ms": 1573,
"round": 37,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:45.495+08:00 [2026-11-07 19:31:44][ADC_TASK] wave: seg=85 armed=0 src=T pts=320 err=0 ovf=0 drop=173616",
"held": [
"[RX] 2026-11-07T19:31:48.029+08:00 [2026-11-07 19:31:46] [WAVE][WARN] seg held 87 ms (idx=87)",
"[RX] 2026-11-07T19:31:50.300+08:00 [2026-11-07 19:31:49] [WAVE][WARN] seg held 81 ms (idx=88)"
]
},
{
"start": "2026-11-07T19:31:52.216+08:00",
"start_epoch": 1794051112.2167828,
"end": "2026-11-07T19:31:53.773+08:00",
"dur_ms": 1557,
"round": 38,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:45.495+08:00 [2026-11-07 19:31:44][ADC_TASK] wave: seg=85 armed=0 src=T pts=320 err=0 ovf=0 drop=173616",
"held": [
"[RX] 2026-11-07T19:31:51.971+08:00 [2026-11-07 19:31:50] [WAVE][WARN] seg held 81 ms (idx=89)",
"[RX] 2026-11-07T19:31:53.991+08:00 [2026-11-07 19:31:52] [WAVE][WARN] seg held 92 ms (idx=90)"
]
},
{
"start": "2026-11-07T19:31:57.241+08:00",
"start_epoch": 1794051117.241369,
"end": "2026-11-07T19:31:58.776+08:00",
"dur_ms": 1535,
"round": 39,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:55.501+08:00 [2026-11-07 19:31:54][ADC_TASK] wave: seg=90 armed=0 src=T pts=320 err=0 ovf=0 drop=188664",
"held": [
"[RX] 2026-11-07T19:31:56.029+08:00 [2026-11-07 19:31:54] [WAVE][WARN] seg held 116 ms (idx=91)",
"[RX] 2026-11-07T19:31:58.770+08:00 [2026-11-07 19:31:57] [WAVE][WARN] seg held 103 ms (idx=92)"
]
},
{
"start": "2026-11-07T19:32:00.728+08:00",
"start_epoch": 1794051120.7286644,
"end": "2026-11-07T19:32:02.386+08:00",
"dur_ms": 1657,
"round": 40,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:31:55.501+08:00 [2026-11-07 19:31:54][ADC_TASK] wave: seg=90 armed=0 src=T pts=320 err=0 ovf=0 drop=188664",
"held": [
"[RX] 2026-11-07T19:32:00.020+08:00 [2026-11-07 19:31:58] [WAVE][WARN] seg held 105 ms (idx=93)",
"[RX] 2026-11-07T19:32:02.255+08:00 [2026-11-07 19:32:01] [WAVE][WARN] seg held 86 ms (idx=94)"
]
},
{
"start": "2026-11-07T19:32:04.144+08:00",
"start_epoch": 1794051124.1445668,
"end": "2026-11-07T19:32:05.789+08:00",
"dur_ms": 1645,
"round": 41,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:05.505+08:00 [2026-11-07 19:32:04][ADC_TASK] wave: seg=95 armed=0 src=T pts=320 err=0 ovf=0 drop=201592",
"held": [
"[RX] 2026-11-07T19:32:03.996+08:00 [2026-11-07 19:32:02] [WAVE][WARN] seg held 92 ms (idx=95)",
"[RX] 2026-11-07T19:32:06.169+08:00 [2026-11-07 19:32:05] [WAVE][WARN] seg held 227 ms (idx=96)"
]
},
{
"start": "2026-11-07T19:32:08.138+08:00",
"start_epoch": 1794051128.1382148,
"end": "2026-11-07T19:32:09.618+08:00",
"dur_ms": 1480,
"round": 42,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:05.505+08:00 [2026-11-07 19:32:04][ADC_TASK] wave: seg=95 armed=0 src=T pts=320 err=0 ovf=0 drop=201592",
"held": [
"[RX] 2026-11-07T19:32:08.056+08:00 [2026-11-07 19:32:06] [WAVE][WARN] seg held 128 ms (idx=97)",
"[RX] 2026-11-07T19:32:10.104+08:00 [2026-11-07 19:32:09] [WAVE][WARN] seg held 164 ms (idx=98)"
]
},
{
"start": "2026-11-07T19:32:10.968+08:00",
"start_epoch": 1794051130.9683368,
"end": "2026-11-07T19:32:12.570+08:00",
"dur_ms": 1603,
"round": 43,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:05.505+08:00 [2026-11-07 19:32:04][ADC_TASK] wave: seg=95 armed=0 src=T pts=320 err=0 ovf=0 drop=201592",
"held": [
"[RX] 2026-11-07T19:32:10.104+08:00 [2026-11-07 19:32:09] [WAVE][WARN] seg held 164 ms (idx=98)",
"[RX] 2026-11-07T19:32:12.557+08:00 [2026-11-07 19:32:11] [WAVE][WARN] seg held 122 ms (idx=99)"
]
},
{
"start": "2026-11-07T19:32:15.018+08:00",
"start_epoch": 1794051135.0183134,
"end": "2026-11-07T19:32:16.629+08:00",
"dur_ms": 1611,
"round": 44,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:15.504+08:00 [2026-11-07 19:32:14][ADC_TASK] wave: seg=100 armed=0 src=T pts=320 err=0 ovf=0 drop=212960",
"held": [
"[RX] 2026-11-07T19:32:14.008+08:00 [2026-11-07 19:32:12] [WAVE][WARN] seg held 113 ms (idx=0)",
"[RX] 2026-11-07T19:32:16.613+08:00 [2026-11-07 19:32:15] [WAVE][WARN] seg held 93 ms (idx=1)"
]
},
{
"start": "2026-11-07T19:32:20.000+08:00",
"start_epoch": 1794051140.0007622,
"end": "2026-11-07T19:32:21.624+08:00",
"dur_ms": 1624,
"round": 45,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:15.504+08:00 [2026-11-07 19:32:14][ADC_TASK] wave: seg=100 armed=0 src=T pts=320 err=0 ovf=0 drop=212960",
"held": [
"[RX] 2026-11-07T19:32:20.047+08:00 [2026-11-07 19:32:18] [WAVE][WARN] seg held 95 ms (idx=3)",
"[RX] 2026-11-07T19:32:22.002+08:00 [2026-11-07 19:32:20] [WAVE][WARN] seg held 104 ms (idx=4)"
]
},
{
"start": "2026-11-07T19:32:24.179+08:00",
"start_epoch": 1794051144.1798894,
"end": "2026-11-07T19:32:25.789+08:00",
"dur_ms": 1609,
"round": 46,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:25.501+08:00 [2026-11-07 19:32:24][ADC_TASK] wave: seg=105 armed=0 src=T pts=320 err=0 ovf=0 drop=222672",
"held": [
"[RX] 2026-11-07T19:32:24.030+08:00 [2026-11-07 19:32:22] [WAVE][WARN] seg held 103 ms (idx=5)",
"[RX] 2026-11-07T19:32:26.105+08:00 [2026-11-07 19:32:25] [WAVE][WARN] seg held 154 ms (idx=6)"
]
},
{
"start": "2026-11-07T19:32:28.144+08:00",
"start_epoch": 1794051148.144161,
"end": "2026-11-07T19:32:29.668+08:00",
"dur_ms": 1524,
"round": 47,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:25.501+08:00 [2026-11-07 19:32:24][ADC_TASK] wave: seg=105 armed=0 src=T pts=320 err=0 ovf=0 drop=222672",
"held": [
"[RX] 2026-11-07T19:32:28.034+08:00 [2026-11-07 19:32:26] [WAVE][WARN] seg held 106 ms (idx=7)",
"[RX] 2026-11-07T19:32:30.015+08:00 [2026-11-07 19:32:28] [WAVE][WARN] seg held 103 ms (idx=8)"
]
},
{
"start": "2026-11-07T19:32:32.224+08:00",
"start_epoch": 1794051152.2245808,
"end": "2026-11-07T19:32:33.770+08:00",
"dur_ms": 1546,
"round": 48,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:25.501+08:00 [2026-11-07 19:32:24][ADC_TASK] wave: seg=105 armed=0 src=T pts=320 err=0 ovf=0 drop=222672",
"held": [
"[RX] 2026-11-07T19:32:31.985+08:00 [2026-11-07 19:32:30] [WAVE][WARN] seg held 73 ms (idx=9)",
"[RX] 2026-11-07T19:32:34.091+08:00 [2026-11-07 19:32:32] [WAVE][WARN] seg held 133 ms (idx=10)"
]
},
{
"start": "2026-11-07T19:32:36.723+08:00",
"start_epoch": 1794051156.7237678,
"end": "2026-11-07T19:32:38.247+08:00",
"dur_ms": 1524,
"round": 49,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:35.499+08:00 [2026-11-07 19:32:34][ADC_TASK] wave: seg=110 armed=0 src=T pts=320 err=0 ovf=0 drop=228512",
"held": [
"[RX] 2026-11-07T19:32:35.990+08:00 [2026-11-07 19:32:34] [WAVE][WARN] seg held 84 ms (idx=11)",
"[RX] 2026-11-07T19:32:38.226+08:00 [2026-11-07 19:32:37] [WAVE][WARN] seg held 88 ms (idx=12)"
]
},
{
"start": "2026-11-07T19:32:40.297+08:00",
"start_epoch": 1794051160.297433,
"end": "2026-11-07T19:32:41.989+08:00",
"dur_ms": 1692,
"round": 50,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:35.499+08:00 [2026-11-07 19:32:34][ADC_TASK] wave: seg=110 armed=0 src=T pts=320 err=0 ovf=0 drop=228512",
"held": [
"[RX] 2026-11-07T19:32:40.039+08:00 [2026-11-07 19:32:38] [WAVE][WARN] seg held 99 ms (idx=13)",
"[RX] 2026-11-07T19:32:42.046+08:00 [2026-11-07 19:32:40] [WAVE][WARN] seg held 101 ms (idx=14)"
]
},
{
"start": "2026-11-07T19:32:44.150+08:00",
"start_epoch": 1794051164.1502302,
"end": "2026-11-07T19:32:45.804+08:00",
"dur_ms": 1655,
"round": 51,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:45.511+08:00 [2026-11-07 19:32:44][ADC_TASK] wave: seg=115 armed=0 src=T pts=320 err=0 ovf=0 drop=234872",
"held": [
"[RX] 2026-11-07T19:32:43.990+08:00 [2026-11-07 19:32:42] [WAVE][WARN] seg held 90 ms (idx=15)",
"[RX] 2026-11-07T19:32:46.048+08:00 [2026-11-07 19:32:44] [WAVE][WARN] seg held 132 ms (idx=16)"
]
},
{
"start": "2026-11-07T19:32:48.573+08:00",
"start_epoch": 1794051168.5731087,
"end": "2026-11-07T19:32:50.185+08:00",
"dur_ms": 1612,
"round": 52,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:45.511+08:00 [2026-11-07 19:32:44][ADC_TASK] wave: seg=115 armed=0 src=T pts=320 err=0 ovf=0 drop=234872",
"held": [
"[RX] 2026-11-07T19:32:48.220+08:00 [2026-11-07 19:32:47] [WAVE][WARN] seg held 304 ms (idx=17)",
"[RX] 2026-11-07T19:32:50.178+08:00 [2026-11-07 19:32:49] [WAVE][WARN] seg held 193 ms (idx=18)"
]
},
{
"start": "2026-11-07T19:32:53.539+08:00",
"start_epoch": 1794051173.5396416,
"end": "2026-11-07T19:32:55.171+08:00",
"dur_ms": 1632,
"round": 53,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:55.499+08:00 [2026-11-07 19:32:54][ADC_TASK] wave: seg=120 armed=0 src=T pts=320 err=0 ovf=0 drop=251728",
"held": [
"[RX] 2026-11-07T19:32:55.117+08:00 [2026-11-07 19:32:54] [WAVE][WARN] seg held 101 ms (idx=20)",
"[RX] 2026-11-07T19:32:55.966+08:00 [2026-11-07 19:32:54] [WAVE][WARN] seg held 61 ms (idx=21)"
]
},
{
"start": "2026-11-07T19:32:57.820+08:00",
"start_epoch": 1794051177.8202837,
"end": "2026-11-07T19:32:59.433+08:00",
"dur_ms": 1613,
"round": 54,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:55.499+08:00 [2026-11-07 19:32:54][ADC_TASK] wave: seg=120 armed=0 src=T pts=320 err=0 ovf=0 drop=251728",
"held": [
"[RX] 2026-11-07T19:32:55.966+08:00 [2026-11-07 19:32:54] [WAVE][WARN] seg held 61 ms (idx=21)",
"[RX] 2026-11-07T19:32:59.970+08:00 [2026-11-07 19:32:58] [WAVE][WARN] seg held 61 ms (idx=23)"
]
},
{
"start": "2026-11-07T19:33:02.486+08:00",
"start_epoch": 1794051182.486079,
"end": "2026-11-07T19:33:04.058+08:00",
"dur_ms": 1572,
"round": 55,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:32:55.499+08:00 [2026-11-07 19:32:54][ADC_TASK] wave: seg=120 armed=0 src=T pts=320 err=0 ovf=0 drop=251728",
"held": [
"[RX] 2026-11-07T19:33:02.123+08:00 [2026-11-07 19:33:00] [WAVE][WARN] seg held 111 ms (idx=24)",
"[RX] 2026-11-07T19:33:04.056+08:00 [2026-11-07 19:33:02] [WAVE][WARN] seg held 101 ms (idx=25)"
]
},
{
"start": "2026-11-07T19:33:05.705+08:00",
"start_epoch": 1794051185.705855,
"end": "2026-11-07T19:33:07.372+08:00",
"dur_ms": 1667,
"round": 56,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:33:05.493+08:00 [2026-11-07 19:33:04][ADC_TASK] wave: seg=125 armed=0 src=T pts=320 err=0 ovf=0 drop=255832",
"held": [
"[RX] 2026-11-07T19:33:04.056+08:00 [2026-11-07 19:33:02] [WAVE][WARN] seg held 101 ms (idx=25)",
"[RX] 2026-11-07T19:33:07.297+08:00 [2026-11-07 19:33:06] [WAVE][WARN] seg held 85 ms (idx=26)"
]
},
{
"start": "2026-11-07T19:33:09.108+08:00",
"start_epoch": 1794051189.1086035,
"end": "2026-11-07T19:33:10.691+08:00",
"dur_ms": 1583,
"round": 57,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:33:05.493+08:00 [2026-11-07 19:33:04][ADC_TASK] wave: seg=125 armed=0 src=T pts=320 err=0 ovf=0 drop=255832",
"held": [
"[RX] 2026-11-07T19:33:07.297+08:00 [2026-11-07 19:33:06] [WAVE][WARN] seg held 85 ms (idx=26)",
"[RX] 2026-11-07T19:33:10.686+08:00 [2026-11-07 19:33:09] [WAVE][WARN] seg held 87 ms (idx=27)"
]
},
{
"start": "2026-11-07T19:33:13.542+08:00",
"start_epoch": 1794051193.5424988,
"end": "2026-11-07T19:33:15.066+08:00",
"dur_ms": 1524,
"round": 58,
"err_lines_total": 0,
"last_hb": "[RX] 2026-11-07T19:33:15.499+08:00 [2026-11-07 19:33:14][ADC_TASK] wave: seg=129 armed=0 src=T pts=320 err=0 ovf=1 drop=283648",
"held": [
"[RX] 2026-11-07T19:33:15.040+08:00 [2026-11-07 19:33:13] [WAVE][WARN] seg held 85 ms (idx=29)",
"[RX] 2026-11-07T19:33:16.047+08:00 [2026-11-07 19:33:14] [WAVE][WARN] seg held 139 ms (idx=30)"
]
}
],
"windows": [],
"bootstrap_reset": {
"rc": 0,
"out": "ware reset\nDevice ID: 0x413 \nDevice flash Size: 1024 Kbytes\nDevice family: STM32F405xx/F407xx/F415xx/F417xx\n\nMCU Reset.\n\nrun application to exit\nApplication started.\nRC: 0 elapsed_ms=218\nSTLINK_RC=0\n",
"err": "",
"ts": "2026-11-07T19:28:54.935+08:00"
},
"abort": "deadline without STOP line (window misbehaving?)",
"t_end": "2026-11-07T19:33:16.284+08:00"
}
@@ -0,0 +1,73 @@
# 回放页开页作废重扫 + 判废留痕修复验收轮(2026-11-07,#93 → PR #94)
台架远程轮(无人到场,bench 锁全程持有,烧录经口头「烧」确认)。修复 = 设计说明 §10
「回放页开页作废重扫与判废留痕修复记录」;验收判据 = #93 正文 F1 五条 / F2 五条。
帧均为 7003 `LCDMEM` 原帧(160×160 1bpp 3200 B,`.bin`),`_raw3200.bin` 为其归档命名,
PNG 为 4× 放大目检件(非判据)。
## 到场盘面事实(与修复无关,如实记档)
- `/WAVE` 100 件 `WAVE00…99.BIN`,尺寸为 5250 B 的 **2~27 倍拼接**(共 1866 段,逐段过
`test/host/wave_read.py` 校验**全部合法、零损坏**)——写者 `FA_OPEN_APPEND` 跨开机累积
属既有设计,回放页单段读侧(`size == total`)按口径逐件判「长度废」:全板无可放段。
全量原件 RETR 备份 + sha256 台账在轮末**逐字节还原**(见「收工」节)。
- 串口唯一枚举 CH340 = **COM4**(仓库 `.serialtest/config.json` 钉 COM3 已过时,本仓文件
未动,用 `$env:DSH_SERIAL_CONFIG` 覆盖);板端 FTP `admin/admin`。
- 到场固件 = 修复前构建(当日 01:00 已在跑,串口捕获窗口起点晚于该启动,构建戳不可证;
Before 侧各帧均取自烧录前时段、期间无新启动。新固件戳见下)。
## Before(旧固件,烧录前时段实测)
| 帧 | 场景 | 串口 |
|---|---|---|
| `oldN_P0_first_open_face_raw3200.bin` | 开页即「该段不可读」(拼接件长度废的自然样本) | **零行**(F2 静默设计面) |
| `oldN_P1_stale_table_after_dele_raw3200.bin` | 页开过一次(钉表 100 名)→ 页关 → `DELE WAVE99` → 重开页 | `open fail fr=4`(钉住表列着已删名——F1 镜像面) |
| `oldN_P2_crc_reject_silent_raw3200.bin` | `STOR WAVE06.BIN`=翻位坏版(byte[130]^=1,与 11-06 同款)→ 开页走位踩入 | **零行**(CRC 判废黑盒面,#93 现象原文复现) |
(sha 与逐帧判读见 `manifest_sha256.json`;`serial_excerpt_before.txt` / `serial_excerpt_after.txt`
为 serial-assistant 原文摘录,仅剔除 `wave:`/`ADC` 心跳行。)
## After(新固件 `fw build: Nov 7 2026 19:10:36`,run_boot_test 内置烧录 + 回读 `No difference found`)
| 帧 | 判据 | 串口锚点 |
|---|---|---|
| `newN_F11_reopen_seg99_max_raw3200.bin` | F1-1:页关时 FTP `STOR WAVE99.BIN`(单段合法件)→ 重开页 → 光标直接落数值最大段 99 并出波形(sha 与旧固件同段好段帧 `oldN_P3` 一致,渲染零漂移) | `UPLOAD` 留痕(`serial_excerpt_f1.txt`),判废零行 |
| `newN_F12_empty_state` + `newN_F12_idlekey_seg6` | F1-2:空盘开页 = 「无录波段」(空态帧 sha `a76c41cf…` 与 11-06 归档空态帧**逐比特一致**)→ 页开着 `STOR WAVE06` → 单次左键即出 SEG6 波形(「空态按键付①」兑现即投即见) | 同左 |
| `newN_F13_after_spam` | F1-3:有段页内连踩 UD/LR ×12,帧稳定,该窗口 `ui wave scan` 锚点新增 **0**(`serial_stats.json` `f13_spam_scans=0`;钉表防抖纪律零改动) | 窗口内零扫描/判废行 |
| `newN_F15_seg6` → `newN_F15_seg99_alt` | F1-5:页关同号覆盖 `WAVE99.BIN`←另一合法段 → 页内踩 6 再踩回 99,切入即见**新字节**(新波形帧 sha `12bd96f8…` ≠ 旧内容 `36a3271a…`;单槽段头缓存在切换中自然作废重读) | 无判废行(两件皆合法) |
| `newN_F14_manual_page/confirm/done` | F1-4 手动录波回归:修改密码页 →「确认手动录波?」→「已请求录波」;`manual_req` 作废路径与七件绑定由主机 ui_data 套件 295 项回归 | 23:03:22 `wave: seg=1 armed=0 src=M`(本次捕获 ACK);FTP 侧 `WAVE00.BIN` 141750→**147000**(+5250 落盘),轮末还原 |
| `newN_A_reject5_enter1/2/3` | F2-1+F2-4:三次开页进入坏段(`WAVE06_bitflip`),三帧均 sha `17291a00…` = 与 11-06 归档「该段不可读」帧**逐比特一致**(画面零改动)| 三行**不去重**:23:09:31/38/44 `ui wave head idx=6 reject=5 stored=0xC204 calc=0x8A84`,与 PC 侧 `wave_read.py dump` 同一坏段 REJECT 行逐值互证 |
| `newN_B_restored_normal6` | F2-2:换回合法件重开 = 正常波形(sha `c538a051…`) | 该开页窗口无新判废行 |
| `newN_C_reject1_head99` | 头废面(`WAVE99_headflip`)画面同为 `17291a00…` | `idx=99 reject=1 stored=0x0000 calc=0x0000`(非 CRC 类两字段占位纪律) |
| `newN_D_final_ok99` | 坏段轮收尾正常段回放 | 无判废行 |
| `newN_Z_final_open_100appended` | 收工还原到场拼接盘态后重开页:画面与 Before 侧 `oldN_P0` 逐比特一致(同一「该段不可读」自然面) | **这次有一行** `idx=99 reject=2 stored=0x0000 calc=0x0000`(旧固件同景零行 = F2 修复前后直接对照面) |
F2-3(无坏段常规板况启动门禁):`boot_new2/` 与 `boot_new3/` 两份启动报告——required 锚点除
`i104: listening on 2404` 外全过(App init / Network Init / net init OK / protect / 栈 /
`fw build` 本戳),**零新增** `UI_TASK`/录波类 `[ERR]`、零 `open fail`;唯一 `[ERR]` 为
`[ERR][I104] i104: bind port 2404 FAIL, retry in loop`——修复前固件当晚(22:49:22,本改动
烧入之前的启动,同串口历史)与本 PR 两次启动(22:56、23:19)逐字相同,runner 判 FAIL 属
既有环境条件而非本 PR 回归。定性:CH395 软复位残留 socket 致首绑失败、重试循环成功但
**静默**(成功路径无日志,门禁标记永缺),STARTDT act→con(`68-04-0B-00-00-00`)实测 2404
服务存活,NET 面 `sock auto-relisten ok` 佐证自愈在跑;「零新增 [ERR]」按同板同电路
修复前后对比成立。两条独立观察项(①软复位首绑必失败的环境账;②重试成功不打日志)已记入
设计说明修复记录,建议各自开票、不并票、不在本 PR 修。`serial_excerpt_before.txt` /
`serial_excerpt_after.txt` 为 serial-assistant 原文摘录(剔除心跳行),逐行时间戳可复查。
## 收工
- `/WAVE` 还原到场拼接原件 100 件逐件 sha256 复验一致(`restore_verify.txt`)。
- 盘上不留本环投放的任何测试件;`samples/` 三件 = 本环用到的 5250 测试件
(`WAVE06_bitflip.BIN` / `WAVE99_headflip.BIN` / `WAVE99_altseg.BIN`,sha 见 manifest)。
- 两锁释放、UI 回主菜单、串口 daemon 端口释放。
## 复现口令(本仓 worktree 根,需 bench 锁)
```
# 身份互证 + 开页取帧
& .venv\Scripts\python.exe scripts\board_ui_nav.py --where --i-hold-bench-lock
# 测试件(5250 B 单段):任一合法段文件翻 byte[130](数据 CRC 废)或翻 byte[8](头废)
# FTP admin/admin → CWD /WAVE → STOR → 7003 开回放页 → 串口见
# [ERR][UI_TASK] ui wave head idx=<n> reject=<1|5> stored=0x…. calc=0x….
# PC 互证:& .venv\Scripts\python.exe test\host\wave_read.py dump <同款测试件>
```
@@ -0,0 +1,184 @@
22:42:16 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
22:42:17 frame oldN_P0_first_open_face sha=17291a0068f2d4ab099f stable=True
22:42:20 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
22:42:20 DELE WAVE99.BIN (archive: backup_pre_round, appended 141750B original)
22:42:23 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
22:42:24 frame oldN_P1_stale_table_after_dele sha=a76c41cfd7f38cecf109 stable=True
22:42:27 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
22:42:28 STOR WAVE99.BIN <- WAVE99.BIN
22:42:29 WAVE99 restored byte-exact: True
22:42:29 == old_natural dele99 done
22:44:12 closed -> {'ver': 1, 'kind': 'STANDBY', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
22:44:12 STOR WAVE06.BIN <- WAVE06_bitflip.BIN
22:44:17 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
22:44:21 nav_to_seg(6) moved 93 l-steps from 99
22:44:22 frame oldN_P2_crc_reject_silent sha=17291a0068f2d4ab099f stable=True
22:44:25 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
22:44:25 STOR WAVE06.BIN <- WAVE06.BIN
22:44:26 WAVE06 appended original restored byte-exact: True
22:44:26 == old_natural crc06 done
22:49:10 STOR WAVE99.BIN <- WAVE99.BIN
22:49:15 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
22:49:16 frame oldN_P3_good_seg99 sha=36a3271a78dafe6afc0c stable=True
22:49:19 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
22:49:19 STOR WAVE99.BIN <- WAVE99.BIN
23:02:51 boot status: {'ver': 1, 'kind': 'STANDBY', 'depth': 0, 'path': [0], 'sel': [0], 'page': None}
23:03:14 after go_page: {'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 23], 'sel': [4, 2], 'page': 'wave_manual'}
23:03:15 frame newN_F14_manual_page sha=bdf7e5d1427b74c5b566 stable=True
23:03:18 frame newN_F14_manual_confirm sha=ee14db44f2437dea6cc7 stable=True
23:03:18 after first e: {'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 23], 'sel': [4, 2], 'page': 'wave_manual'}
23:03:22 frame newN_F14_manual_done sha=0d677bf478c579391a1a stable=True
23:03:22 after second e: {'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 23], 'sel': [4, 2], 'page': 'wave_manual'}
23:03:22 waiting 14 s for ring->defaultTask capture + ACK
23:08:35 F1-2: DELE all 100 (arrived originals archived)
23:09:02 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
23:09:03 frame newN_F12_empty_state sha=a76c41cfd7f38cecf109 stable=True
23:09:03 STOR WAVE06.BIN <- WAVE06.BIN
23:09:07 frame newN_F12_idlekey_seg6 sha=c538a051b6bdcca7e871 stable=True
23:09:10 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
23:09:10 STOR WAVE99.BIN <- WAVE99.BIN
23:09:14 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
23:09:15 frame newN_F11_reopen_seg99_max sha=36a3271a78dafe6afc0c stable=True
23:09:15 STOR WAVE99.BIN <- WAVE99_altseg.BIN
23:09:19 frame newN_F15_seg6 sha=c538a051b6bdcca7e871 stable=True
23:09:22 frame newN_F15_seg99_alt sha=12bd96f8f7405446c3f7 stable=True
23:09:26 frame newN_F13_after_spam sha=bfacdb1d922f4e7277d1 stable=True
23:09:29 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
23:09:29 == battery2 n-f1 done
23:09:29 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
23:09:29 STOR WAVE06.BIN <- WAVE06_bitflip.BIN
23:09:33 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
23:09:34 frame newN_A_reject5_enter1 sha=17291a0068f2d4ab099f stable=True
23:09:34 F2-1 pixel identity vs 11-06 archived bad frame: True
23:09:37 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
23:09:39 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
23:09:41 frame newN_A_reject5_enter2 sha=17291a0068f2d4ab099f stable=True
23:09:43 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
23:09:46 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
23:09:47 frame newN_A_reject5_enter3 sha=17291a0068f2d4ab099f stable=True
23:09:50 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
23:09:50 STOR WAVE06.BIN <- WAVE06.BIN
23:09:54 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
23:09:55 frame newN_B_restored_normal6 sha=c538a051b6bdcca7e871 stable=True
23:09:57 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
23:09:58 STOR WAVE99.BIN <- WAVE99_headflip.BIN
23:10:01 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
23:10:02 frame newN_C_reject1_head99 sha=17291a0068f2d4ab099f stable=True
23:10:05 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
23:10:05 STOR WAVE99.BIN <- WAVE99.BIN
23:10:08 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
23:10:10 frame newN_D_final_ok99 sha=36a3271a78dafe6afc0c stable=True
23:10:12 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
23:10:12 == battery2 n-f2 done
23:10:13 == battery2 n-manual done
23:10:36 == battery2 n-manual done
23:10:38 STOR WAVE00.BIN <- WAVE00.BIN
23:10:39 STOR WAVE01.BIN <- WAVE01.BIN
23:10:40 STOR WAVE02.BIN <- WAVE02.BIN
23:10:42 STOR WAVE03.BIN <- WAVE03.BIN
23:10:43 STOR WAVE04.BIN <- WAVE04.BIN
23:10:44 STOR WAVE05.BIN <- WAVE05.BIN
23:10:45 STOR WAVE06.BIN <- WAVE06.BIN
23:10:46 STOR WAVE07.BIN <- WAVE07.BIN
23:10:47 STOR WAVE08.BIN <- WAVE08.BIN
23:10:49 STOR WAVE09.BIN <- WAVE09.BIN
23:10:50 STOR WAVE10.BIN <- WAVE10.BIN
23:10:51 STOR WAVE11.BIN <- WAVE11.BIN
23:10:52 STOR WAVE12.BIN <- WAVE12.BIN
23:10:53 STOR WAVE13.BIN <- WAVE13.BIN
23:10:54 STOR WAVE14.BIN <- WAVE14.BIN
23:10:55 STOR WAVE15.BIN <- WAVE15.BIN
23:10:56 STOR WAVE16.BIN <- WAVE16.BIN
23:10:58 STOR WAVE17.BIN <- WAVE17.BIN
23:10:59 STOR WAVE18.BIN <- WAVE18.BIN
23:11:00 STOR WAVE19.BIN <- WAVE19.BIN
23:11:01 STOR WAVE20.BIN <- WAVE20.BIN
23:11:02 STOR WAVE21.BIN <- WAVE21.BIN
23:11:03 STOR WAVE22.BIN <- WAVE22.BIN
23:11:04 STOR WAVE23.BIN <- WAVE23.BIN
23:11:05 STOR WAVE24.BIN <- WAVE24.BIN
23:11:06 STOR WAVE25.BIN <- WAVE25.BIN
23:11:07 STOR WAVE26.BIN <- WAVE26.BIN
23:11:09 STOR WAVE27.BIN <- WAVE27.BIN
23:11:09 STOR WAVE28.BIN <- WAVE28.BIN
23:11:10 STOR WAVE29.BIN <- WAVE29.BIN
23:11:11 STOR WAVE30.BIN <- WAVE30.BIN
23:11:13 STOR WAVE31.BIN <- WAVE31.BIN
23:11:14 STOR WAVE32.BIN <- WAVE32.BIN
23:11:15 STOR WAVE33.BIN <- WAVE33.BIN
23:11:16 STOR WAVE34.BIN <- WAVE34.BIN
23:11:17 STOR WAVE35.BIN <- WAVE35.BIN
23:11:17 STOR WAVE36.BIN <- WAVE36.BIN
23:11:18 STOR WAVE37.BIN <- WAVE37.BIN
23:11:19 STOR WAVE38.BIN <- WAVE38.BIN
23:11:20 STOR WAVE39.BIN <- WAVE39.BIN
23:11:22 STOR WAVE40.BIN <- WAVE40.BIN
23:11:23 STOR WAVE41.BIN <- WAVE41.BIN
23:11:24 STOR WAVE42.BIN <- WAVE42.BIN
23:11:25 STOR WAVE43.BIN <- WAVE43.BIN
23:11:26 STOR WAVE44.BIN <- WAVE44.BIN
23:11:27 STOR WAVE45.BIN <- WAVE45.BIN
23:11:28 STOR WAVE46.BIN <- WAVE46.BIN
23:11:28 STOR WAVE47.BIN <- WAVE47.BIN
23:11:29 STOR WAVE48.BIN <- WAVE48.BIN
23:11:30 STOR WAVE49.BIN <- WAVE49.BIN
23:11:31 STOR WAVE50.BIN <- WAVE50.BIN
23:11:32 STOR WAVE51.BIN <- WAVE51.BIN
23:11:33 STOR WAVE52.BIN <- WAVE52.BIN
23:11:34 STOR WAVE53.BIN <- WAVE53.BIN
23:11:35 STOR WAVE54.BIN <- WAVE54.BIN
23:11:36 STOR WAVE55.BIN <- WAVE55.BIN
23:11:37 STOR WAVE56.BIN <- WAVE56.BIN
23:11:38 STOR WAVE57.BIN <- WAVE57.BIN
23:11:39 STOR WAVE58.BIN <- WAVE58.BIN
23:11:40 STOR WAVE59.BIN <- WAVE59.BIN
23:11:40 STOR WAVE60.BIN <- WAVE60.BIN
23:11:41 STOR WAVE61.BIN <- WAVE61.BIN
23:11:42 STOR WAVE62.BIN <- WAVE62.BIN
23:11:43 STOR WAVE63.BIN <- WAVE63.BIN
23:11:44 STOR WAVE64.BIN <- WAVE64.BIN
23:11:45 STOR WAVE65.BIN <- WAVE65.BIN
23:11:46 STOR WAVE66.BIN <- WAVE66.BIN
23:11:47 STOR WAVE67.BIN <- WAVE67.BIN
23:11:48 STOR WAVE68.BIN <- WAVE68.BIN
23:11:48 STOR WAVE69.BIN <- WAVE69.BIN
23:11:49 STOR WAVE70.BIN <- WAVE70.BIN
23:11:50 STOR WAVE71.BIN <- WAVE71.BIN
23:11:51 STOR WAVE72.BIN <- WAVE72.BIN
23:11:52 STOR WAVE73.BIN <- WAVE73.BIN
23:11:53 STOR WAVE74.BIN <- WAVE74.BIN
23:11:54 STOR WAVE75.BIN <- WAVE75.BIN
23:11:55 STOR WAVE76.BIN <- WAVE76.BIN
23:11:56 STOR WAVE77.BIN <- WAVE77.BIN
23:11:57 STOR WAVE78.BIN <- WAVE78.BIN
23:11:58 STOR WAVE79.BIN <- WAVE79.BIN
23:11:58 STOR WAVE80.BIN <- WAVE80.BIN
23:11:59 STOR WAVE81.BIN <- WAVE81.BIN
23:12:00 STOR WAVE82.BIN <- WAVE82.BIN
23:12:01 STOR WAVE83.BIN <- WAVE83.BIN
23:12:02 STOR WAVE84.BIN <- WAVE84.BIN
23:12:03 STOR WAVE85.BIN <- WAVE85.BIN
23:12:04 STOR WAVE86.BIN <- WAVE86.BIN
23:12:05 STOR WAVE87.BIN <- WAVE87.BIN
23:12:06 STOR WAVE88.BIN <- WAVE88.BIN
23:12:07 STOR WAVE89.BIN <- WAVE89.BIN
23:12:08 STOR WAVE90.BIN <- WAVE90.BIN
23:12:09 STOR WAVE91.BIN <- WAVE91.BIN
23:12:10 STOR WAVE92.BIN <- WAVE92.BIN
23:12:10 STOR WAVE93.BIN <- WAVE93.BIN
23:12:11 STOR WAVE94.BIN <- WAVE94.BIN
23:12:12 STOR WAVE95.BIN <- WAVE95.BIN
23:12:13 STOR WAVE96.BIN <- WAVE96.BIN
23:12:14 STOR WAVE97.BIN <- WAVE97.BIN
23:12:15 STOR WAVE98.BIN <- WAVE98.BIN
23:12:16 STOR WAVE99.BIN <- WAVE99.BIN
23:13:13 RESTORE verify mismatches: ['WAVE90.BIN', 'WAVE99.BIN']
23:13:13 == battery2 restore done
23:13:54 STOR WAVE90.BIN <- WAVE90.BIN
23:13:55 STOR WAVE99.BIN <- WAVE99.BIN
23:13:55 attempt 0 re-put: ['WAVE90.BIN', 'WAVE99.BIN']
23:13:57 WAVE90/99 already clean (attempt 1)
23:14:55 restore verify -> D:\Code\DTU Code\_wt\fix-wave-findings-b8c190da2e56\ci-artifacts\waveboard\restore_verify.txt mismatches: NONE
23:14:57 open_page -> True ({'ver': 1, 'kind': 'PAGE', 'depth': 1, 'path': [0, 32], 'sel': [6, 9], 'page': 'wave_play'})
23:14:59 frame newN_Z_final_open_100appended sha=17291a0068f2d4ab099f stable=True
23:15:01 closed -> {'ver': 1, 'kind': 'MENU', 'depth': 0, 'path': [0], 'sel': [6], 'page': None}
@@ -0,0 +1,157 @@
[+0ms] [----/--/-- --:--:--][APP] boot: syslog init OK
[+10ms] [----/--/-- --:--:--][APP] fw build: Nov 7 2026 19:10:36 suite=NONE dstr=off
[+21ms] [----/--/-- --:--:--][APP] reset cause: software (NVIC_SystemReset) (CSR=0x14000000)
[+21ms] PREVRUN seg=2 seq=2101829730 t=188054
[+21ms] TICKRUN uw=188103 n=188103 duw=49
[+31ms] [----/--/-- --:--:--][RTC] sd2506_init: OK
[+31ms] [----/--/-- --:--:--][APP] SD2506 init: OK (ret=0)
[+42ms] [2026-11-07 22:52:37][CLK] sys_clock_init: RTC initial time 2026-11-07 22:52:37
[+52ms] [2026-11-07 22:52:37][CLK] sys_clock_init: wall clock base = unix 1794091957, base_tick=142
[+62ms] [2026-11-07 22:52:37][APP] RS485 init: OK (UART4, DE=PA15)
[+62ms] [2026-11-07 22:52:37][APP] ScreenLink init: OK (ret=0, USART1 700000 baud, BRR=0x0078)
[+83ms] [2026-11-07 22:52:37][NAND] Resetting NAND...
[+104ms] [2026-11-07 22:52:37][NAND] Reading NAND ID...
[+104ms] [2026-11-07 22:52:37][NAND] NAND ID: MID=0xC8, DID=0x52
[+104ms] [2026-11-07 22:52:37][NAND] Scanning bad blocks...
[+240ms] [2026-11-07 22:52:37][NAND] BBT scan: 0 bad blocks found
[+240ms] [2026-11-07 22:52:37][NAND] Enabling ECC...
[+250ms] [2026-11-07 22:52:37][NAND] Unlocking block protection...
[+261ms] [2026-11-07 22:52:37][NAND] Locating BBT pool...
[+261ms] [2026-11-07 22:52:37][NAND] Loading persisted BBT...
[+271ms] [2026-11-07 22:52:37][NAND] NAND init OK
[+271ms] [2026-11-07 22:52:37][APP] NAND init: OK
[+271ms] [2026-11-07 22:52:37][ADC] Init OK
[+281ms] [2026-11-07 22:52:37][APP] ADC init: OK
[+281ms] [2026-11-07 22:52:37][APP] ADC input layer init: OK
[+281ms] [2026-11-07 22:52:37][APP] phasor layer init: OK (inst=5)
[+292ms] [2026-11-07 22:52:37][APP] freq layer init: OK
[+303ms] [2026-11-07 22:52:37][CFG] register: section 'adc_cal' (9 keys)
[+303ms] [2026-11-07 22:52:37][CFG] register: section 'adc_cal_ofs' (8 keys)
[+313ms] [2026-11-07 22:52:37][APP] adc cal init: OK (k_q16 tpafe=10000000 stm32=52800000)
[+313ms] [2026-11-07 22:52:37][CFG] register: section 'run_par' (9 keys)
[+324ms] [2026-11-07 22:52:37][APP] run par init: OK (db9 k/b via adc_cal, evt=1<<8)
[+334ms] [2026-11-07 22:52:37][CFG] register: section 'comm' (2 keys)
[+334ms] [2026-11-07 22:52:37][APP] comm init: OK (ca=1 port=2404)
[+345ms] [2026-11-07 22:52:37][APP] protection init: OK (set=40 elm=9)
[+345ms] [2026-11-07 22:52:37][APP] SD2506 ID: 2512153425482405
[+355ms] [2026-11-07 22:52:37][APP] SD2506 time: 2026-11-07 22:52:37 (week 6)
[+355ms] [2026-11-07 22:52:37][APP] SD2506 temp: 23 C
[+366ms] [2026-11-07 22:52:37][APP] SD2506 battery: 3.12 V
[+366ms] [2026-11-07 22:52:37][APP] App init OK
[+376ms] [2026-11-07 22:52:37][NAND_FTL] Initializing NAND FTL...
[+397ms] [2026-11-07 22:52:37][PROT] uncalibrated -> protection blocked (UA/UN/IA VALID not all set)
[+512ms] [2026-11-07 22:52:37][NAND_FTL] Map resumed: 46942/93232 sectors used
[+522ms] [2026-11-07 22:52:37][NAND_FTL] Map head=36880 tail=92105 epoch=8
[+522ms] [2026-11-07 22:52:37][NAND_FTL] NAND FTL ready (capacity: 93232 pages = 182 MB)
[+605ms] [2026-11-07 22:52:37] [FS] FATFS mounted
[+667ms] [2026-11-07 22:52:37][SYSLOG] runlog boot entry: reboot
[+679ms] [2026-11-07 22:52:37][CFG] register: section 'network' (4 keys)
[+679ms] [2026-11-07 22:52:37][CFG] register: section 'ftp' (3 keys)
[+689ms] [2026-11-07 22:52:37][CFG] register: section 'sntp' (4 keys)
[+700ms] [2026-11-07 22:52:37][CFG] load: OK (1064B, heap free 16552B)
[+700ms] [2026-11-07 22:52:37][NET_CFG] load: OK ip=192.168.31.100
[+710ms] [2026-11-07 22:52:37] [CFG] prot set loaded (/prot_set.bin)
[+731ms] [2026-11-07 22:52:37][ADC_TASK] first: UA=-18 UB=417 UC=521 UN=-16 IA=-18 IB=0 IC=771 IN=833 T=713
[+741ms] [2026-11-07 22:52:37][ADC_TASK] phasor(first) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+752ms] [2026-11-07 22:52:37][ADC_TASK] phasor(first) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+752ms] [2026-11-07 22:52:37][ADC_TASK] phasor(first) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+762ms] [2026-11-07 22:52:37][ADC_TASK] phasor(first) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+772ms] [2026-11-07 22:52:37][ADC_TASK] phasor(first) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+772ms] [2026-11-07 22:52:37][ADC_TASK] freq(first): f=0 valid=0 (x0.01)
[+782ms] [2026-11-07 22:52:37][NET_TASK] === Network Init ===
[+782ms] [2026-11-07 22:52:37][PROT] protect task start: cycle=20ms elm=9
[+793ms] [2026-11-07 22:52:37][NET] ch395f ver=0x4A fun_para=0x08
[+793ms] MISS start snap=0x000001E7 req=0x000001F7 t=897
[+803ms] [2026-11-07 22:52:37][WD] [WD] armed: timeout ~2498ms (worst ~1701ms), miss_tol=800ms
[+814ms] [2026-11-07 22:52:37][NET_TASK] net init: OK
[+814ms] [2026-11-07 22:52:37][NET_TASK] MAC: 3C:AB:72:53:2B:12
[+856ms] [2026-11-07 22:52:37][NET_TASK] IP_INF: IP=192.168.31.100 GW=192.168.31.1 MASK=255.255.255.0
[+866ms] [2026-11-07 22:52:37][UI_TASK] UI task: started, wait net ready
[+2783ms] [2026-11-07 22:52:39][NET_TASK] PHY: 100M FULL
[+2804ms] [2026-11-07 22:52:39][NET_TASK] netTask: started (single-socket mode)
[+2835ms] [2026-11-07 22:52:39][ERR][I104] i104: bind port 2404 FAIL, retry in loop
[+2866ms] [2026-11-07 22:52:39] [FTP] using factory default password
[+2876ms] [2026-11-07 22:52:39] [FTP] waiting for connection...
[+2876ms] [2026-11-07 22:52:39][UI_TASK] UI task: net ready, init port
[+2887ms] [2026-11-07 22:52:39][UI_TASK] UI task: ui_port_init enter
[+2898ms] [2026-11-07 22:52:39][UI_PORT] theme: mono dark_bg=true applied
[+2898ms] [2026-11-07 22:52:39][UI_TASK] UI port init: OK
[+2908ms] [2026-11-07 22:52:39][UI_TASK] UI task: ui_menu_init enter
[+2908ms] [2026-11-07 22:52:39][UI_MENU] menu build start: total=15136 free=12692 big=12692
[+2918ms] [2026-11-07 22:52:39][UI_MENU_VIEW] view init: root frame w=66 h=107
[+2929ms] [2026-11-07 22:52:39][UI_MENU] menu build done: total=15020 free=11828 big=11816 used=3192
[+2939ms] [2026-11-07 22:52:39][UI_TASK] UI menu init: OK
[+2939ms] [2026-11-07 22:52:39][UI_STANDBY] standby: ready (idle=60000ms)
[+2950ms] [2026-11-07 22:52:39][UI_TASK] UI standby: ready (idle=60s)
[+2992ms] [2026-11-07 22:52:39][UI_TASK] UI net sink: started (port 7003)
[+3002ms] MISS start snap=0x000001E7 req=0x000001F7 t=3100
[+3002ms] [PROF] t=3104 uic=0 uip=0 uipn=0 uil=0 uiw=0 uis=0 uisn=0 adc=2630 adcm=2001 adcn=0 gl=0
[+3013ms] [PROF2] t=3104 defd=92184 defs=40929 netp=1026 netn=940 adcp=9 adcq=0 gl=0
[+3034ms] [2026-11-07 22:52:39][SBLINK] first frame: size=6 cmd=1 key=0
[+4942ms] [PROF] t=5038 uic=172 uip=29009 uipn=4851 uil=11004 uiw=19009 uis=1138 uisn=0 adc=4564 adcm=2001 adcn=0 gl=0
[+4953ms] [PROF2] t=5038 defd=92184 defs=40929 netp=1026 netn=0 adcp=9 adcq=0 gl=0
[+5377ms] [2026-11-07 22:52:42][SBLINK] rx=19 ok=19 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+5387ms] [2026-11-07 22:52:42] [STACK] default peak_used=2176/5120 free_min=2944 (57%)
[+5398ms] [2026-11-07 22:52:42] [STACK] net peak_used=1116/3840 free_min=2724 (70%)
[+5398ms] [2026-11-07 22:52:42] [STACK] ftp peak_used=740/4096 free_min=3356 (81%)
[+5408ms] [2026-11-07 22:52:42] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[+5418ms] [2026-11-07 22:52:42] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[+5418ms] [2026-11-07 22:52:42] [STACK] adc peak_used=1024/2560 free_min=1536 (60%)
[+5429ms] [2026-11-07 22:52:42] [STACK] iec104 peak_used=540/2560 free_min=2020 (78%)
[+5439ms] [2026-11-07 22:52:42] [STACK] protect peak_used=492/2048 free_min=1556 (75%)
[+5439ms] [2026-11-07 22:52:42] [STACK] heap free=15624 min_ever=8464
[+5450ms] [2026-11-07 22:52:42][SBLINK] tx=9 done=8 drop=10 kerr=0 abor=0 fb=5 bad=0 us=512 max=673 kq=0 off=0 dfok=0 dfold=0
[+6963ms] [PROF] t=7058 uic=347 uip=94958 uipn=856 uil=10998 uiw=85483 uis=1138 uisn=667 adc=6584 adcm=2001 adcn=0 gl=0
[+6973ms] [PROF2] t=7058 defd=92184 defs=40929 netp=1987 netn=0 adcp=9 adcq=0 gl=0
[+8974ms] [PROF] t=9076 uic=528 uip=94958 uipn=6856 uil=10999 uiw=85483 uis=17926 uisn=0 adc=8602 adcm=2001 adcn=0 gl=0
[+8985ms] [PROF2] t=9076 defd=92184 defs=40929 netp=1987 netn=0 adcp=9 adcq=0 gl=0
[+10382ms] [2026-11-07 22:52:47][ADC_TASK] frames=10000 idle=0 skip=1 seq=10006 frst_err=0 ring=9999 adc1_rc=0 adc1_err=0 adc1_seq=10005 adc1_gap=5 adc1_hw=0 tgap=1
[+10392ms] [2026-11-07 22:52:47][ADC_TASK] phasor(hb) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+10403ms] [2026-11-07 22:52:47][ADC_TASK] phasor(hb) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+10403ms] [2026-11-07 22:52:47][ADC_TASK] phasor(hb) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+10413ms] [2026-11-07 22:52:47][ADC_TASK] phasor(hb) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+10413ms] [2026-11-07 22:52:47][ADC_TASK] phasor(hb) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+10423ms] [2026-11-07 22:52:47][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[+10434ms] [2026-11-07 22:52:47][ADC_TASK] adc: UA=-23 UB=408 UC=614 UN=-21 IA=-21 IB=0 IC=761 IN=875 T=731
[+10444ms] [2026-11-07 22:52:47][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[+10444ms] [2026-11-07 22:52:47][ADC_TASK] meas: seq=50 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[+10455ms] [2026-11-07 22:52:47][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[+10465ms] [2026-11-07 22:52:47][SBLINK] rx=37 ok=37 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+10475ms] [2026-11-07 22:52:47][SBLINK] tx=27 done=27 drop=10 kerr=0 abor=0 fb=16 bad=0 us=676 max=676 kq=0 off=0 dfok=0 dfold=0
[+10984ms] [PROF] t=11084 uic=700 uip=94958 uipn=4856 uil=10982 uiw=85483 uis=17926 uisn=0 adc=10608 adcm=3437 adcn=0 gl=0
[+10995ms] [PROF2] t=11084 defd=92184 defs=40929 netp=4025 netn=0 adcp=9 adcq=0 gl=0
[+13009ms] [PROF] t=13102 uic=882 uip=94958 uipn=5863 uil=10999 uiw=85483 uis=17926 uisn=0 adc=12626 adcm=3437 adcn=0 gl=0
[+13009ms] [PROF2] t=13102 defd=92184 defs=40929 netp=4025 netn=0 adcp=9 adcq=0 gl=0
[+15021ms] [PROF] t=15120 uic=1064 uip=94958 uipn=5856 uil=10916 uiw=85483 uis=17926 uisn=0 adc=14644 adcm=3437 adcn=0 gl=0
[+15032ms] [PROF2] t=15120 defd=92184 defs=40929 netp=4025 netn=0 adcp=9 adcq=0 gl=0
[+15467ms] [2026-11-07 22:52:52][SBLINK] rx=55 ok=55 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+15477ms] [2026-11-07 22:52:52][SBLINK] tx=45 done=45 drop=10 kerr=0 abor=0 fb=26 bad=0 us=513 max=676 kq=0 off=0 dfok=0 dfold=0
[+17039ms] [PROF] t=17140 uic=1244 uip=94958 uipn=7855 uil=11000 uiw=85483 uis=17926 uisn=0 adc=16664 adcm=3437 adcn=0 gl=0
[+17050ms] [PROF2] t=17140 defd=92184 defs=40929 netp=4025 netn=0 adcp=9 adcq=0 gl=0
[+19069ms] [PROF] t=19158 uic=1426 uip=94958 uipn=5856 uil=10999 uiw=85483 uis=17926 uisn=0 adc=18682 adcm=3437 adcn=0 gl=0
[+19069ms] [PROF2] t=19158 defd=92184 defs=40929 netp=4025 netn=0 adcp=9 adcq=0 gl=0
[+20382ms] [2026-11-07 22:52:57][ADC_TASK] frames=19998 idle=0 skip=2 seq=20006 frst_err=0 ring=19996 adc1_rc=0 adc1_err=0 adc1_seq=20005 adc1_gap=8 adc1_hw=0 tgap=3
[+20392ms] [2026-11-07 22:52:57][ADC_TASK] phasor(hb) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+20402ms] [2026-11-07 22:52:57][ADC_TASK] phasor(hb) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+20402ms] [2026-11-07 22:52:57][ADC_TASK] phasor(hb) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+20412ms] [2026-11-07 22:52:57][ADC_TASK] phasor(hb) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+20412ms] [2026-11-07 22:52:57][ADC_TASK] phasor(hb) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+20423ms] [2026-11-07 22:52:57][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[+20433ms] [2026-11-07 22:52:57][ADC_TASK] adc: UA=-22 UB=403 UC=619 UN=-21 IA=-21 IB=0 IC=764 IN=890 T=750
[+20444ms] [2026-11-07 22:52:57][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[+20444ms] [2026-11-07 22:52:57][ADC_TASK] meas: seq=100 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[+20454ms] [2026-11-07 22:52:57][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[+20475ms] [2026-11-07 22:52:57][SBLINK] rx=73 ok=73 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+20485ms] [2026-11-07 22:52:57][SBLINK] tx=63 done=62 drop=10 kerr=0 abor=0 fb=35 bad=0 us=512 max=676 kq=0 off=0 dfok=0 dfold=0
[+21097ms] [PROF] t=21194 uic=1600 uip=98423 uipn=4856 uil=10997 uiw=85483 uis=17926 uisn=0 adc=20716 adcm=3462 adcn=0 gl=0
[+21107ms] [PROF2] t=21194 defd=92184 defs=40929 netp=4025 netn=0 adcp=9 adcq=0 gl=0
[+23114ms] [PROF] t=23212 uic=1782 uip=98423 uipn=5855 uil=11000 uiw=85483 uis=17926 uisn=0 adc=22734 adcm=3462 adcn=0 gl=0
[+23125ms] [PROF2] t=23212 defd=92184 defs=40929 netp=4025 netn=0 adcp=9 adcq=0 gl=0
[+25134ms] [PROF] t=25230 uic=1964 uip=98423 uipn=5856 uil=10998 uiw=85483 uis=17926 uisn=0 adc=24752 adcm=3462 adcn=0 gl=0
[+25144ms] [PROF2] t=25230 defd=92184 defs=40929 netp=4025 netn=0 adcp=9 adcq=0 gl=0
[+25477ms] [2026-11-07 22:53:02][SBLINK] rx=90 ok=90 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+25487ms] [2026-11-07 22:53:02][SBLINK] tx=80 done=80 drop=10 kerr=0 abor=0 fb=46 bad=0 us=513 max=676 kq=0 off=0 dfok=0 dfold=0
[+27152ms] [PROF] t=27250 uic=2144 uip=98423 uipn=9856 uil=11000 uiw=85483 uis=17926 uisn=0 adc=26772 adcm=3462 adcn=0 gl=0
[+27162ms] [PROF2] t=27250 defd=92184 defs=40929 netp=4025 netn=0 adcp=9 adcq=0 gl=0
[+29170ms] [PROF] t=29268 uic=2326 uip=98423 uipn=5857 uil=10998 uiw=85483 uis=17926 uisn=0 adc=28790 adcm=3462 adcn=0 gl=0
[+29180ms] [PROF2] t=29268 defd=92184 defs=40929 netp=4025 netn=0 adcp=9 adcq=0 gl=0
@@ -0,0 +1,157 @@
[+0ms] [----/--/-- --:--:--][APP] boot: syslog init OK
[+0ms] [----/--/-- --:--:--][APP] fw build: Nov 7 2026 19:10:36 suite=NONE dstr=off
[+10ms] [----/--/-- --:--:--][APP] reset cause: software (NVIC_SystemReset) (CSR=0x14000000)
[+10ms] PREVRUN seg=2 seq=2101858748 t=171841
[+21ms] TICKRUN uw=171873 n=171873 duw=32
[+21ms] [----/--/-- --:--:--][RTC] sd2506_init: OK
[+31ms] [----/--/-- --:--:--][APP] SD2506 init: OK (ret=0)
[+42ms] [2026-11-07 22:56:09][CLK] sys_clock_init: RTC initial time 2026-11-07 22:56:09
[+42ms] [2026-11-07 22:56:09][CLK] sys_clock_init: wall clock base = unix 1794092169, base_tick=142
[+52ms] [2026-11-07 22:56:09][APP] RS485 init: OK (UART4, DE=PA15)
[+62ms] [2026-11-07 22:56:09][APP] ScreenLink init: OK (ret=0, USART1 700000 baud, BRR=0x0078)
[+73ms] [2026-11-07 22:56:09][NAND] Resetting NAND...
[+94ms] [2026-11-07 22:56:09][NAND] Reading NAND ID...
[+94ms] [2026-11-07 22:56:09][NAND] NAND ID: MID=0xC8, DID=0x52
[+104ms] [2026-11-07 22:56:09][NAND] Scanning bad blocks...
[+238ms] [2026-11-07 22:56:09][NAND] BBT scan: 0 bad blocks found
[+238ms] [2026-11-07 22:56:09][NAND] Enabling ECC...
[+238ms] [2026-11-07 22:56:09][NAND] Unlocking block protection...
[+249ms] [2026-11-07 22:56:09][NAND] Locating BBT pool...
[+249ms] [2026-11-07 22:56:09][NAND] Loading persisted BBT...
[+259ms] [2026-11-07 22:56:09][NAND] NAND init OK
[+259ms] [2026-11-07 22:56:09][APP] NAND init: OK
[+270ms] [2026-11-07 22:56:09][ADC] Init OK
[+270ms] [2026-11-07 22:56:09][APP] ADC init: OK
[+270ms] [2026-11-07 22:56:09][APP] ADC input layer init: OK
[+281ms] [2026-11-07 22:56:09][APP] phasor layer init: OK (inst=5)
[+281ms] [2026-11-07 22:56:09][APP] freq layer init: OK
[+291ms] [2026-11-07 22:56:09][CFG] register: section 'adc_cal' (9 keys)
[+291ms] [2026-11-07 22:56:09][CFG] register: section 'adc_cal_ofs' (8 keys)
[+301ms] [2026-11-07 22:56:09][APP] adc cal init: OK (k_q16 tpafe=10000000 stm32=52800000)
[+312ms] [2026-11-07 22:56:09][CFG] register: section 'run_par' (9 keys)
[+312ms] [2026-11-07 22:56:09][APP] run par init: OK (db9 k/b via adc_cal, evt=1<<8)
[+322ms] [2026-11-07 22:56:09][CFG] register: section 'comm' (2 keys)
[+332ms] [2026-11-07 22:56:09][APP] comm init: OK (ca=1 port=2404)
[+332ms] [2026-11-07 22:56:09][APP] protection init: OK (set=40 elm=9)
[+343ms] [2026-11-07 22:56:09][APP] SD2506 ID: 2512153425482405
[+343ms] [2026-11-07 22:56:09][APP] SD2506 time: 2026-11-07 22:56:10 (week 6)
[+353ms] [2026-11-07 22:56:09][APP] SD2506 temp: 24 C
[+353ms] [2026-11-07 22:56:09][APP] SD2506 battery: 3.12 V
[+364ms] [2026-11-07 22:56:09][APP] App init OK
[+364ms] [2026-11-07 22:56:09][NAND_FTL] Initializing NAND FTL...
[+498ms] [2026-11-07 22:56:09][NAND_FTL] Map resumed: 46942/93232 sectors used
[+509ms] [2026-11-07 22:56:09][NAND_FTL] Map head=37008 tail=92232 epoch=8
[+509ms] [2026-11-07 22:56:09][NAND_FTL] NAND FTL ready (capacity: 93232 pages = 182 MB)
[+592ms] [2026-11-07 22:56:09] [FS] FATFS mounted
[+655ms] [2026-11-07 22:56:09][SYSLOG] runlog boot entry: reboot
[+655ms] [2026-11-07 22:56:09][CFG] register: section 'network' (4 keys)
[+665ms] [2026-11-07 22:56:09][CFG] register: section 'ftp' (3 keys)
[+665ms] [2026-11-07 22:56:09][CFG] register: section 'sntp' (4 keys)
[+686ms] [2026-11-07 22:56:09][CFG] load: OK (1064B, heap free 16552B)
[+686ms] [2026-11-07 22:56:09][NET_CFG] load: OK ip=192.168.31.100
[+697ms] [2026-11-07 22:56:09] [CFG] prot set loaded (/prot_set.bin)
[+759ms] [2026-11-07 22:56:09][PROT] uncalibrated -> protection blocked (UA/UN/IA VALID not all set)
[+759ms] [2026-11-07 22:56:09][ADC_TASK] first: UA=-17 UB=414 UC=521 UN=-17 IA=-17 IB=0 IC=765 IN=900 T=711
[+770ms] [2026-11-07 22:56:09][ADC_TASK] phasor(first) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+780ms] [2026-11-07 22:56:09][ADC_TASK] phasor(first) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+791ms] [2026-11-07 22:56:09][ADC_TASK] phasor(first) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+791ms] [2026-11-07 22:56:09][ADC_TASK] phasor(first) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+801ms] [2026-11-07 22:56:09][ADC_TASK] phasor(first) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+812ms] [2026-11-07 22:56:09][ADC_TASK] freq(first): f=0 valid=0 (x0.01)
[+812ms] [2026-11-07 22:56:09][NET_TASK] === Network Init ===
[+822ms] [2026-11-07 22:56:09][PROT] protect task start: cycle=20ms elm=9
[+822ms] [2026-11-07 22:56:09][NET] ch395f ver=0x4A fun_para=0x08
[+833ms] [2026-11-07 22:56:09][NET_TASK] net init: OK
[+833ms] [2026-11-07 22:56:09][NET_TASK] MAC: 3C:AB:72:53:2B:12
[+843ms] [2026-11-07 22:56:09][NET_TASK] IP_INF: IP=192.168.31.100 GW=192.168.31.1 MASK=255.255.255.0
[+843ms] MISS start snap=0x000001E7 req=0x000001F7 t=952
[+854ms] [2026-11-07 22:56:09][WD] [WD] armed: timeout ~2498ms (worst ~1701ms), miss_tol=800ms
[+895ms] [2026-11-07 22:56:09][UI_TASK] UI task: started, wait net ready
[+2749ms] [2026-11-07 22:56:11][NET_TASK] PHY: 100M FULL
[+2769ms] [2026-11-07 22:56:11][NET_TASK] netTask: started (single-socket mode)
[+2800ms] [2026-11-07 22:56:11][ERR][I104] i104: bind port 2404 FAIL, retry in loop
[+2832ms] [2026-11-07 22:56:11] [FTP] using factory default password
[+2832ms] [2026-11-07 22:56:11] [FTP] waiting for connection...
[+2842ms] [2026-11-07 22:56:11][UI_TASK] UI task: net ready, init port
[+2853ms] [2026-11-07 22:56:11][UI_TASK] UI task: ui_port_init enter
[+2863ms] [2026-11-07 22:56:11][UI_PORT] theme: mono dark_bg=true applied
[+2863ms] [2026-11-07 22:56:11][UI_TASK] UI port init: OK
[+2863ms] [2026-11-07 22:56:11][UI_TASK] UI task: ui_menu_init enter
[+2873ms] [2026-11-07 22:56:11][UI_MENU] menu build start: total=15136 free=12692 big=12692
[+2884ms] [2026-11-07 22:56:11][UI_MENU_VIEW] view init: root frame w=66 h=107
[+2894ms] [2026-11-07 22:56:11][UI_MENU] menu build done: total=15020 free=11828 big=11816 used=3192
[+2905ms] [2026-11-07 22:56:11][UI_TASK] UI menu init: OK
[+2905ms] [2026-11-07 22:56:11][UI_STANDBY] standby: ready (idle=60000ms)
[+2915ms] [2026-11-07 22:56:11][UI_TASK] UI standby: ready (idle=60s)
[+2967ms] [2026-11-07 22:56:11][UI_TASK] UI net sink: started (port 7003)
[+2967ms] MISS start snap=0x000001E7 req=0x000001F7 t=3073
[+2967ms] [PROF] t=3077 uic=0 uip=0 uipn=0 uil=0 uiw=0 uis=0 uisn=0 adc=2606 adcm=1917 adcn=0 gl=0
[+2978ms] [PROF2] t=3077 defd=96634 defs=38441 netp=1008 netn=0 adcp=9 adcq=0 gl=0
[+2999ms] [2026-11-07 22:56:11][SBLINK] first frame: size=6 cmd=1 key=0
[+4902ms] [PROF] t=5011 uic=172 uip=28812 uipn=4855 uil=10999 uiw=18696 uis=1136 uisn=0 adc=4539 adcm=1917 adcn=0 gl=0
[+4912ms] [PROF2] t=5011 defd=96634 defs=38441 netp=1008 netn=0 adcp=9 adcq=0 gl=0
[+5378ms] [2026-11-07 22:56:14] [STACK] default peak_used=2176/5120 free_min=2944 (57%)
[+5378ms] [2026-11-07 22:56:14] [STACK] net peak_used=1048/3840 free_min=2792 (72%)
[+5388ms] [2026-11-07 22:56:14] [STACK] ftp peak_used=740/4096 free_min=3356 (81%)
[+5398ms] [2026-11-07 22:56:14] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[+5398ms] [2026-11-07 22:56:14] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[+5409ms] [2026-11-07 22:56:14] [STACK] adc peak_used=1024/2560 free_min=1536 (60%)
[+5419ms] [2026-11-07 22:56:14] [STACK] iec104 peak_used=540/2560 free_min=2020 (78%)
[+5419ms] [2026-11-07 22:56:14] [STACK] protect peak_used=492/2048 free_min=1556 (75%)
[+5430ms] [2026-11-07 22:56:14] [STACK] heap free=15624 min_ever=8464
[+5440ms] [2026-11-07 22:56:14][SBLINK] rx=19 ok=19 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+5451ms] [2026-11-07 22:56:14][SBLINK] tx=9 done=9 drop=10 kerr=0 abor=0 fb=6 bad=0 us=513 max=672 kq=0 off=0 dfok=0 dfold=0
[+6908ms] [PROF] t=7013 uic=345 uip=72735 uipn=6855 uil=10999 uiw=22654 uis=1136 uisn=0 adc=6541 adcm=1917 adcn=0 gl=0
[+6918ms] [PROF2] t=7013 defd=96634 defs=38441 netp=1009 netn=0 adcp=9 adcq=0 gl=0
[+8927ms] [PROF] t=9030 uic=527 uip=72735 uipn=4856 uil=10999 uiw=22654 uis=1157 uisn=0 adc=8558 adcm=1917 adcn=0 gl=0
[+8937ms] [PROF2] t=9030 defd=96634 defs=38441 netp=1009 netn=0 adcp=9 adcq=0 gl=0
[+10366ms] [2026-11-07 22:56:19][ADC_TASK] frames=10001 idle=0 skip=2 seq=10006 frst_err=0 ring=9999 adc1_rc=0 adc1_err=0 adc1_seq=10005 adc1_gap=5 adc1_hw=0 tgap=0
[+10387ms] [2026-11-07 22:56:19][ADC_TASK] phasor(hb) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+10387ms] [2026-11-07 22:56:19][ADC_TASK] phasor(hb) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+10397ms] [2026-11-07 22:56:19][ADC_TASK] phasor(hb) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+10407ms] [2026-11-07 22:56:19][ADC_TASK] phasor(hb) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+10407ms] [2026-11-07 22:56:19][ADC_TASK] phasor(hb) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+10418ms] [2026-11-07 22:56:19][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[+10428ms] [2026-11-07 22:56:19][ADC_TASK] adc: UA=-22 UB=405 UC=620 UN=-21 IA=-21 IB=0 IC=758 IN=894 T=729
[+10428ms] [2026-11-07 22:56:19][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[+10439ms] [2026-11-07 22:56:19][ADC_TASK] meas: seq=50 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[+10449ms] [2026-11-07 22:56:19][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[+10459ms] [2026-11-07 22:56:19][SBLINK] rx=37 ok=37 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+10470ms] [2026-11-07 22:56:19][SBLINK] tx=27 done=27 drop=10 kerr=0 abor=0 fb=16 bad=0 us=511 max=672 kq=0 off=0 dfok=0 dfold=0
[+10924ms] [PROF] t=11033 uic=698 uip=93581 uipn=10861 uil=10998 uiw=23057 uis=1157 uisn=0 adc=10559 adcm=3418 adcn=0 gl=0
[+10935ms] [PROF2] t=11033 defd=96634 defs=38441 netp=4008 netn=0 adcp=9 adcq=0 gl=0
[+12943ms] [PROF] t=13051 uic=880 uip=93581 uipn=5855 uil=11000 uiw=23057 uis=1157 uisn=0 adc=12577 adcm=3418 adcn=0 gl=0
[+12953ms] [PROF2] t=13051 defd=96634 defs=38441 netp=4008 netn=0 adcp=9 adcq=0 gl=0
[+14969ms] [PROF] t=15069 uic=1062 uip=93581 uipn=5856 uil=10998 uiw=23057 uis=1157 uisn=0 adc=14595 adcm=3418 adcn=0 gl=0
[+14969ms] [PROF2] t=15069 defd=96634 defs=38441 netp=4008 netn=0 adcp=9 adcq=0 gl=0
[+15466ms] [2026-11-07 22:56:24][SBLINK] rx=55 ok=55 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+15476ms] [2026-11-07 22:56:24][SBLINK] tx=45 done=45 drop=10 kerr=0 abor=0 fb=26 bad=0 us=511 max=672 kq=0 off=0 dfok=0 dfold=0
[+16985ms] [PROF] t=17092 uic=1243 uip=93581 uipn=1855 uil=10982 uiw=23057 uis=1157 uisn=0 adc=16618 adcm=3418 adcn=0 gl=0
[+16995ms] [PROF2] t=17092 defd=96634 defs=38441 netp=4008 netn=0 adcp=9 adcq=0 gl=0
[+19001ms] [PROF] t=19110 uic=1425 uip=93581 uipn=5856 uil=10998 uiw=23057 uis=1157 uisn=0 adc=18636 adcm=3418 adcn=0 gl=0
[+19011ms] [PROF2] t=19110 defd=96634 defs=38441 netp=4008 netn=0 adcp=9 adcq=0 gl=0
[+20371ms] [2026-11-07 22:56:29][ADC_TASK] frames=19999 idle=0 skip=3 seq=20006 frst_err=0 ring=19996 adc1_rc=0 adc1_err=0 adc1_seq=20005 adc1_gap=8 adc1_hw=0 tgap=2
[+20381ms] [2026-11-07 22:56:29][ADC_TASK] phasor(hb) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+20392ms] [2026-11-07 22:56:29][ADC_TASK] phasor(hb) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+20392ms] [2026-11-07 22:56:29][ADC_TASK] phasor(hb) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+20402ms] [2026-11-07 22:56:29][ADC_TASK] phasor(hb) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+20412ms] [2026-11-07 22:56:29][ADC_TASK] phasor(hb) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+20423ms] [2026-11-07 22:56:29][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[+20423ms] [2026-11-07 22:56:29][ADC_TASK] adc: UA=-20 UB=401 UC=613 UN=-20 IA=-20 IB=0 IC=765 IN=897 T=750
[+20433ms] [2026-11-07 22:56:29][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[+20444ms] [2026-11-07 22:56:29][ADC_TASK] meas: seq=100 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[+20444ms] [2026-11-07 22:56:29][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[+20464ms] [2026-11-07 22:56:29][SBLINK] rx=73 ok=73 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+20475ms] [2026-11-07 22:56:29][SBLINK] tx=63 done=63 drop=10 kerr=0 abor=0 fb=36 bad=0 us=511 max=672 kq=0 off=0 dfok=0 dfold=0
[+21035ms] [PROF] t=21142 uic=1598 uip=98999 uipn=10855 uil=11000 uiw=89760 uis=89573 uisn=0 adc=20666 adcm=3450 adcn=0 gl=0
[+21045ms] [PROF2] t=21142 defd=96634 defs=38441 netp=4008 netn=0 adcp=9 adcq=0 gl=0
[+23054ms] [PROF] t=23160 uic=1780 uip=98999 uipn=5856 uil=10999 uiw=89760 uis=89573 uisn=0 adc=22684 adcm=3450 adcn=0 gl=0
[+23064ms] [PROF2] t=23160 defd=96634 defs=38441 netp=4008 netn=0 adcp=9 adcq=0 gl=0
[+25074ms] [PROF] t=25178 uic=1962 uip=98999 uipn=5855 uil=10999 uiw=89760 uis=89573 uisn=0 adc=24702 adcm=3450 adcn=0 gl=0
[+25085ms] [PROF2] t=25178 defd=96634 defs=38441 netp=4008 netn=0 adcp=9 adcq=0 gl=0
[+25480ms] [2026-11-07 22:56:34][SBLINK] rx=91 ok=91 keys=0 crc=0 len=0 fmt=0 err=1 bits=0x08 rearm=0 size=6 key=0
[+25490ms] [2026-11-07 22:56:34][SBLINK] tx=81 done=81 drop=10 kerr=0 abor=0 fb=46 bad=0 us=511 max=672 kq=0 off=0 dfok=0 dfold=0
[+27101ms] [PROF] t=27203 uic=2143 uip=98999 uipn=3843 uil=11016 uiw=89760 uis=89573 uisn=0 adc=26727 adcm=3450 adcn=0 gl=0
[+27112ms] [PROF2] t=27203 defd=96634 defs=38441 netp=4008 netn=0 adcp=9 adcq=0 gl=0
[+29117ms] [PROF] t=29221 uic=2325 uip=98999 uipn=5855 uil=11000 uiw=89760 uis=89573 uisn=0 adc=28745 adcm=3450 adcn=0 gl=0
[+29127ms] [PROF2] t=29221 defd=96634 defs=38441 netp=4008 netn=0 adcp=9 adcq=0 gl=0
@@ -0,0 +1,157 @@
[+0ms] [----/--/-- --:--:--][APP] boot: syslog init OK
[+11ms] [----/--/-- --:--:--][APP] fw build: Nov 7 2026 19:10:36 suite=NONE dstr=off
[+11ms] [----/--/-- --:--:--][APP] reset cause: software (NVIC_SystemReset) (CSR=0x14000000)
[+21ms] PREVRUN seg=2 seq=2102063490 t=1334204
[+21ms] TICKRUN uw=1334216 n=1334216 duw=12
[+31ms] [----/--/-- --:--:--][RTC] sd2506_init: OK
[+31ms] [----/--/-- --:--:--][APP] SD2506 init: OK (ret=0)
[+42ms] [2026-11-07 23:19:04][CLK] sys_clock_init: RTC initial time 2026-11-07 23:19:04
[+53ms] [2026-11-07 23:19:04][CLK] sys_clock_init: wall clock base = unix 1794093544, base_tick=143
[+63ms] [2026-11-07 23:19:04][APP] RS485 init: OK (UART4, DE=PA15)
[+63ms] [2026-11-07 23:19:04][APP] ScreenLink init: OK (ret=0, USART1 700000 baud, BRR=0x0078)
[+84ms] [2026-11-07 23:19:04][NAND] Resetting NAND...
[+105ms] [2026-11-07 23:19:04][NAND] Reading NAND ID...
[+105ms] [2026-11-07 23:19:04][NAND] NAND ID: MID=0xC8, DID=0x52
[+105ms] [2026-11-07 23:19:04][NAND] Scanning bad blocks...
[+240ms] [2026-11-07 23:19:04][NAND] BBT scan: 0 bad blocks found
[+251ms] [2026-11-07 23:19:04][NAND] Enabling ECC...
[+251ms] [2026-11-07 23:19:04][NAND] Unlocking block protection...
[+261ms] [2026-11-07 23:19:04][NAND] Locating BBT pool...
[+261ms] [2026-11-07 23:19:04][NAND] Loading persisted BBT...
[+272ms] [2026-11-07 23:19:04][NAND] NAND init OK
[+272ms] [2026-11-07 23:19:04][APP] NAND init: OK
[+272ms] [2026-11-07 23:19:04][ADC] Init OK
[+282ms] [2026-11-07 23:19:04][APP] ADC init: OK
[+282ms] [2026-11-07 23:19:04][APP] ADC input layer init: OK
[+282ms] [2026-11-07 23:19:04][APP] phasor layer init: OK (inst=5)
[+292ms] [2026-11-07 23:19:04][APP] freq layer init: OK
[+303ms] [2026-11-07 23:19:04][CFG] register: section 'adc_cal' (9 keys)
[+303ms] [2026-11-07 23:19:04][CFG] register: section 'adc_cal_ofs' (8 keys)
[+313ms] [2026-11-07 23:19:04][APP] adc cal init: OK (k_q16 tpafe=10000000 stm32=52800000)
[+313ms] [2026-11-07 23:19:04][CFG] register: section 'run_par' (9 keys)
[+324ms] [2026-11-07 23:19:04][APP] run par init: OK (db9 k/b via adc_cal, evt=1<<8)
[+334ms] [2026-11-07 23:19:04][CFG] register: section 'comm' (2 keys)
[+334ms] [2026-11-07 23:19:04][APP] comm init: OK (ca=1 port=2404)
[+345ms] [2026-11-07 23:19:04][APP] protection init: OK (set=40 elm=9)
[+345ms] [2026-11-07 23:19:04][APP] SD2506 ID: 2512153425482405
[+355ms] [2026-11-07 23:19:04][APP] SD2506 time: 2026-11-07 23:19:05 (week 6)
[+366ms] [2026-11-07 23:19:04][APP] SD2506 temp: 24 C
[+366ms] [2026-11-07 23:19:04][APP] SD2506 battery: 3.12 V
[+366ms] [2026-11-07 23:19:04][APP] App init OK
[+376ms] [2026-11-07 23:19:04][NAND_FTL] Initializing NAND FTL...
[+376ms] [2026-11-07 23:19:04][PROT] uncalibrated -> protection blocked (UA/UN/IA VALID not all set)
[+480ms] [2026-11-07 23:19:04][NAND_FTL] Map resumed: 46942/93232 sectors used
[+480ms] [2026-11-07 23:19:04][NAND_FTL] Map head=46768 tail=94934 epoch=8
[+491ms] [2026-11-07 23:19:04][NAND_FTL] NAND FTL ready (capacity: 93232 pages = 182 MB)
[+573ms] [2026-11-07 23:19:04] [FS] FATFS mounted
[+646ms] [2026-11-07 23:19:04][SYSLOG] runlog boot entry: power on
[+646ms] [2026-11-07 23:19:04][CFG] register: section 'network' (4 keys)
[+656ms] [2026-11-07 23:19:04][CFG] register: section 'ftp' (3 keys)
[+667ms] [2026-11-07 23:19:04][CFG] register: section 'sntp' (4 keys)
[+677ms] [2026-11-07 23:19:04][CFG] load: OK (1064B, heap free 16552B)
[+677ms] [2026-11-07 23:19:04][NET_CFG] load: OK ip=192.168.31.100
[+688ms] [2026-11-07 23:19:04] [CFG] prot set loaded (/prot_set.bin)
[+709ms] [2026-11-07 23:19:04][ADC_TASK] first: UA=-18 UB=415 UC=521 UN=-17 IA=-18 IB=0 IC=762 IN=903 T=716
[+720ms] [2026-11-07 23:19:04][ADC_TASK] phasor(first) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+730ms] [2026-11-07 23:19:04][ADC_TASK] phasor(first) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+730ms] [2026-11-07 23:19:04][ADC_TASK] phasor(first) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+740ms] [2026-11-07 23:19:04][ADC_TASK] phasor(first) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+751ms] [2026-11-07 23:19:04][ADC_TASK] phasor(first) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+751ms] [2026-11-07 23:19:04][ADC_TASK] freq(first): f=0 valid=0 (x0.01)
[+761ms] [2026-11-07 23:19:04][NET_TASK] === Network Init ===
[+761ms] [2026-11-07 23:19:04][PROT] protect task start: cycle=20ms elm=9
[+772ms] [2026-11-07 23:19:04][NET] ch395f ver=0x4A fun_para=0x08
[+772ms] [2026-11-07 23:19:04][NET_TASK] net init: OK
[+782ms] [2026-11-07 23:19:04][NET_TASK] MAC: 3C:AB:72:53:2B:12
[+782ms] MISS start snap=0x000001E7 req=0x000001F7 t=885
[+793ms] [2026-11-07 23:19:04][WD] [WD] armed: timeout ~2498ms (worst ~1701ms), miss_tol=800ms
[+793ms] [2026-11-07 23:19:04][NET_TASK] IP_INF: IP=192.168.31.100 GW=192.168.31.1 MASK=255.255.255.0
[+845ms] [2026-11-07 23:19:04][UI_TASK] UI task: started, wait net ready
[+2752ms] [2026-11-07 23:19:06][NET_TASK] PHY: 100M FULL
[+2762ms] [2026-11-07 23:19:06][NET_TASK] netTask: started (single-socket mode)
[+2794ms] [2026-11-07 23:19:06][ERR][I104] i104: bind port 2404 FAIL, retry in loop
[+2835ms] [2026-11-07 23:19:06] [FTP] using factory default password
[+2835ms] [2026-11-07 23:19:06] [FTP] waiting for connection...
[+2846ms] MISS start snap=0x000001E7 req=0x000001F7 t=2941
[+2846ms] [PROF] t=2946 uic=0 uip=0 uipn=0 uil=0 uiw=0 uis=0 uisn=0 adc=2472 adcm=1922 adcn=0 gl=0
[+2856ms] [PROF2] t=2946 defd=96546 defs=36903 netp=996 netn=0 adcp=8 adcq=0 gl=0
[+2856ms] [2026-11-07 23:19:06][UI_TASK] UI task: net ready, init port
[+2867ms] [2026-11-07 23:19:06][UI_TASK] UI task: ui_port_init enter
[+2877ms] [2026-11-07 23:19:06][UI_PORT] theme: mono dark_bg=true applied
[+2877ms] [2026-11-07 23:19:06][UI_TASK] UI port init: OK
[+2887ms] [2026-11-07 23:19:06][UI_TASK] UI task: ui_menu_init enter
[+2887ms] [2026-11-07 23:19:06][UI_MENU] menu build start: total=15136 free=12692 big=12692
[+2897ms] [2026-11-07 23:19:06][UI_MENU_VIEW] view init: root frame w=66 h=107
[+2908ms] [2026-11-07 23:19:06][UI_MENU] menu build done: total=15020 free=11828 big=11816 used=3192
[+2919ms] [2026-11-07 23:19:06][UI_TASK] UI menu init: OK
[+2919ms] [2026-11-07 23:19:06][UI_STANDBY] standby: ready (idle=60000ms)
[+2929ms] [2026-11-07 23:19:06][UI_TASK] UI standby: ready (idle=60s)
[+2982ms] [2026-11-07 23:19:06][UI_TASK] UI net sink: started (port 7003)
[+2992ms] [2026-11-07 23:19:06][SBLINK] first frame: size=6 cmd=1 key=0
[+4899ms] [PROF] t=5000 uic=172 uip=29195 uipn=5856 uil=10999 uiw=19168 uis=1135 uisn=0 adc=4526 adcm=1922 adcn=0 gl=0
[+4909ms] [PROF2] t=5000 defd=96546 defs=36903 netp=1016 netn=0 adcp=8 adcq=0 gl=0
[+5386ms] [2026-11-07 23:19:09][SBLINK] rx=19 ok=19 keys=0 crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0 size=6 key=0
[+5396ms] [2026-11-07 23:19:09] [STACK] default peak_used=2188/5120 free_min=2932 (57%)
[+5407ms] [2026-11-07 23:19:09] [STACK] net peak_used=1116/3840 free_min=2724 (70%)
[+5407ms] [2026-11-07 23:19:09] [STACK] ftp peak_used=740/4096 free_min=3356 (81%)
[+5417ms] [2026-11-07 23:19:09] [STACK] ui peak_used=4204/16384 free_min=12180 (74%)
[+5427ms] [2026-11-07 23:19:09] [STACK] timesync peak_used=476/2560 free_min=2084 (81%)
[+5427ms] [2026-11-07 23:19:09] [STACK] adc peak_used=1024/2560 free_min=1536 (60%)
[+5438ms] [2026-11-07 23:19:09] [STACK] iec104 peak_used=540/2560 free_min=2020 (78%)
[+5448ms] [2026-11-07 23:19:09] [STACK] protect peak_used=492/2048 free_min=1556 (75%)
[+5448ms] [2026-11-07 23:19:09] [STACK] heap free=15624 min_ever=8464
[+5459ms] [2026-11-07 23:19:09][SBLINK] tx=8 done=8 drop=11 kerr=0 abor=0 fb=6 bad=0 us=513 max=675 kq=0 off=0 dfok=0 dfold=0
[+6919ms] [PROF] t=7016 uic=346 uip=95998 uipn=6855 uil=11000 uiw=86551 uis=1139 uisn=0 adc=6542 adcm=1922 adcn=0 gl=0
[+6929ms] [PROF2] t=7016 defd=96546 defs=36903 netp=1017 netn=0 adcp=8 adcq=0 gl=0
[+8939ms] [PROF] t=9033 uic=528 uip=95998 uipn=4856 uil=10999 uiw=86551 uis=1197 uisn=0 adc=8559 adcm=1922 adcn=0 gl=0
[+8939ms] [PROF2] t=9033 defd=96546 defs=36903 netp=1017 netn=0 adcp=8 adcq=0 gl=0
[+10379ms] [2026-11-07 23:19:14][ADC_TASK] frames=10001 idle=0 skip=2 seq=10006 frst_err=0 ring=9999 adc1_rc=0 adc1_err=0 adc1_seq=10005 adc1_gap=5 adc1_hw=0 tgap=0
[+10390ms] [2026-11-07 23:19:14][ADC_TASK] phasor(hb) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+10401ms] [2026-11-07 23:19:14][ADC_TASK] phasor(hb) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+10401ms] [2026-11-07 23:19:14][ADC_TASK] phasor(hb) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+10412ms] [2026-11-07 23:19:14][ADC_TASK] phasor(hb) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+10422ms] [2026-11-07 23:19:14][ADC_TASK] phasor(hb) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+10422ms] [2026-11-07 23:19:14][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[+10433ms] [2026-11-07 23:19:14][ADC_TASK] adc: UA=-23 UB=405 UC=617 UN=-21 IA=-21 IB=0 IC=758 IN=894 T=731
[+10443ms] [2026-11-07 23:19:14][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[+10453ms] [2026-11-07 23:19:14][ADC_TASK] meas: seq=50 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[+10453ms] [2026-11-07 23:19:14][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[+10464ms] [2026-11-07 23:19:14][SBLINK] rx=38 ok=38 keys=0 crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0 size=6 key=0
[+10474ms] [2026-11-07 23:19:14][SBLINK] tx=27 done=26 drop=11 kerr=0 abor=0 fb=15 bad=0 us=512 max=675 kq=0 off=0 dfok=0 dfold=0
[+10939ms] [PROF] t=11034 uic=699 uip=95998 uipn=8856 uil=10998 uiw=86551 uis=1197 uisn=0 adc=10558 adcm=3427 adcn=0 gl=0
[+10939ms] [PROF2] t=11034 defd=96546 defs=36903 netp=4017 netn=0 adcp=8 adcq=0 gl=0
[+12959ms] [PROF] t=13052 uic=881 uip=95998 uipn=5855 uil=10999 uiw=86551 uis=1197 uisn=0 adc=12576 adcm=3427 adcn=0 gl=0
[+12959ms] [PROF2] t=13052 defd=96546 defs=36903 netp=4017 netn=0 adcp=8 adcq=0 gl=0
[+14968ms] [PROF] t=15070 uic=1063 uip=95998 uipn=5856 uil=10998 uiw=86551 uis=1197 uisn=0 adc=14594 adcm=3427 adcn=0 gl=0
[+14979ms] [PROF2] t=15070 defd=96546 defs=36903 netp=4017 netn=0 adcp=8 adcq=0 gl=0
[+15474ms] [2026-11-07 23:19:19][SBLINK] rx=55 ok=55 keys=0 crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0 size=6 key=0
[+15485ms] [2026-11-07 23:19:19][SBLINK] tx=44 done=44 drop=11 kerr=0 abor=0 fb=26 bad=0 us=511 max=675 kq=0 off=0 dfok=0 dfold=0
[+16996ms] [PROF] t=17095 uic=1244 uip=95998 uipn=1859 uil=11000 uiw=86551 uis=1197 uisn=0 adc=16619 adcm=3427 adcn=0 gl=0
[+17006ms] [PROF2] t=17095 defd=96546 defs=36903 netp=4017 netn=0 adcp=8 adcq=0 gl=0
[+19013ms] [PROF] t=19113 uic=1426 uip=95998 uipn=5839 uil=11015 uiw=86551 uis=1197 uisn=0 adc=18637 adcm=3427 adcn=0 gl=0
[+19023ms] [PROF2] t=19113 defd=96546 defs=36903 netp=4017 netn=0 adcp=8 adcq=0 gl=0
[+20380ms] [2026-11-07 23:19:24][ADC_TASK] frames=19999 idle=0 skip=3 seq=20006 frst_err=0 ring=19996 adc1_rc=0 adc1_err=0 adc1_seq=20005 adc1_gap=8 adc1_hw=0 tgap=2
[+20391ms] [2026-11-07 23:19:24][ADC_TASK] phasor(hb) C01-IA-F1: Re=0 Im=0 rms=0 (x0.1)
[+20401ms] [2026-11-07 23:19:24][ADC_TASK] phasor(hb) C02-UA-F1: Re=0 Im=0 rms=0 (x0.1)
[+20401ms] [2026-11-07 23:19:24][ADC_TASK] phasor(hb) C03-UN-F1: Re=0 Im=0 rms=0 (x0.1)
[+20411ms] [2026-11-07 23:19:24][ADC_TASK] phasor(hb) C04-IA-F2: Re=0 Im=0 rms=0 (x0.1)
[+20422ms] [2026-11-07 23:19:24][ADC_TASK] phasor(hb) C05-IA-F5: Re=0 Im=0 rms=0 (x0.1)
[+20422ms] [2026-11-07 23:19:24][ADC_TASK] freq(hb): f=0 valid=0 (x0.01)
[+20432ms] [2026-11-07 23:19:24][ADC_TASK] adc: UA=-21 UB=401 UC=617 UN=-21 IA=-21 IB=0 IC=763 IN=896 T=751
[+20443ms] [2026-11-07 23:19:24][ADC_TASK] cal: ua_mv=-3 un_mv=-3 ia_mv=-3 vl=0x00 cl=0xe6 rail=0x000 edge=0x000
[+20453ms] [2026-11-07 23:19:24][ADC_TASK] meas: seq=100 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
[+20453ms] [2026-11-07 23:19:24][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[+20474ms] [2026-11-07 23:19:24][SBLINK] rx=73 ok=73 keys=0 crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0 size=6 key=0
[+20485ms] [2026-11-07 23:19:24][SBLINK] tx=62 done=62 drop=11 kerr=0 abor=0 fb=36 bad=0 us=511 max=675 kq=0 off=0 dfok=0 dfold=0
[+21053ms] [PROF] t=21146 uic=1599 uip=99822 uipn=10855 uil=11000 uiw=86551 uis=1197 uisn=0 adc=20668 adcm=3458 adcn=0 gl=0
[+21053ms] [PROF2] t=21146 defd=96546 defs=36903 netp=4017 netn=0 adcp=8 adcq=0 gl=0
[+23062ms] [PROF] t=23164 uic=1781 uip=99822 uipn=5856 uil=10982 uiw=86551 uis=1197 uisn=0 adc=22686 adcm=3458 adcn=0 gl=0
[+23073ms] [PROF2] t=23164 defd=96546 defs=36903 netp=4017 netn=0 adcp=8 adcq=0 gl=0
[+25088ms] [PROF] t=25182 uic=1963 uip=99822 uipn=5855 uil=10999 uiw=86551 uis=1197 uisn=0 adc=24704 adcm=3458 adcn=0 gl=0
[+25088ms] [PROF2] t=25182 defd=96546 defs=36903 netp=4017 netn=0 adcp=8 adcq=0 gl=0
[+25490ms] [2026-11-07 23:19:29][SBLINK] rx=91 ok=91 keys=0 crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0 size=6 key=0
[+25501ms] [2026-11-07 23:19:29][SBLINK] tx=80 done=80 drop=11 kerr=0 abor=0 fb=46 bad=0 us=513 max=675 kq=0 off=0 dfok=0 dfold=0
[+27107ms] [PROF] t=27207 uic=2144 uip=99822 uipn=3865 uil=11000 uiw=86551 uis=1197 uisn=0 adc=26729 adcm=3458 adcn=0 gl=0
[+27117ms] [PROF2] t=27207 defd=96546 defs=36903 netp=4017 netn=0 adcp=8 adcq=0 gl=0
[+29123ms] [PROF] t=29225 uic=2326 uip=99822 uipn=5855 uil=10917 uiw=86551 uis=1197 uisn=0 adc=28747 adcm=3458 adcn=0 gl=0
[+29133ms] [PROF2] t=29225 defd=96546 defs=36903 netp=4017 netn=0 adcp=8 adcq=0 gl=0
@@ -0,0 +1,58 @@
{
"battery_log.txt": "ff26bfcac72426b64e1f2eb0197b6c57718a04baefa7ed8e5ab5b509b16146d8",
"boot_new3_stdout.txt": "8d4ffa53239dc760eb0fefe58e12583a6576c1d6850c80f3e77f695a2696a2cd",
"newN_A_reject5_enter1.png": "342b3aa67a775817a40159cca61987251217ce32a252a5841642ffe14ca1d463",
"newN_A_reject5_enter1_raw3200.bin": "17291a0068f2d4ab099f636888e809941ad9bba52cad942ff6341a8677b72889",
"newN_A_reject5_enter2.png": "342b3aa67a775817a40159cca61987251217ce32a252a5841642ffe14ca1d463",
"newN_A_reject5_enter2_raw3200.bin": "17291a0068f2d4ab099f636888e809941ad9bba52cad942ff6341a8677b72889",
"newN_A_reject5_enter3.png": "342b3aa67a775817a40159cca61987251217ce32a252a5841642ffe14ca1d463",
"newN_A_reject5_enter3_raw3200.bin": "17291a0068f2d4ab099f636888e809941ad9bba52cad942ff6341a8677b72889",
"newN_B_restored_normal6.png": "f520feb7a59bf1fe1997dd45d27159d9caa11130833d96b8b3e6cdd344de2818",
"newN_B_restored_normal6_raw3200.bin": "c538a051b6bdcca7e871710eb8f0dae2ba54cc6a62725765ce6ce116645f3fef",
"newN_C_reject1_head99.png": "342b3aa67a775817a40159cca61987251217ce32a252a5841642ffe14ca1d463",
"newN_C_reject1_head99_raw3200.bin": "17291a0068f2d4ab099f636888e809941ad9bba52cad942ff6341a8677b72889",
"newN_D_final_ok99.png": "d3fc9b4f41c4d34ee6953d7fdf444d43dae20003dafe13fa69d4aa606fc9c94f",
"newN_D_final_ok99_raw3200.bin": "36a3271a78dafe6afc0c93282ab6e0c993af22395ed8b030be821a98c1bb80ba",
"newN_F11_reopen_seg99_max.png": "d3fc9b4f41c4d34ee6953d7fdf444d43dae20003dafe13fa69d4aa606fc9c94f",
"newN_F11_reopen_seg99_max_raw3200.bin": "36a3271a78dafe6afc0c93282ab6e0c993af22395ed8b030be821a98c1bb80ba",
"newN_F12_empty_state.png": "4056c7b6ea2d711161f2eb52e90bb3342e1a085c8d564de893cb555a9554afd7",
"newN_F12_empty_state_raw3200.bin": "a76c41cfd7f38cecf1092777371869a0a28a4c0ca09eb6963e17afc94d713f66",
"newN_F12_idlekey_seg6.png": "f520feb7a59bf1fe1997dd45d27159d9caa11130833d96b8b3e6cdd344de2818",
"newN_F12_idlekey_seg6_raw3200.bin": "c538a051b6bdcca7e871710eb8f0dae2ba54cc6a62725765ce6ce116645f3fef",
"newN_F13_after_spam.png": "e004e0e15173e1dc715e0b29bd8b1cdbf31f9f809db60013562bcafd11d70a3c",
"newN_F13_after_spam_raw3200.bin": "bfacdb1d922f4e7277d10a3a9a5c469e0257106f3e7dded5940884e853b30221",
"newN_F14_manual_confirm.png": "2495d41b9b2a761ea5c1a898ae77bb0ef5aafbd21c263616635e87dfcf824061",
"newN_F14_manual_confirm_raw3200.bin": "ee14db44f2437dea6cc7dab10b3d49b1aa636fdddd30d2e9396fee107a4a92fd",
"newN_F14_manual_done.png": "6a96fa3ed9993933b9b86467ffd7da60ab51f287aa3e81c30131c8d3ce329350",
"newN_F14_manual_done_raw3200.bin": "0d677bf478c579391a1ac935d18928cfbbffe278047e72d329049f4b4b2d7162",
"newN_F14_manual_page.png": "0a44c86fcbfd36056badb99572f5b0b82f90f3aa1635b7ba1599fa7841bfd5cf",
"newN_F14_manual_page_raw3200.bin": "bdf7e5d1427b74c5b566a7732d9abb2ec342717f002c1002c817736618a18169",
"newN_F15_seg6.png": "f520feb7a59bf1fe1997dd45d27159d9caa11130833d96b8b3e6cdd344de2818",
"newN_F15_seg6_raw3200.bin": "c538a051b6bdcca7e871710eb8f0dae2ba54cc6a62725765ce6ce116645f3fef",
"newN_F15_seg99_alt.png": "8f7eae0d5bdaeb2d7bcc5357fbed844cea01762afa342ff4ba0851f1d3609a04",
"newN_F15_seg99_alt_raw3200.bin": "12bd96f8f7405446c3f789e622868a638ffbddfeaefc1a7db737089c40d6255a",
"newN_Z_final_open_100appended.png": "342b3aa67a775817a40159cca61987251217ce32a252a5841642ffe14ca1d463",
"newN_Z_final_open_100appended_raw3200.bin": "17291a0068f2d4ab099f636888e809941ad9bba52cad942ff6341a8677b72889",
"oldN_P0_first_open_face.png": "342b3aa67a775817a40159cca61987251217ce32a252a5841642ffe14ca1d463",
"oldN_P0_first_open_face_raw3200.bin": "17291a0068f2d4ab099f636888e809941ad9bba52cad942ff6341a8677b72889",
"oldN_P1_stale_table_after_dele.png": "4056c7b6ea2d711161f2eb52e90bb3342e1a085c8d564de893cb555a9554afd7",
"oldN_P1_stale_table_after_dele_raw3200.bin": "a76c41cfd7f38cecf1092777371869a0a28a4c0ca09eb6963e17afc94d713f66",
"oldN_P2_crc_reject_silent.png": "342b3aa67a775817a40159cca61987251217ce32a252a5841642ffe14ca1d463",
"oldN_P2_crc_reject_silent_raw3200.bin": "17291a0068f2d4ab099f636888e809941ad9bba52cad942ff6341a8677b72889",
"oldN_P3_good_seg99.png": "d3fc9b4f41c4d34ee6953d7fdf444d43dae20003dafe13fa69d4aa606fc9c94f",
"oldN_P3_good_seg99_raw3200.bin": "36a3271a78dafe6afc0c93282ab6e0c993af22395ed8b030be821a98c1bb80ba",
"restore_verify.txt": "6c966009d3fadd5c21300add57df4b69e694869117a1272202ac224da6c92f17",
"serial_excerpt_after.txt": "5879feb5bd6e26aed2a4c58fed3ffe18714e1696ee853288f61483a7fe7a9e4d",
"serial_excerpt_before.txt": "51795ef9620a9f21c8133bcf498448d43910fa8fabe319e613bcd530d143c4ac",
"serial_excerpt_f1.txt": "aea8da4064e5419530ac26312930c1e8e0a41fc6d896f28ef8acf8c1acafc7c4",
"serial_excerpt_f2.txt": "d687dfbfb00937bb72a1bb249c3d4ba3045ddaf0af85a4295d86ebdadf1e10d4",
"serial_excerpt_man_post.txt": "19e7ce63f9cf4b198500b7295838ba9988ecdedfead6cd054fd26790c1a8f6ed",
"serial_excerpt_restore.txt": "746a728bdc5c87e949f7dec1fa0d1a0f234a0c1838c376c102676e91e9390dca",
"serial_stats.json": "d3712a2b2212cafa73895f79804f0feeba17b8fa4d562fd02b4396cc40d1ae0f",
"boot_new/boot_log_20261107_225225.txt": "3701a33b33302ded79a2f8b4d8559d1a3616a6d803583083d27d240a351037a5",
"boot_new2/boot_log_20261107_225601.txt": "ce26fc2e5d910b0dd50f65ae51aa2de1fcaf34df85c2fbdd569c33c106d91abe",
"boot_new3/boot_log_20261107_231856.txt": "07ed87bf6deeea1a9f00233ae7da2750337b66514af116fdf2a30abf0f867c75",
"samples/WAVE06_bitflip.BIN": "8ea7abed8ae95a701d3ff583b9ae19b229c194e92e53588151ac67db6f7735c3",
"samples/WAVE99_altseg.BIN": "2ea86400be3be01a7afae85358315939efcffe6423c8fe8dae0ec1d1c3a4b2ac",
"samples/WAVE99_headflip.BIN": "e97bb57afb8142725bcc5cb9f0485e2830a1e3be7a972d1356122bf6daed5105"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1,101 @@
WAVE00.BIN 141750 5dec259bcfe232714eabc73e524e3c137544c97dfd1011f5d562751cd08cd34a OK
WAVE01.BIN 141750 c1e52668f29c1e58495c628adb62ea64c7b28c40e1264e4b570392c7a34c5444 OK
WAVE02.BIN 141750 9fa2ac67153918e7ee01217f6877e61f3ecf20d36f2f73c17831b526749118e9 OK
WAVE03.BIN 141750 6f0d210f0833cd48127589e51eb01ec9e098d3c588c67e201dbd403d103eb927 OK
WAVE04.BIN 141750 d90a068be6128ce66d4f477c319b9b34a4fed111181b2bfd05631e2f1b4f6451 OK
WAVE05.BIN 141750 e219826f7fc58825af298481c62bbdf2551f23763f5a12854a5842e5949b5666 OK
WAVE06.BIN 141750 96ca64631420b0ac003d6d4406d82bf297407502d01337472341f9d78f3e9ccd OK
WAVE07.BIN 141750 cf84c28879d2481f80df33fb9c8554a7e5166ab48eee379aaa0cc60295119234 OK
WAVE08.BIN 141750 b5b74abcb846971fcccad70ab28e8e014791586d17e8f092ed32d48a6560ac96 OK
WAVE09.BIN 141750 d5a2607daec3a2c00a93adb2eef84fac82ed909198eb8aca264a58a99d76a272 OK
WAVE10.BIN 141750 82ae4e8f347c90446b6145a9820f350d91880f1a5e0f274d8efbbaf1717ff2bf OK
WAVE11.BIN 141750 38b83cac51c3ad7a5415cd592322cdc31b1158ab6e71b1ab1a2dffa2538bbd0b OK
WAVE12.BIN 141750 a66ef3a9670db89d41b5b072aecf79a99ecefb9a9d372468269161081c981f13 OK
WAVE13.BIN 141750 b1619f61e0724b0f3666e2c0d3e6e8e3f2e310b673930d6192f571c8b56b8134 OK
WAVE14.BIN 141750 b3b0ae35f823e118ef5d2e45d7b6783e7bb74d7f1b439473298cdec7bb523b92 OK
WAVE15.BIN 141750 2feb5db36e44f2b833283f265513f92a684bd6849ace37d0baa9e23860173e36 OK
WAVE16.BIN 141750 af141ae8f389ceaaeaf32d94fefe63029dc2901f6b2bfbf736c68fbc58101b97 OK
WAVE17.BIN 136500 f3663128227b4a46cbd5ed782eac3a8c8088492dd8e87b20ce4fd839c04b0e02 OK
WAVE18.BIN 136500 241e803e7cd8f94208d927be9365070176961bfc956a36111e13d58a52fbc2ee OK
WAVE19.BIN 136500 175c47df57a4c2d1d2e222555224b1c2f1b8664bd973bfd20cf66ca9cfe503a9 OK
WAVE20.BIN 136500 ec54dc5da39738caa6fb14236cf3b0a90b1eae721f0770fb308ee85f7be0d89b OK
WAVE21.BIN 136500 996b0f51d391c47cf29e49277948d07ede2dc786a118a881e4ef1fcc078ab891 OK
WAVE22.BIN 131250 c7d4479c9d1d7e319054c3842822a7b3233a77ce729c7d538190ad5c718db1fb OK
WAVE23.BIN 131250 468b29efb464df5ecbbd1bc6b08a09734a8cc9a3e532b12a70d91a0e80517ea5 OK
WAVE24.BIN 126000 0f2761280135c990e36cd76230e0d027fdada9611b76473f90f4bea030b1a511 OK
WAVE25.BIN 126000 384b7d026fc865c57fded2cb93b3b061caa1afac42be181da30f6077f8717850 OK
WAVE26.BIN 126000 cb49f5d5316972d0d4811c9f1b84a5603a5d7a08b0b7a88112dab6ee5d6d43de OK
WAVE27.BIN 126000 96d87592b72495162c976a7fa964b36d653531d645e33f63b3c80b1a461cc290 OK
WAVE28.BIN 31500 709a6527988442578d47205941dc6fdb4d899cbe50df23530c4ae07008fc2c79 OK
WAVE29.BIN 126000 60803c9f5d480d03fc2f283eedf60241d0fddc44705dcd76ce5098d27d9e057e OK
WAVE30.BIN 120750 dfdb4ec581fdecaa7bdd3904f2119d32e9ee574aae30eb60b5029deaf5047f9c OK
WAVE31.BIN 120750 05eeda0adba85048c57e84000e9280c3b045d540122542891b51e6cce699cb8b OK
WAVE32.BIN 120750 5551e9945f2916b6a2250d80b4839567d69926bbedec07b9a39a2640dbe32db6 OK
WAVE33.BIN 120750 d21222ae671d0d22d1112235a06f28cd354a7bea835e39a0b045d832fe036864 OK
WAVE34.BIN 115500 653bb85f700ea3208657da04f8d1464f911d9a91b45deabbe039e118efa6116b OK
WAVE35.BIN 115500 a174ad39395b5f1e0c146623d78050a3cf8e571a6aa2a45c494a4099b5b55ffa OK
WAVE36.BIN 10500 1a5597514a88d92581b1177a0c50072e911053f021df31645108601756ee50d6 OK
WAVE37.BIN 110250 4aa918983ccac6a7258aaafb8b48b7ee4be5f14a110cdc44b0eda56e51063c98 OK
WAVE38.BIN 110250 8e0e8f77c3cd1a5c9ec9db202ee576e29e4470943e77f946dd168bcdb62b69d5 OK
WAVE39.BIN 110250 158da90c622460a3ec49a528fba1cc74f98589c8619ed3b56523d48360df7e97 OK
WAVE40.BIN 110250 c2efa796ed38c340311deedf44440704e1baadd806f07621f451d0609c2a0778 OK
WAVE41.BIN 110250 dcb694c82eb0ed3da1b344af72e268a5208c9fc0415daed4721713a71a6a9305 OK
WAVE42.BIN 110250 ca5fa525190714123422b03865915c10a7653d404640cbcd51a98f00055b0c00 OK
WAVE43.BIN 110250 10cb317e12a24f61e89c8a419e1eee52d1a6ab99fb0a2a86609811d5c4d65c6f OK
WAVE44.BIN 68250 a48c14290d1b5328ba9c680692e25334435571fb0ef9cc34a1e4e420d28500d8 OK
WAVE45.BIN 105000 a92ef951d5f2feef917197e905347236fd884ff63724b85fa52969599df30876 OK
WAVE46.BIN 99750 50710c832d7424c7fb8f1552056a3219126da12889e11ab8743e7729ad493501 OK
WAVE47.BIN 99750 18e85c5d935d9bf35b1f0bdead9884d42ddb4540b1fd872c132d6fbc780c4f44 OK
WAVE48.BIN 94500 d50d3845ac7a80ad61b359df200122e33f60b12eb06d2a9f0f0a107a1aa3cbb9 OK
WAVE49.BIN 89250 c4b44bd0febe6103b55cdc33ea88e8da80a59306d5f1f9247ce4e556dbcbc415 OK
WAVE50.BIN 78750 f8445ff0e4558c8b47d28c8b2db9a337e318f7a63cdc2ea81343672d6d1c92e9 OK
WAVE51.BIN 78750 92af2f2ff736975de6c8fce5b59a4454f8147c1d7488e70d076d68143285b196 OK
WAVE52.BIN 78750 5a6520c92b2477d2e4cc24010e5215384a363b1099635bb4fed646d27ec995a6 OK
WAVE53.BIN 78750 bf4db176433ff9397a2bb544217a8529d1a454b32c4a1c8f65deb3f1b4d6adc2 OK
WAVE54.BIN 78750 b7d0df9ea2bffb3269b447f20fcf0428a21408b15c6cc369e8a0ec66fb6af3cd OK
WAVE55.BIN 78750 390de8e3c5021eda079c0ed2b2832a870456a44d581e5ec4b7fe1cbb833911e5 OK
WAVE56.BIN 78750 29d00e15b3f5b5b8a87fc0b1c6afc967b83e5265b25c3c549969819c94b4b2d0 OK
WAVE57.BIN 78750 46818313cc77cef539886c2e3722babc722f9d6cfdf920d1374b9d6b03dde2ca OK
WAVE58.BIN 78750 05da71d8027d96337ff9185a6bed8e4f992d4a424808ecbcc84788400f0a4f4f OK
WAVE59.BIN 78750 f5fb2d45498efc0e7e05f5745817378c73607c9312657ecac39c7161f030c301 OK
WAVE60.BIN 73500 eae4e35ba09b1dc040f621f2c1c12c4217e128f1679ba6eba348acdf8a7aa8ed OK
WAVE61.BIN 73500 db611720cdbacb93a88190dc30e8a749a35f62eda1d6d8cefd9b7c22961e1886 OK
WAVE62.BIN 73500 656d94772ccab059dea601f89cfb55696bda05d413751b8db6cc145947d0a889 OK
WAVE63.BIN 73500 46a830cd2430b824ec7f034062e6b6151b66d021c90d275020fe7e550a9bfc5b OK
WAVE64.BIN 73500 9e300fa68a8f0028af4a38e3a7c61f82db3e5c72939dcd8e83a2ce0a28bec7dc OK
WAVE65.BIN 73500 3031d3859775b91cb9a047508a0a7ce6bcc5dad6caa3c25c2b8b98048842ba2a OK
WAVE66.BIN 73500 23063dbe44695c76c55f15e2450f3c62d60a8a09f6ac32dc3aba97c4166b0752 OK
WAVE67.BIN 73500 d18795aaf23d511fe2d618c713dfa495c541938e1e32a3fd9307a0ea9a468c5a OK
WAVE68.BIN 73500 5d1babb82f7b641bb70120b807e77fae6c9ce9e5c9b43afb9326877346da66bf OK
WAVE69.BIN 73500 cc20d1dc5a22b0f99a050cefbd694ea319cb1ce120d2d35b6f40f6629d9803d2 OK
WAVE70.BIN 73500 09cd5935b33a98841d43e0c4f62364a8735b5a2272f38730913312e91d3807dd OK
WAVE71.BIN 73500 977cd0fd9c4f54334ccb60121deb18fc34cf98b7cc3bbb10912a131048a67508 OK
WAVE72.BIN 73500 a432a8672ccbe50b49bb86359e461ec5eacd4648ffec4649fcb58774ed40c936 OK
WAVE73.BIN 73500 d5c78555381a768cd37ed3d4e249525b1302145a92165ee7e7477d8ddfe192d1 OK
WAVE74.BIN 73500 72708d2bfc43786bbd199a564f386a92717d2cfc5da937ac90c9282a7830414f OK
WAVE75.BIN 73500 1c61c89097b6519fabb100ca64c69445f3eb6cd39b7ff4591a7d52396ae638f9 OK
WAVE76.BIN 73500 02ee53ac4ea9de6eb0d0e8524ab61453b932089eb9967742a1369440a2990c90 OK
WAVE77.BIN 73500 5593f588e5eaa1caa5f1cac9243b4bf8b13ed854a9249a3e50af74ca4bba1889 OK
WAVE78.BIN 73500 715827a9df0d7393e5014a2bb3e800d2e91c4163a20ae934b2919d35b9e7ca0b OK
WAVE79.BIN 73500 e7d865123415f11d79e4ec6bd929f347097dbac58194e4f4fec2f7317a30908c OK
WAVE80.BIN 73500 ea11c812b800ddd43a3695467cb4c511052a637a328d64ef3f528e69843662a6 OK
WAVE81.BIN 73500 7d6776fee8521204cf27d641fe9dac70cc52ba12341c8ea09dd6673442e0daa9 OK
WAVE82.BIN 73500 aa2a432b1c564f8559c3be36899db58e2830035ccd83d775159399b1dae3bd7c OK
WAVE83.BIN 73500 aeba71ec8c768186bded317df0493e482c5cf0c65c14446aacc709268a49f014 OK
WAVE84.BIN 73500 a1619dbda34aed7e0677b821bbbba99c41c6089d082326a195bf1b82cce9681d OK
WAVE85.BIN 73500 fa9889c9c5deff8830d9f70618da9f24abcd219621f22f04393701ec4c130465 OK
WAVE86.BIN 73500 711db013aef51272f99167db9e06cb8a808b23d904bdf0c634c4c26188a0b705 OK
WAVE87.BIN 73500 3a13a49b8f755bc595d722445fab873918f579008361ad0b8f7835e46bbb3b16 OK
WAVE88.BIN 73500 37bc3425556c76f764bf7c3e253d0b5cdfed69f9edf1bd6e153ba53e9d1bcd97 OK
WAVE89.BIN 73500 d43969601bd41068d2dbe8c2d6bf80e5f84852fad455f37a3218886fb3c31605 OK
WAVE90.BIN 73500 c35f5a357c93841ad70b5acd426406f3f2b8faccb1b90ab2eeda58f676616060 OK
WAVE91.BIN 73500 e1a83648238949fc6881b9b3b0df5d013b48bd9e1a74359c0b05c8a93c684c6d OK
WAVE92.BIN 73500 f89ac2acdd2e0ee169b5c17024c970e6f797359595458d45d3fa45a49a5cda8b OK
WAVE93.BIN 73500 e11ca6198f8d5ca8399ea22a92e1149e9bfaab6168bded1374b4416670f3b94e OK
WAVE94.BIN 73500 7a4375e6e5586da74c743306ae90a9f082456ec9f2a07e7be74b17f341fe7bc3 OK
WAVE95.BIN 73500 e7769e41724d3a030f7a2b7a568be2bd23f171a4dd5829c894bfc51024e9bee7 OK
WAVE96.BIN 73500 8665629333a18688659c3515487d1fd5cde565f8f120cb4186dff9ea4080af1a OK
WAVE97.BIN 73500 eef8d3d949d03e3ad33945cf0cca2141b501bd87376ab09375a5f2d4e076d45c OK
WAVE98.BIN 73500 702c7be0ad8b500918ecd5b8833926576738229c293c4e9c2d8cd79d44f9198d OK
WAVE99.BIN 73500 a692f1e5923e15cf53910ae89dfe8122a1141f2eb43fce1fdb1c75438a3128f0 OK
SUMMARY: 100 files, mismatches: NONE
@@ -0,0 +1,187 @@
[RX] 2026-11-07T22:46:05.757+08:00 [2026-11-07 22:46:05][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:46:15.760+08:00 [2026-11-07 22:46:15][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:46:25.763+08:00 [2026-11-07 22:46:25][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:46:35.755+08:00 [2026-11-07 22:46:35][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:46:45.759+08:00 [2026-11-07 22:46:45][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:46:55.764+08:00 [2026-11-07 22:46:55][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:47:05.755+08:00 [2026-11-07 22:47:05][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:47:15.759+08:00 [2026-11-07 22:47:15][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:47:25.756+08:00 [2026-11-07 22:47:25][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:47:35.755+08:00 [2026-11-07 22:47:35][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:47:45.762+08:00 [2026-11-07 22:47:45][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:47:55.757+08:00 [2026-11-07 22:47:55][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:48:05.761+08:00 [2026-11-07 22:48:05][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:48:15.757+08:00 [2026-11-07 22:48:15][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:48:25.757+08:00 [2026-11-07 22:48:25][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:48:35.753+08:00 [2026-11-07 22:48:35][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:48:45.756+08:00 [2026-11-07 22:48:45][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:48:55.761+08:00 [2026-11-07 22:48:55][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:49:05.759+08:00 [2026-11-07 22:49:05][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:49:10.285+08:00 [2026-11-07 22:49:09] [FTP] UPLOAD '/WAVE/WAVE99.BIN' 5250 bytes OK
[RX] 2026-11-07T22:49:14.042+08:00 [2026-11-07 22:49:13][UI_CONTENT_PAGE] page open: id=wave_play rows=0
[RX] 2026-11-07T22:49:15.759+08:00 [2026-11-07 22:49:15][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:49:16.381+08:00 [2026-11-07 22:49:16][UI_CONTENT_PAGE] page close: id=wave_play
[RX] 2026-11-07T22:49:19.627+08:00 [2026-11-07 22:49:19] [FTP] UPLOAD '/WAVE/WAVE99.BIN' 73500 bytes OK
[RX] 2026-11-07T22:49:20.216+08:00 [2026-11-07 22:49:19] [FTP] CMD RETR WAVE99.BIN
[RX] 2026-11-07T22:49:21.065+08:00 [----/--/-- --:--:--][APP] fw build: Nov 7 2026 21:52:33 suite=NONE dstr=off
[RX] 2026-11-07T22:49:21.076+08:00 [----/--/-- --:--:--][APP] reset cause: software (NVIC_SystemReset) (CSR=0x14000000)
[RX] 2026-11-07T22:49:21.966+08:00 [2026-11-07 22:49:20][UI_TASK] UI task: started, wait net ready
[RX] 2026-11-07T22:49:23.867+08:00 [2026-11-07 22:49:22][ERR][I104] i104: bind port 2404 FAIL, retry in loop
[RX] 2026-11-07T22:49:23.940+08:00 [2026-11-07 22:49:22][UI_TASK] UI task: net ready, init port
[RX] 2026-11-07T22:49:23.940+08:00 [2026-11-07 22:49:22][UI_TASK] UI task: ui_port_init enter
[RX] 2026-11-07T22:49:23.962+08:00 [2026-11-07 22:49:22][UI_TASK] UI port init: OK
[RX] 2026-11-07T22:49:23.962+08:00 [2026-11-07 22:49:22][UI_TASK] UI task: ui_menu_init enter
[RX] 2026-11-07T22:49:23.993+08:00 [2026-11-07 22:49:22][UI_TASK] UI menu init: OK
[RX] 2026-11-07T22:49:24.003+08:00 [2026-11-07 22:49:22][UI_TASK] UI standby: ready (idle=60s)
[RX] 2026-11-07T22:49:24.055+08:00 [2026-11-07 22:49:22][UI_TASK] UI net sink: started (port 7003)
[RX] 2026-11-07T22:49:31.516+08:00 [2026-11-07 22:49:30][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:49:41.512+08:00 [2026-11-07 22:49:40][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:49:51.519+08:00 [2026-11-07 22:49:50][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:50:01.518+08:00 [2026-11-07 22:50:00][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:50:11.520+08:00 [2026-11-07 22:50:10][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:50:21.514+08:00 [2026-11-07 22:50:20][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:50:31.514+08:00 [2026-11-07 22:50:30][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:50:41.522+08:00 [2026-11-07 22:50:40][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:50:51.515+08:00 [2026-11-07 22:50:50][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:51:01.521+08:00 [2026-11-07 22:51:00][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:51:11.514+08:00 [2026-11-07 22:51:10][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:51:21.515+08:00 [2026-11-07 22:51:20][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:51:31.515+08:00 [2026-11-07 22:51:30][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:51:41.516+08:00 [2026-11-07 22:51:40][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:51:51.520+08:00 [2026-11-07 22:51:50][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:52:01.513+08:00 [2026-11-07 22:52:00][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:52:11.518+08:00 [2026-11-07 22:52:10][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:52:21.520+08:00 [2026-11-07 22:52:20][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T23:13:53.236+08:00 [2026-11-07 23:13:52] [FTP] CMD RETR WAVE90.BIN
[RX] 2026-11-07T23:13:53.664+08:00 [2026-11-07 23:13:53] [FTP] CMD RETR WAVE99.BIN
[RX] 2026-11-07T23:13:54.444+08:00 [2026-11-07 23:13:53] [FTP] UPLOAD '/WAVE/WAVE90.BIN' 73500 bytes OK
[RX] 2026-11-07T23:13:55.356+08:00 [2026-11-07 23:13:54] [FTP] UPLOAD '/WAVE/WAVE99.BIN' 73500 bytes OK
[RX] 2026-11-07T23:13:56.055+08:00 [2026-11-07 23:13:55][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T23:13:56.979+08:00 [2026-11-07 23:13:56] [FTP] CMD RETR WAVE90.BIN
[RX] 2026-11-07T23:13:57.425+08:00 [2026-11-07 23:13:56] [FTP] CMD RETR WAVE99.BIN
[RX] 2026-11-07T23:13:57.986+08:00 [2026-11-07 23:13:57][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T23:13:58.404+08:00 [2026-11-07 23:13:57] [FTP] CMD RETR WAVE00.BIN
[RX] 2026-11-07T23:13:59.058+08:00 [2026-11-07 23:13:58] [FTP] CMD RETR WAVE01.BIN
[RX] 2026-11-07T23:13:59.720+08:00 [2026-11-07 23:13:59] [FTP] CMD RETR WAVE02.BIN
[RX] 2026-11-07T23:14:00.413+08:00 [2026-11-07 23:13:59] [FTP] CMD RETR WAVE03.BIN
[RX] 2026-11-07T23:14:01.107+08:00 [2026-11-07 23:14:00] [FTP] CMD RETR WAVE04.BIN
[RX] 2026-11-07T23:14:01.833+08:00 [2026-11-07 23:14:01] [FTP] CMD RETR WAVE05.BIN
[RX] 2026-11-07T23:14:02.529+08:00 [2026-11-07 23:14:01] [FTP] CMD RETR WAVE06.BIN
[RX] 2026-11-07T23:14:02.995+08:00 [2026-11-07 23:14:02][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:14:03.269+08:00 [2026-11-07 23:14:02] [FTP] CMD RETR WAVE07.BIN
[RX] 2026-11-07T23:14:04.026+08:00 [2026-11-07 23:14:03] [FTP] CMD RETR WAVE08.BIN
[RX] 2026-11-07T23:14:04.683+08:00 [2026-11-07 23:14:04] [FTP] CMD RETR WAVE09.BIN
[RX] 2026-11-07T23:14:05.445+08:00 [2026-11-07 23:14:04] [FTP] CMD RETR WAVE10.BIN
[RX] 2026-11-07T23:14:06.223+08:00 [2026-11-07 23:14:05] [FTP] CMD RETR WAVE11.BIN
[RX] 2026-11-07T23:14:06.929+08:00 [2026-11-07 23:14:06] [FTP] CMD RETR WAVE12.BIN
[RX] 2026-11-07T23:14:07.632+08:00 [2026-11-07 23:14:07] [FTP] CMD RETR WAVE13.BIN
[RX] 2026-11-07T23:14:08.429+08:00 [2026-11-07 23:14:07] [FTP] CMD RETR WAVE14.BIN
[RX] 2026-11-07T23:14:09.123+08:00 [2026-11-07 23:14:08] [FTP] CMD RETR WAVE15.BIN
[RX] 2026-11-07T23:14:09.839+08:00 [2026-11-07 23:14:09] [FTP] CMD RETR WAVE16.BIN
[RX] 2026-11-07T23:14:10.480+08:00 [2026-11-07 23:14:09] [FTP] CMD RETR WAVE17.BIN
[RX] 2026-11-07T23:14:11.225+08:00 [2026-11-07 23:14:10] [FTP] CMD RETR WAVE18.BIN
[RX] 2026-11-07T23:14:11.886+08:00 [2026-11-07 23:14:11] [FTP] CMD RETR WAVE19.BIN
[RX] 2026-11-07T23:14:12.632+08:00 [2026-11-07 23:14:12] [FTP] CMD RETR WAVE20.BIN
[RX] 2026-11-07T23:14:12.996+08:00 [2026-11-07 23:14:12][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:14:13.420+08:00 [2026-11-07 23:14:12] [FTP] CMD RETR WAVE21.BIN
[RX] 2026-11-07T23:14:14.092+08:00 [2026-11-07 23:14:13] [FTP] CMD RETR WAVE22.BIN
[RX] 2026-11-07T23:14:14.704+08:00 [2026-11-07 23:14:14] [FTP] CMD RETR WAVE23.BIN
[RX] 2026-11-07T23:14:15.324+08:00 [2026-11-07 23:14:14] [FTP] CMD RETR WAVE24.BIN
[RX] 2026-11-07T23:14:16.026+08:00 [2026-11-07 23:14:15] [FTP] CMD RETR WAVE25.BIN
[RX] 2026-11-07T23:14:16.676+08:00 [2026-11-07 23:14:16] [FTP] CMD RETR WAVE26.BIN
[RX] 2026-11-07T23:14:17.430+08:00 [2026-11-07 23:14:16] [FTP] CMD RETR WAVE27.BIN
[RX] 2026-11-07T23:14:18.106+08:00 [2026-11-07 23:14:17] [FTP] CMD RETR WAVE28.BIN
[RX] 2026-11-07T23:14:18.427+08:00 [2026-11-07 23:14:17] [FTP] CMD RETR WAVE29.BIN
[RX] 2026-11-07T23:14:19.070+08:00 [2026-11-07 23:14:18] [FTP] CMD RETR WAVE30.BIN
[RX] 2026-11-07T23:14:19.704+08:00 [2026-11-07 23:14:19] [FTP] CMD RETR WAVE31.BIN
[RX] 2026-11-07T23:14:20.426+08:00 [2026-11-07 23:14:19] [FTP] CMD RETR WAVE32.BIN
[RX] 2026-11-07T23:14:21.025+08:00 [2026-11-07 23:14:20] [FTP] CMD RETR WAVE33.BIN
[RX] 2026-11-07T23:14:21.613+08:00 [2026-11-07 23:14:21] [FTP] CMD RETR WAVE34.BIN
[RX] 2026-11-07T23:14:22.263+08:00 [2026-11-07 23:14:21] [FTP] CMD RETR WAVE35.BIN
[RX] 2026-11-07T23:14:22.865+08:00 [2026-11-07 23:14:22] [FTP] CMD RETR WAVE36.BIN
[RX] 2026-11-07T23:14:23.002+08:00 [2026-11-07 23:14:22][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:14:23.220+08:00 [2026-11-07 23:14:22] [FTP] CMD RETR WAVE37.BIN
[RX] 2026-11-07T23:14:23.832+08:00 [2026-11-07 23:14:23] [FTP] CMD RETR WAVE38.BIN
[RX] 2026-11-07T23:14:24.411+08:00 [2026-11-07 23:14:23] [FTP] CMD RETR WAVE39.BIN
[RX] 2026-11-07T23:14:25.033+08:00 [2026-11-07 23:14:24] [FTP] CMD RETR WAVE40.BIN
[RX] 2026-11-07T23:14:25.647+08:00 [2026-11-07 23:14:25] [FTP] CMD RETR WAVE41.BIN
[RX] 2026-11-07T23:14:26.212+08:00 [2026-11-07 23:14:25] [FTP] CMD RETR WAVE42.BIN
[RX] 2026-11-07T23:14:26.831+08:00 [2026-11-07 23:14:26] [FTP] CMD RETR WAVE43.BIN
[RX] 2026-11-07T23:14:27.421+08:00 [2026-11-07 23:14:26] [FTP] CMD RETR WAVE44.BIN
[RX] 2026-11-07T23:14:27.877+08:00 [2026-11-07 23:14:27] [FTP] CMD RETR WAVE45.BIN
[RX] 2026-11-07T23:14:28.482+08:00 [2026-11-07 23:14:27] [FTP] CMD RETR WAVE46.BIN
[RX] 2026-11-07T23:14:29.023+08:00 [2026-11-07 23:14:28] [FTP] CMD RETR WAVE47.BIN
[RX] 2026-11-07T23:14:29.635+08:00 [2026-11-07 23:14:29] [FTP] CMD RETR WAVE48.BIN
[RX] 2026-11-07T23:14:30.236+08:00 [2026-11-07 23:14:29] [FTP] CMD RETR WAVE49.BIN
[RX] 2026-11-07T23:14:30.826+08:00 [2026-11-07 23:14:30] [FTP] CMD RETR WAVE50.BIN
[RX] 2026-11-07T23:14:31.305+08:00 [2026-11-07 23:14:30] [FTP] CMD RETR WAVE51.BIN
[RX] 2026-11-07T23:14:31.812+08:00 [2026-11-07 23:14:31] [FTP] CMD RETR WAVE52.BIN
[RX] 2026-11-07T23:14:32.423+08:00 [2026-11-07 23:14:31] [FTP] CMD RETR WAVE53.BIN
[RX] 2026-11-07T23:14:32.887+08:00 [2026-11-07 23:14:32] [FTP] CMD RETR WAVE54.BIN
[RX] 2026-11-07T23:14:33.002+08:00 [2026-11-07 23:14:32][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:14:33.436+08:00 [2026-11-07 23:14:32] [FTP] CMD RETR WAVE55.BIN
[RX] 2026-11-07T23:14:33.893+08:00 [2026-11-07 23:14:33] [FTP] CMD RETR WAVE56.BIN
[RX] 2026-11-07T23:14:34.422+08:00 [2026-11-07 23:14:33] [FTP] CMD RETR WAVE57.BIN
[RX] 2026-11-07T23:14:34.898+08:00 [2026-11-07 23:14:34] [FTP] CMD RETR WAVE58.BIN
[RX] 2026-11-07T23:14:35.414+08:00 [2026-11-07 23:14:34] [FTP] CMD RETR WAVE59.BIN
[RX] 2026-11-07T23:14:35.880+08:00 [2026-11-07 23:14:35] [FTP] CMD RETR WAVE60.BIN
[RX] 2026-11-07T23:14:36.420+08:00 [2026-11-07 23:14:35] [FTP] CMD RETR WAVE61.BIN
[RX] 2026-11-07T23:14:36.865+08:00 [2026-11-07 23:14:36] [FTP] CMD RETR WAVE62.BIN
[RX] 2026-11-07T23:14:37.299+08:00 [2026-11-07 23:14:36] [FTP] CMD RETR WAVE63.BIN
[RX] 2026-11-07T23:14:37.827+08:00 [2026-11-07 23:14:37] [FTP] CMD RETR WAVE64.BIN
[RX] 2026-11-07T23:14:38.315+08:00 [2026-11-07 23:14:37] [FTP] CMD RETR WAVE65.BIN
[RX] 2026-11-07T23:14:38.822+08:00 [2026-11-07 23:14:38] [FTP] CMD RETR WAVE66.BIN
[RX] 2026-11-07T23:14:39.288+08:00 [2026-11-07 23:14:38] [FTP] CMD RETR WAVE67.BIN
[RX] 2026-11-07T23:14:39.828+08:00 [2026-11-07 23:14:39] [FTP] CMD RETR WAVE68.BIN
[RX] 2026-11-07T23:14:40.307+08:00 [2026-11-07 23:14:39] [FTP] CMD RETR WAVE69.BIN
[RX] 2026-11-07T23:14:40.803+08:00 [2026-11-07 23:14:40] [FTP] CMD RETR WAVE70.BIN
[RX] 2026-11-07T23:14:41.252+08:00 [2026-11-07 23:14:40] [FTP] CMD RETR WAVE71.BIN
[RX] 2026-11-07T23:14:41.820+08:00 [2026-11-07 23:14:41] [FTP] CMD RETR WAVE72.BIN
[RX] 2026-11-07T23:14:42.308+08:00 [2026-11-07 23:14:41] [FTP] CMD RETR WAVE73.BIN
[RX] 2026-11-07T23:14:42.837+08:00 [2026-11-07 23:14:42] [FTP] CMD RETR WAVE74.BIN
[RX] 2026-11-07T23:14:42.994+08:00 [2026-11-07 23:14:42][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:14:43.422+08:00 [2026-11-07 23:14:42] [FTP] CMD RETR WAVE75.BIN
[RX] 2026-11-07T23:14:43.871+08:00 [2026-11-07 23:14:43] [FTP] CMD RETR WAVE76.BIN
[RX] 2026-11-07T23:14:44.288+08:00 [2026-11-07 23:14:43] [FTP] CMD RETR WAVE77.BIN
[RX] 2026-11-07T23:14:44.830+08:00 [2026-11-07 23:14:44] [FTP] CMD RETR WAVE78.BIN
[RX] 2026-11-07T23:14:45.248+08:00 [2026-11-07 23:14:44] [FTP] CMD RETR WAVE79.BIN
[RX] 2026-11-07T23:14:45.698+08:00 [2026-11-07 23:14:45] [FTP] CMD RETR WAVE80.BIN
[RX] 2026-11-07T23:14:46.102+08:00 [2026-11-07 23:14:45] [FTP] CMD RETR WAVE81.BIN
[RX] 2026-11-07T23:14:46.642+08:00 [2026-11-07 23:14:46] [FTP] CMD RETR WAVE82.BIN
[RX] 2026-11-07T23:14:47.108+08:00 [2026-11-07 23:14:46] [FTP] CMD RETR WAVE83.BIN
[RX] 2026-11-07T23:14:47.616+08:00 [2026-11-07 23:14:47] [FTP] CMD RETR WAVE84.BIN
[RX] 2026-11-07T23:14:48.042+08:00 [2026-11-07 23:14:47] [FTP] CMD RETR WAVE85.BIN
[RX] 2026-11-07T23:14:48.517+08:00 [2026-11-07 23:14:47] [FTP] CMD RETR WAVE86.BIN
[RX] 2026-11-07T23:14:49.026+08:00 [2026-11-07 23:14:48] [FTP] CMD RETR WAVE87.BIN
[RX] 2026-11-07T23:14:49.440+08:00 [2026-11-07 23:14:48] [FTP] CMD RETR WAVE88.BIN
[RX] 2026-11-07T23:14:49.873+08:00 [2026-11-07 23:14:49] [FTP] CMD RETR WAVE89.BIN
[RX] 2026-11-07T23:14:50.309+08:00 [2026-11-07 23:14:49] [FTP] CMD RETR WAVE90.BIN
[RX] 2026-11-07T23:14:50.806+08:00 [2026-11-07 23:14:50] [FTP] CMD RETR WAVE91.BIN
[RX] 2026-11-07T23:14:51.240+08:00 [2026-11-07 23:14:50] [FTP] CMD RETR WAVE92.BIN
[RX] 2026-11-07T23:14:51.699+08:00 [2026-11-07 23:14:51] [FTP] CMD RETR WAVE93.BIN
[RX] 2026-11-07T23:14:52.241+08:00 [2026-11-07 23:14:51] [FTP] CMD RETR WAVE94.BIN
[RX] 2026-11-07T23:14:52.706+08:00 [2026-11-07 23:14:52] [FTP] CMD RETR WAVE95.BIN
[RX] 2026-11-07T23:14:52.996+08:00 [2026-11-07 23:14:52][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:14:53.226+08:00 [2026-11-07 23:14:52] [FTP] CMD RETR WAVE96.BIN
[RX] 2026-11-07T23:14:53.693+08:00 [2026-11-07 23:14:53] [FTP] CMD RETR WAVE97.BIN
[RX] 2026-11-07T23:14:54.230+08:00 [2026-11-07 23:14:53] [FTP] CMD RETR WAVE98.BIN
[RX] 2026-11-07T23:14:54.675+08:00 [2026-11-07 23:14:54] [FTP] CMD RETR WAVE99.BIN
[RX] 2026-11-07T23:14:55.225+08:00 [2026-11-07 23:14:54][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T23:14:56.852+08:00 [2026-11-07 23:14:56][UI_CONTENT_PAGE] page open: id=wave_play rows=0
[RX] 2026-11-07T23:14:56.871+08:00 [2026-11-07 23:14:56][ERR][UI_TASK] ui wave head idx=99 reject=2 stored=0x0000 calc=0x0000
[RX] 2026-11-07T23:14:59.166+08:00 [2026-11-07 23:14:58][UI_CONTENT_PAGE] page close: id=wave_play
[RX] 2026-11-07T23:15:02.180+08:00 [2026-11-07 23:15:01][NET] sock2 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T23:15:02.987+08:00 [2026-11-07 23:15:02][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:15:12.993+08:00 [2026-11-07 23:15:12][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:15:22.987+08:00 [2026-11-07 23:15:22][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:15:32.993+08:00 [2026-11-07 23:15:32][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:15:42.991+08:00 [2026-11-07 23:15:42][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:15:52.994+08:00 [2026-11-07 23:15:52][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:16:02.993+08:00 [2026-11-07 23:16:02][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:16:12.984+08:00 [2026-11-07 23:16:12][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:16:22.986+08:00 [2026-11-07 23:16:22][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:16:32.992+08:00 [2026-11-07 23:16:32][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:16:42.992+08:00 [2026-11-07 23:16:42][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:16:52.988+08:00 [2026-11-07 23:16:52][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:17:02.992+08:00 [2026-11-07 23:17:02][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
[RX] 2026-11-07T23:17:12.987+08:00 [2026-11-07 23:17:12][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000
@@ -0,0 +1,16 @@
[RX] 2026-11-07T22:44:12.602+08:00 [2026-11-07 22:44:12] [FTP] UPLOAD '/WAVE/WAVE06.BIN' 5250 bytes OK
[RX] 2026-11-07T22:44:13.311+08:00 [2026-11-07 22:44:12][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T22:44:15.759+08:00 [2026-11-07 22:44:15][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:44:16.475+08:00 [2026-11-07 22:44:16][UI_CONTENT_PAGE] page open: id=wave_play rows=0
[RX] 2026-11-07T22:44:22.188+08:00 [2026-11-07 22:44:21][UI_CONTENT_PAGE] page close: id=wave_play
[RX] 2026-11-07T22:44:25.792+08:00 [2026-11-07 22:44:25][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:44:25.802+08:00 [2026-11-07 22:44:25] [FTP] UPLOAD '/WAVE/WAVE06.BIN' 141750 bytes OK
[RX] 2026-11-07T22:44:26.312+08:00 [2026-11-07 22:44:25] [FTP] CMD RETR WAVE06.BIN
[RX] 2026-11-07T22:44:27.173+08:00 [2026-11-07 22:44:26][NET] sock1 reconcile: chip not listening (0x00/0xFF, was state=3) -> relisten
[RX] 2026-11-07T22:44:27.183+08:00 [2026-11-07 22:44:26][NET] sock2 reconcile: chip not listening (0x00/0xFF, was state=0) -> relisten
[RX] 2026-11-07T22:44:35.767+08:00 [2026-11-07 22:44:35][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:44:45.764+08:00 [2026-11-07 22:44:45][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:44:55.856+08:00 [2026-11-07 22:44:55][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:45:05.762+08:00 [2026-11-07 22:45:05][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:45:15.760+08:00 [2026-11-07 22:45:15][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
[RX] 2026-11-07T22:45:25.758+08:00 [2026-11-07 22:45:25][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0
@@ -0,0 +1,150 @@
 "[RX] 2026-11-07T23:02:13.012+08:00 [2026-11-07 23:02:12][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0",
"[RX] 2026-11-07T23:02:23.009+08:00 [2026-11-07 23:02:22][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0",
"[RX] 2026-11-07T23:02:33.012+08:00 [2026-11-07 23:02:32][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0",
"[RX] 2026-11-07T23:02:43.009+08:00 [2026-11-07 23:02:42][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0",
"[RX] 2026-11-07T23:02:53.007+08:00 [2026-11-07 23:02:52][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0",
"[RX] 2026-11-07T23:03:03.006+08:00 [2026-11-07 23:03:02][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0",
"[RX] 2026-11-07T23:03:13.010+08:00 [2026-11-07 23:03:12][ADC_TASK] wave: seg=0 armed=0 src=- pts=320 err=0 ovf=0 drop=0",
"[RX] 2026-11-07T23:03:13.135+08:00 [2026-11-07 23:03:12][UI_CONTENT_PAGE] page open: id=wave_manual rows=0",
"[RX] 2026-11-07T23:03:23.005+08:00 [2026-11-07 23:03:22][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:03:33.009+08:00 [2026-11-07 23:03:32][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:03:36.209+08:00 [2026-11-07 23:03:35][UI_CONTENT_PAGE] page close: id=wave_manual",
"[RX] 2026-11-07T23:03:43.009+08:00 [2026-11-07 23:03:42][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:03:53.011+08:00 [2026-11-07 23:03:52][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:04:03.006+08:00 [2026-11-07 23:04:02][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:04:13.008+08:00 [2026-11-07 23:04:12][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:04:23.003+08:00 [2026-11-07 23:04:22][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:04:33.002+08:00 [2026-11-07 23:04:32][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:04:43.004+08:00 [2026-11-07 23:04:42][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:04:53.005+08:00 [2026-11-07 23:04:52][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:05:03.001+08:00 [2026-11-07 23:05:02][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:05:13.010+08:00 [2026-11-07 23:05:12][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:05:23.001+08:00 [2026-11-07 23:05:22][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:05:33.008+08:00 [2026-11-07 23:05:32][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:05:43.000+08:00 [2026-11-07 23:05:42][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:05:52.999+08:00 [2026-11-07 23:05:52][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:06:03.019+08:00 [2026-11-07 23:06:02][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:06:13.017+08:00 [2026-11-07 23:06:12][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:06:23.001+08:00 [2026-11-07 23:06:22][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:06:33.018+08:00 [2026-11-07 23:06:32][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:06:43.010+08:00 [2026-11-07 23:06:42][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:06:53.001+08:00 [2026-11-07 23:06:52][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:07:03.005+08:00 [2026-11-07 23:07:02][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:07:12.998+08:00 [2026-11-07 23:07:12][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:07:23.000+08:00 [2026-11-07 23:07:22][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:07:33.000+08:00 [2026-11-07 23:07:32][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:07:43.000+08:00 [2026-11-07 23:07:42][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:07:52.996+08:00 [2026-11-07 23:07:52][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:08:03.000+08:00 [2026-11-07 23:08:02][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:08:12.996+08:00 [2026-11-07 23:08:12][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:08:23.001+08:00 [2026-11-07 23:08:22][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:08:27.945+08:00 [2026-11-07 23:08:27] [FTP] CMD DELE WAVE00.BIN",
"[RX] 2026-11-07T23:08:28.018+08:00 [2026-11-07 23:08:27] [FTP] CMD DELE WAVE01.BIN",
"[RX] 2026-11-07T23:08:28.122+08:00 [2026-11-07 23:08:27] [FTP] CMD DELE WAVE02.BIN",
"[RX] 2026-11-07T23:08:28.174+08:00 [2026-11-07 23:08:27] [FTP] CMD DELE WAVE03.BIN",
"[RX] 2026-11-07T23:08:28.246+08:00 [2026-11-07 23:08:27] [FTP] CMD DELE WAVE04.BIN",
"[RX] 2026-11-07T23:08:28.309+08:00 [2026-11-07 23:08:27] [FTP] CMD DELE WAVE05.BIN",
"[RX] 2026-11-07T23:08:28.382+08:00 [2026-11-07 23:08:27] [FTP] CMD DELE WAVE06.BIN",
"[RX] 2026-11-07T23:08:28.423+08:00 [2026-11-07 23:08:27] [FTP] CMD DELE WAVE07.BIN",
"[RX] 2026-11-07T23:08:28.486+08:00 [2026-11-07 23:08:27] [FTP] CMD DELE WAVE08.BIN",
"[RX] 2026-11-07T23:08:28.558+08:00 [2026-11-07 23:08:27] [FTP] CMD DELE WAVE09.BIN",
"[RX] 2026-11-07T23:08:28.652+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE10.BIN",
"[RX] 2026-11-07T23:08:28.715+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE11.BIN",
"[RX] 2026-11-07T23:08:28.778+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE12.BIN",
"[RX] 2026-11-07T23:08:28.850+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE13.BIN",
"[RX] 2026-11-07T23:08:28.923+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE14.BIN",
"[RX] 2026-11-07T23:08:28.985+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE15.BIN",
"[RX] 2026-11-07T23:08:29.058+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE16.BIN",
"[RX] 2026-11-07T23:08:29.131+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE17.BIN",
"[RX] 2026-11-07T23:08:29.204+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE18.BIN",
"[RX] 2026-11-07T23:08:29.276+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE19.BIN",
"[RX] 2026-11-07T23:08:29.349+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE20.BIN",
"[RX] 2026-11-07T23:08:29.411+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE21.BIN",
"[RX] 2026-11-07T23:08:29.485+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE22.BIN",
"[RX] 2026-11-07T23:08:29.547+08:00 [2026-11-07 23:08:28] [FTP] CMD DELE WAVE23.BIN",
"[RX] 2026-11-07T23:08:29.620+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE24.BIN",
"[RX] 2026-11-07T23:08:29.777+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE25.BIN",
"[RX] 2026-11-07T23:08:29.787+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE26.BIN",
"[RX] 2026-11-07T23:08:29.870+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE27.BIN",
"[RX] 2026-11-07T23:08:29.932+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE28.BIN",
"[RX] 2026-11-07T23:08:29.973+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE29.BIN",
"[RX] 2026-11-07T23:08:30.045+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE30.BIN",
"[RX] 2026-11-07T23:08:30.117+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE31.BIN",
"[RX] 2026-11-07T23:08:30.190+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE32.BIN",
"[RX] 2026-11-07T23:08:30.263+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE33.BIN",
"[RX] 2026-11-07T23:08:30.336+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE34.BIN",
"[RX] 2026-11-07T23:08:30.409+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE35.BIN",
"[RX] 2026-11-07T23:08:30.481+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE36.BIN",
"[RX] 2026-11-07T23:08:30.523+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE37.BIN",
"[RX] 2026-11-07T23:08:30.596+08:00 [2026-11-07 23:08:29] [FTP] CMD DELE WAVE38.BIN",
"[RX] 2026-11-07T23:08:30.638+08:00 STALL snap=0x000001E7 req=0x000001F7 h=000001E7,000001E7,000001E7,000001E7,000001E7,000001E7,000001E7,000001E7 mg=193 cf=0 seg=1",
"[RX] 2026-11-07T23:08:30.783+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE39.BIN",
"[RX] 2026-11-07T23:08:30.845+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE40.BIN",
"[RX] 2026-11-07T23:08:30.907+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE41.BIN",
"[RX] 2026-11-07T23:08:30.990+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE42.BIN",
"[RX] 2026-11-07T23:08:31.062+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE43.BIN",
"[RX] 2026-11-07T23:08:31.145+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE44.BIN",
"[RX] 2026-11-07T23:08:31.197+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE45.BIN",
"[RX] 2026-11-07T23:08:31.281+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE46.BIN",
"[RX] 2026-11-07T23:08:31.385+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE47.BIN",
"[RX] 2026-11-07T23:08:31.447+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE48.BIN",
"[RX] 2026-11-07T23:08:31.519+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE49.BIN",
"[RX] 2026-11-07T23:08:31.561+08:00 [2026-11-07 23:08:30] [FTP] CMD DELE WAVE50.BIN",
"[RX] 2026-11-07T23:08:31.603+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE51.BIN",
"[RX] 2026-11-07T23:08:31.644+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE52.BIN",
"[RX] 2026-11-07T23:08:31.707+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE53.BIN",
"[RX] 2026-11-07T23:08:31.738+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE54.BIN",
"[RX] 2026-11-07T23:08:31.780+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE55.BIN",
"[RX] 2026-11-07T23:08:31.821+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE56.BIN",
"[RX] 2026-11-07T23:08:31.863+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE57.BIN",
"[RX] 2026-11-07T23:08:31.904+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE58.BIN",
"[RX] 2026-11-07T23:08:31.945+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE59.BIN",
"[RX] 2026-11-07T23:08:31.987+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE60.BIN",
"[RX] 2026-11-07T23:08:32.071+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE61.BIN",
"[RX] 2026-11-07T23:08:32.092+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE62.BIN",
"[RX] 2026-11-07T23:08:32.175+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE63.BIN",
"[RX] 2026-11-07T23:08:32.248+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE64.BIN",
"[RX] 2026-11-07T23:08:32.330+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE65.BIN",
"[RX] 2026-11-07T23:08:32.446+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE66.BIN",
"[RX] 2026-11-07T23:08:32.508+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE67.BIN",
"[RX] 2026-11-07T23:08:32.581+08:00 [2026-11-07 23:08:31] [FTP] CMD DELE WAVE68.BIN",
"[RX] 2026-11-07T23:08:32.717+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE69.BIN",
"[RX] 2026-11-07T23:08:32.758+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE70.BIN",
"[RX] 2026-11-07T23:08:32.841+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE71.BIN",
"[RX] 2026-11-07T23:08:32.914+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE72.BIN",
"[RX] 2026-11-07T23:08:33.197+08:00 [2026-11-07 23:08:32][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:08:33.227+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE73.BIN",
"[RX] 2026-11-07T23:08:33.258+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE74.BIN",
"[RX] 2026-11-07T23:08:33.269+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE75.BIN",
"[RX] 2026-11-07T23:08:33.373+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE76.BIN",
"[RX] 2026-11-07T23:08:33.404+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE77.BIN",
"[RX] 2026-11-07T23:08:33.487+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE78.BIN",
"[RX] 2026-11-07T23:08:33.570+08:00 [2026-11-07 23:08:32] [FTP] CMD DELE WAVE79.BIN",
"[RX] 2026-11-07T23:08:33.643+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE80.BIN",
"[RX] 2026-11-07T23:08:33.736+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE81.BIN",
"[RX] 2026-11-07T23:08:33.850+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE82.BIN",
"[RX] 2026-11-07T23:08:33.913+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE83.BIN",
"[RX] 2026-11-07T23:08:33.995+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE84.BIN",
"[RX] 2026-11-07T23:08:34.068+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE85.BIN",
"[RX] 2026-11-07T23:08:34.150+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE86.BIN",
"[RX] 2026-11-07T23:08:34.233+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE87.BIN",
"[RX] 2026-11-07T23:08:34.316+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE88.BIN",
"[RX] 2026-11-07T23:08:34.389+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE89.BIN",
"[RX] 2026-11-07T23:08:34.473+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE90.BIN",
"[RX] 2026-11-07T23:08:34.577+08:00 [2026-11-07 23:08:33] [FTP] CMD DELE WAVE91.BIN",
"[RX] 2026-11-07T23:08:34.639+08:00 [2026-11-07 23:08:34] [FTP] CMD DELE WAVE92.BIN",
"[RX] 2026-11-07T23:08:34.723+08:00 [2026-11-07 23:08:34] [FTP] CMD DELE WAVE93.BIN",
"[RX] 2026-11-07T23:08:34.805+08:00 [2026-11-07 23:08:34] [FTP] CMD DELE WAVE94.BIN",
"[RX] 2026-11-07T23:08:34.889+08:00 [2026-11-07 23:08:34] [FTP] CMD DELE WAVE95.BIN",
"[RX] 2026-11-07T23:08:34.973+08:00 [2026-11-07 23:08:34] [FTP] CMD DELE WAVE96.BIN",
"[RX] 2026-11-07T23:08:35.056+08:00 [2026-11-07 23:08:34] [FTP] CMD DELE WAVE97.BIN",
"[RX] 2026-11-07T23:08:35.139+08:00 [2026-11-07 23:08:34] [FTP] CMD DELE WAVE98.BIN",
"[RX] 2026-11-07T23:08:35.275+08:00 [2026-11-07 23:08:34] [FTP] CMD DELE WAVE99.BIN",
"[RX] 2026-11-07T23:08:42.995+08:00 [2026-11-07 23:08:42][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:08:53.004+08:00 [2026-11-07 23:08:52][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:09:02.997+08:00 [2026-11-07 23:09:02][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:09:03.638+08:00 [2026-11-07 23:09:03] [FTP] UPLOAD '/WAVE/WAVE06.BIN' 5250 bytes OK",
"[RX] 2026-11-07T23:09:10.839+08:00 [2026-11-07 23:09:10] [FTP] UPLOAD '/WAVE/WAVE99.BIN' 5250 bytes OK",
"[RX] 2026-11-07T23:09:13.001+08:00 [2026-11-07 23:09:12][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",
"[RX] 2026-11-07T23:09:15.641+08:00 [2026-11-07 23:09:15] [FTP] UPLOAD '/WAVE/WAVE99.BIN' 5250 bytes OK",
"[RX] 2026-11-07T23:09:22.998+08:00 [2026-11-07 23:09:22][ADC_TASK] wave: seg=1 armed=0 src=M pts=320 err=0 ovf=0 drop=1000",

Some files were not shown because too many files have changed in this diff Show More