结论:接入 LinuxCNC iniFindBool 到 INI WASM/SDK,并让 machine-session bridge 通过 vendored INI 解析 [EMCIO]RANDOM_TOOLCHANGER 后透传给 tooldata;native、WASM、OPFS 和浏览器 smoke 验证已通过。
85 lines
2.1 KiB
JavaScript
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),
|
|
]),
|
|
);
|
|
},
|
|
};
|
|
}
|