Files
cnc_wams/wasm-port/runtime/opfs/linuxcnc-machine-session-bridge.js
wangdequan e21f11d69f 按规划继续工作
结论:补齐 INI 派生参数文件和刀具表 OPFS 会话加载,扩大浏览器解释器 file-path fixture 覆盖,并通过 host/WASM/browser 聚合验证。
2026-06-08 09:00:54 +08:00

109 lines
3.4 KiB
JavaScript

import { loadTextFile } from "./file-service.js";
import {
machineIniPath,
parameterFilePath,
toolTablePath,
} from "./path-model.js";
import { restoreMachineParametersFromOpfs } from "./linuxcnc-parameter-bridge.js";
import { loadMachineToolTableFromOpfs } from "./linuxcnc-tool-table-bridge.js";
const DEFAULT_WASM_INI_PATH = "/work/machine.ini";
const DEFAULT_WASM_PARAMETER_PATH = "/work/linuxcnc.var";
const DEFAULT_WASM_TOOL_TABLE_PATH = "/work/tool.tbl";
function requireSessionSdk(interp) {
if (typeof interp?.writeTextFile !== "function") {
throw new Error("interpreter SDK is missing writeTextFile().");
}
}
function requireIniSdk(iniSdk) {
if (!iniSdk) {
return;
}
for (const method of ["writeTextFile", "getString", "getBool"]) {
if (typeof iniSdk[method] !== "function") {
throw new Error(`INI SDK is missing ${method}().`);
}
}
}
function iniString(iniSdk, iniWasmPath, section, tag) {
if (!iniSdk) {
return undefined;
}
const value = iniSdk.getString(iniWasmPath, section, tag);
return value === null || value === "" ? undefined : value;
}
function resolveSessionPaths(machineId, options = {}, iniValues = {}) {
return {
iniOpfsPath: options.iniOpfsPath ?? machineIniPath(machineId, options.iniFilename),
iniWasmPath: options.iniWasmPath ?? DEFAULT_WASM_INI_PATH,
parameterOpfsPath:
options.parameterOpfsPath ??
parameterFilePath(
machineId,
options.parameterFilename ?? iniValues.parameterFilename,
),
parameterWasmPath: options.parameterWasmPath ?? DEFAULT_WASM_PARAMETER_PATH,
toolTableOpfsPath:
options.toolTableOpfsPath ??
toolTablePath(machineId, options.toolTableFilename ?? iniValues.toolTableFilename),
toolTableWasmPath: options.toolTableWasmPath ?? DEFAULT_WASM_TOOL_TABLE_PATH,
};
}
function randomToolChangerFromIni(iniSdk, iniWasmPath, iniText) {
if (!iniSdk) {
return false;
}
iniSdk.writeTextFile(iniWasmPath, iniText);
return iniSdk.getBool(iniWasmPath, "EMCIO", "RANDOM_TOOLCHANGER") === true;
}
export async function loadMachineSessionFromOpfs(interp, machineId, options = {}) {
requireSessionSdk(interp);
requireIniSdk(options.iniSdk);
const iniPaths = resolveSessionPaths(machineId, options);
const iniText = await loadTextFile(iniPaths.iniOpfsPath, options.storage);
options.iniSdk?.writeTextFile(iniPaths.iniWasmPath, iniText);
const paths = resolveSessionPaths(machineId, options, {
parameterFilename: iniString(
options.iniSdk,
iniPaths.iniWasmPath,
"RS274NGC",
"PARAMETER_FILE",
),
toolTableFilename: iniString(options.iniSdk, iniPaths.iniWasmPath, "EMCIO", "TOOL_TABLE"),
});
interp.writeTextFile(paths.iniWasmPath, iniText);
const randomToolChanger =
typeof options.randomToolChanger === "boolean"
? options.randomToolChanger
: randomToolChangerFromIni(options.iniSdk, paths.iniWasmPath, iniText);
const parameters = await restoreMachineParametersFromOpfs(interp, machineId, {
storage: options.storage,
opfsPath: paths.parameterOpfsPath,
wasmPath: paths.parameterWasmPath,
});
const toolTable = await loadMachineToolTableFromOpfs(interp, machineId, {
storage: options.storage,
opfsPath: paths.toolTableOpfsPath,
wasmPath: paths.toolTableWasmPath,
randomToolChanger,
});
return {
machineId,
ini: {
opfsPath: paths.iniOpfsPath,
wasmPath: paths.iniWasmPath,
},
parameters,
toolTable,
};
}