按源清理OPFS参数scratch

结论:依据 LinuxCNC rs274ngc_pre.cc restore_parameters() 只读取配置参数文件、interp_internal.hh 默认 rs274ngc.var/.bak 常量,浏览器 OPFS loadParameterFile 在加载存在的参数文件前清理 rs274ngc.var.new/.bak scratch,避免旧 WASM mirror 污染;缺失文件路径继续清空 scratch 并返回 null。

检查:./test-native.sh 通过;./test-linuxcnc-source-link.sh 通过。
This commit is contained in:
cnc
2026-06-06 11:47:33 +08:00
parent 92562db29f
commit 4e246738ac
2 changed files with 22 additions and 27 deletions

View File

@@ -499,6 +499,7 @@ function installOpfsWorkspace(module, options) {
assertRelativePath(path); assertRelativePath(path);
try { try {
const data = await readOpfsFile(workspacePath, path); const data = await readOpfsFile(workspacePath, path);
cleanupLinuxCncParameterFiles(module);
writeWasmFileReplacingPath(module, LINUXCNC_DEFAULT_PARAMETER_FILE, data); writeWasmFileReplacingPath(module, LINUXCNC_DEFAULT_PARAMETER_FILE, data);
writeWasmFileReplacingPath(module, `/${LINUXCNC_DEFAULT_PARAMETER_FILE}`, data); writeWasmFileReplacingPath(module, `/${LINUXCNC_DEFAULT_PARAMETER_FILE}`, data);
return data; return data;

View File

@@ -3,6 +3,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) {
expectErrorContaining, expectErrorContaining,
expectEvent, expectEvent,
expectIncludes, expectIncludes,
expectLinuxCncParameterScratchMissing,
expectMissingOpfsFile, expectMissingOpfsFile,
expectMissingWasmPath, expectMissingWasmPath,
expectNoEvent, expectNoEvent,
@@ -11,12 +12,19 @@ export async function runBrowserOpfsParameterSections(context, simulator) {
expectWasmFilesMissing, expectWasmFilesMissing,
near, near,
readOpfsText, readOpfsText,
readWasmText,
removeWasmPathIfExists, removeWasmPathIfExists,
runSection, runSection,
withSmokeSimulator, withSmokeSimulator,
} = context; } = context;
const backend = { backend: "linuxcnc-rs274" }; const backend = { backend: "linuxcnc-rs274" };
const parseWithParameters = (program, path) => simulator.parseWithParameterFile(program, path, "linuxcnc", backend); const parseWithParameters = (program, path) => simulator.parseWithParameterFile(program, path, "linuxcnc", backend);
const g28BranchProgram = "G21 G90\nF100\nO10 if [#5161 EQ 1]\nG1 X9\nO10 endif\n";
const writeDefaultScratch = (main, temporary, backup) => {
simulator.fs.module.FS.writeFile("rs274ngc.var", main);
simulator.fs.module.FS.writeFile("rs274ngc.var.new", temporary);
simulator.fs.module.FS.writeFile("rs274ngc.var.bak", backup);
};
await runSection("opfs parameter save", async () => { await runSection("opfs parameter save", async () => {
await simulator.parseWithParameterFile("G21 G90\nG0 X1\nG28.1\nM30\n", "parameters/rs274ngc.var", "linuxcnc", backend); await simulator.parseWithParameterFile("G21 G90\nG0 X1\nG28.1\nM30\n", "parameters/rs274ngc.var", "linuxcnc", backend);
@@ -263,37 +271,23 @@ export async function runBrowserOpfsParameterSections(context, simulator) {
await runSection("opfs stale parameter state cleanup", async () => { await runSection("opfs stale parameter state cleanup", async () => {
await simulator.fs.opfs.writeFile("parameters/stale-state.var", "5161\t1.000000\n"); await simulator.fs.opfs.writeFile("parameters/stale-state.var", "5161\t1.000000\n");
const staleStateEvents = await simulator.parseWithParameterFile( const staleStateEvents = await simulator.parseWithParameterFile(g28BranchProgram, "parameters/stale-state.var", "linuxcnc", backend);
"G21 G90\nF100\nO10 if [#5161 EQ 1]\nG1 X9\nO10 endif\n", expectEvent(staleStateEvents, (event) => event.type === "linear-feed" && near(event.end.x, 9), "LinuxCNC did not honor the loaded OPFS parameter state");
"parameters/stale-state.var",
"linuxcnc",
backend,
);
expectEvent(staleStateEvents, (event) => event.type === "linear-feed" && near(event.end.x, 9),
"LinuxCNC did not honor the loaded OPFS parameter state");
await simulator.fs.opfs.removeFile("parameters/stale-state.var"); await simulator.fs.opfs.removeFile("parameters/stale-state.var");
const missingStateEvents = await simulator.parseWithParameterFile( const missingStateEvents = await simulator.parseWithParameterFile(g28BranchProgram, "parameters/stale-state.var", "linuxcnc", backend);
"G21 G90\nF100\nO10 if [#5161 EQ 1]\nG1 X9\nO10 endif\n", expectNoEvent(missingStateEvents, (event) => event.type === "linear-feed" && near(event.end.x, 9), "LinuxCNC stale OPFS parameter state was not cleared when the file was missing");
"parameters/stale-state.var", // LinuxCNC source basis: rs274ngc_pre.cc restore_parameters() ignores
"linuxcnc", // missing files and reads only the configured parameter file.
backend, writeDefaultScratch("5161\t1.000000\n", "stale temporary parameter file\n", "stale backup parameter file\n");
);
expectNoEvent(missingStateEvents, (event) => event.type === "linear-feed" && near(event.end.x, 9),
"LinuxCNC stale OPFS parameter state was not cleared when the file was missing");
// LinuxCNC source basis: rs274ngc_pre.cc restore_parameters()
// treats a missing parameter file as OK; the browser OPFS bridge
// must not leave stale default parameter files in the WASM mirror.
simulator.fs.module.FS.writeFile("rs274ngc.var", "5161\t1.000000\n");
simulator.fs.module.FS.writeFile("rs274ngc.var.new", "stale temporary parameter file\n");
simulator.fs.module.FS.writeFile("rs274ngc.var.bak", "stale backup parameter file\n");
const missingLoad = await simulator.fs.opfs.loadParameterFile("parameters/load-missing.var"); const missingLoad = await simulator.fs.opfs.loadParameterFile("parameters/load-missing.var");
if (missingLoad !== null) { if (missingLoad !== null) {
throw new Error("missing OPFS parameter file did not return null"); throw new Error("missing OPFS parameter file did not return null");
} }
expectWasmFilesMissing( expectLinuxCncParameterScratchMissing(simulator, (parameterPath) => `missing OPFS parameter load left stale WASM file ${parameterPath}`);
simulator.fs.module.FS, writeDefaultScratch("5161\t7.000000\n", "stale successful-load temporary parameter file\n", "stale successful-load backup parameter file\n");
["rs274ngc.var", "rs274ngc.var.new", "rs274ngc.var.bak"], await simulator.fs.opfs.writeFile("parameters/load-existing.var", "5161\t2.000000\n");
(parameterPath) => `missing OPFS parameter load left stale WASM file ${parameterPath}`, await simulator.fs.opfs.loadParameterFile("parameters/load-existing.var");
); expectText(readWasmText(simulator, "rs274ngc.var"), "5161\t2.000000\n", "existing OPFS parameter load did not replace the LinuxCNC default parameter file");
expectWasmFilesMissing(simulator.fs.module.FS, ["rs274ngc.var.new", "rs274ngc.var.bak"], (parameterPath) => `existing OPFS parameter load left stale WASM file ${parameterPath}`);
}); });
} }