/** * robotActions.js – Roboter-Bewegungsaktionen * * Alle Bewegungsbefehle laufen hier durch, bevor sie ans Roboter-Backend * weitergeleitet werden (ROBOT_URL). Solange ROBOT_URL nicht konfiguriert * ist, werden die Aktionen nur geloggt und eine Stub-Antwort zurückgegeben. * * Joint-Namen: 'x-axis' | 'arm1' | 'arm2' | 'elbow' | 'hand' * Directions: 'left' | 'right' (x-axis, linear) * 'cw' | 'ccw' (alle Gelenke, rotatorisch) */ const ROBOT_URL = process.env.ROBOT_URL || ''; // ── Validierung ─────────────────────────────────────────────────────────────── const VALID_JOINTS = new Set(['x-axis', 'arm1', 'arm2', 'elbow', 'hand']); const VALID_DIRECTIONS = new Set(['left', 'right', 'cw', 'ccw']); function validateMove({ joint, direction, steps = 1 }) { if (!joint) return '"joint" fehlt'; if (!direction) return '"direction" fehlt'; if (!VALID_JOINTS.has(joint)) return `Unbekanntes Joint: "${joint}"`; if (!VALID_DIRECTIONS.has(direction)) return `Unbekannte Richtung: "${direction}"`; if (typeof steps !== 'number' || steps < 1 || steps > 100) return '"steps" muss eine Zahl zwischen 1 und 100 sein'; return null; // ok } // ── Ausführung ──────────────────────────────────────────────────────────────── /** * Sendet einen Bewegungsbefehl. * Gibt { ok, joint, direction, steps, message } zurück oder wirft einen Fehler. */ export async function executeMove({ joint, direction, steps = 1 }) { const err = validateMove({ joint, direction, steps }); if (err) throw Object.assign(new Error(err), { statusCode: 400 }); const payload = { joint, direction, steps }; console.log(`[robotActions] move: ${JSON.stringify(payload)}`); if (ROBOT_URL) { // ── Weiterleitung an das Roboter-Backend ───────────────────────────────── const url = new URL('/api/move', ROBOT_URL).toString(); const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); if (!res.ok) { const text = await res.text().catch(() => ''); throw Object.assign( new Error(`Robot-Backend: ${res.status} – ${text}`), { statusCode: 502 } ); } const data = await res.json(); return { ok: true, joint, direction, steps, ...data }; } // ── Stub (ROBOT_URL nicht konfiguriert) ─────────────────────────────────── const label = joint === 'x-axis' ? `X-Achse ${direction === 'left' ? '⬅' : '➡'}` : `${joint} ${direction === 'ccw' ? '↺ Rauf' : 'Runter ↻'}`; const message = `[Stub] ${label} – ${steps} Schritt(e). ROBOT_URL nicht konfiguriert.`; console.warn(`[robotActions] ${message}`); return { ok: true, stub: true, joint, direction, steps, message }; }