Align AXIS control flow and fix pause and program rendering

Document source UI gates, explicit native live-plot clearing, and remaining parity boundaries. Fix pause/resume transport continuity, repeated stepping, coordinate previews, and spindle override state. Optimize large program snapshots and rendering, and cover the control flows with native Tcl, WASM, and browser checks.

Validation: 22 native tests and source/browser checks pass. Worker/App regression: 113 of 123 pass; 10 pre-existing failures remain documented with no new failures.
This commit is contained in:
2026-09-08 10:46:27 +08:00
parent 845075f4a3
commit bade560372
55 changed files with 2495 additions and 286 deletions

View File

@@ -35,11 +35,38 @@ for (let sample = 0; sample < 5; sample += 1) jogSample = send("SIM_STEP", { cyc
assert.ok(Number(jogSample.payload.wasm_motion?.state?.position?.x ?? 0) > 0);
assert.equal(send("JOG_STOP", {}).payload.status, "verified");
const beforeTouch = session.wasmMotion.read().state.position;
const epochBefore = send("SNAPSHOT_REQUEST").payload.panel_snapshot.visual.live_path_epoch;
const systemTouch = send("TOUCH_OFF", { axis: "X", value: 12, system: "P1 G54", units: "mm" });
assert.equal(systemTouch.kind, "COMMAND_RESULT");
assert.equal(systemTouch.payload.touch_off.source_block, "G10 L20 P1 X12");
assert.equal(systemTouch.payload.touch_off.block, "G10 L20 P1 X12");
assert.equal(systemTouch.payload.task.mode, "MANUAL");
let panel = send("SNAPSHOT_REQUEST").payload.panel_snapshot;
assert.deepEqual(session.wasmMotion.read().state.position, beforeTouch);
assert.ok(Math.abs(panel.coordinates.relative[0] - 12) < 1e-9);
assert.ok(Math.abs(panel.visual.toolpath[0].end.x - (beforeTouch.x - 12 + 10)) < 1e-9);
assert.equal(panel.visual.live_path_epoch, epochBefore);
for (const axis of ["A", "C"]) {
const angular = send("TOUCH_OFF", { axis, value: 15, system: "P1 G54", units: "inch" });
assert.equal(angular.kind, "COMMAND_RESULT", JSON.stringify(angular.payload));
assert.equal(angular.payload.block, `G10 L20 P1 ${axis}15`);
panel = send("SNAPSHOT_REQUEST").payload.panel_snapshot;
assert.equal(panel.coordinates.relative[axis === "A" ? 3 : 4], 15);
}
const savedOffsets = panel.program.coordinate_context;
assert.equal(send("PROGRAM_LOAD", { source: "G21 G90\nG0 X13 A15 C15\nM2\n", path: "touch-reload.ngc" }).kind, "COMMAND_RESULT");
panel = send("SNAPSHOT_REQUEST").payload.panel_snapshot;
assert.deepEqual(panel.program.coordinate_context, savedOffsets);
assert.ok(Math.abs(panel.visual.toolpath[0].end.x - beforeTouch.x - 1) < 1e-9);
assert.equal(send("TOUCH_OFF", { axis: "X", value: 0, system: "G54.1" }).payload.code, "touch_off_system_invalid");
assert.equal(send("TOUCH_OFF", { axis: "X", value: 20, system: "G59.3" }).kind, "COMMAND_RESULT");
assert.equal(send("MDI_EXECUTE", { block: "G59.3" }).kind, "COMMAND_RESULT");
panel = send("SNAPSHOT_REQUEST").payload.panel_snapshot;
assert.equal(panel.coordinates.system, 9);
assert.ok(Math.abs(panel.coordinates.relative[0] - 20) < 1e-9);
assert.equal(send("MDI_EXECUTE", { block: "G54" }).kind, "COMMAND_RESULT");
assert.equal(send("SET_MODE", { mode: "MANUAL" }).kind, "COMMAND_RESULT");
assert.equal(send("TOOL_PREPARE", { tool: 1, pocket: 1 }).payload.status, "verified");
assert.equal(send("TOOL_PREPARED", { prepared: true }).payload.status, "verified");