Files
cnc_wams/wasm-port/working/01-项目功能内容.md
2026-07-08 09:20:47 -04:00

123 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 01-项目功能内容
## 项目目标
`wasm-port` 的 task/motion/HAL 运行时从当前 minimal adapter 推进到尽可能贴近 LinuxCNC 原生 `emctaskmain.cc` 的 task 主循环结构。
核心要求:
- 每个 task 周期都建立 LinuxCNC 式 motion 状态快照。
- task 状态机使用该 motion 快照驱动等待、错误、estop、abort、queueFull、in-position、program line 等行为。
- 周期顺序对标上游 `emctaskmain.cc`command read -> plan -> execute -> motion update -> subordinate sync -> task update -> status write。
- 当前 JSON 自有状态机逐步收缩为 host/runtime 边界CNC/task 语义优先来自 LinuxCNC 源码。
- 后续 WASM 程序定位为核心状态机实现的运行载体task/motion 状态机、周期调度、状态聚合、命令执行位于 C/C++ WASM 侧JS/SDK 和 JSON 只承担外部边界职责。
## 对标源
主要对标文件:
- `/home/mes123456/cnc_wams/linuxcnc/src/emc/task/emctaskmain.cc`
- `/home/mes123456/cnc_wams/linuxcnc/src/emc/task/emctask.cc`
- `/home/mes123456/cnc_wams/linuxcnc/src/emc/task/taskintf.cc`
- `/home/mes123456/cnc_wams/linuxcnc/src/emc/task/emccanon.cc`
- `/home/mes123456/cnc_wams/linuxcnc/src/emc/task/task.hh`
- `/home/mes123456/cnc_wams/linuxcnc/src/emc/nml_intf/emc.hh`
- `/home/mes123456/cnc_wams/linuxcnc/src/emc/nml_intf/emc_nml.hh`
- `/home/mes123456/cnc_wams/linuxcnc/src/emc/motion/usrmotintf.h`
- `/home/mes123456/cnc_wams/linuxcnc/src/emc/motion/motion.h`
当前 WASM 侧入口:
- `/home/mes123456/cnc_wams/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `/home/mes123456/cnc_wams/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `/home/mes123456/cnc_wams/wasm-port/runtime/sdk/src/linuxcnc-task-hal.js`
## 当前闭合状态
当前 `wasm-port` 已有:
- `lctask_*` C ABI。
- `lcmot_*` minimal motion runtime。
- HAL pin/snapshot runtime。
- Node WASM task/motion/HAL smoke。
- LinuxCNC 式 task 周期骨架command read -> plan -> execute -> motion update -> subordinate sync -> task update -> status write。
- 周期内 `LcmotStatusSnapshot``StandaloneEmcStatus.motion` 的映射。
- `StandaloneEmcStatus` 作为当前阶段 `EMC_STAT` 等价容器,集中导出 task/motion/io/top status。
- RUN 文件主路径通过 staged program plan read/command/execute、`emccanon.cc` command envelope 和 `taskintf.cc` motion issue 工作,不依赖 host JSON motion plan。
- task 状态、模式、pause/resume/step/home/run gate、wait-for-motion、queueFull、motion error、soft-limit、IO error、RCS 聚合和 no-JSON RUN path 的 WASM/SDK/state-matrix 覆盖。
当前保守边界:
- 当前 shim `runtime/core/shims/nml_intf/emc.hh` 只暴露 `motion.traj.linearUnits`,远小于上游 `emc_nml.hh``EMC_STAT``EMC_TASK_STAT``EMC_MOTION_STAT``EMC_TRAJ_STAT` 的字段范围。
- task-HAL WASM 构建接入的是 `emctask.cc``taskintf.cc``emccanon.cc` 的窄 source-anchored subset不是完整上游 process/NML topology。
- `tools/task-hal-source-manifest.txt` 仍是 Phase 0 references`task_hal_runtime_promoted=0`
- `nativeTaskReady=false``nativeHalSyncReady=false``fullLinuxCncProgramExecutionReady=false` 仍是当前 readiness contract。
## WASM核心状态机边界
后续完善时按以下职责划分:
| 层 | 职责 |
| --- | --- |
| WASM/C++ | 核心状态机、LinuxCNC 语义复用、task cycle、motion snapshot、`StandaloneEmcStatus`、command read/plan/execute、RCS 聚合。 |
| JS/SDK | 加载 WASM、传命令、读状态、管理 Emscripten FS/OPFS 和浏览器/Node 边界。 |
| JSON | 作为外部通信格式,例如 command JSON 和 status JSON不得作为核心状态机事实源。 |
因此,新增状态应优先进入 C/C++ 结构体、枚举、队列和周期函数status JSON 只能从最后一次 status write 或 `StandaloneEmcStatus` 导出。
`status JSON` 的具体 LinuxCNC 对标方案详见 `12-status-json-LinuxCNC对标方案.md`。该方案要求 `emcStatus` 成为新增 LinuxCNC 对标字段的主对象,`task``motionStatus` 等旧字段只作为兼容视图。
## 功能范围
本阶段要实现或准备实现:
1. 在 WASM task runtime 内建立 `EMC_STAT` 等价状态容器。
2. 将 minimal motion runtime 的状态导入 `EMC_STAT.motion` 等价快照。
3. 重排 `lctask_run_cycles()`,使每个 task 周期符合上游主循环顺序。
4. 把 wait-for-motion、motion queue、pause/step/resume、abort/error 逻辑改为依赖 motion 快照。
5. 增加测试证明 task 周期内读取 motion而不是只在 status API 读取时拼接 motion。
6. 分阶段引入 vendored/upstream task 源码,减少自有状态机语义。
## 最小字段闭环
第一阶段必须优先闭合以下字段,原因是它们直接参与 `emctaskmain.cc` 主循环、`emcTaskExecute()` 或顶层 status 聚合:
| 领域 | 字段 | 用途 |
| --- | --- | --- |
| task | `state``mode` | state/mode gate、power/home/run 前置 |
| task | `execState``interpState` | `emcTaskPlan()``emcTaskExecute()` 状态机 |
| task | `currentLine``readLine``motionLine` | interpreter/motion line 对齐 |
| task | `task_paused` | pause/resume/step |
| motion | `status` | wait-for-motion、error、top-level status |
| motion.traj | `enabled``inpos``queue``activeQueue``queueFull` | motion wait、queue gate、disable edge |
| motion.traj | `id``paused``single_stepping` | stepping、motion id、pause |
| motion.traj | `position``actualPosition``current_vel` | UI/status、interpreter sync |
| motion | `on_soft_limit` | soft-limit error path |
| io | `status``aux.estop` | subordinate sync、top-level status |
完整字段映射详见 `07-emctaskmain周期对标蓝图.md`
后续 WASM 核心状态机完善路线详见 `11-WASM核心状态机边界与后续完善路线.md`
## 非目标
本阶段不做:
- 驱动真实硬件。
- 浏览器内复刻 LinuxCNC 原生多进程拓扑。
- 移植 native GUI。
- 用 JavaScript 重写 CNC/task/motion 语义。
- 一次性完整移植 realtime motion controller。
## 完成定义
阶段完成至少满足:
- 文档记录 task 主循环对标范围、步骤、任务矩阵和验收证据。
- 新增测试能区分“task 周期读取 motion”和“status API 拼接 motion”。
- `lctask_run_cycles()` 内存在清晰的 LinuxCNC 式周期结构。
- `nativeTaskReady``nativeHalSyncReady``fullLinuxCncProgramExecutionReady` 等 readiness 字段与真实能力一致。
- 现有 WASM task/motion/HAL smoke 不回退。
- `lctask_send_command_json()` 不再直接产生 LinuxCNC task 语义变化;语义变化必须由后续 `lctask_run_cycles()` 的 command read/plan/execute 阶段产生。
- `lctask_read_status_json()` 不推进、不同步、不重新读取 motion它只导出最后一次 status write 的快照。