Files
cnc_wams/wasm-port/runtime/sdk/src/linuxcnc-ini.js
wangdequan cf0887e0e7 按规划继续工作
结论:接入 LinuxCNC iniFindBool 到 INI WASM/SDK,并让 machine-session bridge 通过 vendored INI 解析 [EMCIO]RANDOM_TOOLCHANGER 后透传给 tooldata;native、WASM、OPFS 和浏览器 smoke 验证已通过。
2026-06-08 08:49:38 +08:00

85 lines
2.1 KiB
JavaScript

import createLinuxCncIniModule from "../../ui/ini-panel/linuxcnc_ini.js";
function allocCString(mod, value) {
const bytes = mod.lengthBytesUTF8(value) + 1;
const ptr = mod._malloc(bytes);
mod.stringToUTF8(value, ptr, bytes);
return ptr;
}
function ensureParentPath(mod, path) {
const parts = path.split("/").filter(Boolean);
let current = "";
for (const part of parts.slice(0, -1)) {
current += `/${part}`;
try {
mod.FS.mkdir(current);
} catch {
// Directory already exists.
}
}
}
export async function createLinuxCncIniSdk(moduleOptions = {}) {
const mod = await createLinuxCncIniModule(moduleOptions);
return {
module: mod,
writeTextFile(path, text) {
ensureParentPath(mod, path);
mod.FS.writeFile(path, text, { encoding: "utf8" });
},
getString(path, section, tag) {
const pathPtr = allocCString(mod, path);
const sectionPtr = allocCString(mod, section);
const tagPtr = allocCString(mod, tag);
const outSize = 2048;
const outPtr = mod._malloc(outSize);
try {
const rc = mod._lcini_get_string(
pathPtr,
sectionPtr,
tagPtr,
outPtr,
outSize,
);
return rc === 0 ? mod.UTF8ToString(outPtr) : null;
} finally {
mod._free(pathPtr);
mod._free(sectionPtr);
mod._free(tagPtr);
mod._free(outPtr);
}
},
getBool(path, section, tag) {
const pathPtr = allocCString(mod, path);
const sectionPtr = allocCString(mod, section);
const tagPtr = allocCString(mod, tag);
const outPtr = mod._malloc(4);
try {
const rc = mod._lcini_get_bool(pathPtr, sectionPtr, tagPtr, outPtr);
return rc === 0 ? mod.HEAP32[outPtr >> 2] !== 0 : null;
} finally {
mod._free(pathPtr);
mod._free(sectionPtr);
mod._free(tagPtr);
mod._free(outPtr);
}
},
getFields(path, fields) {
return Object.fromEntries(
Object.entries(fields).map(([name, query]) => [
name,
this.getString(path, query.section, query.tag),
]),
);
},
};
}