rotation vorbereitung

This commit is contained in:
chk
2026-06-10 21:48:44 +02:00
parent 560a4823d4
commit e0e4212a90
9 changed files with 463 additions and 50 deletions

View File

@@ -21,6 +21,10 @@ async function loadPanel(tab, src) {
if (tab === 'camera-npz') initCameraNpz();
else if (tab === 'board') initBoard();
else if (tab === 'robot-x-axis') initXAxis();
else if (tab === 'arm1') initArm('arm1');
else if (tab === 'arm2') initArm('arm2');
else if (tab === 'elbow') initArm('elbow');
else if (tab === 'hand') initArm('hand');
} catch (err) {
document.getElementById('tab-' + tab).innerHTML =
@@ -496,6 +500,75 @@ function initXAxis() {
}
}
// ── Tabs: Arm1 / Arm2 / Elbow / Hand (generisch) ────────────────────────────
// Alle Gelenk-Tabs teilen dieselbe Init-Logik der Tab-Name (arm1, arm2, …)
// wird als Prefix für Element-IDs und Viewer-Frame-ID genutzt.
function initArm(tab) {
const logEl = document.getElementById(`log-${tab}`);
const frameEl = document.getElementById(`${tab}-viewer-frame`);
const runBtn = document.getElementById(`btn-${tab}-run`);
const lastRunEl = document.getElementById(`${tab}-last-run`);
if (!logEl) return; // Panel noch nicht geladen
function log(msg) {
const ts = new Date().toLocaleTimeString('de-CH');
logEl.value += `[${ts}] ${msg}\n`;
logEl.scrollTop = logEl.scrollHeight;
}
// "Board erkennen"-Button
if (runBtn) {
runBtn.addEventListener('click', async () => {
log('Board-Erkennung …');
runBtn.disabled = true;
try {
const response = await fetch('/api/board/run', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({}),
});
if (!response.ok) {
const raw = await response.text().catch(() => '');
let msg;
try { msg = JSON.parse(raw).error || raw; }
catch { msg = raw.slice(0, 300) || `HTTP ${response.status}`; }
log(`❌ HTTP ${response.status}: ${msg}`);
return;
}
await readSseStream(response, log, (evt) => {
if (evt.exitCode === 0) {
log('✅ Board-Run abgeschlossen.');
if (evt.runDir) {
if (lastRunEl) lastRunEl.textContent = evt.runDir;
if (frameEl?.contentWindow) frameEl.contentWindow.postMessage({ type: 'reload' }, '*');
}
} else {
log(`❌ Beendet mit Exit-Code ${evt.exitCode}`);
}
});
} catch (err) {
log(`❌ Fehler: ${err}`);
} finally {
runBtn.disabled = false;
}
});
}
// Achsen-Messung vom Viewer empfangen
window.addEventListener('message', (e) => {
if (!frameEl || e.source !== frameEl.contentWindow) return;
const msg = e.data;
if (msg?.type === 'yaxis-measurement' && Array.isArray(msg.axisDir)) {
const fmt = v => (v >= 0 ? '+' : '') + v.toFixed(3) + '°';
log(`📐 Achse (${msg.numMarkers} Marker): dir=[${msg.axisDir.map(v => v.toFixed(4)).join(', ')}]` +
` XY=${fmt(msg.tiltXY)} YZ=${fmt(msg.tiltYZ)}`);
log(` Referenzpunkt: [${msg.axisPoint.map(v => v.toFixed(1)).join(', ')}] mm`);
}
});
}
// ── Tab: Board (shared helpers) ───────────────────────────────────────────────
/** Befüllt alle Set-Dropdowns aus /api/robot/board-sets */