docs: record pause wasm implementation plan

This commit is contained in:
wangdequan
2026-07-07 09:40:33 -04:00
parent 6cecd280e2
commit 83402c506e
3299 changed files with 1364681 additions and 325 deletions

View File

@@ -0,0 +1,20 @@
# 2026-07-06 xyzbc-trt 任务态按钮逻辑严格对标
## 用户提问
完全对标 `/home/mes123456/cnc_wams/linuxcnc``xyzbc-trt` 中解除 `ESTOP``上电``Home All``Run``暂停` 功能,修改 Web 仿真系统 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan` 的混乱逻辑,并进行严格验证。要求新任务先写入 `working` 文档后再执行。
## 执行目标
1. 以本地 LinuxCNC `xyzbc-trt` 配置、HAL/任务状态语义和现有验证证据为参考,梳理按钮状态机。
2. 修正 Web 仿真中 `ESTOP`、机器上电、全轴回零、程序运行、暂停/继续的状态流转和按钮可用性。
3. 增加或更新自动化验证,覆盖未解除急停、未上电、未回零、运行、暂停、继续等关键路径。
4. 执行构建/节点测试/浏览器验证等可用验证,并把结果记录到最终结论与日志。
## 执行顺序
1. 阅读 LinuxCNC `xyzbc-trt` 参考配置与 Web 当前任务态实现。
2. 定位混乱逻辑的根因,制定局部修改方案。
3. 修改源代码与必要测试。
4. 严格运行验证并保存证据。
5. 按仓库要求把完整执行过程追加到 `gptlog-process/gpdlog.md`

View File

@@ -0,0 +1,19 @@
# 2026-07-06 xyzbc-trt 暂停按钮严格对标
## 用户提问
严格对标“暂停”按钮的逻辑。一直就不好用。
## 执行目标
1. 对照本地 LinuxCNC AXIS 的 `task_pause``task_resume``task_pauseresume` 源码语义,明确暂停按钮应有行为。
2. 复查 Web 仿真中工具栏暂停按钮、菜单 Pause、菜单 Resume、底层 `PAUSE/RESUME/PAUSE_RESUME` 的分发与状态门禁。
3. 找出导致暂停按钮“不好用”的实际原因,修正为以 LinuxCNC 任务状态为准的稳定逻辑。
4. 使用节点测试、构建、浏览器烟测和真实按钮/位置冻结证据进行严格验证。
## 预期对标语义
1. 工具栏双竖线按钮对标 LinuxCNC AXIS `task_pauseresume`:运行中点击应暂停,暂停中点击应恢复。
2. 菜单 `Pause` 对标 `task_pause`:仅在 AUTO 且 interpreter 处于 reading/waiting 时暂停。
3. 菜单 `Resume` 对标 `task_resume`:仅在 paused 且 task mode 为 AUTO/MDI 时恢复。
4. 暂停后速度归零G-code 执行采样不继续推进DRO、axisPose、canvas toolhead 保持冻结。

View File

@@ -0,0 +1,55 @@
# 2026-07-06 AXIS 主控制按钮严格对标补齐
## 用户提问
对标 `doc/AXIS主控制按钮功能先决条件与状态影响详解.md`,修改项目 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan`,并依据 `working` 下既有任务文档实施。
## 本轮目标
1. 以本地 LinuxCNC AXIS `task_pause``task_resume``task_pauseresume` 源码和项目文档为准,复查主控制按钮状态门禁。
2. 收紧 Web 仿真中暂停相关门禁,避免仅凭 `runState` 的残留运行态绕过 AXIS 的 `task_mode``interp_state` 条件。
3. 更新自动化验证,覆盖菜单 Pause、工具栏 pause/resume 在 idle、manual、AUTO/MDI、paused 状态下的严格行为。
4. 重新构建 `dist`,执行节点 smoke、浏览器 smoke、Web evidence 与 compare。
## 实施结论
- `app/src/state/linuxcnc-task-policy.js`
- `canPause` 调整为仅在 `STATE_ON + MODE_AUTO + INTERP_READING/WAITING` 时为真。
- 菜单 `PAUSE` 严格对标 AXIS `task_pause`:非 AUTO 阻止,非 READING/WAITING 阻止。
- 工具栏 `PAUSE_RESUME` 的暂停分支对标 AXIS `task_pauseresume`:必须为 AUTO/MDI且解释器非 idle。
- `app/src/state/store.js`
- `PAUSE_RESUME` 不再因 `runState=running/stepping` 自动接管 manual 残留状态。
- `PAUSE_RESUME` 在 manual 模式直接返回 `pause blocked: task mode must be auto or MDI`
- `PAUSE_RESUME` 在 AUTO/MDI 且解释器 idle 时返回 `pause ignored: interpreter is idle`
- `tests/node/verify_xyzbc_trt_web_app.mjs`
- 移除旧的宽容断言idle interpreter + running runState 不应被菜单 Pause 暂停。
- 移除旧的宽容断言manual 残留 running 状态不应被工具栏 pause/resume 强制改成 AUTO paused。
- 增加对应严格拦截断言。
- `app/dist/src/...`
- 通过 `npm --prefix app run build``src` 重新生成。
## 验证结果
```text
npm --prefix app run smoke:node
xyzbc_trt_web_app_smoke=ok
npm --prefix app run build
gmoccapy_static_build=ok
npm --prefix app run smoke:browser
xyzbc_trt_browser_smoke=ok
npm --prefix app run evidence:web
web_xyzbc_trt_evidence=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json
npm --prefix app run evidence:compare
compare_xyzbc_trt_status=pass
```
## 注意事项
本轮开始前工作区已有多处未提交修改和新增证据文件。本轮只在现有状态上补齐 AXIS 暂停/恢复门禁,不回退既有改动。

View File

@@ -0,0 +1,83 @@
# 2026-07-06 AXIS 主控制按钮完全对标复核
## 用户提问
项目 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan` 要完全对标 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/doc/AXIS主控制按钮功能先决条件与状态影响详解.md`
## 对标范围
按文档逐项复核:
- 急停与解除急停:`estop_clicked()``STATE_ESTOP` / `STATE_ESTOP_RESET`
- 上电/下电:`onoff_clicked()`,仅 `STATE_ESTOP_RESET` 分支上电,其余状态发送 `STATE_OFF`
- Home All`home_all_joints()` / `c.home(-1)`
- Run`task_run()` / `AUTO_RUN`,要求上电、已回零、程序打开。
- Pause`task_pause()` / `AUTO_PAUSE`,要求 AUTO 且解释器 READING/WAITING。
- Resume`task_resume()` / `AUTO_RESUME`,要求 paused 且 AUTO/MDI。
- Pause/Resume 工具栏合并按钮:`task_pauseresume()`,要求 AUTO/MDIpaused 时恢复,非 idle 时暂停。
- Step`task_step()` / `AUTO_STEP`,支持自动空闲初次单步,也支持 reading/waiting/paused 队列单步推进。
## 本轮发现和修正
### P-016-001 电源按钮 ESTOP/OFF 语义偏差
问题:
Web 原 `TOGGLE_POWER``STATE_ESTOP` 下会被策略阻止并提示先 reset在非 on 状态下容易按“切换”理解直接进入 on。LinuxCNC AXIS 的 `onoff_clicked()` 并不是“任意非 on 上电”,而是:
```python
if s.task_state == linuxcnc.STATE_ESTOP_RESET:
c.state(linuxcnc.STATE_ON)
else:
c.state(linuxcnc.STATE_OFF)
```
修正:
- `app/src/state/linuxcnc-task-policy.js`
- `TOGGLE_POWER` 不再在 `STATE_ESTOP` 下阻止,允许按钮动作进入 OFF 分支。
- `app/src/state/store.js`
- `TOGGLE_POWER` 改为 `taskState === "estop-reset"` 时上电,否则下电到 `taskState="off"`
- 下电时关闭 power、motion、RTCP、冷却、主轴速度并清除 `allHomed`,对标 `emcJointUnhome(-2)` 的 volatile home 清除效果。
- task/HAL 命令改为上电发送 `EMC_TASK_SET_STATE ON`,否则发送 `EMC_TASK_SET_STATE OFF`
### P-016-002 自动化验证补齐
- `tests/node/verify_xyzbc_trt_web_app.mjs`
- 新增 ESTOP 下点击 Power 进入 OFF 的断言。
- 新增 OFF 下继续点击 Power 仍保持 OFF不能绕过 reset 直接上电的断言。
- 新增下电清除 `allHomed` 的断言。
- 将主按钮链路测试和后续 MDI/JOG/override 测试拆分为独立 store避免异步运行状态污染。
- `tests/browser/xyzbc_trt_browser_smoke.html`
- 新增真实 DOM 按钮路径ESTOP 后点 Power 进入 OFFOFF 下点 Power 仍保持 OFF再 ESTOP/RESET 后才能上电。
## 验证结果
```text
npm --prefix app run smoke:node
xyzbc_trt_web_app_smoke=ok
npm --prefix app run build
gmoccapy_static_build=ok
npm --prefix app run smoke:browser
xyzbc_trt_browser_smoke=ok
npm --prefix app run evidence:web
web_xyzbc_trt_evidence=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json
web status=ready-for-wasm-runtime
blockers=[]
npm --prefix app run evidence:compare
compare_xyzbc_trt_status=pass
checkCount=60
passCount=60
failCount=0
blockers=[]
```
## 结论
本轮按参考文档完成主控制按钮全量复核,并修正电源按钮与 AXIS `onoff_clicked()` 不一致的问题。当前 ESTOP、RESET、POWER、HOME、RUN、PAUSE、RESUME、PAUSE_RESUME、STEP 均有源码门禁和自动化验证覆盖Web/native evidence compare 为 60/60 pass。

View File

@@ -0,0 +1,115 @@
# 2026-07-06 暂停按钮严格测试报告
## 用户提问
严格测试“暂停”按钮的功能。
## 测试目标
`working/14-20260706-xyzbc-trt-暂停按钮严格对标.md` 的预期语义验证:
- 工具栏双竖线按钮对标 AXIS `task_pauseresume`:运行中暂停,暂停中恢复。
- 菜单 `Pause` 对标 `task_pause`:仅 AUTO 且 interpreter 为 reading/waiting 时暂停。
- 菜单 `Resume` 对标 `task_resume`paused 且 AUTO/MDI 时恢复。
- 暂停后速度归零G-code 采样不继续推进DRO、axisPose、canvas toolhead 保持冻结。
## 执行命令和结果
### 1. 构建与回归
```text
npm --prefix app run build
gmoccapy_static_build=ok
npm --prefix app run smoke:node
xyzbc_trt_web_app_smoke=ok
npm --prefix app run smoke:browser
xyzbc_trt_browser_smoke=ok
```
### 2. 暂停位置 JSON trace
命令:
```text
APP_URL_PATH=/web-rtcp-5axis-xyzbc-trt-sim-plan/app/dist/index.html node tools/trace-pause-position-json.mjs
```
结果:
```text
pause_position_status=passed-position-frozen
trace=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/pause-position-traces/pause-position-20260706T063131Z/trace.json
position_changed=false
changed_fields=
```
关键证据:
```text
pausedSampleCount=35
baselineLabel=pause-start
sampleIndex=48
currentVelocity=0
changedFields=[]
```
暂停开始到最后一个暂停采样期间:
- `runState=paused`
- `taskState=on`
- `mode=auto`
- `interpState=paused`
- `taskPaused=true`
- `sampleIndex=48` 保持不变
- `currentVelocity=0`
- `axisPose``dro``runtimeAxisPose``runtimeTcp``uiExecution.joint``uiExecution.tcp``canvasToolhead` 均无变化
- 暂停按钮状态为 `paused=true`,标题为 `Resume program`
### 3. 50ms 长流程截图验证
命令:
```text
RUN_STABLE_BEFORE_FIRST_PAUSE_MS=3000 node tools/verify-estop-power-home-run-pause-50ms.mjs
```
结果:
```text
verification_status=passed
screenshots=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/screenshots/estop-power-home-run-pause-50ms-20260706T063233Z
captured_frames=403
sample_period_ms=50
manifest=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/screenshots/estop-power-home-run-pause-50ms-20260706T063233Z/manifest.json
```
关键断言:
| 阶段 | 结果 | runState | mode | interpState | taskPaused | sampleIndex | currentVelocity |
|---|---|---|---|---|---|---:|---:|
| 第一次暂停 | 通过 | paused | auto | paused | true | 111 | 0 |
| 第一次暂停保持 5 秒 | 通过 | paused | auto | paused | true | 111 | 0 |
| 第二次暂停 | 通过 | paused | auto | paused | true | 405 | 0 |
| 第二次暂停保持 5 秒 | 通过 | paused | auto | paused | true | 405 | 0 |
两次暂停都发生在真实展开程序 `helix_bc.ngc` 第 17 行:
```text
f#<frate> g2i#<r>z#<zmin> p#<n>
```
### 4. Web/native evidence
```text
npm --prefix app run evidence:web
web_xyzbc_trt_evidence=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json
npm --prefix app run evidence:compare
compare_xyzbc_trt_status=pass
```
## 结论
暂停按钮严格测试通过。工具栏暂停/恢复、菜单 Pause/Resume 的回归测试通过;真实浏览器中暂停后状态稳定为 `paused`,速度为 0采样索引不推进DRO/axisPose/runtime/canvas toolhead 均保持冻结;两次 5 秒暂停保持均通过50ms 截图长流程验证通过Web/native compare 仍为 pass。

View File

@@ -18,6 +18,7 @@
当前新增关注点:
- 2026-07-06 00:22 EDT 新任务:完全对标 `/home/mes123456/cnc_wams/linuxcnc``xyzbc-trt` 的 AXIS/task 状态联锁,重整 Web 仿真系统 `解除 ESTOP``上电``Home All``Run``暂停/继续` 功能逻辑;要求修复当前混乱状态流,并通过源码对照、自动化 smoke、browser 验证和 evidence/compare 严格复验。
- 2026-07-05 18:57 EDT 已按 LinuxCNC AXIS 源码修复 Pause工具栏按钮恢复为 `.toolbar.program_pause -> task_pauseresume` 语义,运行中点击暂停、暂停中点击继续;菜单 Pause/Resume 仍为独立命令。Node smoke、browser smoke、build、native/Web/compare 均通过,最新 compare 为 `60/60 pass`
- 2026-07-05 18:18 EDT 已按 `working/12-20260704-真实执行复验与缺失功能工作计划.md` 的 P-002 规则再次执行全量复验native LinuxCNC、Web evidence、compare、build、Node smoke、browser smoke 均通过;最新 `compare-xyzbc-trt-evidence.json``60/60 pass``blockers=[]``requiredImprovements=[]`
- 2026-07-05 18:08 EDT 已按用户要求重新执行“除硬件相关外完全对标”复验native LinuxCNC、Web evidence、compare、build、Node smoke、browser smoke 均通过;最新 `compare-xyzbc-trt-evidence.json``60/60 pass``blockers=[]``requiredImprovements=[]`

View File

@@ -1,7 +1,7 @@
{
"apiName": "xyzbc-trt-native-web-evidence-comparison",
"status": "pass",
"comparedAt": "2026-07-05T22:57:05.625Z",
"comparedAt": "2026-07-06T06:35:08.413Z",
"nativePath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/native-xyzbc-trt-evidence.json",
"webPath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json",
"summary": {
@@ -973,8 +973,8 @@
"id": "menu-run-ready",
"action": "run-ready",
"sourceSymbol": "AXIS run preconditions",
"sourceLines": "axis.py:2308-2320",
"expected": "power on, home, auto mode and TCP kins ready"
"sourceLines": "axis.py:2379-2391",
"expected": "open/stage the selected program without substituting power, Home All, or Run"
},
{
"id": "menu-run",

View File

@@ -1,7 +1,7 @@
{
"apiName": "xyzbc-trt-web-opfs-wasm-evidence",
"status": "ready-for-wasm-runtime",
"collectedAt": "2026-07-05T22:56:54.459Z",
"collectedAt": "2026-07-06T06:35:07.906Z",
"profile": {
"id": "xyzbc-trt",
"machineName": "sim-xyzbc-trt-kins (switchkins)",
@@ -227889,8 +227889,8 @@
"id": "menu-run-ready",
"action": "run-ready",
"sourceSymbol": "AXIS run preconditions",
"sourceLines": "axis.py:2308-2320",
"expected": "power on, home, auto mode and TCP kins ready"
"sourceLines": "axis.py:2379-2391",
"expected": "open/stage the selected program without substituting power, Home All, or Run"
},
{
"id": "menu-run",
@@ -230061,8 +230061,8 @@
"id": "menu-run-ready",
"action": "run-ready",
"sourceSymbol": "AXIS run preconditions",
"sourceLines": "axis.py:2308-2320",
"expected": "power on, home, auto mode and TCP kins ready"
"sourceLines": "axis.py:2379-2391",
"expected": "open/stage the selected program without substituting power, Home All, or Run"
},
{
"id": "menu-run",

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