虚拟HAL完全满足Web数控仿真
结论:motion controller matrix 已显式关联 external-offsets、QtDragon multi-joint、vismach remap sims 的 LinuxCNC configs/sim source evidence,并纳入 SDK、browser diagnostics artifact 与 release validation;虚拟 HAL 仍只作为 Web 仿真替代层,不声明 Linux kernel hard-realtime ABI、外部硬件驱动 ABI 或 native HAL module ABI。
This commit is contained in:
@@ -496,6 +496,7 @@ export const VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES = Object.freeze([
|
||||
"axis.x.pos-cmd",
|
||||
"joint.0.pos-fb",
|
||||
]),
|
||||
simConfigTargets: Object.freeze(["external-offsets"]),
|
||||
expected: Object.freeze({
|
||||
moving: true,
|
||||
inPosition: false,
|
||||
@@ -528,6 +529,7 @@ export const VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES = Object.freeze([
|
||||
"joint.1.pos-fb",
|
||||
"joint.2.pos-fb",
|
||||
]),
|
||||
simConfigTargets: Object.freeze(["qtdragon-on-abort"]),
|
||||
expected: Object.freeze({
|
||||
moving: false,
|
||||
inPosition: true,
|
||||
@@ -558,6 +560,7 @@ export const VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES = Object.freeze([
|
||||
"joint.4.pos-fb",
|
||||
"joint.5.pos-fb",
|
||||
]),
|
||||
simConfigTargets: Object.freeze(["vismach-remap-sims"]),
|
||||
expected: Object.freeze({
|
||||
moving: false,
|
||||
inPosition: true,
|
||||
@@ -2186,6 +2189,11 @@ function valuesClose(actual, expected, tolerance = 0.000001) {
|
||||
return Math.abs(Number(actual) - Number(expected)) <= tolerance;
|
||||
}
|
||||
|
||||
function virtualHalSimConfigTargetsById(targetIds = []) {
|
||||
const ids = new Set(targetIds);
|
||||
return VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS.filter((target) => ids.has(target.id));
|
||||
}
|
||||
|
||||
export function createVirtualHalMotionControllerMatrixReport(options = {}) {
|
||||
const fixtures = options.motionFixtures ?? options.fixtures ?? VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES;
|
||||
const tolerance = clampNumber(options.tolerance ?? 0.000001, 0, 1);
|
||||
@@ -2244,11 +2252,25 @@ export function createVirtualHalMotionControllerMatrixReport(options = {}) {
|
||||
distanceToGoMatched &&
|
||||
movingMatched &&
|
||||
axisFeedbackRows.every((row) => row.matched);
|
||||
const simConfigEvidenceRows = virtualHalSimConfigTargetsById(fixture.simConfigTargets ?? [])
|
||||
.map((target) => ({
|
||||
id: target.id,
|
||||
label: target.label,
|
||||
sourceFiles: [...target.sourceFiles],
|
||||
capabilities: [...target.capabilities],
|
||||
evidence: target.evidence,
|
||||
}));
|
||||
const missingSimConfigTargets = (fixture.simConfigTargets ?? [])
|
||||
.filter((targetId) => !simConfigEvidenceRows.some((target) => target.id === targetId));
|
||||
return {
|
||||
id: fixture.id,
|
||||
label: fixture.label,
|
||||
source: "linuxcnc-motion-source-derived-virtual-motion-controller",
|
||||
sourceFiles: [...(fixture.sourceFiles ?? [])],
|
||||
simConfigTargets: [...(fixture.simConfigTargets ?? [])],
|
||||
simConfigEvidenceRows,
|
||||
simConfigSourceFiles: [...new Set(simConfigEvidenceRows.flatMap((target) => target.sourceFiles))],
|
||||
missingSimConfigTargets,
|
||||
complete,
|
||||
target: { ...(fixture.target ?? {}) },
|
||||
initialPosition: { ...(fixture.initialPosition ?? {}) },
|
||||
@@ -2269,7 +2291,8 @@ export function createVirtualHalMotionControllerMatrixReport(options = {}) {
|
||||
};
|
||||
});
|
||||
const missingFixtures = rows.filter((row) => !row.complete).map((row) => row.id);
|
||||
const complete = rows.length > 0 && missingFixtures.length === 0;
|
||||
const missingSimConfigTargets = rows.flatMap((row) => row.missingSimConfigTargets);
|
||||
const complete = rows.length > 0 && missingFixtures.length === 0 && missingSimConfigTargets.length === 0;
|
||||
return {
|
||||
apiName: "linuxcnc-wasm-virtual-hal-motion-controller-matrix-report",
|
||||
matrixVersion: 1,
|
||||
@@ -2278,13 +2301,17 @@ export function createVirtualHalMotionControllerMatrixReport(options = {}) {
|
||||
complete,
|
||||
webSimulationSatisfied: complete,
|
||||
sourceFiles: [...new Set(rows.flatMap((row) => row.sourceFiles))],
|
||||
simConfigSourceFiles: [...new Set(rows.flatMap((row) => row.simConfigSourceFiles))],
|
||||
simConfigTargets: [...new Set(rows.flatMap((row) => row.simConfigTargets))],
|
||||
requiredPins: [...new Set(fixtures.flatMap((fixture) => fixture.requiredPins ?? []))],
|
||||
fixtureCount: rows.length,
|
||||
missingFixtures,
|
||||
missingSimConfigTargets,
|
||||
rows,
|
||||
summaryRows: [
|
||||
{ id: "fixtures", label: "Motion matrix fixtures", value: `${rows.length}` },
|
||||
{ id: "source", label: "LinuxCNC motion source", value: complete ? "source-derived" : "incomplete" },
|
||||
{ id: "sim-config-source", label: "LinuxCNC sim config source", value: missingSimConfigTargets.length === 0 ? "source-derived" : `missing ${missingSimConfigTargets.length}` },
|
||||
{ id: "servo-period", label: "Servo period stepping", value: complete ? "covered" : "blocked" },
|
||||
{ id: "axis-joint-feedback", label: "Axis/joint feedback", value: complete ? "covered" : "blocked" },
|
||||
],
|
||||
@@ -2526,6 +2553,7 @@ export function createVirtualHalSourceComplianceReport(options = {}) {
|
||||
...simConfigSourceCoverage.sourceFiles,
|
||||
...commandScriptFixtures.sourceFiles,
|
||||
...motionControllerMatrix.sourceFiles,
|
||||
...motionControllerMatrix.simConfigSourceFiles,
|
||||
])],
|
||||
missingCapabilitySources,
|
||||
missingFamilySources,
|
||||
|
||||
@@ -121,7 +121,13 @@ export function createProjectReleaseBrowserDiagnosticsArtifactValidation(artifac
|
||||
arrayOrEmpty(motionControllerMatrix.requiredPins).includes("motion.distance-to-go") &&
|
||||
arrayOrEmpty(motionControllerMatrix.requiredPins).includes("motion.in-position") &&
|
||||
arrayOrEmpty(motionControllerMatrix.sourceFiles).includes("linuxcnc/src/emc/motion/motion.c") &&
|
||||
arrayOrEmpty(motionControllerMatrix.sourceFiles).includes("linuxcnc/src/emc/motion/axis.c");
|
||||
arrayOrEmpty(motionControllerMatrix.sourceFiles).includes("linuxcnc/src/emc/motion/axis.c") &&
|
||||
arrayOrEmpty(motionControllerMatrix.simConfigTargets).includes("external-offsets") &&
|
||||
arrayOrEmpty(motionControllerMatrix.simConfigTargets).includes("qtdragon-on-abort") &&
|
||||
arrayOrEmpty(motionControllerMatrix.simConfigTargets).includes("vismach-remap-sims") &&
|
||||
arrayOrEmpty(motionControllerMatrix.simConfigSourceFiles).includes("linuxcnc/configs/sim/axis/external_offsets/dynamic_offsets.ini") &&
|
||||
arrayOrEmpty(motionControllerMatrix.simConfigSourceFiles).includes("linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini") &&
|
||||
arrayOrEmpty(motionControllerMatrix.simConfigSourceFiles).includes("linuxcnc/configs/sim/axis/vismach/puma/puma.ini");
|
||||
const replacementReady = replacement.ready === true &&
|
||||
replacement.replacesHostRuntimeForSimulation === true &&
|
||||
objectOrEmpty(replacement.sourceCompliance).webSimulationSatisfied === true &&
|
||||
@@ -154,6 +160,7 @@ export function createProjectReleaseBrowserDiagnosticsArtifactValidation(artifac
|
||||
...arrayOrEmpty(simConfigSourceCoverage.sourceFiles),
|
||||
...arrayOrEmpty(commandScriptFixtures.sourceFiles),
|
||||
...arrayOrEmpty(motionControllerMatrix.sourceFiles),
|
||||
...arrayOrEmpty(motionControllerMatrix.simConfigSourceFiles),
|
||||
])],
|
||||
rows: [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user