Turn on Point kann jetzt schon im Admin aufgerufen werden um den Rover in eine Richtug zu drehen

This commit is contained in:
2026-05-29 09:36:53 +02:00
parent 5e39a41f49
commit 4c24558516
3 changed files with 285 additions and 2 deletions
+95
View File
@@ -180,6 +180,24 @@
<button class="act-btn subtle" style="padding:2px 8px;font-size:11px;" onclick="resetHudColor()">Reset</button>
</span>
</div>
<div class="sr">
<span class="sr-led led-off"></span>
<span class="sr-key">Ziel-Heading</span>
<span class="sr-val" style="display:flex;align-items:center;gap:6px;">
<input type="number" id="rotate_target" min="0" max="359" step="1" value="0"
style="width:60px;background:#111;color:#eee;border:1px solid #444;padding:2px 4px;font-size:12px;border-radius:3px;">
<span style="font-size:11px;color:#888;">° (0=N, 90=O, 180=S, 270=W)</span>
</span>
</div>
<div class="act-grid">
<button class="act-btn subtle full" id="rotate_start_btn" onclick="startRotate()">Zu Heading drehen</button>
<button class="act-btn subtle full" id="rotate_stop_btn" onclick="stopRotate()" style="display:none;">Drehung abbrechen</button>
</div>
<div class="sr" id="rotate_status_row" style="display:none;">
<span class="sr-led led-blue" id="rotate_status_led"></span>
<span class="sr-key">Drehung</span>
<strong id="rotate_status_val" class="sr-val">-</strong>
</div>
<div class="sr">
<span class="sr-led led-off"></span>
<span class="sr-key">Hinweis</span>
@@ -2890,6 +2908,83 @@
}
}
var rotatePoller = null;
function updateRotateUi(rotate) {
if (!rotate) return;
var running = rotate.result === 'running';
var startBtn = document.getElementById('rotate_start_btn');
var stopBtn = document.getElementById('rotate_stop_btn');
var row = document.getElementById('rotate_status_row');
var val = document.getElementById('rotate_status_val');
var led = document.getElementById('rotate_status_led');
if (startBtn) startBtn.style.display = running ? 'none' : '';
if (stopBtn) stopBtn.style.display = running ? '' : 'none';
if (row) row.style.display = rotate.result === 'idle' ? 'none' : '';
if (led) {
led.className = 'sr-led ' + (
rotate.result === 'done' ? 'led-ok' :
rotate.result === 'error' ? 'led-warn' :
rotate.result === 'aborted' ? 'led-warn' : 'led-blue'
);
}
if (val) {
var txt = rotate.message || '-';
if (running && rotate.current_deg !== null && rotate.error_deg !== null) {
txt += ' | Ist: ' + rotate.current_deg + '° | Rest: ' + rotate.error_deg + '°';
}
val.textContent = txt;
}
if (!running && rotatePoller) {
clearInterval(rotatePoller);
rotatePoller = null;
}
}
async function startRotate() {
var input = document.getElementById('rotate_target');
var target = parseFloat(input ? input.value : 0);
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})
});
var data = await response.json();
if (!response.ok) throw new Error(data.status || ('status ' + response.status));
updateRotateUi(data.rotate);
setAdminStatus(data.status || 'Drehung gestartet');
if (rotatePoller) clearInterval(rotatePoller);
rotatePoller = setInterval(pollRotateStatus, 300);
} catch (e) {
setAdminStatus('Fehler: ' + (e.message || 'unbekannt'));
alert(e.message || 'Drehung konnte nicht gestartet werden.');
}
}
async function stopRotate() {
setAdminStatus('Stoppe Drehung…');
try {
var response = await fetch(adminApiBase + '/api/imu/rotate-stop', { method: 'POST' });
var data = await response.json();
updateRotateUi(data.rotate);
setAdminStatus(data.status || 'Drehung gestoppt');
} catch (e) {
setAdminStatus('Fehler beim Stoppen');
}
}
async function pollRotateStatus() {
try {
var response = await fetch(adminApiBase + '/api/imu/rotate-status');
if (!response.ok) return;
var data = await response.json();
updateRotateUi(data.rotate);
} catch (e) {}
}
async function fetchDelay() {
try {
var response = await fetch(adminApiBase + '/api/delay');