按规划继续工作
结论:接入 vendored LinuxCNC tooldata_common.cc 负责刀具表解析与保存,WASM/SDK/OPFS/UI 仅做运行时边界搬运;native、WASM、OPFS 和浏览器 smoke 验证已通过。
This commit is contained in:
59
wasm-port/runtime/opfs/linuxcnc-machine-session-bridge.js
Normal file
59
wasm-port/runtime/opfs/linuxcnc-machine-session-bridge.js
Normal file
@@ -0,0 +1,59 @@
|
||||
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 resolveSessionPaths(machineId, options = {}) {
|
||||
return {
|
||||
iniOpfsPath: options.iniOpfsPath ?? machineIniPath(machineId, options.iniFilename),
|
||||
iniWasmPath: options.iniWasmPath ?? DEFAULT_WASM_INI_PATH,
|
||||
parameterOpfsPath:
|
||||
options.parameterOpfsPath ?? parameterFilePath(machineId, options.parameterFilename),
|
||||
parameterWasmPath: options.parameterWasmPath ?? DEFAULT_WASM_PARAMETER_PATH,
|
||||
toolTableOpfsPath:
|
||||
options.toolTableOpfsPath ?? toolTablePath(machineId, options.toolTableFilename),
|
||||
toolTableWasmPath: options.toolTableWasmPath ?? DEFAULT_WASM_TOOL_TABLE_PATH,
|
||||
};
|
||||
}
|
||||
|
||||
export async function loadMachineSessionFromOpfs(interp, machineId, options = {}) {
|
||||
requireSessionSdk(interp);
|
||||
const paths = resolveSessionPaths(machineId, options);
|
||||
const iniText = await loadTextFile(paths.iniOpfsPath, options.storage);
|
||||
interp.writeTextFile(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,
|
||||
});
|
||||
|
||||
return {
|
||||
machineId,
|
||||
ini: {
|
||||
opfsPath: paths.iniOpfsPath,
|
||||
wasmPath: paths.iniWasmPath,
|
||||
},
|
||||
parameters,
|
||||
toolTable,
|
||||
};
|
||||
}
|
||||
46
wasm-port/runtime/opfs/linuxcnc-tool-table-bridge.js
Normal file
46
wasm-port/runtime/opfs/linuxcnc-tool-table-bridge.js
Normal file
@@ -0,0 +1,46 @@
|
||||
import { loadTextFile, saveTextFile } from "./file-service.js";
|
||||
import { toolTablePath } from "./path-model.js";
|
||||
|
||||
const DEFAULT_WASM_TOOL_TABLE_PATH = "/work/tool.tbl";
|
||||
|
||||
function requireToolTableSdk(interp) {
|
||||
for (const method of ["writeTextFile", "readTextFile", "loadToolTable", "saveToolTable"]) {
|
||||
if (typeof interp?.[method] !== "function") {
|
||||
throw new Error(`interpreter SDK is missing ${method}().`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function resolvePaths(machineId, options = {}) {
|
||||
const opfsPath = options.opfsPath ?? toolTablePath(machineId, options.filename);
|
||||
const wasmPath = options.wasmPath ?? DEFAULT_WASM_TOOL_TABLE_PATH;
|
||||
return { opfsPath, wasmPath };
|
||||
}
|
||||
|
||||
export async function loadMachineToolTableFromOpfs(interp, machineId, options = {}) {
|
||||
requireToolTableSdk(interp);
|
||||
const { opfsPath, wasmPath } = resolvePaths(machineId, options);
|
||||
const text = await loadTextFile(opfsPath, options.storage);
|
||||
interp.writeTextFile(wasmPath, text);
|
||||
return {
|
||||
opfsPath,
|
||||
wasmPath,
|
||||
result: interp.loadToolTable(wasmPath),
|
||||
};
|
||||
}
|
||||
|
||||
export async function saveMachineToolTableToOpfs(interp, machineId, options = {}) {
|
||||
requireToolTableSdk(interp);
|
||||
const { opfsPath, wasmPath } = resolvePaths(machineId, options);
|
||||
const result = interp.saveToolTable(wasmPath);
|
||||
const savedText = interp.readTextFile(wasmPath);
|
||||
|
||||
await saveTextFile(opfsPath, savedText, options.storage);
|
||||
|
||||
return {
|
||||
opfsPath,
|
||||
wasmPath,
|
||||
result,
|
||||
savedText,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user