127 lines
4.7 KiB
Markdown
127 lines
4.7 KiB
Markdown
# 06-决策记录
|
||
|
||
## DR-W8-001:暂停语义必须分成 task/interpreter 与 motion/trajectory 两层
|
||
|
||
日期:2026-07-07
|
||
|
||
决策:
|
||
|
||
暂停按钮不能只修改 Web `runState`,必须同时维护:
|
||
|
||
- task/interpreter:`interpState`、`interpResumeState`、`taskPaused`;
|
||
- motion/trajectory:`motion.paused`、queue 保留、速度归零或受控减速;
|
||
- 后续 TP:`tpPause()`、`tpResume()`。
|
||
|
||
原因:
|
||
|
||
LinuxCNC AXIS 的暂停调用链明确同时发送 `EMC_TASK_PLAN_PAUSE` 和 `EMCMOT_PAUSE`,并由 TP 完成暂停减速语义。只改 UI 状态会出现按钮显示暂停但底层行号或运动继续推进的问题。
|
||
|
||
影响:
|
||
|
||
所有验收必须检查 task 与 motion 两层状态,不能只检查 `runState=paused`。
|
||
|
||
## DR-W8-002:工具栏 Pause 是 toggle,菜单 Pause 和 Resume 是独立命令
|
||
|
||
日期:2026-07-07
|
||
|
||
决策:
|
||
|
||
Web 工具栏 `tbtn_pause` 对标 AXIS `task_pauseresume`;菜单 Pause 对标 `task_pause`;菜单 Resume 对标 `task_resume`。
|
||
|
||
原因:
|
||
|
||
AXIS 源码中工具栏按钮会根据 `s.paused` 在 pause/resume 间切换,菜单命令则分别有独立 gate。混用会导致菜单 Pause 在 paused 状态误触发 resume,或工具栏无法恢复。
|
||
|
||
影响:
|
||
|
||
`linuxcnc-task-policy.js` 中必须保留菜单 Pause 的严格条件:AUTO 且 interpreter 为 `reading/waiting`。工具栏 toggle 的恢复判断优先使用 motion paused。
|
||
|
||
## DR-W8-003:Resume gate 应优先接受 motion paused
|
||
|
||
日期:2026-07-07
|
||
|
||
决策:
|
||
|
||
Web resume gate 不应只依赖 `interpState === "paused"`,应接受:
|
||
|
||
- `motionPaused === true`;
|
||
- 或 `taskPaused === true`;
|
||
- 或 `interpState === "paused"`。
|
||
|
||
原因:
|
||
|
||
AXIS `task_resume()` 和 `task_pauseresume()` 的恢复判断核心是 `s.paused`,该字段来自 motion/traj 层,而不是单纯 task interpreter 状态。WASM 和 Web 状态同步存在短窗口,motion paused 是恢复按钮是否可用的关键来源。
|
||
|
||
影响:
|
||
|
||
需要把 `taskHalStatus.motionStatus.motion.paused` 映射进 Web state,并更新按钮 active/title 和 RESUME gate。
|
||
|
||
## DR-W8-004:Immediate pause 不清空运动队列
|
||
|
||
日期:2026-07-07
|
||
|
||
决策:
|
||
|
||
用户点击暂停时,motion runtime 应立即停止继续消费普通 move,但不能清空队列。
|
||
|
||
原因:
|
||
|
||
LinuxCNC `tpPause()` 设置 `tp->pausing=1`,使规划器受控降速并保留队列;`tpResume()` 后从原队列继续。清空队列会把 pause 变成 stop/abort,破坏恢复语义。
|
||
|
||
影响:
|
||
|
||
`linuxcnc_motion_runtime.c` 的 pause 处理应设置 paused 和速度状态,暂停期间只允许 STEP/RESUME/ABORT 继续处理。
|
||
|
||
## DR-W8-005:STEP 不是普通 Resume
|
||
|
||
日期:2026-07-07
|
||
|
||
决策:
|
||
|
||
STEP 必须实现“短暂推进一个 motion id 或一行后自动回暂停”,不能等同于 resume。
|
||
|
||
原因:
|
||
|
||
LinuxCNC motion 中 `EMCMOT_STEP` 会记录 `idForStep`,短暂恢复 TP,检测 id 改变后自动 `tpPause()`。如果 STEP 只是 resume,会导致程序连续运行,破坏 AXIS 单步语义。
|
||
|
||
影响:
|
||
|
||
需要在 motion runtime 中增加 stepping/id 追踪,并在 task runtime 中保持 step 完成后的 paused 状态。
|
||
|
||
## DR-W8-006:短期先修 wrapper 可观测语义,长期迁移到 vendored TP
|
||
|
||
日期:2026-07-07
|
||
|
||
决策:
|
||
|
||
当前阶段先在 `linuxcnc_task_hal_wasm.cpp` 和 `linuxcnc_motion_runtime.c` 修正 pause/resume/step 的可观测状态与队列行为;随后通过 `linuxcnc_tp_wasm.c` 增加 TP pause/resume probe,并逐步让 task-hal motion runtime 使用 vendored TP。
|
||
|
||
原因:
|
||
|
||
`wasm-port` 的原则是复用 LinuxCNC 源码,不扩展手写 CNC 语义。但现有前端依赖 task-hal runtime,直接替换为 TP 全链路风险较大。分两步推进可以先修正暂停按钮,再用 TP 证据收敛底层实现。
|
||
|
||
影响:
|
||
|
||
任务矩阵把 `W8-001` 至 `W8-006` 作为短期必要任务,把 `W8-007` 作为向 LinuxCNC TP 真实语义收敛的关键任务。
|
||
|
||
## DR-W8-007:Run Ready 验证不代替 ESTOP/Power/Home/Run
|
||
|
||
日期:2026-07-07
|
||
|
||
决策:
|
||
|
||
Web Node 回归中的 `RUN_READY` 保持 AXIS 风格“准备并打开程序”的语义,不把上电、Home All、切 AUTO 或 Run 混入 Run Ready。需要运行程序时,测试显式执行:
|
||
|
||
- `TOGGLE_POWER`
|
||
- `HOME`
|
||
- `SET_MODE auto`
|
||
- `RUN`
|
||
|
||
原因:
|
||
|
||
AXIS toolbar/menu 的 Run Ready 入口不是 LinuxCNC task run 命令,也不能替用户绕过机床状态前置条件。把 power/home/run 混进 Run Ready 会污染暂停按钮验收,因为后续 pause/resume gate 无法区分“程序准备”与“任务正在运行”。
|
||
|
||
影响:
|
||
|
||
`verify_run_feedback_loop.mjs` 先断言 Run Ready 已准备 task/HAL session,再显式走 power/home/auto/run 流程;暂停恢复验收只在真实 running 状态下执行。
|