按规划继续工作

结论:补齐 LinuxCNC tooldata_common.cc 随机换刀器 load/save 验证边界,WASM/SDK/OPFS 只透传 random-toolchanger 配置;native、WASM、OPFS 和浏览器 smoke 验证已通过。
This commit is contained in:
2026-06-08 08:39:26 +08:00
parent a16f3605fa
commit 3f4eb06b47
12 changed files with 211 additions and 28 deletions

View File

@@ -172,6 +172,13 @@ void append_tool_table_state(std::ostringstream &output)
if (standalone::get_tool_entry(&tool, 2) == 0) {
append_tool_entry(output, "tool_2", tool);
}
for (int idx = 0; idx < CANON_POCKETS_MAX; ++idx) {
if (standalone::get_tool_entry(&tool, idx) == 0 && tool.toolno != -1) {
std::ostringstream prefix;
prefix << "tool_pocket_" << idx;
append_tool_entry(output, prefix.str().c_str(), tool);
}
}
output << "tool_index_for_tool_2=" << standalone::find_tool_index_for_tool(2) << "\n";
}
@@ -196,6 +203,20 @@ void apply_parameter_assignments(Interp &interp, const char *assignments)
}
}
char *load_tool_table_with_mode(const char *path, bool random_tool_changer)
{
standalone::reset_tool_adapter();
tooldata_init(random_tool_changer);
tooldata_set_db(DB_NOTUSED);
std::ostringstream output;
output << "tooldata_random_toolchanger=" << (random_tool_changer ? 1 : 0) << "\n";
const int rc = tooldata_load(path);
output << "tooldata_load=" << rc << "\n";
append_tool_table_state(output);
return copy_result(output.str());
}
} // namespace
extern "C" {
@@ -350,15 +371,13 @@ char *lcinterp_save_parameters(const char *path, const char *assignments)
EMSCRIPTEN_KEEPALIVE
char *lcinterp_load_tool_table(const char *path)
{
standalone::reset_tool_adapter();
tooldata_init(false);
tooldata_set_db(DB_NOTUSED);
return load_tool_table_with_mode(path, false);
}
std::ostringstream output;
const int rc = tooldata_load(path);
output << "tooldata_load=" << rc << "\n";
append_tool_table_state(output);
return copy_result(output.str());
EMSCRIPTEN_KEEPALIVE
char *lcinterp_load_tool_table_random(const char *path)
{
return load_tool_table_with_mode(path, true);
}
EMSCRIPTEN_KEEPALIVE

View File

@@ -45,6 +45,7 @@ export async function loadMachineSessionFromOpfs(interp, machineId, options = {}
storage: options.storage,
opfsPath: paths.toolTableOpfsPath,
wasmPath: paths.toolTableWasmPath,
randomToolChanger: options.randomToolChanger === true,
});
return {

View File

@@ -25,7 +25,9 @@ export async function loadMachineToolTableFromOpfs(interp, machineId, options =
return {
opfsPath,
wasmPath,
result: interp.loadToolTable(wasmPath),
result: interp.loadToolTable(wasmPath, {
randomToolChanger: options.randomToolChanger === true,
}),
};
}

View File

@@ -40,7 +40,11 @@ vendored LinuxCNC RS274NGC sources and exposes:
- `runFileWithIni(path, iniPath)`
- `restoreParameters(path)`
- `saveParameters(path, values)`
- `loadToolTable(path)`
- `loadToolTable(path, options)`
- `saveToolTable(path)`
- `writeTextFile(path, text)`
- `readTextFile(path)`
`loadToolTable()` accepts `{ randomToolChanger: true }` to select the
LinuxCNC random-toolchanger branch before calling vendored
`tooldata_load()`. The SDK only forwards that runtime boundary flag.

View File

@@ -85,8 +85,11 @@ export async function createLinuxCncInterpSdk(moduleOptions = {}) {
return callStringResult(mod, "lcinterp_save_parameters", path, assignments);
},
loadToolTable(path) {
return callStringResult(mod, "lcinterp_load_tool_table", path);
loadToolTable(path, options = {}) {
const functionName = options.randomToolChanger
? "lcinterp_load_tool_table_random"
: "lcinterp_load_tool_table";
return callStringResult(mod, functionName, path);
},
saveToolTable(path) {