虚拟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:
@@ -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",
|
||||
|
||||
@@ -241,6 +241,9 @@
|
||||
!api?.stepVirtualHalMotionController ||
|
||||
!api?.getVirtualHalSimulationRuntimeReport ||
|
||||
!api?.getVirtualHalSimulationReplacementReport ||
|
||||
!api?.getVirtualHalSourceComplianceReport ||
|
||||
!api?.getVirtualHalSimConfigSourceCoverageReport ||
|
||||
!api?.getVirtualHalCommandScriptFixtureReport ||
|
||||
!api?.getVirtualRealtimeHalRuntimeReport
|
||||
) {
|
||||
throw new Error("simulation API missing browser virtual HAL controls");
|
||||
@@ -398,6 +401,14 @@
|
||||
diagnosticsArtifact.statusHistory.length === 0 ||
|
||||
diagnosticsArtifact.virtualHal.source !== "browser-virtual-hal" ||
|
||||
diagnosticsArtifact.virtualHalSimulationReplacement?.ready !== true ||
|
||||
diagnosticsArtifact.virtualHalSimulationReplacement?.sourceCompliance?.webSimulationSatisfied !== true ||
|
||||
diagnosticsArtifact.virtualHalSourceCompliance?.complete !== true ||
|
||||
diagnosticsArtifact.virtualHalSourceCompliance?.webSimulationSatisfied !== true ||
|
||||
!diagnosticsArtifact.virtualHalSourceCompliance?.sourceFiles?.includes("linuxcnc/src/hal/utils/halcmd_commands.cc") ||
|
||||
diagnosticsArtifact.virtualHalSimConfigSourceCoverage?.complete !== true ||
|
||||
!diagnosticsArtifact.virtualHalSimConfigSourceCoverage?.sourceFiles?.includes("linuxcnc/configs/sim/axis/foam/axis_foam.ini") ||
|
||||
diagnosticsArtifact.virtualHalCommandScriptFixtures?.complete !== true ||
|
||||
!diagnosticsArtifact.virtualHalCommandScriptFixtures?.coveredActions?.includes("loadusr") ||
|
||||
diagnosticsArtifact.limitsHome.source !== "browser-virtual-hal" ||
|
||||
diagnosticsArtifact.preview.renderer !== "threejs" ||
|
||||
diagnosticsArtifact.toolTable.state !== "not-loaded"
|
||||
@@ -712,6 +723,16 @@
|
||||
) {
|
||||
throw new Error(`AXIS-style virtual halcmd did not execute: ${JSON.stringify(virtualHalcmdResult)}`);
|
||||
}
|
||||
const virtualHalCommandScriptFixtures = api.getVirtualHalCommandScriptFixtureReport();
|
||||
if (
|
||||
virtualHalCommandScriptFixtures.apiName !== "linuxcnc-wasm-virtual-hal-command-script-fixture-report" ||
|
||||
virtualHalCommandScriptFixtures.complete !== true ||
|
||||
!virtualHalCommandScriptFixtures.coveredActions.includes("setp") ||
|
||||
!virtualHalCommandScriptFixtures.coveredActions.includes("stop") ||
|
||||
!virtualHalCommandScriptFixtures.sourceFiles.includes("linuxcnc/src/hal/utils/halcmd_commands.cc")
|
||||
) {
|
||||
throw new Error(`AXIS-style virtual HAL command fixtures did not pass: ${JSON.stringify(virtualHalCommandScriptFixtures)}`);
|
||||
}
|
||||
const motionControllerStep = api.stepVirtualHalMotionController({
|
||||
target: { x: 2.25 },
|
||||
maxVelocity: 10,
|
||||
@@ -732,6 +753,15 @@
|
||||
virtualHalReplacement.replacements["linuxcnc-realtime-hal"].ready !== true ||
|
||||
virtualHalReplacement.replacements.halcmd.ready !== true ||
|
||||
virtualHalReplacement.replacements["motion-controller"].ready !== true ||
|
||||
virtualHalReplacement.sourceCompliance?.complete !== true ||
|
||||
virtualHalReplacement.sourceCompliance?.webSimulationSatisfied !== true ||
|
||||
virtualHalReplacement.simConfigSourceCoverage?.complete !== true ||
|
||||
virtualHalReplacement.commandScriptFixtures?.complete !== true ||
|
||||
api.getVirtualHalSourceComplianceReport().complete !== true ||
|
||||
api.getVirtualHalSourceComplianceReport().commandScriptFixtures?.complete !== true ||
|
||||
!api.getVirtualHalSourceComplianceReport().sourceFiles.includes("linuxcnc/src/emc/motion/motion.c") ||
|
||||
api.getVirtualHalSimConfigSourceCoverageReport().complete !== true ||
|
||||
!api.getVirtualHalSimConfigSourceCoverageReport().sourceFiles.includes("linuxcnc/configs/sim/qtdragon/qtdragon_xyz/on_abort.ngc") ||
|
||||
api.getVirtualRealtimeHalRuntimeReport().ready !== true ||
|
||||
api.getVirtualHalSimulationRuntimeReport().replacesHostRuntimeForSimulation !== true
|
||||
) {
|
||||
|
||||
Reference in New Issue
Block a user