diff --git a/gui/admin.html b/gui/admin.html index e7b66f8..a6cff26 100644 --- a/gui/admin.html +++ b/gui/admin.html @@ -189,6 +189,21 @@ ° (0=N, 90=O, 180=S, 270=W) +
+ + Dreh-Speed + + + +
@@ -2946,14 +2961,16 @@ async function startRotate() { var input = document.getElementById('rotate_target'); + var speedEl = document.getElementById('rotate_speed'); var target = parseFloat(input ? input.value : 0); + var speedPct = speedEl ? parseInt(speedEl.value) : 20; if (isNaN(target)) { alert('Ungültiger Winkel'); return; } setAdminStatus('Starte Drehung zu ' + target + '°…'); try { var response = await fetch(adminApiBase + '/api/imu/rotate-to', { method: 'POST', headers: {'Content-Type': 'application/json'}, - body: JSON.stringify({target_deg: target}) + body: JSON.stringify({target_deg: target, speed_pct: speedPct}) }); var data = await response.json(); if (!response.ok) throw new Error(data.status || ('status ' + response.status)); diff --git a/scripts/exomy_admin_api.py b/scripts/exomy_admin_api.py index 96abdae..588b1b0 100644 --- a/scripts/exomy_admin_api.py +++ b/scripts/exomy_admin_api.py @@ -2319,10 +2319,12 @@ class Handler(http.server.BaseHTTPRequestHandler): self.write_json(status_code, response) return + if self.path == '/api/imu/rotate-to': try: payload = json.loads(raw_body.decode('utf-8')) target_deg = float(payload.get('target_deg', 0)) + speed_pct = max(20, min(50, int(payload.get('speed_pct', 20)))) except (UnicodeDecodeError, json.JSONDecodeError, TypeError, ValueError): self.write_json(400, {'status': 'Ungültige Anfrage'}) return @@ -2333,10 +2335,12 @@ class Handler(http.server.BaseHTTPRequestHandler): return import imu_rotate heading_offset = read_imu_heading_calibration()['offset_deg'] + vel = max(1, int(100.0 * (speed_pct / 100.0) ** 2.0)) status = imu_rotate.start_rotate( target_deg=target_deg, heading_offset=heading_offset, restore_mode=LAST_LOCOMOTION_MODE, + vel=vel, ) self.write_json(200, {'status': 'Drehung gestartet', 'rotate': status}) return