完善虚拟HAL仿真替代能力

This commit is contained in:
2026-06-17 19:45:51 +08:00
parent 656cddf73a
commit a4d449ad48
17 changed files with 5005 additions and 302 deletions

View File

@@ -4,7 +4,9 @@ import { dirname, resolve } from "node:path";
import assert from "node:assert/strict";
import {
applyVirtualHalAction,
createLinuxCncInterpSdk,
createVirtualHalState,
planIniFileContextStaging,
} from "../../../runtime/sdk/src/index.js";
import {
@@ -726,6 +728,46 @@ verifyExpectedOutput(
].join("\n"),
);
if (
interp.hasWasmFunction("lcinterp_hal_reset") &&
interp.hasWasmFunction("lcinterp_hal_set_value") &&
interp.hasWasmFunction("lcinterp_probe_hal_named")
) {
let virtualHal = createVirtualHalState();
virtualHal = applyVirtualHalAction(virtualHal, "estop");
virtualHal = applyVirtualHalAction(virtualHal, "power");
virtualHal = applyVirtualHalAction(virtualHal, "jog", { axis: "x", increment: "0.01 in", direction: 1 });
virtualHal = applyVirtualHalAction(virtualHal, "spindle", { command: "cw", speed: 1200 });
virtualHal = applyVirtualHalAction(virtualHal, "coolant", { name: "flood", enabled: true });
const applyResult = interp.applyVirtualHalState(virtualHal);
assert.equal(applyResult.apiName, "linuxcnc-wasm-hal-apply-result");
assert.equal(applyResult.source, "browser-virtual-hal");
assert.ok(applyResult.applied > 0, "virtual HAL bridge should apply values");
verifyExpectedOutput(
"probe_virtual_hal_bridge",
[
interp.probeHalNamed("_hal[jog.x]"),
interp.probeHalNamed("_hal[jog.increment]"),
interp.probeHalNamed("_hal[axisui.jog.x]"),
interp.probeHalNamed("_hal[axisui.jog.increment]"),
interp.probeHalNamed("_hal[axis.x.pos-cmd]"),
interp.probeHalNamed("_hal[halui.machine.is-on]"),
interp.probeHalNamed("_hal[spindle.0.speed-out]"),
interp.probeHalNamed("_hal[iocontrol.0.coolant-flood]"),
].join(""),
[
"_hal[jog.x]: rc=0 found=1 value=1",
"_hal[jog.increment]: rc=0 found=1 value=0.01",
"_hal[axisui.jog.x]: rc=0 found=1 value=1",
"_hal[axisui.jog.increment]: rc=0 found=1 value=0.01",
"_hal[axis.x.pos-cmd]: rc=0 found=1 value=0.01",
"_hal[halui.machine.is-on]: rc=0 found=1 value=1",
"_hal[spindle.0.speed-out]: rc=0 found=1 value=1200",
"_hal[iocontrol.0.coolant-flood]: rc=0 found=1 value=1",
].join("\n"),
);
}
for (const fixtureName of INTERP_MDI_FIXTURES) {
const programText = readFileSync(
resolve(rootDir, `tests/fixtures/gcode/${fixtureName}.ngc`),