Implement AXIS parity UI and execution baseline
This commit is contained in:
@@ -4,18 +4,26 @@ const EMPTY_STATE = Object.freeze({
|
||||
status: "disconnected",
|
||||
alarm: null,
|
||||
mode: null,
|
||||
program: null,
|
||||
snapshot: null,
|
||||
lastCommand: null,
|
||||
error: null,
|
||||
diagnostic: null,
|
||||
motion: null,
|
||||
devices: null,
|
||||
hal: null,
|
||||
plc: null,
|
||||
python: null,
|
||||
io_ack: null,
|
||||
});
|
||||
|
||||
export function reduceWorkerState(state = EMPTY_STATE, message) {
|
||||
if (!message || typeof message !== "object") return { ...state, error: "worker_message_invalid" };
|
||||
if (message.kind === "ERROR") return { ...state, status: "error", error: message.payload?.code ?? "worker_error", alarm: message.payload?.message_key ?? null };
|
||||
if (message.kind === "ERROR") return { ...state, status: "error", error: message.payload?.code ?? "worker_error", alarm: message.payload?.message_key ?? null, diagnostic: { code: message.payload?.code ?? "worker_error", line: message.payload?.line ?? message.payload?.source_line ?? null, column: message.payload?.column ?? null, text: message.payload?.text ?? null } };
|
||||
if (message.kind === "CAPABILITIES") return { ...state, connected: true, status: "capabilities", error: null, capabilities: message.payload };
|
||||
if (message.kind === "SESSION_READY") return { ...state, connected: true, status: "ready", tick: message.simulation_tick ?? state.tick, error: null };
|
||||
if (message.kind === "STATE_SNAPSHOT") return { ...state, status: "snapshot", tick: message.payload?.tick ?? message.simulation_tick ?? state.tick, snapshot: message.payload, error: null };
|
||||
if (message.kind === "COMMAND_RESULT") return { ...state, status: message.payload?.status ?? "verified", tick: message.simulation_tick ?? state.tick, lastCommand: message.payload?.command ?? null, snapshot: message.payload?.snapshot ?? state.snapshot, error: null };
|
||||
if (message.kind === "SESSION_READY") return { ...state, connected: true, status: "ready", mode: message.payload?.task?.mode ?? state.mode, tick: message.simulation_tick ?? state.tick, error: null };
|
||||
if (message.kind === "STATE_SNAPSHOT") return { ...state, status: "snapshot", mode: message.payload?.task?.mode ?? state.mode, tick: message.payload?.tick ?? message.simulation_tick ?? state.tick, snapshot: message.payload, program: message.payload?.snapshot?.state?.program ?? state.program, motion: message.payload?.motion ?? state.motion, devices: message.payload?.devices ?? state.devices, hal: message.payload?.hal ?? state.hal, plc: message.payload?.plc ?? state.plc, python: message.payload?.python ?? state.python, io_ack: message.payload?.io_ack ?? state.io_ack, error: null };
|
||||
if (message.kind === "COMMAND_RESULT") return { ...state, status: message.payload?.status ?? "verified", mode: message.payload?.task?.mode ?? state.mode, tick: message.simulation_tick ?? state.tick, lastCommand: message.payload?.command ?? null, snapshot: message.payload?.snapshot ?? state.snapshot, program: message.payload?.program ?? message.payload?.snapshot?.state?.program ?? state.program, motion: message.payload?.motion ?? state.motion, devices: message.payload?.devices ?? state.devices, hal: message.payload?.hal ?? state.hal, plc: message.payload?.plc ?? state.plc, python: message.payload?.python ?? state.python, io_ack: message.payload?.io_ack ?? state.io_ack, error: null };
|
||||
if (message.kind === "ALARM") return { ...state, status: "alarm", alarm: message.payload, error: message.payload?.code ?? null };
|
||||
return { ...state, tick: message.simulation_tick ?? state.tick };
|
||||
}
|
||||
@@ -27,9 +35,23 @@ export function renderStatePanel(document, state) {
|
||||
title.className = "panel-title";
|
||||
title.textContent = "Machine state";
|
||||
section.append(title);
|
||||
const dro = document.createElement("div");
|
||||
dro.className = "dro-readout";
|
||||
const positionState = state.program?.state ?? state.motion?.state?.position ?? {};
|
||||
for (const axis of ["x", "y", "z"]) {
|
||||
const row = document.createElement("div");
|
||||
row.className = "dro-row";
|
||||
const name = document.createElement("span"); name.className = "dro-axis"; name.textContent = axis.toUpperCase();
|
||||
const value = document.createElement("strong"); value.textContent = Number.isFinite(positionState[axis]) ? Number(positionState[axis]).toFixed(3) : "0.000";
|
||||
row.append(name, value); dro.append(row);
|
||||
}
|
||||
section.append(dro);
|
||||
const grid = document.createElement("dl");
|
||||
grid.className = "state-grid";
|
||||
const fields = [["Connection", state.connected ? "Connected" : "Disconnected"], ["Status", state.status], ["Tick", String(state.tick)], ["Mode", state.mode ?? "-"], ["Alarm", state.alarm ? (typeof state.alarm === "string" ? state.alarm : JSON.stringify(state.alarm)) : "None"]];
|
||||
const program = state.program;
|
||||
const position = program?.state ? `X ${program.state.x} | Y ${program.state.y} | Z ${program.state.z}` : "-";
|
||||
const diagnostic = state.diagnostic ? `${state.diagnostic.code}${state.diagnostic.line ? ` @${state.diagnostic.line}` : ""}${state.diagnostic.column ? `:${state.diagnostic.column}` : ""}` : "None";
|
||||
const fields = [["Connection", state.connected ? "Connected" : "Disconnected"], ["Status", state.status], ["Tick", String(state.tick)], ["Program", program?.program_status ?? "-"], ["Line", program ? `${program.line}/${program.line_count}` : "-"], ["Position", position], ["Mode", state.mode ?? "-"], ["Motion", state.motion?.state?.fault ?? state.motion?.fault ?? "Ready"], ["HAL", state.hal?.status ?? "-"], ["PLC", state.plc?.state?.last_error ?? state.plc?.last_error ?? "-"], ["Python", state.python?.state?.errors?.length ?? state.python?.errors?.length ?? 0], ["IO ack", state.io_ack?.commands?.length ?? 0], ["Alarm", state.alarm ? (typeof state.alarm === "string" ? state.alarm : JSON.stringify(state.alarm)) : "None"], ["Diagnostic", diagnostic]];
|
||||
for (const [name, value] of fields) {
|
||||
const term = document.createElement("dt"); term.textContent = name;
|
||||
const detail = document.createElement("dd"); detail.textContent = value;
|
||||
|
||||
Reference in New Issue
Block a user