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

结论:real simulation page 已将保存的 virtual HAL session snapshot 联动到 release diagnostics artifact,保存或恢复后的 Web CNC 仿真会话可直接输出 release-ready virtual HAL source、sim-config、halcmd fixture 与 motion matrix evidence;该能力仍限于 Web 仿真替代层,不声明 Linux kernel hard-realtime ABI、外部硬件驱动 ABI 或 native HAL module ABI。
This commit is contained in:
2026-06-17 23:07:11 +08:00
parent 7449ff7f4e
commit 208992c42e
5 changed files with 154 additions and 2 deletions

View File

@@ -1800,6 +1800,7 @@ M2
import {
createLinuxCncIniSdk,
createLinuxCncInterpSdk,
createProjectReleaseBrowserDiagnosticsArtifactValidation,
} from "../../sdk/src/index.js";
import {
DEFAULT_SIMULATION_PROGRAM_ID,
@@ -1921,6 +1922,7 @@ M2
status: "Virtual HAL session not saved",
revision: 0,
restored: false,
releaseDiagnosticsReady: false,
};
let machineReadinessState = {
machineId: "axis-browser-sim",
@@ -2613,6 +2615,7 @@ M2
virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport(),
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport(),
virtualHalMotionControllerMatrix: createVirtualHalMotionControllerMatrixReport(),
virtualHalSessionDiagnostics: createVirtualHalSessionDiagnosticsArtifact(),
statusHistory: getStatusHistory(),
mdiHistory: getMdiHistory(),
recentPrograms: getRecentPrograms(),
@@ -2627,6 +2630,44 @@ M2
};
}
function createVirtualHalSessionDiagnosticsArtifact(snapshot = virtualHalSessionState.snapshot ?? null) {
if (!snapshot?.payload?.virtualHal) {
return {
apiName: "real-browser-simulation-virtual-hal-session-diagnostics",
artifactVersion: 1,
ready: false,
phase: "not-saved",
missing: ["virtualHalSessionSnapshot"],
};
}
const virtualHal = snapshot.payload.virtualHal;
const diagnosticsArtifact = {
apiName: "real-browser-simulation-diagnostics-artifact",
artifactVersion: 1,
virtualHal: virtualHal.state,
virtualHalSimulationReplacement: virtualHal.diagnostics,
virtualHalSourceCompliance: virtualHal.sourceCompliance,
virtualHalSimConfigSourceCoverage: virtualHal.simConfigSourceCoverage,
virtualHalCommandScriptFixtures: virtualHal.commandScriptFixtures,
virtualHalMotionControllerMatrix: virtualHal.motionControllerMatrix,
};
const validation = createProjectReleaseBrowserDiagnosticsArtifactValidation(diagnosticsArtifact);
return {
apiName: "real-browser-simulation-virtual-hal-session-diagnostics",
artifactVersion: 1,
ready: validation.ready === true,
phase: validation.ready === true ? "release-ready" : "blocked",
sessionId: snapshot.sessionId,
machineId: snapshot.payload.machineId,
createdAt: snapshot.createdAt,
metadata: { ...(snapshot.metadata ?? {}) },
files: { ...(snapshot.payload.files ?? {}) },
virtualHalRevision: virtualHal.state.revision,
validation,
diagnosticsArtifact,
};
}
function recordError(error, context = "runtime") {
const message = `${context}: ${error?.message ?? error}`;
renderDiagnostics({ lastError: message });
@@ -3549,6 +3590,7 @@ M2
virtualHalRevision: virtualHal.state.revision,
},
});
const sessionDiagnostics = createVirtualHalSessionDiagnosticsArtifact(snapshot);
pushStatusHistory("hal-session", `saved ${session.sessionId}/${session.filename}`);
return setVirtualHalSessionState({
ready: true,
@@ -3559,6 +3601,8 @@ M2
status: `Saved HAL session: linuxcnc/sessions/${session.sessionId}/${session.filename}`,
revision: virtualHal.state.revision,
restored: false,
releaseDiagnosticsReady: sessionDiagnostics.ready === true,
sessionDiagnostics,
snapshot,
});
}
@@ -3571,6 +3615,7 @@ M2
virtualHalState = restoreVirtualHalStateFromSessionSnapshot(snapshot);
renderVirtualHalState();
renderAxisStatusbar();
const sessionDiagnostics = createVirtualHalSessionDiagnosticsArtifact(snapshot);
pushStatusHistory("hal-session", `restored ${session.sessionId}/${session.filename}`);
return setVirtualHalSessionState({
ready: true,
@@ -3581,6 +3626,8 @@ M2
status: `Restored HAL session: linuxcnc/sessions/${session.sessionId}/${session.filename}`,
revision: virtualHalState.revision,
restored: true,
releaseDiagnosticsReady: sessionDiagnostics.ready === true,
sessionDiagnostics,
snapshot,
});
}
@@ -3975,6 +4022,7 @@ M2
getVirtualHalSessionState: () => ({ ...virtualHalSessionState }),
saveVirtualHalSessionSnapshot,
restoreVirtualHalSessionSnapshot,
exportVirtualHalSessionDiagnosticsArtifact: () => createVirtualHalSessionDiagnosticsArtifact(),
getRunMode: () => syncRunMode(),
getRunControlState: () => renderRunControlState(),
getAxisStatusbarState: () => renderAxisStatusbar(),