接入虚拟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:
@@ -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" ||
|
||||
|
||||
@@ -266,12 +266,14 @@ assert.equal(virtualHalSessionPayload.state.hal.nets["x-pos"].includes("axis.x.p
|
||||
assert.equal(virtualHalSessionPayload.sourceCompliance.complete, true);
|
||||
assert.equal(virtualHalSessionPayload.simConfigSourceCoverage.complete, true);
|
||||
assert.equal(virtualHalSessionPayload.commandScriptFixtures.complete, true);
|
||||
assert.equal(virtualHalSessionPayload.motionControllerMatrix.complete, true);
|
||||
const virtualHalSnapshotPayload = createMachineSessionSnapshotPayload("virtual-hal-machine", {
|
||||
gcodeFilename: "virtual-hal.ngc",
|
||||
virtualHal: virtualHalSessionPayload,
|
||||
});
|
||||
assert.equal(virtualHalSnapshotPayload.virtualHal.state.hal.signals["x-pos"].value, 2.25);
|
||||
assert.equal(virtualHalSnapshotPayload.virtualHal.commandScriptFixtures.coveredActions.includes("loadusr"), true);
|
||||
assert.equal(virtualHalSnapshotPayload.virtualHal.motionControllerMatrix.sourceFiles.includes("linuxcnc/src/emc/motion/axis.c"), true);
|
||||
assert.deepEqual(
|
||||
createMachineSessionSnapshotPayload("custom-machine", {
|
||||
parameterFilename: "custom.var",
|
||||
|
||||
@@ -747,6 +747,7 @@ assert.equal(virtualHalSessionPayload.state.hal.signals["x-pos"].value, 1.25);
|
||||
assert.equal(virtualHalSessionPayload.sourceCompliance.complete, true);
|
||||
assert.equal(virtualHalSessionPayload.simConfigSourceCoverage.complete, true);
|
||||
assert.equal(virtualHalSessionPayload.commandScriptFixtures.complete, true);
|
||||
assert.equal(virtualHalSessionPayload.motionControllerMatrix.complete, true);
|
||||
const virtualHalSessionSnapshot = createSessionSnapshot(
|
||||
"sdk-virtual-hal-session",
|
||||
createMachineSessionSnapshotPayload("sdk-mill", {
|
||||
|
||||
Reference in New Issue
Block a user