Support XYZAC and XYZBC in shared web machine UI

This commit is contained in:
2026-09-11 06:25:13 +08:00
parent aac1ceb250
commit 02dcc573b0
20 changed files with 318 additions and 146 deletions

View File

@@ -1,7 +1,9 @@
import type { XyzacCapabilitySnapshot, XyzacKinematicsSnapshot } from "./protocol";
import { DEFAULT_MACHINE, MACHINE_DEFINITIONS } from "../../workspace/machine-definitions.mjs";
export const XYZAC_CASE = "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini" as const;
export const XYZAC_AXES = ["x", "y", "z", "a", "c"] as const;
export const MACHINE_CASES = MACHINE_DEFINITIONS;
export const XYZAC_CASE = DEFAULT_MACHINE.entrypoint;
export const XYZAC_AXES: readonly string[] = DEFAULT_MACHINE.axes;
export const XYZAC_COMMANDS = {
power: "POWER",
selectKinematics: "KINEMATICS_SELECT",
@@ -25,6 +27,7 @@ export type XyzacPanelView = {
joints: number[];
gates: Record<string, XyzacGate>;
recovery: Record<string, unknown> | null;
machine: typeof DEFAULT_MACHINE;
};
type XyzacPanelSource = {
@@ -38,13 +41,18 @@ type XyzacPanelSource = {
};
export function projectXyzacPanel(snapshot: XyzacPanelSource | null | undefined): XyzacPanelView {
const kinematics = snapshot?.kinematics?.coordinates === "XYZAC" && snapshot.kinematics.joint_count === 5 ? snapshot.kinematics : null;
const capability = snapshot?.xyzac?.coordinates === "XYZAC" && snapshot.xyzac.joint_count === 5 ? snapshot.xyzac : null;
const rawKinematics = snapshot?.kinematics;
const rawCapability = snapshot?.xyzac;
const machine = MACHINE_DEFINITIONS.find((entry) => entry.coordinates === rawKinematics?.coordinates) ?? DEFAULT_MACHINE;
const kinematics = rawKinematics && rawKinematics.coordinates === machine.coordinates && rawKinematics.joint_count === machine.joint_count ? rawKinematics : null;
const capability = rawCapability && rawCapability.coordinates === machine.coordinates && rawCapability.joint_count === machine.joint_count ? rawCapability : null;
const visualPose = snapshot?.visual?.pose;
const pose = visualPose && [visualPose.x, visualPose.y, visualPose.z, visualPose.a, visualPose.c].every((value) => Number.isFinite(value))
const poseAxes = [...machine.coordinates.toLowerCase()];
const pose = visualPose && poseAxes.every((axis) => Number.isFinite(visualPose[axis]))
? { ...(kinematics?.pose ?? { x: 0, y: 0, z: 0, a: 0, b: 0, c: 0, u: 0, v: 0, w: 0 }), ...visualPose }
: kinematics?.pose ?? null;
const joints = snapshot?.visual?.joints?.length === 5 ? snapshot.visual.joints.slice(0, 5) : kinematics?.joints ? [...kinematics.joints] : [];
const visualJoints = snapshot?.visual?.joints;
const joints = visualJoints?.length === machine.joint_count ? visualJoints.slice(0, machine.joint_count) : kinematics?.joints ? [...kinematics.joints] : [];
return {
status: kinematics && capability ? "ready" : "unavailable",
tick: snapshot?.simulation_tick ?? 0,
@@ -55,5 +63,6 @@ export function projectXyzacPanel(snapshot: XyzacPanelSource | null | undefined)
joints,
gates: snapshot?.gates ?? {},
recovery: (snapshot?.authoritative?.recovery as Record<string, unknown> | undefined) ?? null,
machine,
};
}