虚拟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:
@@ -7,6 +7,14 @@ import {
|
||||
sessionSnapshotPath,
|
||||
toolTablePath,
|
||||
} from "./path-model.js";
|
||||
import {
|
||||
cloneVirtualHalState,
|
||||
createVirtualHalCommandScriptFixtureReport,
|
||||
createVirtualHalSimConfigSourceCoverageReport,
|
||||
createVirtualHalSimulationReplacementReport,
|
||||
createVirtualHalSourceComplianceReport,
|
||||
createVirtualHalState,
|
||||
} from "../sdk/src/linuxcnc-hal.js";
|
||||
|
||||
export const SESSION_SNAPSHOT_FORMAT = "linuxcnc-wasm-session-snapshot";
|
||||
export const SESSION_SNAPSHOT_VERSION = 1;
|
||||
@@ -45,9 +53,58 @@ function validateMachineSessionSnapshotPayload(payload, machineId) {
|
||||
requiredSnapshotFilePath(payload.files, "parameters", "machine session parameter OPFS path");
|
||||
requiredSnapshotFilePath(payload.files, "toolTable", "machine session tool table OPFS path");
|
||||
optionalOpfsPath(payload.files.gcode, "machine session G-code OPFS path");
|
||||
if (payload.virtualHal !== undefined) {
|
||||
validateVirtualHalSessionPayload(payload.virtualHal);
|
||||
}
|
||||
return payload;
|
||||
}
|
||||
|
||||
function validateVirtualHalSessionPayload(virtualHal) {
|
||||
assertPlainObject(virtualHal, "virtual HAL session payload");
|
||||
assertPlainObject(virtualHal.state, "virtual HAL session state");
|
||||
assertPlainObject(virtualHal.diagnostics, "virtual HAL session diagnostics");
|
||||
assertPlainObject(virtualHal.sourceCompliance, "virtual HAL session source compliance");
|
||||
assertPlainObject(virtualHal.simConfigSourceCoverage, "virtual HAL session sim-config source coverage");
|
||||
assertPlainObject(virtualHal.commandScriptFixtures, "virtual HAL session command script fixtures");
|
||||
if (virtualHal.state.source !== "browser-virtual-hal") {
|
||||
throw new Error(`Unsupported virtual HAL state source: ${virtualHal.state.source}`);
|
||||
}
|
||||
if (virtualHal.sourceCompliance.complete !== true) {
|
||||
throw new Error("virtual HAL source compliance is incomplete.");
|
||||
}
|
||||
if (virtualHal.simConfigSourceCoverage.complete !== true) {
|
||||
throw new Error("virtual HAL sim-config source coverage is incomplete.");
|
||||
}
|
||||
if (virtualHal.commandScriptFixtures.complete !== true) {
|
||||
throw new Error("virtual HAL command script fixtures are incomplete.");
|
||||
}
|
||||
return virtualHal;
|
||||
}
|
||||
|
||||
export function createVirtualHalSessionPayload(halState = createVirtualHalState(), options = {}) {
|
||||
const state = cloneVirtualHalState(halState);
|
||||
const diagnostics = options.diagnostics ?? createVirtualHalSimulationReplacementReport(state);
|
||||
const sourceCompliance = options.sourceCompliance ?? createVirtualHalSourceComplianceReport({ halState: state });
|
||||
const simConfigSourceCoverage = options.simConfigSourceCoverage ?? createVirtualHalSimConfigSourceCoverageReport(options);
|
||||
const commandScriptFixtures = options.commandScriptFixtures ?? createVirtualHalCommandScriptFixtureReport({ ...options, halState: state });
|
||||
return validateVirtualHalSessionPayload({
|
||||
apiName: "linuxcnc-wasm-virtual-hal-session-payload",
|
||||
payloadVersion: 1,
|
||||
source: "browser-virtual-hal",
|
||||
state,
|
||||
diagnostics,
|
||||
sourceCompliance,
|
||||
simConfigSourceCoverage,
|
||||
commandScriptFixtures,
|
||||
});
|
||||
}
|
||||
|
||||
export function restoreVirtualHalStateFromSessionSnapshot(snapshot) {
|
||||
assertPlainObject(snapshot, "session snapshot");
|
||||
const virtualHal = validateVirtualHalSessionPayload(snapshot.payload?.virtualHal);
|
||||
return cloneVirtualHalState(virtualHal.state);
|
||||
}
|
||||
|
||||
export function createMachineSessionSnapshotPayload(machineId, options = {}) {
|
||||
assertPlainObject(options, "machine session snapshot options");
|
||||
const ini = optionalOpfsPath(options.iniOpfsPath, "INI OPFS path") ??
|
||||
@@ -58,6 +115,9 @@ export function createMachineSessionSnapshotPayload(machineId, options = {}) {
|
||||
toolTablePath(machineId, options.toolTableFilename);
|
||||
const gcode = optionalOpfsPath(options.gcodeOpfsPath, "G-code OPFS path") ??
|
||||
(options.gcodeFilename === undefined ? undefined : gcodeProgramPath(options.gcodeFilename));
|
||||
const virtualHal = options.virtualHalState === undefined && options.virtualHal === undefined
|
||||
? undefined
|
||||
: (options.virtualHal ?? createVirtualHalSessionPayload(options.virtualHalState, options.virtualHalOptions ?? {}));
|
||||
|
||||
return {
|
||||
machineId,
|
||||
@@ -67,6 +127,7 @@ export function createMachineSessionSnapshotPayload(machineId, options = {}) {
|
||||
toolTable,
|
||||
...(gcode === undefined ? {} : { gcode }),
|
||||
},
|
||||
...(virtualHal === undefined ? {} : { virtualHal }),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user