100 lines
4.0 KiB
Markdown
100 lines
4.0 KiB
Markdown
# 09-emc_nml 复用评估
|
||
|
||
## 结论
|
||
|
||
T-029 选择:暂不直接 include 完整上游 `emc_nml.hh`,当前阶段采用窄 `StandaloneEmcStatus` / 分阶段 typedef 路线。
|
||
|
||
原因:
|
||
|
||
- `wasm-port/vendor/linuxcnc/src/emc/nml_intf/` 当前未 vendored `emc_nml.hh`。
|
||
- 上游 `emc_nml.hh` 不是单纯状态结构头文件,会拉入 NML/CMS command/status message 基类和大量 interpreter/canon 依赖。
|
||
- 当前 task runtime 已有 T-028 的 `RCS_STATUS` 等价聚合行为,T-007 已建立集中 `StandaloneEmcStatus` 容器;但完整 `emc_nml.hh` 仍需要未 promoted 的 NML/CMS/message runtime 边界,因此不直接 include。
|
||
- 直接 include 会把未设计的 NML transport、CMS serialization、command message update、RS274 active code arrays、tool/canon table 等边界提前混入 task main loop 迁移。
|
||
|
||
## 上游依赖清单
|
||
|
||
上游文件:`linuxcnc/src/emc/nml_intf/emc_nml.hh`。
|
||
|
||
直接 include 依赖:
|
||
|
||
- `linuxcnc.h`
|
||
- `emcpos.h`
|
||
- `emc.hh`
|
||
- `libnml/rcs/rcs.hh`
|
||
- `libnml/nml/cmd_msg.hh`
|
||
- `libnml/nml/stat_msg.hh`
|
||
- `rs274ngc/modal_state.hh`
|
||
- `canon.hh`
|
||
- `rs274ngc/rs274ngc.hh`
|
||
|
||
这些依赖带来的边界:
|
||
|
||
- `RCS_CMD_MSG` / `RCS_STAT_MSG` / `CMS` / `NMLTYPE` message runtime。
|
||
- `update(CMS *)` serialization hooks。
|
||
- `CANON_TOOL_TABLE`、`CANON_UNITS`、RS274 active G/M/settings arrays。
|
||
- full motion/task/io/tool/coolant/aux/spindle status object graph。
|
||
|
||
## 需要的状态子集
|
||
|
||
当前 T-028 已闭合的最小状态字段:
|
||
|
||
| 领域 | 当前字段 | LinuxCNC 对应概念 |
|
||
| --- | --- | --- |
|
||
| top | `top_level_rcs_status` | `EMC_STAT.status` |
|
||
| task | `task_rcs_status` | `EMC_STAT.task.status` |
|
||
| task | `state`、`mode`、`exec_state`、`interp_state` | `EMC_TASK_STAT.state/mode/execState/interpState` |
|
||
| motion | `motion_rcs_status`、`LcmotStatusSnapshot.status` | `EMC_STAT.motion.status` |
|
||
| motion.traj | queue、queueFull、in_position、paused、stepping、motion_id | `EMC_TRAJ_STAT` queue/inpos/pause/id 字段族 |
|
||
| motion | `on_soft_limit` | `EMC_MOTION_STAT.on_soft_limit` |
|
||
| io | `io_rcs_status`、`io_error` | `EMC_STAT.io.status` |
|
||
|
||
## 选择
|
||
|
||
采用分阶段 typedef / 窄 status 容器:
|
||
|
||
1. T-007 已建立 `StandaloneEmcStatus`,集中承载 task/motion/io/top-level 必需字段。
|
||
2. 字段命名和 JSON 导出继续对齐 `EMC_STAT`、`EMC_TASK_STAT`、`EMC_MOTION_STAT`、`EMC_TRAJ_STAT`、`EMC_IO_STAT`。
|
||
3. `RCS_STATUS` 暂以 `"DONE"`、`"EXEC"`、`"ERROR"` 字符串导出,内部可在 T-030/T-032 后替换为窄 enum。
|
||
4. T-032+ 建立 usrmot/NML shim 后,再评估是否 vendor `emc_nml.hh` 及其必要依赖,或只 vendor 一个由上游字段映射驱动的 status subset header。
|
||
|
||
## 不采用的方案
|
||
|
||
### 直接 include 完整 `emc_nml.hh`
|
||
|
||
暂不采用。
|
||
|
||
阻塞项:
|
||
|
||
- `emc_nml.hh` 未在 vendor tree 中。
|
||
- 直接 include 需要引入 `libnml`、CMS、RS274、canon 依赖链。
|
||
- 完整类中大量 `update(CMS *)` 和 message 构造路径超出当前 WASM task runtime 边界。
|
||
- 会让 T-028 已闭合的 status 聚合和后续 T-032/T-040 的 runtime edge 纠缠。
|
||
|
||
### 只扩展现有 `runtime/core/shims/nml_intf/emc.hh`
|
||
|
||
仅作为短期兼容,不作为 T-029 结论。
|
||
|
||
现有 shim 只服务解释器单位字段和 source probe:
|
||
|
||
- `EMC_STAT.motion.traj.linearUnits`
|
||
- `EmcJointType`
|
||
- `extern EMC_STAT *emcStatus`
|
||
|
||
继续无限扩展该 shim 会让 interpreter 单位兼容层和 task status 容器混在一起。
|
||
|
||
## 后续入口
|
||
|
||
- T-007:已建立集中 `StandaloneEmcStatus`。
|
||
- T-030:更新 source reuse map 与 drift 文档,记录本 T-029 决策。
|
||
- T-032:设计 `taskintf.cc` usrmot shim,明确 NML/transport 仍是 runtime boundary。
|
||
- T-033/T-038:把 motion update 和 task update 映射到 `StandaloneEmcStatus` 字段。
|
||
|
||
## 验收
|
||
|
||
T-029 的验收由 `tools/verify_task_emc_nml_reuse_plan.sh` 固定:
|
||
|
||
- 上游 `emc_nml.hh` 存在。
|
||
- 当前 vendor tree 未声称完整 `emc_nml.hh` 已 vendored。
|
||
- 本文记录直接 include 依赖、阻塞项和最终选择。
|
||
- 任务矩阵将 T-029 标为完成。
|