接入虚拟HAL会话保存恢复

结论:real simulation page 已提供显式 Save/Restore HAL Session 按钮与 browser API,使用 OPFS session snapshot 保存和恢复 virtual HAL runtime state,并随 payload 校验 source compliance、sim-config coverage、halcmd fixtures 与 motion controller matrix,证明虚拟HAL可恢复地满足Web方式数控系统仿真范围。
This commit is contained in:
2026-06-17 22:32:23 +08:00
parent 402fd41d4d
commit 0a33f0f7c1
7 changed files with 263 additions and 1 deletions

View File

@@ -252,6 +252,9 @@
if (!api?.getMachineSessionLoadState || !api?.loadReadyMachineSession) {
throw new Error("simulation API missing AXIS machine/session load controls");
}
if (!api?.getVirtualHalSessionState || !api?.saveVirtualHalSessionSnapshot || !api?.restoreVirtualHalSessionSnapshot) {
throw new Error("simulation API missing virtual HAL session persistence controls");
}
if (!api?.getRunMode || !api?.getRunControlState || !api?.setUseLoadedSession || !api?.getRunSummary) {
throw new Error("simulation API missing AXIS run-mode controls");
}
@@ -317,7 +320,14 @@
if (!doc.querySelector("[data-opfs-program-filename]") || !doc.querySelector("[data-save-program-opfs]") || !doc.querySelector("[data-load-program-opfs]")) {
throw new Error("simulation page missing OPFS program persistence controls");
}
if (!doc.querySelector('[data-axis-shell="machine-session"]') || !doc.querySelector("[data-check-machine-session]") || !doc.querySelector("[data-load-machine-session]") || !doc.querySelector("[data-use-loaded-session]")) {
if (
!doc.querySelector('[data-axis-shell="machine-session"]') ||
!doc.querySelector("[data-check-machine-session]") ||
!doc.querySelector("[data-load-machine-session]") ||
!doc.querySelector("[data-save-virtual-hal-session]") ||
!doc.querySelector("[data-restore-virtual-hal-session]") ||
!doc.querySelector("[data-use-loaded-session]")
) {
throw new Error("simulation page missing machine/session readiness controls");
}
if (!doc.querySelector("[data-axis-machine-control-state]")?.textContent.includes("browser virtual HAL active")) {
@@ -726,6 +736,41 @@
) {
throw new Error(`AXIS-style virtual halcmd did not execute: ${JSON.stringify(virtualHalcmdResult)}`);
}
const savedVirtualHalSession = await api.saveVirtualHalSessionSnapshot({
sessionId: "axis-browser-virtual-hal-session",
machineId: "axis-browser-virtual-hal",
filename: "virtual-hal-session.json",
gcodeFilename: "axis-opfs-roundtrip.ngc",
});
if (
savedVirtualHalSession.phase !== "saved" ||
savedVirtualHalSession.revision < virtualHalcmdResult.state.revision ||
!savedVirtualHalSession.snapshot?.payload?.virtualHal?.sourceCompliance?.complete ||
!savedVirtualHalSession.snapshot?.payload?.virtualHal?.motionControllerMatrix?.complete ||
doc.body.dataset.virtualHalSessionPhase !== "saved" ||
!doc.querySelector("[data-virtual-hal-session-status]")?.textContent.includes("Saved HAL session")
) {
throw new Error(`AXIS-style virtual HAL session save failed: ${JSON.stringify(savedVirtualHalSession)}`);
}
api.executeVirtualHalcmd("setp axis.x.pos-cmd 9.5\nloadusr post-save-component");
if (api.readVirtualHalPin("axis.x.pos-cmd")?.value !== 9.5) {
throw new Error("AXIS-style virtual HAL pre-restore mutation did not apply");
}
const restoredVirtualHalSession = await api.restoreVirtualHalSessionSnapshot({
sessionId: "axis-browser-virtual-hal-session",
filename: "virtual-hal-session.json",
});
if (
restoredVirtualHalSession.phase !== "restored" ||
restoredVirtualHalSession.restored !== true ||
api.readVirtualHalPin("axis.x.pos-cmd")?.value !== 1.75 ||
api.getVirtualHalState().hal.loadedComponents.some(({ component }) => component === "post-save-component") ||
!api.getVirtualHalState().hal.functions.some(({ name }) => name === "motion-controller") ||
doc.body.dataset.virtualHalSessionPhase !== "restored" ||
!doc.querySelector("[data-virtual-hal-session-status]")?.textContent.includes("Restored HAL session")
) {
throw new Error(`AXIS-style virtual HAL session restore failed: ${JSON.stringify(restoredVirtualHalSession)}`);
}
const virtualHalCommandScriptFixtures = api.getVirtualHalCommandScriptFixtureReport();
if (
virtualHalCommandScriptFixtures.apiName !== "linuxcnc-wasm-virtual-hal-command-script-fixture-report" ||