107 lines
3.9 KiB
Markdown
107 lines
3.9 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 真实语义收敛的关键任务。
|
||
|