Turn on Point kann jetzt schon im Admin aufgerufen werden um den Rover in eine Richtug zu drehen
This commit is contained in:
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user