feat: sync latest run execution updates

This commit is contained in:
2026-06-22 21:47:16 -04:00
parent 0b1aad39e1
commit 8d3177cb73
92 changed files with 22837 additions and 246 deletions

View File

@@ -0,0 +1,385 @@
{
"generatedAt": "2026-06-23T01:38:37.231Z",
"url": "http://127.0.0.1:35283/web-rtcp-5axis-sim-plan/app/index.html",
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc",
"activeLines": [
9,
10,
12
],
"historyLines": [
9,
10,
11,
12
],
"synced": true,
"samples": [
{
"elapsedMs": 100,
"activeLine": 9,
"uiLine": 9,
"runState": "running",
"velocity": 2100,
"line": 9,
"motionProgramLine": 9,
"halProgramLine": 9,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"history": [
{
"line": 9,
"motion": 9,
"hal": 9,
"source": "motion-status",
"synced": true
}
]
},
{
"elapsedMs": 250,
"activeLine": 10,
"uiLine": 10,
"runState": "running",
"velocity": 2100,
"line": 10,
"motionProgramLine": 10,
"halProgramLine": 10,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"history": [
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 9,
"motion": 9,
"hal": 9,
"source": "motion-status",
"synced": true
}
]
},
{
"elapsedMs": 500,
"activeLine": 10,
"uiLine": 10,
"runState": "running",
"velocity": 2100,
"line": 10,
"motionProgramLine": 10,
"halProgramLine": 10,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"history": [
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 9,
"motion": 9,
"hal": 9,
"source": "motion-status",
"synced": true
}
]
},
{
"elapsedMs": 1000,
"activeLine": 12,
"uiLine": 12,
"runState": "running",
"velocity": 100.0002,
"line": 12,
"motionProgramLine": 12,
"halProgramLine": 12,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"history": [
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 11,
"motion": 11,
"hal": 11,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 9,
"motion": 9,
"hal": 9,
"source": "motion-status",
"synced": true
}
]
},
{
"elapsedMs": 2000,
"activeLine": 12,
"uiLine": 12,
"runState": "running",
"velocity": 100.0002,
"line": 12,
"motionProgramLine": 12,
"halProgramLine": 12,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"history": [
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 11,
"motion": 11,
"hal": 11,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 10,
"motion": 10,
"hal": 10,
"source": "motion-status",
"synced": true
},
{
"line": 9,
"motion": 9,
"hal": 9,
"source": "motion-status",
"synced": true
}
]
},
{
"elapsedMs": 4000,
"activeLine": 12,
"uiLine": 12,
"runState": "running",
"velocity": 100.0002,
"line": 12,
"motionProgramLine": 12,
"halProgramLine": 12,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"history": [
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
},
{
"line": 12,
"motion": 12,
"hal": 12,
"source": "motion-status",
"synced": true
}
]
}
],
"final": {
"runState": "running",
"activeLine": 12,
"feedbackHistoryLength": 24
},
"consoleErrors": [
"Failed to load resource: the server responded with a status of 404 (Not Found)",
"Failed to load resource: the server responded with a status of 404 (Not Found)"
]
}

View File

@@ -0,0 +1,267 @@
{
"generatedAt": "2026-06-22T22:09:41.825Z",
"targetUrl": "http://127.0.0.1:45757/web-rtcp-5axis-sim-plan/app/index.html",
"caseName": "08-meter-scene-desktop-mobile",
"summary": "浏览器米尺度 Three.js 证据desktop/mobile canvas 非空、路径 bounds 为米、预览稳定居中",
"status": "PASS",
"samples": [
{
"viewport": {
"name": "desktop",
"width": 1600,
"height": 1200,
"deviceScaleFactor": 1
},
"screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/meter-scene-evidence/08-meter-scene-desktop.png",
"pixelStats": {
"width": 803,
"height": 874,
"averageLuminance": 65.18,
"nonBlackRatio": 0.8173
},
"dataset": {
"fiveAxisCanvas": "true",
"engine": "three.js r183",
"threeReady": "true",
"threeRevision": "183",
"threePathPoints": "1498",
"threeExecutedPathPoints": "1",
"threeSceneObjects": "20",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}",
"threeSceneUnits": "m",
"threeLinearUnits": "mm",
"threeLinearUnitScaleToMeters": "0.001",
"threeToolAxis": "{\"x\":0.558,\"y\":0.769,\"z\":0.312}",
"threeTcpPose": "{\"x\":36.474,\"y\":-22.486,\"z\":-13.749,\"a\":-71.841,\"c\":-35.93}",
"threeRtcpState": "on",
"threeSelectedView": "iso",
"threeFrameApi": "web-rtcp-5axis-motion-frame",
"threeRenderer": "webgl",
"threeSceneMode": "program-preview-and-tool-execution",
"threePreviewScope": "machine-reference-and-toolpath",
"threeMachineReferenceModel": "webgl-five-axis-reference",
"threeCameraControls": "orbit-pan-zoom",
"threeProgramPreviewSource": "linuxcnc-interpreter-wasm",
"threeToolExecutionMarker": "true",
"threeTcpMarker": "sphere",
"threeToolAxisMarker": "line",
"threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion",
"threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback",
"threePathFitBounds": "ok",
"threePathBoundsMeters": "{\"center\":{\"x\":-0.001,\"y\":0,\"z\":0.019},\"size\":{\"x\":0.088,\"y\":0.089,\"z\":0.043},\"maxSpan\":0.089211}",
"threeCurrentSegmentHighlight": "ok",
"threeRapidFeedVisualDistinction": "ok",
"threeNoGcodeSemanticsGeneration": "ok",
"threeRapidPathPoints": "186",
"threeFeedPathPoints": "1436",
"threeArcPathPoints": "0",
"threeCurrentSegmentPoints": "1",
"threeCurrentSegmentType": "STRAIGHT_TRAVERSE"
},
"status": "PASS",
"checks": [
{
"name": "canvas ready",
"pass": true,
"detail": "threeReady=true"
},
{
"name": "WebGL renderer",
"pass": true,
"detail": "renderer=webgl"
},
{
"name": "机床参考模型",
"pass": true,
"detail": "scope=machine-reference-and-toolpath, model=webgl-five-axis-reference"
},
{
"name": "TCP 球标记",
"pass": true,
"detail": "tcp=sphere, marker=true"
},
{
"name": "刀轴线",
"pass": true,
"detail": "toolAxisMarker=line"
},
{
"name": "场景对象数量",
"pass": true,
"detail": "sceneObjects=20"
},
{
"name": "无 G-code 语义生成",
"pass": true,
"detail": "semanticGuard=ok"
},
{
"name": "刀路预览点",
"pass": true,
"detail": "pathPoints=1498"
},
{
"name": "执行轨迹点",
"pass": true,
"detail": "executed=1"
},
{
"name": "scene units are meters",
"pass": true,
"detail": "sceneUnits=m"
},
{
"name": "linear scale visible",
"pass": true,
"detail": "scale=0.001"
},
{
"name": "path fit bounds",
"pass": true,
"detail": "fit=ok"
},
{
"name": "path bounds in meters",
"pass": true,
"detail": "bounds={\"center\":{\"x\":-0.001,\"y\":0,\"z\":0.019},\"size\":{\"x\":0.088,\"y\":0.089,\"z\":0.043},\"maxSpan\":0.089211}"
},
{
"name": "canvas nonblank",
"pass": true,
"detail": "nonBlack=0.8173"
}
]
},
{
"viewport": {
"name": "mobile",
"width": 390,
"height": 844,
"deviceScaleFactor": 2
},
"screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/meter-scene-evidence/08-meter-scene-mobile.png",
"pixelStats": {
"width": 1146,
"height": 1036,
"averageLuminance": 67.87,
"nonBlackRatio": 0.838
},
"dataset": {
"fiveAxisCanvas": "true",
"engine": "three.js r183",
"threeReady": "true",
"threeRevision": "183",
"threePathPoints": "1498",
"threeExecutedPathPoints": "1",
"threeSceneObjects": "20",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}",
"threeSceneUnits": "m",
"threeLinearUnits": "mm",
"threeLinearUnitScaleToMeters": "0.001",
"threeToolAxis": "{\"x\":0.558,\"y\":0.769,\"z\":0.312}",
"threeTcpPose": "{\"x\":36.474,\"y\":-22.486,\"z\":-13.749,\"a\":-71.841,\"c\":-35.93}",
"threeRtcpState": "on",
"threeSelectedView": "iso",
"threeFrameApi": "web-rtcp-5axis-motion-frame",
"threeRenderer": "webgl",
"threeSceneMode": "program-preview-and-tool-execution",
"threePreviewScope": "machine-reference-and-toolpath",
"threeMachineReferenceModel": "webgl-five-axis-reference",
"threeCameraControls": "orbit-pan-zoom",
"threeProgramPreviewSource": "linuxcnc-interpreter-wasm",
"threeToolExecutionMarker": "true",
"threeTcpMarker": "sphere",
"threeToolAxisMarker": "line",
"threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion",
"threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback",
"threePathFitBounds": "ok",
"threePathBoundsMeters": "{\"center\":{\"x\":-0.001,\"y\":0,\"z\":0.019},\"size\":{\"x\":0.088,\"y\":0.089,\"z\":0.043},\"maxSpan\":0.089211}",
"threeCurrentSegmentHighlight": "ok",
"threeRapidFeedVisualDistinction": "ok",
"threeNoGcodeSemanticsGeneration": "ok",
"threeRapidPathPoints": "186",
"threeFeedPathPoints": "1436",
"threeArcPathPoints": "0",
"threeCurrentSegmentPoints": "1",
"threeCurrentSegmentType": "STRAIGHT_TRAVERSE"
},
"status": "PASS",
"checks": [
{
"name": "canvas ready",
"pass": true,
"detail": "threeReady=true"
},
{
"name": "WebGL renderer",
"pass": true,
"detail": "renderer=webgl"
},
{
"name": "机床参考模型",
"pass": true,
"detail": "scope=machine-reference-and-toolpath, model=webgl-five-axis-reference"
},
{
"name": "TCP 球标记",
"pass": true,
"detail": "tcp=sphere, marker=true"
},
{
"name": "刀轴线",
"pass": true,
"detail": "toolAxisMarker=line"
},
{
"name": "场景对象数量",
"pass": true,
"detail": "sceneObjects=20"
},
{
"name": "无 G-code 语义生成",
"pass": true,
"detail": "semanticGuard=ok"
},
{
"name": "刀路预览点",
"pass": true,
"detail": "pathPoints=1498"
},
{
"name": "执行轨迹点",
"pass": true,
"detail": "executed=1"
},
{
"name": "scene units are meters",
"pass": true,
"detail": "sceneUnits=m"
},
{
"name": "linear scale visible",
"pass": true,
"detail": "scale=0.001"
},
{
"name": "path fit bounds",
"pass": true,
"detail": "fit=ok"
},
{
"name": "path bounds in meters",
"pass": true,
"detail": "bounds={\"center\":{\"x\":-0.001,\"y\":0,\"z\":0.019},\"size\":{\"x\":0.088,\"y\":0.089,\"z\":0.043},\"maxSpan\":0.089211}"
},
{
"name": "canvas nonblank",
"pass": true,
"detail": "nonBlack=0.838"
}
]
}
],
"consoleErrors": [
"Failed to load resource: the server responded with a status of 404 (Not Found)",
"Failed to load resource: the server responded with a status of 404 (Not Found)"
]
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,565 @@
{
"generatedAt": "2026-06-22T22:10:40.219Z",
"targetUrl": "http://127.0.0.1:45757/web-rtcp-5axis-sim-plan/app/index.html",
"caseName": "07-run-preconditions-and-feedback",
"summary": "浏览器 RUN 证据INI/profile/kinematics/task-HAL 同一上下文taskHalStatusLoop 持续推进UI 消费 task/HAL/motion feedback",
"status": "PASS",
"checks": [
{
"name": "INI ready",
"pass": true,
"detail": "iniReady=true,true,true,true,true"
},
{
"name": "selected LinuxCNC G-code",
"pass": true,
"detail": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc"
},
{
"name": "task/HAL session opened selected G-code",
"pass": true,
"detail": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc"
},
{
"name": "taskHalStatusLoop 新 RUN sequence",
"pass": true,
"detail": "baselineSequence=1, sequences=2,2,2,2,2"
},
{
"name": "taskHalStatusLoop 本次 RUN tickCount",
"pass": true,
"detail": "ticks=4,4,4,4,4"
},
{
"name": "programRuntimeFeedbackHistory 本次 RUN 采样",
"pass": true,
"detail": "history=5,5,5,5,5"
},
{
"name": "feedback sourceMode 来自 task/HAL",
"pass": true,
"detail": "sourceModes=linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm"
},
{
"name": "无 fixture-line-playback feedback",
"pass": true,
"detail": "sourceModes=linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm"
},
{
"name": "semantic boundary",
"pass": true,
"detail": "linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime"
},
{
"name": "activeLine 等于 UI 高亮行",
"pass": true,
"detail": "active=29/29,29/29,29/29,29/29,29/29"
},
{
"name": "DRO 等于 runtime feedback axisPose",
"pass": true,
"detail": "droMatchesFeedback=true for all samples"
},
{
"name": "RTCP canvas 与 state 一致",
"pass": true,
"detail": "off/off,off/off,off/off,off/off,off/off"
},
{
"name": "runtime cycle 可见",
"pass": true,
"detail": "33/330,33/330,33/330,33/330,33/330"
},
{
"name": "canvas 执行轨迹",
"pass": true,
"detail": "true/1/ok,true/1/ok,true/1/ok,true/1/ok,true/1/ok"
}
],
"baseline": {
"elapsedMs": 0,
"screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-0000ms-before-run.png",
"canvas": {
"threeReady": "true",
"rtcpState": "off",
"executedPathPoints": 1,
"currentSegmentHighlight": "ok",
"toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback"
},
"state": {
"profileId": "xyzac-trt",
"iniReady": true,
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"coordinates": "XYZAC",
"kinematicsModuleId": "xyzac-trt",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc",
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 1,
"profileId": "xyzac-trt",
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"kinematicsModuleId": "xyzac-trt",
"tickCount": 12,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": "2026-06-22T22:10:27.362Z",
"lastError": null,
"stopReason": "running",
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runState": "idle",
"activeLine": 1,
"activeRowLine": 1,
"activeLineMatchesUi": true,
"droAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"feedbackAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"droMatchesFeedback": true,
"rtcpState": "off",
"kinsType": "identity",
"feedback": {
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"line": 1,
"taskCycle": 3,
"servoCycle": 30,
"velocity": 0,
"distanceToGo": 0
},
"feedbackHistoryLength": 18,
"feedbackHistorySourceModes": [
"linuxcnc-task-motion-hal-wasm"
],
"taskHalStatus": {
"taskState": "on",
"taskMode": "auto",
"interpState": "idle",
"taskCycle": null,
"servoCycle": 30
}
}
},
"samples": [
{
"elapsedMs": 200,
"screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-200ms.png",
"canvas": {
"threeReady": "true",
"rtcpState": "off",
"executedPathPoints": 1,
"currentSegmentHighlight": "ok",
"toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback"
},
"state": {
"profileId": "xyzac-trt",
"iniReady": true,
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"coordinates": "XYZAC",
"kinematicsModuleId": "xyzac-trt",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc",
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 2,
"profileId": "xyzac-trt",
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"kinematicsModuleId": "xyzac-trt",
"tickCount": 4,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": "2026-06-22T22:10:35.152Z",
"lastError": null,
"stopReason": "complete",
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runState": "complete",
"activeLine": 29,
"activeRowLine": 29,
"activeLineMatchesUi": true,
"droAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"feedbackAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"droMatchesFeedback": true,
"rtcpState": "off",
"kinsType": "identity",
"feedback": {
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"line": 29,
"taskCycle": 33,
"servoCycle": 330,
"velocity": 3600,
"distanceToGo": 0
},
"feedbackHistoryLength": 5,
"feedbackHistorySourceModes": [
"linuxcnc-task-motion-hal-wasm"
],
"taskHalStatus": {
"taskState": "on",
"taskMode": "auto",
"interpState": "idle",
"taskCycle": null,
"servoCycle": 330
}
}
},
{
"elapsedMs": 500,
"screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-500ms.png",
"canvas": {
"threeReady": "true",
"rtcpState": "off",
"executedPathPoints": 1,
"currentSegmentHighlight": "ok",
"toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback"
},
"state": {
"profileId": "xyzac-trt",
"iniReady": true,
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"coordinates": "XYZAC",
"kinematicsModuleId": "xyzac-trt",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc",
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 2,
"profileId": "xyzac-trt",
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"kinematicsModuleId": "xyzac-trt",
"tickCount": 4,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": "2026-06-22T22:10:35.152Z",
"lastError": null,
"stopReason": "complete",
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runState": "complete",
"activeLine": 29,
"activeRowLine": 29,
"activeLineMatchesUi": true,
"droAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"feedbackAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"droMatchesFeedback": true,
"rtcpState": "off",
"kinsType": "identity",
"feedback": {
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"line": 29,
"taskCycle": 33,
"servoCycle": 330,
"velocity": 3600,
"distanceToGo": 0
},
"feedbackHistoryLength": 5,
"feedbackHistorySourceModes": [
"linuxcnc-task-motion-hal-wasm"
],
"taskHalStatus": {
"taskState": "on",
"taskMode": "auto",
"interpState": "idle",
"taskCycle": null,
"servoCycle": 330
}
}
},
{
"elapsedMs": 1000,
"screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-1000ms.png",
"canvas": {
"threeReady": "true",
"rtcpState": "off",
"executedPathPoints": 1,
"currentSegmentHighlight": "ok",
"toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback"
},
"state": {
"profileId": "xyzac-trt",
"iniReady": true,
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"coordinates": "XYZAC",
"kinematicsModuleId": "xyzac-trt",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc",
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 2,
"profileId": "xyzac-trt",
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"kinematicsModuleId": "xyzac-trt",
"tickCount": 4,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": "2026-06-22T22:10:35.152Z",
"lastError": null,
"stopReason": "complete",
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runState": "complete",
"activeLine": 29,
"activeRowLine": 29,
"activeLineMatchesUi": true,
"droAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"feedbackAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"droMatchesFeedback": true,
"rtcpState": "off",
"kinsType": "identity",
"feedback": {
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"line": 29,
"taskCycle": 33,
"servoCycle": 330,
"velocity": 3600,
"distanceToGo": 0
},
"feedbackHistoryLength": 5,
"feedbackHistorySourceModes": [
"linuxcnc-task-motion-hal-wasm"
],
"taskHalStatus": {
"taskState": "on",
"taskMode": "auto",
"interpState": "idle",
"taskCycle": null,
"servoCycle": 330
}
}
},
{
"elapsedMs": 2000,
"screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-2000ms.png",
"canvas": {
"threeReady": "true",
"rtcpState": "off",
"executedPathPoints": 1,
"currentSegmentHighlight": "ok",
"toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback"
},
"state": {
"profileId": "xyzac-trt",
"iniReady": true,
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"coordinates": "XYZAC",
"kinematicsModuleId": "xyzac-trt",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc",
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 2,
"profileId": "xyzac-trt",
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"kinematicsModuleId": "xyzac-trt",
"tickCount": 4,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": "2026-06-22T22:10:35.152Z",
"lastError": null,
"stopReason": "complete",
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runState": "complete",
"activeLine": 29,
"activeRowLine": 29,
"activeLineMatchesUi": true,
"droAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"feedbackAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"droMatchesFeedback": true,
"rtcpState": "off",
"kinsType": "identity",
"feedback": {
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"line": 29,
"taskCycle": 33,
"servoCycle": 330,
"velocity": 3600,
"distanceToGo": 0
},
"feedbackHistoryLength": 5,
"feedbackHistorySourceModes": [
"linuxcnc-task-motion-hal-wasm"
],
"taskHalStatus": {
"taskState": "on",
"taskMode": "auto",
"interpState": "idle",
"taskCycle": null,
"servoCycle": 330
}
}
},
{
"elapsedMs": 5000,
"screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-5000ms.png",
"canvas": {
"threeReady": "true",
"rtcpState": "off",
"executedPathPoints": 1,
"currentSegmentHighlight": "ok",
"toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback"
},
"state": {
"profileId": "xyzac-trt",
"iniReady": true,
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"coordinates": "XYZAC",
"kinematicsModuleId": "xyzac-trt",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc",
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 2,
"profileId": "xyzac-trt",
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"kinematicsModuleId": "xyzac-trt",
"tickCount": 4,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": "2026-06-22T22:10:35.152Z",
"lastError": null,
"stopReason": "complete",
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runState": "complete",
"activeLine": 29,
"activeRowLine": 29,
"activeLineMatchesUi": true,
"droAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"feedbackAxisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"droMatchesFeedback": true,
"rtcpState": "off",
"kinsType": "identity",
"feedback": {
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"line": 29,
"taskCycle": 33,
"servoCycle": 330,
"velocity": 3600,
"distanceToGo": 0
},
"feedbackHistoryLength": 5,
"feedbackHistorySourceModes": [
"linuxcnc-task-motion-hal-wasm"
],
"taskHalStatus": {
"taskState": "on",
"taskMode": "auto",
"interpState": "idle",
"taskCycle": null,
"servoCycle": 330
}
}
}
],
"consoleErrors": [
"Failed to load resource: the server responded with a status of 404 (Not Found)",
"Failed to load resource: the server responded with a status of 404 (Not Found)"
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"generatedAt": "2026-06-22T13:12:11.146Z",
"targetUrl": "http://127.0.0.1:43627/web-rtcp-5axis-sim-plan/app/index.html",
"generatedAt": "2026-06-22T22:09:28.057Z",
"targetUrl": "http://127.0.0.1:45757/web-rtcp-5axis-sim-plan/app/index.html",
"projectPath": "/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/index.html",
"chromePath": "/usr/bin/google-chrome",
"screenshots": {
@@ -9,6 +9,7 @@
"03-arc-demo-toolpath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/03-arc-demo-toolpath.png",
"04-clear-preview-reference": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/04-clear-preview-reference.png",
"05-vendored-impeller-toolpath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/05-vendored-impeller-toolpath.png",
"09-g20-g21-mixed-units-preview": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/09-g20-g21-mixed-units-preview.png",
"06-running-rtcp-toolpath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/06-running-rtcp-toolpath.png"
},
"cases": [
@@ -66,8 +67,8 @@
"pixelStats": {
"width": 803,
"height": 874,
"averageLuminance": 62.52,
"nonBlackRatio": 0.7491
"averageLuminance": 68.18,
"nonBlackRatio": 0.8681
},
"dataset": {
"fiveAxisCanvas": "true",
@@ -77,7 +78,10 @@
"threePathPoints": "2",
"threeExecutedPathPoints": "1",
"threeSceneObjects": "20",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0.35}",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}",
"threeSceneUnits": "m",
"threeLinearUnits": "mm",
"threeLinearUnitScaleToMeters": "0.001",
"threeToolAxis": "{\"x\":0,\"y\":0,\"z\":1}",
"threeTcpPose": "{\"x\":0,\"y\":0,\"z\":0,\"a\":0,\"c\":0}",
"threeRtcpState": "on",
@@ -95,6 +99,7 @@
"threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion",
"threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback",
"threePathFitBounds": "ok",
"threePathBoundsMeters": "{\"center\":{\"x\":0,\"y\":0,\"z\":0.002},\"size\":{\"x\":0,\"y\":0,\"z\":0.005},\"maxSpan\":0.005}",
"threeCurrentSegmentHighlight": "ok",
"threeRapidFeedVisualDistinction": "ok",
"threeNoGcodeSemanticsGeneration": "ok",
@@ -207,8 +212,8 @@
"pixelStats": {
"width": 803,
"height": 874,
"averageLuminance": 59.4,
"nonBlackRatio": 0.7092
"averageLuminance": 66.03,
"nonBlackRatio": 0.854
},
"dataset": {
"fiveAxisCanvas": "true",
@@ -218,7 +223,10 @@
"threePathPoints": "6",
"threeExecutedPathPoints": "1",
"threeSceneObjects": "20",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0.35}",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}",
"threeSceneUnits": "m",
"threeLinearUnits": "mm",
"threeLinearUnitScaleToMeters": "0.001",
"threeToolAxis": "{\"x\":0,\"y\":0,\"z\":1}",
"threeTcpPose": "{\"x\":0,\"y\":0,\"z\":0,\"a\":0,\"c\":0}",
"threeRtcpState": "on",
@@ -236,6 +244,7 @@
"threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion",
"threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback",
"threePathFitBounds": "ok",
"threePathBoundsMeters": "{\"center\":{\"x\":0.005,\"y\":0.005,\"z\":0.002},\"size\":{\"x\":0.01,\"y\":0.01,\"z\":0.005},\"maxSpan\":0.01}",
"threeCurrentSegmentHighlight": "ok",
"threeRapidFeedVisualDistinction": "ok",
"threeNoGcodeSemanticsGeneration": "ok",
@@ -346,8 +355,8 @@
"pixelStats": {
"width": 803,
"height": 874,
"averageLuminance": 65.26,
"nonBlackRatio": 0.7885
"averageLuminance": 67.56,
"nonBlackRatio": 0.8687
},
"dataset": {
"fiveAxisCanvas": "true",
@@ -357,7 +366,10 @@
"threePathPoints": "2",
"threeExecutedPathPoints": "1",
"threeSceneObjects": "20",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0.35}",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}",
"threeSceneUnits": "m",
"threeLinearUnits": "mm",
"threeLinearUnitScaleToMeters": "0.001",
"threeToolAxis": "{\"x\":0,\"y\":0,\"z\":1}",
"threeTcpPose": "{\"x\":1,\"y\":0,\"z\":0,\"a\":0,\"c\":0}",
"threeRtcpState": "on",
@@ -375,6 +387,7 @@
"threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion",
"threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback",
"threePathFitBounds": "ok",
"threePathBoundsMeters": "{\"center\":{\"x\":0.001,\"y\":0.001,\"z\":0},\"size\":{\"x\":0.001,\"y\":0.001,\"z\":0},\"maxSpan\":0.001}",
"threeCurrentSegmentHighlight": "ok",
"threeRapidFeedVisualDistinction": "ok",
"threeNoGcodeSemanticsGeneration": "ok",
@@ -487,8 +500,8 @@
"pixelStats": {
"width": 803,
"height": 874,
"averageLuminance": 64.72,
"nonBlackRatio": 0.7874
"averageLuminance": 67.78,
"nonBlackRatio": 0.8701
},
"dataset": {
"fiveAxisCanvas": "true",
@@ -498,7 +511,10 @@
"threePathPoints": "0",
"threeExecutedPathPoints": "0",
"threeSceneObjects": "20",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0.35}",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}",
"threeSceneUnits": "m",
"threeLinearUnits": "mm",
"threeLinearUnitScaleToMeters": "0.001",
"threeToolAxis": "{\"x\":0,\"y\":0,\"z\":1}",
"threeTcpPose": "{\"x\":1,\"y\":0,\"z\":0,\"a\":0,\"c\":0}",
"threeRtcpState": "on",
@@ -516,6 +532,7 @@
"threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion",
"threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback",
"threePathFitBounds": "ok",
"threePathBoundsMeters": "null",
"threeCurrentSegmentHighlight": "pending",
"threeRapidFeedVisualDistinction": "pending",
"threeNoGcodeSemanticsGeneration": "ok",
@@ -643,8 +660,8 @@
"pixelStats": {
"width": 803,
"height": 874,
"averageLuminance": 35.56,
"nonBlackRatio": 0.4577
"averageLuminance": 65.18,
"nonBlackRatio": 0.8173
},
"dataset": {
"fiveAxisCanvas": "true",
@@ -654,7 +671,10 @@
"threePathPoints": "1498",
"threeExecutedPathPoints": "1",
"threeSceneObjects": "20",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0.35}",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}",
"threeSceneUnits": "m",
"threeLinearUnits": "mm",
"threeLinearUnitScaleToMeters": "0.001",
"threeToolAxis": "{\"x\":0.558,\"y\":0.769,\"z\":0.312}",
"threeTcpPose": "{\"x\":36.474,\"y\":-22.486,\"z\":-13.749,\"a\":-71.841,\"c\":-35.93}",
"threeRtcpState": "on",
@@ -672,6 +692,7 @@
"threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion",
"threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback",
"threePathFitBounds": "ok",
"threePathBoundsMeters": "{\"center\":{\"x\":-0.001,\"y\":0,\"z\":0.019},\"size\":{\"x\":0.088,\"y\":0.089,\"z\":0.043},\"maxSpan\":0.089211}",
"threeCurrentSegmentHighlight": "ok",
"threeRapidFeedVisualDistinction": "ok",
"threeNoGcodeSemanticsGeneration": "ok",
@@ -726,6 +747,176 @@
"programRuntimeFeedbackSource": "linuxcnc-tp-runtime-sample"
}
},
{
"name": "08-meter-scene-desktop-mobile",
"summary": "浏览器米尺度 Three.js 证据desktop/mobile canvas 非空、路径 bounds 为米、预览稳定居中",
"status": "PASS",
"screenshotDir": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/meter-scene-evidence",
"output": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/meter-scene-evidence.json",
"sampleCount": 2
},
{
"name": "09-g20-g21-mixed-units-preview",
"summary": "G20/G21 混合单位程序:验证 canonical motion 保留 inch/mmThree.js 统一按米绘制",
"status": "PASS",
"checks": [
{
"name": "canvas ready",
"pass": true,
"detail": "threeReady=true"
},
{
"name": "WebGL renderer",
"pass": true,
"detail": "renderer=webgl"
},
{
"name": "机床参考模型",
"pass": true,
"detail": "scope=machine-reference-and-toolpath, model=webgl-five-axis-reference"
},
{
"name": "TCP 球标记",
"pass": true,
"detail": "tcp=sphere, marker=true"
},
{
"name": "刀轴线",
"pass": true,
"detail": "toolAxisMarker=line"
},
{
"name": "场景对象数量",
"pass": true,
"detail": "sceneObjects=20"
},
{
"name": "无 G-code 语义生成",
"pass": true,
"detail": "semanticGuard=ok"
},
{
"name": "刀路预览点",
"pass": true,
"detail": "pathPoints=2"
},
{
"name": "执行轨迹点",
"pass": true,
"detail": "executed=1"
},
{
"name": "G20/G21 motion units",
"pass": true,
"detail": "units=inch,mm"
},
{
"name": "scene units are meters",
"pass": true,
"detail": "sceneUnits=m"
},
{
"name": "mixed unit path visible",
"pass": true,
"detail": "pathPoints=2"
},
{
"name": "1 inch equals 25.4 mm in scene",
"pass": true,
"detail": "xMeters=0.0254,0.0254"
},
{
"name": "no unit fallback in canonical motion",
"pass": true,
"detail": "source=linuxcnc-interpreter-wasm"
}
],
"pixelStats": {
"width": 803,
"height": 874,
"averageLuminance": 64.71,
"nonBlackRatio": 0.849
},
"dataset": {
"fiveAxisCanvas": "true",
"engine": "three.js r183",
"threeReady": "true",
"threeRevision": "183",
"threePathPoints": "2",
"threeExecutedPathPoints": "1",
"threeSceneObjects": "20",
"threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}",
"threeSceneUnits": "m",
"threeLinearUnits": "mm",
"threeLinearUnitScaleToMeters": "0.001",
"threeToolAxis": "{\"x\":0,\"y\":0,\"z\":1}",
"threeTcpPose": "{\"x\":43,\"y\":-32.15,\"z\":-11.306,\"a\":0,\"c\":0}",
"threeRtcpState": "on",
"threeSelectedView": "iso",
"threeFrameApi": "web-rtcp-5axis-motion-frame",
"threeRenderer": "webgl",
"threeSceneMode": "program-preview-and-tool-execution",
"threePreviewScope": "machine-reference-and-toolpath",
"threeMachineReferenceModel": "webgl-five-axis-reference",
"threeCameraControls": "orbit-pan-zoom",
"threeProgramPreviewSource": "linuxcnc-interpreter-wasm",
"threeToolExecutionMarker": "true",
"threeTcpMarker": "sphere",
"threeToolAxisMarker": "line",
"threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion",
"threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback",
"threePathFitBounds": "ok",
"threePathBoundsMeters": "{\"center\":{\"x\":0.013,\"y\":0.013,\"z\":0},\"size\":{\"x\":0.025,\"y\":0.025,\"z\":0},\"maxSpan\":0.0254}",
"threeCurrentSegmentHighlight": "ok",
"threeRapidFeedVisualDistinction": "ok",
"threeNoGcodeSemanticsGeneration": "ok",
"threeRapidPathPoints": "0",
"threeFeedPathPoints": "2",
"threeArcPathPoints": "0",
"threeCurrentSegmentPoints": "1",
"threeCurrentSegmentType": "STRAIGHT_FEED"
},
"state": {
"activeProgram": "operator-g20-g21-mixed-units.ngc",
"activeLine": 2,
"programSource": "operator-file",
"programExecutionSourceMode": "linuxcnc-interpreter-wasm",
"programExecutionSummary": {
"ready": true,
"programLineCount": 5,
"canonicalEventCount": 22,
"motionEventCount": 2,
"motionTypes": [
"STRAIGHT_FEED"
],
"finalAxes": {
"x": 25.4,
"y": 25.4,
"z": 0,
"a": 0,
"b": 0,
"c": 0,
"u": 0,
"v": 0,
"w": 0
},
"switchkinsEventCount": 0,
"switchkinsCodes": [],
"switchkinsRemapBoundary": null,
"remapRuntimeReady": false,
"plannerRuntimeReady": true,
"plannerSemanticBoundary": "linuxcnc_tp_queue_runtime_timing_from_canonical_motion",
"machineFileExecutionReady": false,
"fullLinuxCncProgramExecutionReady": false
},
"runState": "idle",
"rtcpState": "on",
"kinsType": "tcp-xyzac",
"programExecutionMotionIndex": 0,
"programExecutionSampleIndex": 0,
"programRuntimeFeedbackSource": "linuxcnc-tp-runtime-sample"
}
},
{
"name": "06-running-rtcp-toolpath",
"summary": "G-code 运行态:验证 task/HAL runtime feedback 驱动执行轨迹、当前段高亮、TCP 球和刀轴线跟随",
@@ -790,8 +981,8 @@
"pixelStats": {
"width": 803,
"height": 874,
"averageLuminance": 36.05,
"nonBlackRatio": 0.4607
"averageLuminance": 65.86,
"nonBlackRatio": 0.8173
},
"dataset": {
"fiveAxisCanvas": "true",
@@ -801,9 +992,12 @@
"threePathPoints": "1498",
"threeExecutedPathPoints": "1",
"threeSceneObjects": "20",
"threeToolhead": "{\"x\":0.26,\"y\":-0.458,\"z\":1.485}",
"threeToolAxis": "{\"x\":0.558,\"y\":0.769,\"z\":0.312}",
"threeTcpPose": "{\"x\":7.417,\"y\":-13.098,\"z\":28.366,\"a\":-71.841,\"c\":-35.93}",
"threeToolhead": "{\"x\":-0.023,\"y\":-0.033,\"z\":0.001}",
"threeSceneUnits": "m",
"threeLinearUnits": "mm",
"threeLinearUnitScaleToMeters": "0.001",
"threeToolAxis": "{\"x\":0.621,\"y\":0.503,\"z\":0.601}",
"threeTcpPose": "{\"x\":-75.066,\"y\":-75.473,\"z\":-49.344,\"a\":-53.043,\"c\":-50.969}",
"threeRtcpState": "on",
"threeSelectedView": "iso",
"threeFrameApi": "web-rtcp-5axis-motion-frame",
@@ -819,6 +1013,7 @@
"threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion",
"threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback",
"threePathFitBounds": "ok",
"threePathBoundsMeters": "{\"center\":{\"x\":-0.001,\"y\":0,\"z\":0.019},\"size\":{\"x\":0.088,\"y\":0.089,\"z\":0.043},\"maxSpan\":0.089211}",
"threeCurrentSegmentHighlight": "ok",
"threeRapidFeedVisualDistinction": "ok",
"threeNoGcodeSemanticsGeneration": "ok",
@@ -830,7 +1025,7 @@
},
"state": {
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"activeLine": 5,
"activeLine": 65,
"programSource": "linuxcnc-vendored-5axis-gcode",
"programExecutionSourceMode": "linuxcnc-interpreter-wasm",
"programExecutionSummary": {
@@ -872,6 +1067,86 @@
"programExecutionSampleIndex": 0,
"programRuntimeFeedbackSource": "linuxcnc-task-motion-hal-wasm"
}
},
{
"name": "07-run-preconditions-and-feedback",
"summary": "浏览器 RUN 证据INI/profile/kinematics/task-HAL 同一上下文taskHalStatusLoop 持续推进UI 消费 task/HAL/motion feedback",
"status": "PASS",
"checks": [
{
"name": "INI ready",
"pass": true,
"detail": "iniReady=true,true,true,true,true"
},
{
"name": "selected LinuxCNC G-code",
"pass": true,
"detail": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc"
},
{
"name": "task/HAL session opened selected G-code",
"pass": true,
"detail": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc"
},
{
"name": "taskHalStatusLoop 新 RUN sequence",
"pass": true,
"detail": "baselineSequence=1, sequences=2,2,2,2,2"
},
{
"name": "taskHalStatusLoop 本次 RUN tickCount",
"pass": true,
"detail": "ticks=4,4,4,4,4"
},
{
"name": "programRuntimeFeedbackHistory 本次 RUN 采样",
"pass": true,
"detail": "history=5,5,5,5,5"
},
{
"name": "feedback sourceMode 来自 task/HAL",
"pass": true,
"detail": "sourceModes=linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm"
},
{
"name": "无 fixture-line-playback feedback",
"pass": true,
"detail": "sourceModes=linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm"
},
{
"name": "semantic boundary",
"pass": true,
"detail": "linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime"
},
{
"name": "activeLine 等于 UI 高亮行",
"pass": true,
"detail": "active=29/29,29/29,29/29,29/29,29/29"
},
{
"name": "DRO 等于 runtime feedback axisPose",
"pass": true,
"detail": "droMatchesFeedback=true for all samples"
},
{
"name": "RTCP canvas 与 state 一致",
"pass": true,
"detail": "off/off,off/off,off/off,off/off,off/off"
},
{
"name": "runtime cycle 可见",
"pass": true,
"detail": "33/330,33/330,33/330,33/330,33/330"
},
{
"name": "canvas 执行轨迹",
"pass": true,
"detail": "true/1/ok,true/1/ok,true/1/ok,true/1/ok,true/1/ok"
}
],
"screenshotDir": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback",
"output": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/run-preconditions-feedback.json",
"sampleCount": 5
}
],
"consoleErrors": [