import assert from "node:assert/strict"; import { readFile } from "node:fs/promises"; import { applyIniConfigToProfile, parseLinuxCncIni, } from "../../app/src/runtime/linuxcnc-ini-runtime.js"; import { xyzacTrtProfile } from "../../app/src/profiles/xyzac-trt.js"; import { xyzbcTrtProfile } from "../../app/src/profiles/xyzbc-trt.js"; const xyzacIniText = await readFile( new URL("../../../wasm-port/vendor/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", import.meta.url), "utf8", ); const xyzbcIniText = await readFile( new URL("../../../wasm-port/vendor/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", import.meta.url), "utf8", ); const xyzacIni = parseLinuxCncIni(xyzacIniText, { path: xyzacTrtProfile.iniPath, profileId: xyzacTrtProfile.id, }); assert.equal(xyzacIni.apiName, "web-rtcp-5axis-linuxcnc-ini-config"); assert.equal(xyzacIni.validation.ready, true); assert.equal(xyzacIni.machineName, "sim-xyzac-trt-kins (switchkins)"); assert.equal(xyzacIni.kinematics.name, "xyzac-trt-kins"); assert.equal(xyzacIni.kinematicsParameters.sparm, "identityfirst"); assert.equal(xyzacIni.kinematicsParameters.joints, 5); assert.equal(xyzacIni.traj.coordinates, "XYZAC"); assert.equal(xyzacIni.rs274ngc.halPinVars, true); assert.equal(xyzacIni.rs274ngc.parameterFile, "xyzac.var"); assert.equal(xyzacIni.hal.halFiles.includes("LIB:basic_sim.tcl"), true); assert.equal(xyzacIni.hal.postguiHalFiles.includes("switchkins_postgui.hal"), true); assert.equal(xyzacIni.hal.halcmd.some((line) => line.includes("motion.analog-out-03") && line.includes("motion.switchkins-type")), true); assert.equal(xyzacIni.emcmot.module, "motmod"); assert.equal(xyzacIni.emcmot.servoPeriodNs, 1000000); assert.equal(xyzacIni.task.module, "milltask"); assert.equal(xyzacIni.task.cycleTimeSeconds, 0.01); assert.equal(xyzacIni.emcio.toolTable, "xyzac-trt.tbl"); assert.equal(xyzacIni.axisLimits.A.max, 50); assert.equal(xyzacIni.jointConfig[3].axis, "A"); assert.equal(xyzacIni.jointConfig[4].max, 36000); assert.deepEqual(xyzacIni.halui.mdiCommands, ["M429", "M428", "M430"]); assert.equal(xyzacIni.rs274ngc.remaps.map((remap) => remap.code).join(","), "M428,M429,M430"); assert.equal(xyzacIni.hal.initialSets.some((set) => set.pin === "y-offset" && set.value === 20), true); const derivedXyzac = applyIniConfigToProfile(xyzacTrtProfile, xyzacIni); assert.equal(derivedXyzac.machineName, xyzacIni.machineName); assert.equal(derivedXyzac.traj.coordinates, "XYZAC"); assert.equal(derivedXyzac.axisLimits.X.min, -200); assert.equal(derivedXyzac.jointConfig.length, 5); assert.equal(derivedXyzac.linuxCncIniConfig.path.endsWith("xyzac-trt.ini"), true); const xyzbcIni = parseLinuxCncIni(xyzbcIniText, { path: xyzbcTrtProfile.iniPath, profileId: xyzbcTrtProfile.id, }); assert.equal(xyzbcIni.validation.ready, true); assert.equal(xyzbcIni.kinematics.name, "xyzbc-trt-kins"); assert.equal(xyzbcIni.kinematicsModuleId, "xyzbc-trt"); assert.equal(xyzbcIni.traj.coordinates, "XYZBC"); assert.equal(xyzbcIni.rs274ngc.parameterFile, "xyzbc.var"); assert.equal(xyzbcIni.emcio.toolTable, "xyzbc-trt.tbl"); assert.equal(xyzbcIni.axisLimits.B.max, 36000); assert.equal(xyzbcIni.jointConfig[3].axis, "B"); assert.equal(xyzbcIni.kinematicsParameters.switchkinsTypes[1].webKinsType, "tcp-xyzbc"); const missingHalPinVarsIni = parseLinuxCncIni(xyzacIniText.replace(/^\s*HAL_PIN_VARS\s*=\s*1$/m, ""), { path: xyzacTrtProfile.iniPath, profileId: xyzacTrtProfile.id, }); assert.equal(missingHalPinVarsIni.validation.ready, false); assert.equal(missingHalPinVarsIni.validation.missing.includes("RS274NGC.HAL_PIN_VARS=1"), true); const missingTaskIni = parseLinuxCncIni(xyzacIniText.replace(/\n\[TASK\][\s\S]*?(?=\n\[EMCIO\])/m, "\n"), { path: xyzacTrtProfile.iniPath, profileId: xyzacTrtProfile.id, }); assert.equal(missingTaskIni.validation.ready, false); assert.equal(missingTaskIni.validation.missing.includes("[TASK]"), true); assert.equal(missingTaskIni.validation.missing.includes("TASK.CYCLE_TIME"), true); console.log("linuxcnc_ini_runtime_smoke=ok");