按规划继续工作
结论:OPFS 参数文件已通过桥接进入 LinuxCNC-backed WASM restore/save 路径,native 与 host/WASM/browser 验证全部通过。
This commit is contained in:
63
wasm-port/runtime/opfs/linuxcnc-parameter-bridge.js
Normal file
63
wasm-port/runtime/opfs/linuxcnc-parameter-bridge.js
Normal file
@@ -0,0 +1,63 @@
|
||||
import { loadTextFile, saveTextFile } from "./file-service.js";
|
||||
import { parameterFilePath } from "./path-model.js";
|
||||
|
||||
const DEFAULT_WASM_PARAMETER_PATH = "/work/linuxcnc.var";
|
||||
|
||||
function requireParameterSdk(interp) {
|
||||
for (const method of ["writeTextFile", "readTextFile", "restoreParameters", "saveParameters"]) {
|
||||
if (typeof interp?.[method] !== "function") {
|
||||
throw new Error(`interpreter SDK is missing ${method}().`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function resolvePaths(machineId, options = {}) {
|
||||
const opfsPath = options.opfsPath ?? parameterFilePath(machineId, options.filename);
|
||||
const wasmPath = options.wasmPath ?? DEFAULT_WASM_PARAMETER_PATH;
|
||||
return { opfsPath, wasmPath };
|
||||
}
|
||||
|
||||
function readOptionalWasmTextFile(interp, path) {
|
||||
try {
|
||||
return interp.readTextFile(path);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export async function restoreMachineParametersFromOpfs(interp, machineId, options = {}) {
|
||||
requireParameterSdk(interp);
|
||||
const { opfsPath, wasmPath } = resolvePaths(machineId, options);
|
||||
const text = await loadTextFile(opfsPath, options.storage);
|
||||
interp.writeTextFile(wasmPath, text);
|
||||
return {
|
||||
opfsPath,
|
||||
wasmPath,
|
||||
result: interp.restoreParameters(wasmPath),
|
||||
};
|
||||
}
|
||||
|
||||
export async function saveMachineParametersToOpfs(interp, machineId, values, options = {}) {
|
||||
requireParameterSdk(interp);
|
||||
const { opfsPath, wasmPath } = resolvePaths(machineId, options);
|
||||
const existingText = await loadTextFile(opfsPath, options.storage);
|
||||
interp.writeTextFile(wasmPath, existingText);
|
||||
|
||||
const result = interp.saveParameters(wasmPath, values);
|
||||
const savedText = interp.readTextFile(wasmPath);
|
||||
const backupText = readOptionalWasmTextFile(interp, `${wasmPath}.bak`);
|
||||
|
||||
await saveTextFile(opfsPath, savedText, options.storage);
|
||||
if (backupText !== null) {
|
||||
await saveTextFile(`${opfsPath}.bak`, backupText, options.storage);
|
||||
}
|
||||
|
||||
return {
|
||||
opfsPath,
|
||||
backupOpfsPath: backupText === null ? null : `${opfsPath}.bak`,
|
||||
wasmPath,
|
||||
result,
|
||||
savedText,
|
||||
backupText,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user