docs: add axis run process working set

This commit is contained in:
wangdequan
2026-07-07 16:46:39 -04:00
parent 8b6be369ff
commit 39b495cf16
672 changed files with 280923 additions and 59 deletions

View File

@@ -0,0 +1,131 @@
# 01-项目功能内容
## 项目目标
完善 `/home/mes123456/cnc_wams/wasm-port` 中 LinuxCNC WASM task/motion 执行链,使 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan` 的 AXIS 风格“执行 Run”按钮按 LinuxCNC 语义工作。
最终用户可见目标:
1. 未解除急停、未上电、未 Home 或未打开程序时Run 按钮不能绕过 LinuxCNC 门禁。
2. 满足条件后点击 Run系统切到 `MODE_AUTO`,发送 `EMC_TASK_PLAN_RUN`task 进入 `INTERP_READING``INTERP_WAITING`
3. 执行中当前行、队列深度、motion id、DRO、TCP、RTCP 位置由 task/motion status 驱动。
4. 执行中 Pause、Resume、Step 继续走 task/motion 命令链,不直接操作前端播放状态。
5. 执行完成、错误、急停、下电、abort 后UI 与 task/motion status 一致,不能残留“前端 running”假状态。
## LinuxCNC 对标依据
来源文档:
`/home/mes123456/cnc_wams/项目分析/AXIS主控制按钮调用链与WASM完善指南.md`
核心调用链:
```text
AXIS task_run()
-> ensure_mode(MODE_AUTO)
-> linuxcnc.command().auto(AUTO_RUN, line)
-> EMC_TASK_PLAN_RUN
-> emcTaskPlan()
-> emcTaskIssueCommand()
-> interpreter readahead
-> canonical motion commands
-> taskintf.cc
-> EMCMOT_SET_LINE / EMCMOT_SET_CIRCLE / ...
-> motion command/control cycle
-> emcStatus
-> linuxcnc.stat().poll()
```
Run 不是前端播放按钮。LinuxCNC 中 Run 的真实结果是 task 解释器状态、motion 队列、status echo 和 GUI 可见状态共同变化。
## 功能范围
### 必须覆盖
1. 急停与解除急停:
- `STATE_ESTOP``STATE_ESTOP_RESET` 的切换。
- ESTOP 分支 abort、motion disable、IO estop on、volatile home 清理。
2. 上电与下电:
- 只有 `STATE_ESTOP_RESET` 才能进入 `STATE_ON`
- `STATE_ON` 由 motion enabled 状态推导,不由前端直接写死。
3. Home
- Run 前必须满足 all homed 或 `no_force_homing`
- Home 应有 `homing -> homed` 过程态。
4. Run
- `MODE_AUTO`
- `EMC_TASK_PLAN_RUN`
- `interpState=READING``taskPaused=false``singleStepping=false`
- 程序文件已 open或 task 能按 `emcStatus->task.file` 打开。
5. Pause/Resume/Step
- 作为 Run 后执行过程控制,不作为独立前端播放逻辑。
- Pause 后 `taskPaused=true``motion.paused=true`
- Step 只推进一个 motion id 或一个可观测执行边界,并回到 paused。
6. Status 投影:
- Web store 中 `taskState/mode/interpState/runState/currentLine/motionPaused/singleStepping` 来自 task/HAL status。
### 暂不覆盖
1. 完整 LinuxCNC NML 网络传输。WASM 可用内存队列替代 NML transport但命令类型和状态语义必须保留。
2. 完整实时 HAL。当前阶段只要求 task/motion/Home/Run/Pause/Step 相关 HAL pin 可观测。
3. 所有 G-code 语义。G-code 到 canonical motion 应优先来自 LinuxCNC interpreter不在 Web 层扩写解释器。
## 当前代码基线
### wasm-port 已有基础
关键文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/runtime/sdk/src/linuxcnc-task-hal.js`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
已具备的基础:
- task/HAL WASM 入口已经存在。
- Pause/Resume/Step 已有 working8 基础验证。
- status JSON 已能输出部分 task/motion 字段。
- Web 项目已经能加载 task-hal WASM 并把部分 status 映射到 store。
### 主要差距
1. task/HAL runtime 仍有 `phase4_minimal` 过渡实现痕迹,部分命令解析和 G-code motion 派生仍是手写逻辑。
2. Run 的门禁需要完全对齐 `emcTaskPlan()`:不能只看 Web 自定义 `runState`
3. 程序 open、canonical motion plan、motion queue、current line 的来源需要收敛到 LinuxCNC interpreter/task/motion 状态。
4. Home 状态常见简化是立即 `allHomed=true`,缺少 `homing/homeState` 过程态。
5. Web store 仍可能存在点击 Run 后直接写 `running` 的分支,需要改为等待 WASM status 确认。
6. 验收不能只看按钮 active需要读取 task/HAL status、trace、截图和 Node/browser 断言。
## 完成定义
本项目完成必须同时满足:
1. Run 前置门禁:
- ESTOP 下 Run 被拒绝。
- ESTOP_RESET 未上电时 Run 被拒绝。
- ON 但未 Home 且 `no_force_homing=false` 时 Run 被拒绝。
- 未 open 程序或没有 canonical plan 时 Run 被拒绝并给出明确错误。
2. Run 命令链:
- UI 点击 Run 后发送 `MODE_AUTO``EMC_TASK_PLAN_RUN`
- WASM status 显示 `task.mode=AUTO`
- WASM status 显示 `task.interpState=READING/WAITING`
- `task.taskPaused=false``motion.traj.singleStepping=false`
3. 执行状态:
- motion queue 或 canonical execution id 可观测。
- 当前行、motion id、DRO/TCP 随 status 推进。
- 执行完成后进入 `INTERP_IDLE``DONE` 或等价完成状态。
4. 执行中控制:
- Pause 后 task 和 motion 双层 paused。
- Resume 后恢复暂停前状态。
- Step 后只推进一个边界并回到 paused。
5. Web 集成:
- Web `runState` 是 task/HAL status 投影。
- UI 按钮 enable/active 状态与 LinuxCNC 门禁一致。
- 浏览器 trace 能证明 Run 后位置推进、Pause 后冻结、Resume 后继续。
## 非目标与风险提醒
1. 不把 Web frame 播放器当作 CNC task。
2. 不在 JS 中新增 G-code 正则解释器作为长期方案。
3. 不因为 UI 看起来 running 就关闭任务,必须有 WASM status 证据。
4. 不把单步实现为数组下标加一Step 必须进入 task/motion 单步状态机。

View File

@@ -0,0 +1,227 @@
# 02-项目程序开发详细步骤
## 开发原则
1. 以 LinuxCNC 源码语义为准:`axis -> emcmodule.cc -> emctaskmain.cc -> taskintf.cc -> motion`
2. Run 按钮只发送命令并渲染状态,不直接把 Web 状态改成 running。
3. WASM wrapper 可以适配 ABI但不能发明第二套 CNC task 状态机。
4. 每一步都要有 Node WASM 测试、Web Node 测试或浏览器 trace 证据。
5. 每轮结束必须更新推进台账、任务矩阵和验收证据。
## 步骤 1建立 Run 状态门禁表
目标文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_state_matrix.mjs`
- `web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/state/linuxcnc-task-policy.js`
开发动作:
1. 固化 LinuxCNC 风格枚举:
- task state`ESTOP``ESTOP_RESET``ON`
- task mode`MANUAL``AUTO``MDI`
- interp state`IDLE``READING``PAUSED``WAITING`
2. 增加 `task_accepts_command(state, mode, interp, command)` 或等价函数。
3.`EMC_TASK_PLAN_RUN` 实现硬门禁:
- 必须 `state=ON`
- 必须 `mode=AUTO`
- 必须 `interpState=IDLE`
- 必须 homed 或 `no_force_homing`
- 必须有已打开程序或可用 canonical plan
4. Web policy 使用同一组条件做按钮 enable/disable但最终以 WASM 返回为准。
验收:
- ESTOP 下 Run 返回拒绝。
- ESTOP_RESET 下 Run 返回拒绝。
- ON/MANUAL 下 Run 需要先切 AUTO。
- ON/AUTO/IDLE 且未 homed 时 Run 返回未回零错误。
- ON/AUTO/IDLE 且 homed、有程序时 Run 被接受。
## 步骤 2补齐程序 open 与 canonical plan 边界
目标文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/runtime/sdk/src/linuxcnc-task-hal.js`
- `web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/runtime/linuxcnc-task-hal-runtime.js`
- `web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/state/store.js`
开发动作:
1. 明确 task/HAL session 的程序来源:
- 当前 G-code 文件路径或虚拟文件名。
- LinuxCNC interpreter canonical events。
- motion plan id/version。
2. 移除或隔离从 G-code 文本正则派生 motion 的 fallback。
3. 无 canonical plan 时Run 返回明确错误,例如 `INTERPRETER_PLAN_REQUIRED`
4. status JSON 输出:
- `task.file`
- `task.programOpen`
- `task.programStartLine`
- `task.planId`
- `task.errorText`
验收:
- 未 open 程序时 Run 不进入 running。
- 有 canonical plan 时 Run 记录 `programStartLine`
- Web 能显示或记录拒绝原因store 不伪造 running。
## 步骤 3实现 Run 命令后的 task 状态变化
目标文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
开发动作:
1. `EMC_TASK_PLAN_RUN` 分支对齐 LinuxCNC
-`taskPaused`
-`singleStepping`
- 清 step 相关等待状态
- 设置 `programStartLine`
- 设置 `interpState=READING`
- 设置 `execState=EXEC` 或等价执行态
2. 把 canonical motion events 下发到 motion runtime 队列。
3. motion runtime 输出:
- `queueDepth`
- `activeDepth`
- `motion.id`
- `motion.programLine`
- `motion.currentVel`
4. 执行完成后 task 状态回到:
- `interpState=IDLE`
- `execState=DONE`
- `taskPaused=false`
验收:
- Run 后读 status 可见 `READING` 或执行中的 `WAITING`
- motion queue 开始消费。
- current line 或 motion id 单调推进。
- 完成后进入 done/idle。
## 步骤 4Web store 改为 task/HAL status 投影
目标文件:
- `web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/state/store.js`
- `web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/runtime/linuxcnc-task-hal-runtime.js`
- `web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_run_feedback_loop.mjs`
开发动作:
1. 点击 Run 后只做:
- policy 检查
- `taskHalRuntime.sendCommand(MODE_AUTO)`
- `taskHalRuntime.sendCommand(EMC_TASK_PLAN_RUN)`
- `runCycles/readStatus`
2. `runState` 映射规则:
- `interpState=READING/WAITING` 且未 paused -> `running`
- `interpState=PAUSED``motion.paused=true` -> `paused`
- `interpState=IDLE` 且 exec done -> `idle/done`
- 有 error -> `error`
3. 删除或隔离点击 Run 后直接写 `running` 的分支。
4. 当前行、DRO、TCP、RTCP 显示优先使用 task/HAL status 和 kinematics runtime 的结果。
验收:
- WASM 拒绝 Run 时 Web 不进入 running。
- WASM 接受 Run 后 Web 才进入 running。
- status loop 中断或错误时 UI 进入明确错误态,不保持假 running。
## 步骤 5Home 过程态补齐为 Run 前置条件
目标文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/state/store.js`
- `web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_run_feedback_loop.mjs`
开发动作:
1. joint status 增加:
- `homing`
- `homed`
- `homeState`
2. Home All 后不要立即只写 `allHomed=true`,应经历至少一个可观测过程态。
3. Run 前使用 `allHomed || noForceHoming`
4. OFF/ESTOP 时按当前模型清理 volatile home如果暂不能区分 volatile必须在 status 和决策记录中标注简化。
验收:
- 未 homed Run 被拒绝。
- Home 过程中 Run 被拒绝。
- Home 完成后 Run 可进入执行。
## 步骤 6执行过程 Pause/Resume/Step 回归
目标文件:
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_run_feedback_loop.mjs`
- `web-rtcp-5axis-xyzbc-trt-sim-plan/tools/trace-pause-position-json.mjs`
- `web-rtcp-5axis-xyzbc-trt-sim-plan/tools/verify-estop-power-home-run-pause-50ms.mjs`
开发动作:
1. 在 Run 成功后执行 Pause断言
- `task.interpState=PAUSED`
- `task.taskPaused=true`
- `motion.paused=true`
2. Resume 后断言:
- 恢复 `interpResumeState`
- `taskPaused=false`
- `motion.paused=false`
3. Step 后断言:
- `singleStepping=true` 或 step 过程字段可观测
- 只推进一个 motion id/程序行
- 回到 paused
验收:
- working8 已有暂停证据继续通过。
- working9 新增 Run 前置、Run 后执行推进、Run 中暂停/恢复/单步证据。
## 步骤 7构建与回归命令
WASM 推荐命令:
```bash
cd /home/mes123456/cnc_wams/wasm-port
./tools/build_task_hal_wasm.sh
node tests/wasm/node/verify_task_hal_wasm.mjs
node tests/wasm/node/verify_task_state_matrix.mjs
```
Web 推荐命令:
```bash
cd /home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan
npm --prefix app run build
node tests/node/verify_run_feedback_loop.mjs
APP_URL_PATH=/web-rtcp-5axis-xyzbc-trt-sim-plan/app/dist/index.html node tools/trace-pause-position-json.mjs
RUN_STABLE_BEFORE_FIRST_PAUSE_MS=3000 node tools/verify-estop-power-home-run-pause-50ms.mjs
```
预期证据关键词:
- `linuxcnc_task_runtime_smoke=ok`
- `task_state_matrix=ok`
- `run_feedback_status_loop_smoke=ok`
- `pause_position_status=passed-position-frozen`
- `verification_status=passed`
## 步骤 8记录与关闭
每完成一个编号任务:
1. 更新 `03-推进台账.md`
2. 更新 `04-任务矩阵.md` 状态。
3. 把命令、输出摘要、trace 路径、截图目录写入 `05-验收证据.md`
4. 如果改变技术方向,追加 `06-决策记录.md`

View File

@@ -0,0 +1,56 @@
# 03-推进台账
## 记录规则
每轮推进结束后追加一条记录,格式固定如下:
```text
## YYYY-MM-DD HH:MM EDT - 第 N 轮
### 本轮目标
### 本轮做了什么
### 改了哪些文件
### 验证了什么
### 结果与证据
### 下一步
```
## 2026-07-07 16:42 EDT - 第 0 轮:文档初始化
### 本轮目标
`/home/mes123456/cnc_wams/项目分析/AXIS主控制按钮调用链与WASM完善指南.md`,在 `/home/mes123456/cnc_wams/work/working9-执行过程按钮` 建立后续推进所需文档体系。
### 本轮做了什么
1. 读取 AXIS 主控制按钮调用链与 WASM 完善指南,确认 working9 应以 Run 执行按钮为主线同时覆盖急停、上电、Home、Pause、Resume、Step 的前置和运行期状态链。
2. 参考 `work/working8-暂停按钮` 的文档组织方式,建立 working9 文档索引、功能内容、开发步骤、推进台账、任务矩阵、验收证据、决策记录。
3. 将任务编号统一为 `W9-xxx`,便于后续按矩阵继续推进。
### 改了哪些文件
- `work/working9-执行过程按钮/README.md`
- `work/working9-执行过程按钮/01-项目功能内容.md`
- `work/working9-执行过程按钮/02-项目程序开发详细步骤.md`
- `work/working9-执行过程按钮/03-推进台账.md`
- `work/working9-执行过程按钮/04-任务矩阵.md`
- `work/working9-执行过程按钮/05-验收证据.md`
- `work/working9-执行过程按钮/06-决策记录.md`
### 验证了什么
本轮只创建推进文档,未修改 `wasm-port` 或 Web 项目代码。验证重点是文件是否齐全、索引是否能覆盖后续继续推进。
### 结果与证据
- working9 文档体系已创建。
- 任务矩阵已列出 Run 门禁、程序 open、task 状态、Web status 投影、Home 前置、Pause/Resume/Step 回归、浏览器验收等后续任务。
### 下一步
`04-任务矩阵.md``W9-001` 开始,先补 Run 状态门禁矩阵和 WASM Node 验证。

View File

@@ -0,0 +1,34 @@
# 04-任务矩阵
## 状态定义
- `待办`:尚未修改代码。
- `进行中`:已有部分修改或验证,但未达到验收标准。
- `已完成`:代码、测试、证据、台账均完成。
- `阻塞`:需要外部输入或依赖。
## 任务列表
| 任务编号 | 状态 | 任务 | 目标文件 | 验收标准 |
|---|---|---|---|---|
| W9-000 | 已完成 | 初始化 working9 推进文档 | `work/working9-执行过程按钮/*` | README、功能内容、开发步骤、推进台账、任务矩阵、验收证据、决策记录均已创建。 |
| W9-001 | 待办 | 建立 Run 状态门禁矩阵 | `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp``wasm-port/tests/wasm/node/verify_task_state_matrix.mjs` | ESTOP、ESTOP_RESET、ON/MANUAL、ON/AUTO/IDLE、未 homed、有程序等状态组合均有明确接受/拒绝断言。 |
| W9-002 | 待办 | Web task policy 对齐 Run 门禁 | `web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/state/linuxcnc-task-policy.js` | Run enable/disable 与 LinuxCNC 条件一致;最终仍以 WASM 拒绝/接受为准。 |
| W9-003 | 待办 | 明确 program open 与 canonical plan 边界 | `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp``wasm-port/runtime/sdk/src/linuxcnc-task-hal.js` | 未 open 程序或无 canonical plan 时 Run 返回明确错误,不能 fallback 为 JS/G-code 正则执行。 |
| W9-004 | 待办 | 实现 `EMC_TASK_PLAN_RUN` 状态转换 | `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp` | Run 后清 pause/step设置 `interpState=READING``taskPaused=false``singleStepping=false``programStartLine`。 |
| W9-005 | 待办 | motion runtime 暴露执行推进字段 | `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c` | status 输出 `queueDepth``activeDepth``motion.id``programLine``currentVel`,执行中可观测推进。 |
| W9-006 | 待办 | Web store 改为 task/HAL status 投影 | `web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/state/store.js` | Run 被 WASM 拒绝时 Web 不进入 runningWASM status 进入 reading/waiting 后 Web 才显示 running。 |
| W9-007 | 待办 | Home 过程态作为 Run 前置条件 | `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp``web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/state/store.js` | 未 homed 或 homing 中 Run 被拒绝Home 完成后 Run 可执行。 |
| W9-008 | 待办 | 执行中 Pause/Resume/Step 状态回归 | `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs``web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_run_feedback_loop.mjs` | Run 后 Pause/Resume/Step 均有 task/motion status 断言,不能只看 UI 状态。 |
| W9-009 | 待办 | 浏览器 Run 过程 trace 验收 | `web-rtcp-5axis-xyzbc-trt-sim-plan/tools/trace-pause-position-json.mjs``tools/verify-estop-power-home-run-pause-50ms.mjs` | trace 证明 Run 后位置推进Pause 后冻结Resume 后继续;截图 manifest 有路径记录。 |
| W9-010 | 待办 | 构建与 dist 同步 | `web-rtcp-5axis-xyzbc-trt-sim-plan/app/dist``wasm-port/build/wasm/task-hal` | WASM 与 Web dist 使用最新实现hash 或构建日志记录到验收证据。 |
| W9-011 | 待办 | 更新文档与证据闭环 | `work/working9-执行过程按钮/03-推进台账.md``05-验收证据.md``06-决策记录.md` | 每个完成任务都有命令、输出摘要、路径证据和必要决策记录。 |
## 防重复规则
1. 前端 `runState=running` 通过不等于 `W9-004` 完成。
2. 按钮可点击不等于 Run 门禁完成,必须有 WASM 接受/拒绝矩阵。
3. Run 后当前行变化不等于 motion runtime 完成,必须有 queue/id/programLine/status 字段证据。
4. 未记录 canonical plan 来源,不得关闭 `W9-003`
5. 未记录 trace 或截图路径,不得关闭浏览器验收任务。
6. Pause/Resume/Step 如果只改 UI 状态,不得计入执行过程控制完成。

View File

@@ -0,0 +1,68 @@
# 05-验收证据
## 记录规则
每次验证后追加证据。建议格式:
```text
## YYYY-MM-DD HH:MM EDT - 任务 W9-xxx
### 命令
### 输出摘要
### 页面/截图/trace/report
### 结论
```
证据可以包括:
- 命令和关键输出。
- 页面 URL。
- Playwright trace 路径。
- 截图目录。
- `manifest.json`
- `job_id``report_id`
- PDF 或报告文件。
- WASM hash、dist hash。
## 2026-07-07 16:42 EDT - 任务 W9-000
### 命令
```bash
sed -n '1,260p' '项目分析/AXIS主控制按钮调用链与WASM完善指南.md'
sed -n '261,620p' '项目分析/AXIS主控制按钮调用链与WASM完善指南.md'
sed -n '621,980p' '项目分析/AXIS主控制按钮调用链与WASM完善指南.md'
find 'work/working9-执行过程按钮' -maxdepth 1 -type f -print | sort
```
### 输出摘要
- 已读取 AXIS 主控制按钮调用链与 WASM 完善指南。
- 已确认工作目录为 `/home/mes123456/cnc_wams/work/working9-执行过程按钮`
- 已创建 working9 文档体系。
### 页面/截图/trace/report
本轮为文档初始化无页面、截图、trace、job_id、report_id 或 PDF。
### 结论
`W9-000` 已完成。后续从 `W9-001` 开始进入代码和验证阶段。
## 待补证据清单
| 任务编号 | 必需证据 |
|---|---|
| W9-001 | `verify_task_state_matrix.mjs` 命令和输出,至少覆盖 Run 接受/拒绝矩阵。 |
| W9-002 | Web policy Node 测试输出,证明按钮门禁与 LinuxCNC 条件一致。 |
| W9-003 | program open/canonical plan 测试输出,证明无 plan 时拒绝 Run。 |
| W9-004 | WASM status 输出片段,证明 Run 后 `interpState=READING`。 |
| W9-005 | motion status 输出片段,证明 queue/id/programLine 推进。 |
| W9-006 | store 测试输出,证明 Web running 来自 WASM status。 |
| W9-007 | Home 过程态测试输出,证明 homing 中 Run 被拒绝。 |
| W9-008 | Pause/Resume/Step 回归输出。 |
| W9-009 | Playwright trace、截图目录、manifest 路径。 |
| W9-010 | build 命令输出、WASM/dist hash 或文件时间戳。 |

View File

@@ -0,0 +1,43 @@
# 06-决策记录
## 记录规则
当出现会影响后续实现路线的技术取舍时追加记录。建议格式:
```text
## DR-W9-xxx - 标题
- 日期:
- 状态:
- 背景:
- 决策:
- 理由:
- 后续影响:
```
## DR-W9-001 - working9 以 Run 为主线但覆盖完整控制链
- 日期2026-07-07
- 状态:已采纳
- 背景:用户目录名为 `working9-执行过程按钮`,来源文档覆盖 AXIS 主控制按钮包括急停、上电、Home、执行、暂停、单步。
- 决策working9 文档以“执行 Run 按钮”为主线同时把急停、上电、Home、Pause、Resume、Step 纳入前置条件和执行过程控制。
- 理由LinuxCNC 中 Run 不能脱离 `STATE_ON``MODE_AUTO`、homed、program open、pause/step 状态机单独成立。只写 Run 会导致后续实现继续用 Web `runState` 绕过真实 task/motion 门禁。
- 后续影响:任务矩阵中的 Run 验收必须包含前置链和运行期链;不能只验证点击 Run 后前端开始播放。
## DR-W9-002 - Web `runState` 只能作为投影状态
- 日期2026-07-07
- 状态:已采纳
- 背景AXIS GUI 通过 `linuxcnc.stat().poll()` 读取 `emcStatus`,按钮本身不保存真实 task/motion 状态。
- 决策Web 中 `runState`、按钮 active、当前行等 UI 状态应由 task/HAL WASM status 投影生成。
- 理由:如果点击 Run 后直接写 `runState=running`,会掩盖 ESTOP、未上电、未 homed、无 program plan 等拒绝条件,形成假执行状态。
- 后续影响:后续代码修改需要优先删除或隔离直接写 running/paused/done 的分支,改为等待 WASM status 同步。
## DR-W9-003 - G-code 到 motion 不再扩展 JS 正则 fallback
- 日期2026-07-07
- 状态:已采纳
- 背景:来源指南指出 `wasm-port` 应复用 LinuxCNC source当前从 G-code 文本中用简单规则派生 motion 属于语义漂移风险。
- 决策Run 所需 motion plan 应来自 LinuxCNC interpreter canonical output 或受控 WASM 适配层。没有 plan 时返回明确错误,不把 JS 正则解析作为长期执行路径。
- 理由Run 按钮的验收对象是 LinuxCNC task/interpreter/motion 链,不是 Web 播放 G-code 文本。
- 后续影响:`W9-003` 必须明确 program open 与 canonical plan 边界;关闭任务前要有无 plan 拒绝 Run 的测试证据。

View File

@@ -0,0 +1,47 @@
# working9 README 索引
## 主题
基于 `/home/mes123456/cnc_wams/项目分析/AXIS主控制按钮调用链与WASM完善指南.md`,推进 AXIS 风格“执行 Run”按钮及其前置/运行期控制链在 `wasm-port``web-rtcp-5axis-xyzbc-trt-sim-plan` 中的完善。
本工作目录以“执行过程按钮”为主线,但 Run 不是孤立按钮。LinuxCNC 中 Run 是否可用、是否能继续、是否能暂停/单步,依赖以下状态链:
```text
ESTOP/ESTOP_RESET
-> Power ON
-> Manual Home
-> AUTO Run
-> Reading/Waiting
-> Pause/Resume/Step
-> Done/Error/Abort
```
## 文档索引
| 文件 | 用途 |
|---|---|
| `01-项目功能内容.md` | 定义执行按钮功能范围、LinuxCNC 对标语义、当前差距和完成定义。 |
| `02-项目程序开发详细步骤.md` | 按 `wasm-port`、Web store、UI、测试证据列出可执行开发步骤。 |
| `03-推进台账.md` | 记录每轮做了什么、改了哪些文件、验证了什么、下一步是什么。 |
| `04-任务矩阵.md` | 管理全部任务编号、状态、依赖和验收标准,防止重复推进。 |
| `05-验收证据.md` | 汇总命令、页面、job_id、report_id、PDF、截图、trace 等证据。 |
| `06-决策记录.md` | 固化关键技术决策,避免后续重复争论同一问题。 |
## 当前推进入口
1. 先读 `01-项目功能内容.md`,确认 Run 的完成定义不是“前端开始播放”,而是 task/motion 状态进入 LinuxCNC 风格执行链。
2.`04-任务矩阵.md``W9-001` 开始推进。
3. 每完成一个任务把命令、输出摘要、trace、截图目录追加到 `05-验收证据.md`
4. 每轮结束更新 `03-推进台账.md`
5. 如果改变状态源、门禁策略、fallback 方案,先追加 `06-决策记录.md`
## 当前结论
`AXIS主控制按钮调用链与WASM完善指南.md` 的核心结论是AXIS 按钮不是直接改 UI 状态,而是通过 `linuxcnc.command()` 发送 `EMC_TASK_*``EMC_JOINT_*` 命令,经 task 层门禁、motion 层执行,再由 `emcStatus` 反向驱动 UI。
working9 后续推进必须围绕这个结论:
- Run 必须发送 `EMC_TASK_PLAN_RUN`,并等待 task status 进入 `INTERP_READING/WAITING`
- Run 前必须满足 `STATE_ON + MODE_AUTO + homed/no_force_homing + program opened`
- Web 的 `runState` 只能是 WASM task/motion status 的投影,不能作为真实执行状态源。
- Pause、Resume、Step 必须作为执行过程的后续命令,不能退化为前端播放暂停或 frameIndex 跳转。