8.0 KiB
8.0 KiB
02-程序开发步骤
阶段 1:确认语义来源
- 阅读 workspace 规则和 LinuxCNC WASM port 规则。
- 确认本轮不能新增独立 CNC 语义,必须以 LinuxCNC 源码为语义依据。
- 查阅 LinuxCNC task 源码:
linuxcnc/src/emc/task/emctaskmain.cclinuxcnc/src/emc/nml_intf/emc_nml.hhlinuxcnc/src/emc/nml_intf/emc.hh
- 确认按钮对应的 LinuxCNC command:
- Run ->
EMC_TASK_PLAN_RUN - Stop ->
EMC_TASK_ABORT - Pause ->
EMC_TASK_PLAN_PAUSE - Resume ->
EMC_TASK_PLAN_RESUME - Step ->
EMC_TASK_PLAN_STEP - Home ->
EMC_JOINT_HOME
- Run ->
阶段 2:前端按钮状态调整
文件:
web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js
步骤:
- 找到 bottom controls 渲染逻辑。
- 增加 promptable action 列表:
RUNSTOPPAUSERESUMESTEPHOME
- 这些按钮在 blocked 时不再设置 HTML
disabled。 - blocked 状态通过以下属性体现:
data-command-ready="false"aria-disabled="true"title="... blocked reason ..."
- 点击后仍 dispatch 原 action,由 store gate 返回真实阻塞原因。
阶段 3:Web store 命令行为调整
文件:
web-rtcp-5axis-sim-plan/app/src/state/store.js
步骤:
-
Resume
- 发送
EMC_TASK_PLAN_RESUME。 - 根据返回 status 调用
shouldContinueTaskHalStatusLoop()。 - 只有仍处于 reading/mdi 等应继续状态时才重启 status loop。
- 发送
-
Step
- 从空 command sequence 改为发送
EMC_TASK_PLAN_STEP。 - 保留单步后 paused 状态。
- 从空 command sequence 改为发送
-
Home
- 在 task/HAL runtime 存在时,先在 Web 状态中标记:
mode="manual"allHomed=trueinterpState="idle"taskPaused=false
- 再异步发送
EMC_JOINT_HOME。 - 修复快速
HOME -> SET_MODE导致 Home 状态丢失的问题。
- 在 task/HAL runtime 存在时,先在 Web 状态中标记:
-
Session reset
initializeTaskHalSession()开始时停止旧taskHalStatusLoop。- 避免旧运行循环覆盖新 session 或 MDI/Step 状态。
-
Status patch
applyTaskHalStatusPatch()保留allHomed。- 同时保留
noForceHoming,避免 gate 状态回退。
阶段 4:WASM task/HAL runtime 补齐
文件:
wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp
步骤:
- 在
TaskRuntime中增加:task_pausedsingle_stepping
- 在
status_json()输出:task.taskPausedtask.singleStepping
- 在 command handler 中补齐:
EMC_TASK_PLAN_STEP- RUN/RESUME/ABORT/HOME/completion 时清理 pause/step 状态。
- Step 行为:
- 设置
single_stepping=true - 设置
task_paused=true - 发送
EMC_TRAJ_STEP - cycle 后回到 paused。
- 设置
阶段 5:WASM motion runtime 补齐
文件:
wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c
步骤:
- 增加
LCMOT_CMD_STEP。 - 解析:
EMC_TRAJ_STEPEMCMOT_STEP
- paused 状态下允许 STEP 命令通过 queue gate。
- apply step 时短暂解除 paused,使单步命令可以推进。
阶段 6:测试覆盖
修改测试:
web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjsweb-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html
新增/强化验证:
- blocked Run 按钮不能被 HTML disabled,应可点击并提示原因。
- Pause 后
runState=paused。 - Resume 后恢复 running/reading 状态。
- Step 后:
machine.interpState="paused"machine.taskPaused=truetaskHalStatus.task.singleStepping=true
- Stop 后:
runState="stopped"machine.interpState="idle"motion.aborted=true
阶段 7:构建与验证
执行:
bash wasm-port/tools/build_task_hal_wasm.sh
node wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_rtcp_store.mjs
bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
结果:全部通过。
阶段 8:浏览器按钮截图取证
新增文件:
qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
步骤:
- 启动本地静态 HTTP server,打开
web-rtcp-5axis-sim-plan/app/index.html。 - 等待 kinematics、interpreter、task/HAL runtime ready。
- 加载短 G-code 程序
button-control-evidence.ngc。 - 按顺序采集:
- 初始界面
- 程序加载后
- Home 前后
- Run 前后
- Pause 前后
- Resume 前后
- Step 前后
- Stop 前后
- 每个步骤记录:
- PNG 截图
RUN/STOP/PAUSE/RESUME/STEP/HOME按钮 DOM readiness 属性- Web store machine/run/taskHalStatus 状态
- Three.js canvas dataset
- PNG 非黑像素统计
- 输出 JSON 报告:
/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json
验证命令:
node --check qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
结果:
button_control_evidence_status=PASS
阶段 9:云端部署与按钮验收
步骤:
- 重建当前静态站点:
bash wasm-port/tools/build_task_hal_wasm.sh
npm --prefix web-rtcp-5axis-sim-plan/app run build
- 打包
web-rtcp-5axis-sim-plan/app/dist:
tar -C web-rtcp-5axis-sim-plan/app/dist -czf /tmp/web-rtcp-5axis-sim-8092-working1.tar.gz .
- 通过 SSH/paramiko 发布到云端 nginx root:
host=82.156.24.101
user=ubuntu
root=/var/www/web-rtcp-5axis-sim
- 云端执行:
sudo nginx -t
sudo systemctl reload nginx
curl -k -I https://127.0.0.1:8092/
- 对公网 URL 运行按钮流程取证:
TARGET_URL='https://82.156.24.101:8092/' \
EVIDENCE_SCOPE='cloud-button-control-evidence' \
node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
结果:
button_control_evidence_status=PASS
button_control_evidence_job_id=btn-20260623091811-c291e49b
button_control_evidence_report_id=report-btn-20260623091811-c291e49b
button_control_evidence_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json
button_control_evidence_pdf=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf
button_control_evidence_screenshots=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence
阶段 10:LinuxCNC native 对照报告
新增文件:
qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
步骤:
- 运行 phase0 native source/probe gate。
- 运行 Web native task/HAL readiness audit。
- 尝试运行 opt-in TRT native runtime probe。
- 尝试运行 upstream
rs274fixture baseline。 - 记录
halcmd、rs274、linuxcncsvr动态库依赖。 - 输出 native 对照 JSON/Markdown 报告。
命令:
node --check qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
node qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
结果:
native_task_hal_comparison_status=PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER
native_task_hal_comparison_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json
native_task_hal_comparison_markdown=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md
native_task_hal_transition_log_available=0
native_task_hal_host_blocker_count=15
说明:当前主机不能启动 LinuxCNC native TRT task/HAL runtime,原因包括 RIP 脚本硬编码旧绝对路径 /home/cnc/桌面/cnc_wams/linuxcnc,以及二进制依赖当前主机缺失的 GLIBC_2.38、GLIBCXX_3.4.31、libpython3.13.so.1.0 等 runtime 条件。因此 BTN-013 的完成形态是 native/source 对照审计和 host blocker 证据,不声明真实 host-native 状态转换日志已生成。