Files
linuxcncWebWASM/web/worker/test_authoritative_kinematics_s7_04.mjs

28 lines
4.8 KiB
JavaScript

import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import createModule from "../../build-wasm/linuxcnc-sim-core.js";
import { compareEndpoints, createEndpoint, endpointHash } from "./endpoint-replay.mjs";
import { SimSession, CONTEXT_ID } from "./sim-session.mjs";
const wasmBinary = await readFile(new URL("../../build-wasm/linuxcnc-sim-core.wasm", import.meta.url));
async function run(id, fast) {
const core = await createModule({ wasmBinary }); const session = new SimSession(core, { sessionId: id });
const base = { schema_version: 1, context_id: CONTEXT_ID, session_id: id }; let seq = 0;
const send = (kind, operation_id, payload = {}) => { seq += 1; const response = session.accept({ ...base, kind, seq, operation_id, payload }); assert.notEqual(response.kind, "ERROR", `${id}:${kind}:${response.payload?.message_key ?? "error"}`); return response; };
send("HELLO", "hello"); send("SESSION_ATTACH", "attach"); send("LOAD_WORKSPACE", "workspace", { root_path: "/workspace", kinematics: "rotarydeltakins" });
send("PROGRAM_LOAD", "program", { source: "G0 X0 Y0 Z-3.793360169\nM2\n", path: "rotarydelta.ngc" }); send("PROGRAM_RUN", "run");
if (fast) send("SIM_STEP", "fast", { cycles: 8 }); else for (let index = 0; index < 8; index += 1) send("SIM_STEP", `step-${index}`, { cycles: 1 });
const endpoint = createEndpoint({ session }); assert.equal(endpoint.authoritative.kinematics.type, "rotarydelta"); endpoint.authoritative.kinematics.joints.forEach((value) => assert.ok(Math.abs(value - 10) < 1e-9));
const checkpoint = session.createCheckpoint(); send("SIM_STEP", "post-checkpoint", { cycles: 1 }); const continuous = createEndpoint({ session }); assert.equal(session.restoreCheckpoint(checkpoint, session.timeline.export(), (operation) => operation).status, "recovered"); const recovery = compareEndpoints(continuous, createEndpoint({ session })); assert.equal(recovery.equal, true, JSON.stringify(recovery));
return { endpoint, checkpoint, recovery };
}
const oneX = await run("authoritative-rotarydelta-1x", false); const fast = await run("authoritative-rotarydelta-fast", true); const mode = compareEndpoints(oneX.endpoint, fast.endpoint); assert.equal(mode.equal, true, JSON.stringify(mode));
const core = await createModule({ wasmBinary }); const singular = new SimSession(core, { sessionId: "authoritative-rotarydelta-singular" }); const base = { schema_version: 1, context_id: CONTEXT_ID, session_id: "authoritative-rotarydelta-singular" }; singular.accept({ ...base, kind: "HELLO", seq: 1, operation_id: "hello" }); singular.accept({ ...base, kind: "SESSION_ATTACH", seq: 2, operation_id: "attach" }); singular.accept({ ...base, kind: "LOAD_WORKSPACE", seq: 3, operation_id: "load", payload: { root_path: "/workspace", kinematics: "rotarydelta" } }); singular.accept({ ...base, kind: "PROGRAM_LOAD", seq: 4, operation_id: "program", payload: { source: "G0 X1 Y0 Z0\nM2\n", path: "singular.ngc" } }); singular.accept({ ...base, kind: "PROGRAM_RUN", seq: 5, operation_id: "run" }); const singularStep = singular.accept({ ...base, kind: "SIM_STEP", seq: 6, operation_id: "step", payload: { cycles: 8 } }); assert.equal(singularStep.kind, "ERROR"); assert.equal(singularStep.payload.message_key, "authoritative_kinematics_singular");
const unsupported = new SimSession(await createModule({ wasmBinary }), { sessionId: "authoritative-rotarydelta-trt" }); const unsupportedBase = { schema_version: 1, context_id: CONTEXT_ID, session_id: "authoritative-rotarydelta-trt" }; unsupported.accept({ ...unsupportedBase, kind: "HELLO", seq: 1, operation_id: "hello" }); unsupported.accept({ ...unsupportedBase, kind: "SESSION_ATTACH", seq: 2, operation_id: "attach" }); const unsupportedResult = unsupported.accept({ ...unsupportedBase, kind: "LOAD_WORKSPACE", seq: 3, operation_id: "trt", payload: { root_path: "/workspace", kinematics: "xyzac-trt" } }); assert.equal(unsupportedResult.kind, "ERROR"); assert.equal(unsupportedResult.payload.code, "authoritative_kinematics_unsupported");
console.log(JSON.stringify({ schema: "authoritative-kinematics-s7-04-sample.v1", status: "verified", context_id: CONTEXT_ID, supported: { type: "rotarydelta", source_family: "rotarydeltakins", pose: [0, 0, -3.793360169], joints: oneX.endpoint.authoritative.kinematics.joints, endpoint_hash: endpointHash(oneX.endpoint) }, parity: { mode, recovery: oneX.recovery }, checkpoint_hash: oneX.checkpoint.checkpoint_hash, singular: { message_key: singularStep.payload.message_key }, unsupported: { type: "xyzac-trt", code: unsupportedResult.payload.code }, geometry: { platform_radius: 10, thigh_length: 10, shin_length: 14, foot_radius: 6 }, boundaries: ["official kinematics oracle remains SOURCE_BLOCKED", "TRT/robot/Hexapod/Pentapod/switch/user remain queued", "missing rdelta HAL resources remain configuration gaps"] }));