接续上一轮,先做 L4-USER-M-PROCESS,完全接入仿真系统

结论:已将 L4-USER-M-PROCESS 的 millturn M128/M129 受控状态转换接入 virtual HAL、真实 browser simulation、OPFS 会话 payload、SDK API 和 release diagnostics validation;外部 user-M process execution 与 promotion 仍保持 locked,不伪装为 native process 解锁。
This commit is contained in:
2026-06-20 06:33:00 +08:00
parent 15b98c3ecf
commit d0e55ba11e
12 changed files with 676 additions and 7 deletions

View File

@@ -34,6 +34,7 @@ import {
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
VIRTUAL_HAL_COMMAND_SCRIPT_FIXTURES,
VIRTUAL_HAL_COVERAGE_STATES,
VIRTUAL_HAL_MILLTURN_USER_M_PROCESS_BOUNDARY,
VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES,
VIRTUAL_HAL_PROJECT_PIN_GROUPS,
VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_AUDIT_CANDIDATES,
@@ -51,6 +52,7 @@ import {
VIRTUAL_HAL_SYSTEM_PIN_FAMILIES,
VIRTUAL_HAL_WASM_BRIDGE_FUNCTIONS,
applyVirtualHalAction,
applyVirtualHalMillturnUserMProcessState,
applyVirtualHalPinUpdates,
applyVirtualHalToInterpSdk,
createVirtualHalSimulationRuntimeReport,
@@ -58,6 +60,7 @@ import {
createLinuxCncInterpSdk,
createLinuxCncVirtualHalRuntime,
createVirtualHalIntegrityReport,
createVirtualHalMillturnUserMProcessBoundaryReport,
createVirtualHalMotionControllerMatrixReport,
createMachineSessionSnapshotPayload,
createVirtualHalSessionPayload,
@@ -356,6 +359,7 @@ const requiredExports = [
["createProjectReleaseReadinessReport", createProjectReleaseReadinessReport],
["createProjectReleaseReadinessSummaryViewModel", createProjectReleaseReadinessSummaryViewModel],
["applyVirtualHalAction", applyVirtualHalAction],
["applyVirtualHalMillturnUserMProcessState", applyVirtualHalMillturnUserMProcessState],
["applyVirtualHalPinUpdates", applyVirtualHalPinUpdates],
["applyVirtualHalToInterpSdk", applyVirtualHalToInterpSdk],
["createLinuxCncVirtualHalRuntime", createLinuxCncVirtualHalRuntime],
@@ -363,6 +367,7 @@ const requiredExports = [
["createVirtualHalBridgeReadiness", createVirtualHalBridgeReadiness],
["createVirtualHalCommandScriptFixtureReport", createVirtualHalCommandScriptFixtureReport],
["createVirtualHalIntegrityReport", createVirtualHalIntegrityReport],
["createVirtualHalMillturnUserMProcessBoundaryReport", createVirtualHalMillturnUserMProcessBoundaryReport],
["createVirtualHalMotionControllerMatrixReport", createVirtualHalMotionControllerMatrixReport],
["createVirtualHalPinInventory", createVirtualHalPinInventory],
["createVirtualHalPinRegistry", createVirtualHalPinRegistry],
@@ -648,6 +653,11 @@ assert.equal(VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS
.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/M111"), true);
assert.equal(VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES["halcmd-simulation-replacement"].sourceFiles.includes("linuxcnc/src/hal/utils/halcmd_commands.cc"), true);
assert.equal(VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES["motion-controller-simulation-replacement"].sourceFiles.includes("linuxcnc/src/emc/motion/motion.c"), true);
assert.equal(VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES["controlled-user-m-process-state-boundary"].sourceFiles.includes("linuxcnc/configs/sim/axis/vismach/millturn/mcodes/M128"), true);
assert.equal(VIRTUAL_HAL_MILLTURN_USER_M_PROCESS_BOUNDARY.boundaryClass, "L4-USER-M-PROCESS");
assert.equal(VIRTUAL_HAL_MILLTURN_USER_M_PROCESS_BOUNDARY.cases.length, 2);
assert.equal(VIRTUAL_HAL_MILLTURN_USER_M_PROCESS_BOUNDARY.cases.some(({ userMCode }) => userMCode === "M128"), true);
assert.equal(VIRTUAL_HAL_MILLTURN_USER_M_PROCESS_BOUNDARY.cases.some(({ userMCode }) => userMCode === "M129"), true);
assert.equal(VIRTUAL_HAL_COVERAGE_STATES.runtimeBoundary, "runtime-boundary");
assert.equal(VIRTUAL_HAL_SOURCE_FILES.halui, "linuxcnc/src/emc/usr_intf/halui.cc");
assert.equal(VIRTUAL_HAL_SYSTEM_PIN_FAMILIES.some(({ id }) => id === "iocontrol"), true);
@@ -656,6 +666,8 @@ assert.match(sdkIndexText, /\bVIRTUAL_HAL_WASM_BRIDGE_FUNCTIONS\b/);
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_WASM_BRIDGE_FUNCTIONS\b/);
assert.match(sdkIndexText, /\bVIRTUAL_HAL_COMMAND_SCRIPT_FIXTURES\b/);
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_COMMAND_SCRIPT_FIXTURES\b/);
assert.match(sdkIndexText, /\bVIRTUAL_HAL_MILLTURN_USER_M_PROCESS_BOUNDARY\b/);
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_MILLTURN_USER_M_PROCESS_BOUNDARY\b/);
assert.match(sdkIndexText, /\bVIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES\b/);
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES\b/);
assert.match(sdkIndexText, /\bVIRTUAL_HAL_PROJECT_PIN_GROUPS\b/);
@@ -672,6 +684,10 @@ assert.match(sdkIndexText, /\bVIRTUAL_HAL_SYSTEM_PIN_FAMILIES\b/);
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_SYSTEM_PIN_FAMILIES\b/);
assert.match(sdkIndexText, /\bexecuteVirtualHalCommand\b/);
assert.match(sdkReadmeText, /\bexecuteVirtualHalCommand\b/);
assert.match(sdkIndexText, /\bapplyVirtualHalMillturnUserMProcessState\b/);
assert.match(sdkReadmeText, /\bapplyVirtualHalMillturnUserMProcessState\b/);
assert.match(sdkIndexText, /\bcreateVirtualHalMillturnUserMProcessBoundaryReport\b/);
assert.match(sdkReadmeText, /\bcreateVirtualHalMillturnUserMProcessBoundaryReport\b/);
assert.match(sdkIndexText, /\bexecuteVirtualHalcmd\b/);
assert.match(sdkReadmeText, /\bexecuteVirtualHalcmd\b/);
assert.match(sdkIndexText, /\bcreateVirtualHalCommandScriptFixtureReport\b/);
@@ -781,6 +797,38 @@ assert.equal(virtualHalReport.pinRegistry.byName["spindle.0.speed-out"].value, 1
assert.equal(virtualHalReport.integrity.complete, true);
const virtualHalRuntime = createLinuxCncVirtualHalRuntime(sdkVirtualHal);
assert.equal(virtualHalRuntime.getProjectReport({ availableFunctions: VIRTUAL_HAL_WASM_BRIDGE_FUNCTIONS }).ready, true);
const millturnUserMBoundaryReport = createVirtualHalMillturnUserMProcessBoundaryReport({ manifestText: sourceManifestText });
assert.equal(millturnUserMBoundaryReport.apiName, "linuxcnc-wasm-virtual-hal-millturn-user-m-process-boundary-report");
assert.equal(millturnUserMBoundaryReport.boundaryClass, "L4-USER-M-PROCESS");
assert.equal(millturnUserMBoundaryReport.complete, true);
assert.equal(millturnUserMBoundaryReport.webSimulationSatisfied, true);
assert.equal(millturnUserMBoundaryReport.executionEnabled, false);
assert.equal(millturnUserMBoundaryReport.promotionAllowed, false);
assert.equal(millturnUserMBoundaryReport.processExecutionReady, false);
assert.equal(millturnUserMBoundaryReport.inventoryBaselineUnchanged, true);
assert.equal(millturnUserMBoundaryReport.missingManifestFiles.length, 0);
assert.equal(millturnUserMBoundaryReport.rows.some(({ userMCode, remapCode }) => userMCode === "M128" && remapCode === "M428"), true);
assert.equal(millturnUserMBoundaryReport.rows.some(({ userMCode, remapCode }) => userMCode === "M129" && remapCode === "M429"), true);
assert.equal(millturnUserMBoundaryReport.rows.every(({ stateTargetCount }) => stateTargetCount === 12), true);
assert.equal(millturnUserMBoundaryReport.rows.every(({ executionEnabled, promotionAllowed }) => executionEnabled === false && promotionAllowed === false), true);
let millturnStateResult = applyVirtualHalMillturnUserMProcessState(virtualHalRuntime.getState(), "M128", { manifestText: sourceManifestText });
assert.equal(millturnStateResult.apiName, "linuxcnc-wasm-virtual-hal-millturn-user-m-process-state-result");
assert.equal(millturnStateResult.ok, true);
assert.equal(millturnStateResult.userMCode, "M128");
assert.equal(millturnStateResult.executionEnabled, false);
assert.equal(millturnStateResult.promotionAllowed, false);
assert.equal(readVirtualHalPin(millturnStateResult.state, "motion.switchkins-type").value, 0);
assert.equal(readVirtualHalPin(millturnStateResult.state, "ini.x.min_limit").value, -300);
assert.equal(readVirtualHalPin(millturnStateResult.state, "ini.z.max_limit").value, 0);
millturnStateResult = virtualHalRuntime.applyMillturnUserMProcessState("M129", { manifestText: sourceManifestText });
assert.equal(millturnStateResult.userMCode, "M129");
assert.equal(readVirtualHalPin(virtualHalRuntime.getState(), "motion.switchkins-type").value, 1);
assert.equal(readVirtualHalPin(virtualHalRuntime.getState(), "motion.analog-out-03").value, 1);
assert.equal(readVirtualHalPin(virtualHalRuntime.getState(), "kinstype.is-0").value, 0);
assert.equal(readVirtualHalPin(virtualHalRuntime.getState(), "kinstype.is-1").value, 1);
assert.equal(readVirtualHalPin(virtualHalRuntime.getState(), "ini.x.max_limit").value, 0);
assert.equal(readVirtualHalPin(virtualHalRuntime.getState(), "ini.z.max_limit").value, 300);
assert.equal(virtualHalRuntime.getMillturnUserMProcessBoundaryReport({ manifestText: sourceManifestText }).complete, true);
const virtualHalcmdResult = virtualHalRuntime.executeHalCommand(`
loadrt trivkins
addf motion-controller servo-thread
@@ -1365,6 +1413,8 @@ assert.equal(virtualHalSessionPayload.simConfigSourceCoverage.complete, true);
assert.equal(virtualHalSessionPayload.simConfigPromotionCandidates.complete, true);
assert.equal(virtualHalSessionPayload.simConfigEvidenceExpansion.complete, true);
assert.equal(virtualHalSessionPayload.simConfigMacroLoadFixtures.complete, true);
assert.equal(virtualHalSessionPayload.millturnUserMProcessBoundary.complete, true);
assert.equal(virtualHalSessionPayload.millturnUserMProcessBoundary.boundaryClass, "L4-USER-M-PROCESS");
assert.equal(virtualHalSessionPayload.commandScriptFixtures.complete, true);
assert.equal(virtualHalSessionPayload.motionControllerMatrix.complete, true);
const virtualHalSessionSnapshot = createSessionSnapshot(
@@ -1404,6 +1454,7 @@ const browserDiagnosticsArtifact = {
inventoryBaseline: "executed=82 passed=82 skipped=77 unexpected_fail=0",
},
virtualHalSimConfigMacroLoadFixtures: simConfigMacroLoadFixtureReport,
virtualHalMillturnUserMProcessBoundary: millturnUserMBoundaryReport,
virtualHalCommandScriptFixtures: commandScriptFixtureReport,
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
};
@@ -1435,6 +1486,8 @@ assert.equal(browserDiagnosticsArtifactValidation.promotionCandidateSummaryReady
assert.equal(browserDiagnosticsArtifactValidation.hasPromotionCandidateSummary, true);
assert.equal(browserDiagnosticsArtifactValidation.macroLoadFixturesReady, true);
assert.equal(browserDiagnosticsArtifactValidation.hasMacroLoadFixtures, true);
assert.equal(browserDiagnosticsArtifactValidation.millturnUserMProcessBoundaryReady, true);
assert.equal(browserDiagnosticsArtifactValidation.hasMillturnUserMProcessBoundary, true);
assert.equal(browserDiagnosticsArtifactValidation.commandScriptFixturesReady, true);
assert.equal(browserDiagnosticsArtifactValidation.motionControllerMatrixReady, true);
assert.equal(browserDiagnosticsArtifactValidation.hasSessionDiagnostics, true);
@@ -1453,6 +1506,19 @@ assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/rose_engine/rcone.ngc"), true);
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini"), true);
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/eoffsets.ngc"), true);
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/vismach/millturn/mcodes/M128"), true);
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/vismach/millturn/mcodes/M129"), true);
assert.equal(createProjectReleaseBrowserDiagnosticsArtifactValidation({
...browserDiagnosticsArtifact,
virtualHalMillturnUserMProcessBoundary: undefined,
}).missing.includes("virtualHalMillturnUserMProcessBoundary"), true);
assert.equal(createProjectReleaseBrowserDiagnosticsArtifactValidation({
...browserDiagnosticsArtifact,
virtualHalMillturnUserMProcessBoundary: {
...millturnUserMBoundaryReport,
promotionAllowed: true,
},
}).millturnUserMProcessBoundaryReady, false);
assert.equal(createProjectReleaseBrowserDiagnosticsArtifactValidation({
...browserDiagnosticsArtifact,
virtualHalPromotionCandidateSummary: undefined,