Wire AXIS controls through operation gates

This commit is contained in:
2026-08-23 09:30:44 +08:00
parent a1edd8defe
commit a7fcec9d33
11 changed files with 367 additions and 17 deletions

View File

@@ -0,0 +1,137 @@
{
"boundaries": [
"no protocol/schema/ABI mutation",
"browser controls do not imply physical safety authority",
"host processes and real hardware remain excluded"
],
"checks": {
"estop_power_recover": {
"commands": [
"ESTOP",
"IO_RECOVER"
],
"status": "verified"
},
"gate_before_send": {
"blocked_gate_does_not_send": true,
"status": "verified"
},
"keyboard_map": {
"input_controls_protected": true,
"keys": 10,
"status": "verified"
},
"mdi_jog_home": {
"commands": [
"MDI_EXECUTE",
"JOG_START",
"JOG_STOP",
"HOME"
],
"status": "verified"
},
"operation_trace": {
"monotonic_ids": true,
"pending_result_error_blocked": true,
"status": "verified"
},
"program_controls": {
"commands": [
"PROGRAM_RUN",
"PROGRAM_STEP",
"PROGRAM_PAUSE",
"PROGRAM_RESUME",
"PROGRAM_ABORT",
"PROGRAM_RESTART"
],
"status": "verified"
},
"spindle_coolant_override": {
"commands": [
"SPINDLE_COMMAND",
"COOLANT_COMMAND",
"SET_OVERRIDE"
],
"status": "verified"
},
"worker_authority": {
"state_source": "Worker protocol envelopes",
"status": "verified"
}
},
"context_id": "linuxcnc-2.10.0-pre0-wasm-m1-py-c1",
"implementation": {
"app_path": "web/react/src/App.tsx",
"app_sha256": "63cf25079ae07f638028c9d086ab60ab3f4f66abb2219ab40b32affead6da67c",
"controller_path": "web/app/axis-operation-controller.mjs",
"controller_sha256": "077e344c5ea1b76fa11613b1e50b6e292d1b766f907c818f7ce42d6afe4f62bb",
"keyboard": [
"F1",
"F2",
"F3",
"F5",
"R",
"T",
"P",
"S",
"Escape",
"Ctrl-K"
],
"operation_id_policy": "axis-<command>-<six-digit-monotonic-counter>",
"test_path": "web/app/test_axis_operation_controller.mjs",
"test_sha256": "dcc4f161305718b2da11e7552813452ec23cb26e7b9c087f6eff49d928642fb1",
"trace_phases": [
"pending",
"result",
"error",
"blocked"
]
},
"implementation_status": "worker_backed_operation_controller",
"report_sha256": "cc12b349cc3fc3e7d1882530f123ca92e4a510f3f40fec4c72bcfd4e876f0a3e",
"schema": "axis-control-report.v1",
"source_anchors": [
{
"lines": "105-264",
"path": "linuxcnc/share/axis/tcl/axis.tcl",
"role": "machine menu"
},
{
"lines": "484-787",
"path": "linuxcnc/share/axis/tcl/axis.tcl",
"role": "toolbar actions"
},
{
"lines": "2214-2409",
"path": "linuxcnc/src/emc/usr_intf/axis/scripts/axis.py",
"role": "estop/program controls"
},
{
"lines": "2701-2915",
"path": "linuxcnc/src/emc/usr_intf/axis/scripts/axis.py",
"role": "home/touch-off/spindle/coolant"
},
{
"lines": "3213-3305",
"path": "linuxcnc/src/emc/usr_intf/axis/scripts/axis.py",
"role": "jog press/release"
}
],
"status": "verified",
"task_id": "AXIS-CTRL-01..08",
"trace_sample": [
{
"operation_id": "axis-program-run-000001",
"phase": "pending"
},
{
"operation_id": "axis-program-run-000001",
"phase": "result"
},
{
"operation_id": "axis-jog-start-000002",
"phase": "blocked",
"reason": "axis_estop_active"
}
]
}

View File

@@ -110,7 +110,7 @@
"--disable-dev-shm-usage",
"--virtual-time-budget=4000",
"--window-size=1440,900",
"--screenshot=/tmp/linuxcnc-gui-visual-zl2df3cr/desktop.png",
"--screenshot=/tmp/linuxcnc-gui-visual-6xldxrkr/desktop.png",
"--dump-dom",
"http://127.0.0.1:5174/"
],
@@ -122,7 +122,7 @@
"toolbar_icon_count": 20,
"toolbar_icon_scope": "axis-toolbar"
},
"dom_sha256": "f3d7ae56d369c8cd1abd148a4a3426ec28a573c1bb6e5a3a710135f2eab71ecb",
"dom_sha256": "c69a2d39f9fe8075182b84f12cd7c7aacf1855e6941e711abeae9290790d8b32",
"markers": {
"Active G-Codes:": true,
"Coolant": true,
@@ -147,11 +147,11 @@
"returncode": 0,
"screenshot": {
"bytes": 132137,
"path": "/tmp/linuxcnc-gui-visual-zl2df3cr/desktop.png",
"path": "/tmp/linuxcnc-gui-visual-6xldxrkr/desktop.png",
"sha256": "71aa049b571d48cb65d3b0498a75cafd8ec8f1ea57bf672c4445118ac1e07ba0"
},
"status": "verified",
"stderr_sha256": "9f7a2939df896e46f2e125787c2391491c5dd65ed3c3f73c9858e90b6d221b08",
"stderr_sha256": "02bd9ef9fbe8a9911162664b94b9f14d5a1f3c9bcda5d647fc7a756fbf353ec0",
"window": "1440,900"
},
"mobile": {
@@ -180,7 +180,7 @@
"--disable-dev-shm-usage",
"--virtual-time-budget=4000",
"--window-size=390,844",
"--screenshot=/tmp/linuxcnc-gui-visual-zl2df3cr/mobile.png",
"--screenshot=/tmp/linuxcnc-gui-visual-6xldxrkr/mobile.png",
"--dump-dom",
"http://127.0.0.1:5174/"
],
@@ -192,7 +192,7 @@
"toolbar_icon_count": 20,
"toolbar_icon_scope": "axis-toolbar"
},
"dom_sha256": "021570b310cfedc40059d0fe0871f280ebe860256cef00ee3b805255776ccf8f",
"dom_sha256": "13c69c83844597d4b683a2a8a23a4fcae34888fd36998e15001e286fe18d3336",
"markers": {
"Active G-Codes:": true,
"Coolant": true,
@@ -217,16 +217,16 @@
"returncode": 0,
"screenshot": {
"bytes": 48695,
"path": "/tmp/linuxcnc-gui-visual-zl2df3cr/mobile.png",
"path": "/tmp/linuxcnc-gui-visual-6xldxrkr/mobile.png",
"sha256": "ee50a536c339fb466f17da2284987b7aec1a358f903475863639d38a3534bb0f"
},
"status": "verified",
"stderr_sha256": "b4f1612a8e30830aff17d7fe8d03967f1b0e0f147ac357b3d0cc800fdf0897a1",
"stderr_sha256": "c0ea7a906e8acfe0e78cc3a86ea41a1dbdf2d7339ee75c99186b64ec405f3afc",
"window": "390,844"
}
},
"release_action": "STOP_RELEASE",
"report_sha256": "0df7a7c9c663292bbf1f764946032fb4ba1b882b23532863569470c723401ae1",
"report_sha256": "c849e565123c99f1c17868807ae3e243f6fd7e8334ab75af5e10e4e8d9dd89aa",
"route": "http://127.0.0.1:5174/",
"schema": "gui-browser-visual-fe-m4-report.v1",
"status": "verified",