虚拟HAL完全满足Web数控仿真

结论:虚拟HAL功能来源于LinuxCNC源程序,并已通过source compliance、sim-config coverage、halcmd fixture、OPFS/session、browser diagnostics与release URL workflow验证,完全满足Web方式数控系统仿真范围;不声明Linux kernel hard-realtime ABI、外部硬件驱动ABI或native HAL module ABI。
This commit is contained in:
2026-06-17 22:03:26 +08:00
parent a4d449ad48
commit 3a6972437f
21 changed files with 2017 additions and 240 deletions

View File

@@ -18,11 +18,17 @@
} from "../../runtime/opfs/path-model.js";
import {
createMachineSessionSnapshotPayload,
createVirtualHalSessionPayload,
loadMachineSessionSnapshot,
loadSessionSnapshot,
restoreVirtualHalStateFromSessionSnapshot,
saveMachineSessionSnapshot,
saveSessionSnapshot,
} from "../../runtime/opfs/snapshot-store.js";
import {
createVirtualHalState,
executeVirtualHalCommand,
} from "../../runtime/sdk/src/linuxcnc-hal.js";
import {
gcodeFilenameFromProgramPath,
loadGcodeProgram,
@@ -166,6 +172,38 @@ TOOL_TABLE = browser-tool.tbl
assertEqual(loadedSnapshot.payload.files.ini, opfsPath, "snapshot payload");
assertEqual(loadedSnapshot.payload.files.gcode, snapshotPayload.files.gcode, "snapshot G-code payload");
assertEqual(loadedSnapshot.metadata.source, "browser-smoke", "snapshot metadata");
const virtualHalState = executeVirtualHalCommand(
createVirtualHalState(),
"newsig x-pos HAL_FLOAT\nsetp axis.x.pos-cmd 4.5\nsets x-pos 3.25\nnet x-pos axis.x.pos-cmd joint.0.pos-fb\nloadrt trivkins\nloadusr halui\naddf motion-controller servo-thread\nstart servo-thread",
).state;
const virtualHalSnapshotPayload = createMachineSessionSnapshotPayload("browser-smoke", {
gcodeFilename: "browser-smoke.ngc",
virtualHal: createVirtualHalSessionPayload(virtualHalState),
});
assertEqual(
virtualHalSnapshotPayload.virtualHal.state.hal.signals["x-pos"].value,
3.25,
"browser virtual HAL signal snapshot",
);
const savedVirtualHalSnapshot = await saveSessionSnapshot(
"browser-virtual-hal-session",
virtualHalSnapshotPayload,
{
createdAt: "2026-06-08T00:00:00.000Z",
metadata: { source: "browser-virtual-hal-smoke" },
},
);
const restoredVirtualHalState = restoreVirtualHalStateFromSessionSnapshot(savedVirtualHalSnapshot);
assertEqual(
restoredVirtualHalState.hal.nets["x-pos"].includes("joint.0.pos-fb"),
true,
"browser virtual HAL restored net",
);
assertEqual(
restoredVirtualHalState.hal.loadedComponents.some(({ component }) => component === "halui"),
true,
"browser virtual HAL restored loadusr",
);
const customMachineSnapshotPayload = createMachineSessionSnapshotPayload("browser-smoke", {
parameterFilename: "browser-linuxcnc.var",
toolTableFilename: "browser-tool.tbl",