// Dashcam page: scan for a USB dashcam, then trigger importing its videos. // Uses plain fetch() (not socket.io / yaris.js) since this is a one-shot // request/response flow, not a live data stream, and yaris.js assumes DOM // elements (#map, #speedGraph) that don't exist on this page. const deviceStatus = document.getElementById('dash-device-status'); const importStatus = document.getElementById('dash-import-status'); const scanBtn = document.getElementById('dash-scan-btn'); const importBtn = document.getElementById('dash-import-btn'); function describeDevice(device) { const label = device.label ? ` "${device.label}"` : ''; return `${device.path}${label} (${device.size}, ${device.fstype || 'unknown fs'})`; } function scanForDashcam() { deviceStatus.textContent = 'Scanning...'; importBtn.disabled = true; fetch('/api/dash/devices') .then(response => response.json()) .then(data => { const devices = data.devices || []; if (devices.length === 0) { deviceStatus.textContent = 'No USB dashcam/storage device detected. Plug it in and scan again.'; return; } deviceStatus.textContent = 'Detected: ' + devices.map(describeDevice).join(', '); importBtn.disabled = false; }) .catch(err => { deviceStatus.textContent = 'Error while scanning: ' + err; }); } function importDashcam() { importStatus.textContent = 'Importing... this can take a while for large videos.'; importBtn.disabled = true; fetch('/api/dash/import', { method: 'POST' }) .then(response => response.json()) .then(summary => { if (summary.status !== 'ok') { importStatus.textContent = summary.message || ('Import failed: ' + summary.status); return; } let text = `Found ${summary.found} video(s), copied ${summary.copied}, skipped ${summary.skipped} (already imported).`; if (summary.errors && summary.errors.length > 0) { text += ` Errors: ${summary.errors.join('; ')}`; } importStatus.textContent = text; }) .catch(err => { importStatus.textContent = 'Error while importing: ' + err; }) .finally(() => { importBtn.disabled = false; }); } scanBtn.addEventListener('click', scanForDashcam); importBtn.addEventListener('click', importDashcam); // Auto-scan once when the page loads. scanForDashcam(); // --- Remote server upload status/toggle --- const uploadStatusEl = document.getElementById('upload-status'); const dashcamToggle = document.getElementById('dashcam-upload-toggle'); function describeUploadStatus(status) { if (!status.configured) { return 'Remote server not configured on this device (see db/upload_creds.env).'; } let text = `Pending trip-log rows to upload: ${status.pending_tracking_rows}.`; if (status.last_success_at) { text += ` Last successful upload: ${status.last_success_at}.`; } if (status.last_error) { text += ` Last error: ${status.last_error}.`; } return text; } function refreshUploadStatus() { fetch('/api/upload/status') .then(response => response.json()) .then(status => { uploadStatusEl.textContent = describeUploadStatus(status); dashcamToggle.checked = status.dashcam_upload_enabled; dashcamToggle.disabled = !status.configured; }) .catch(err => { uploadStatusEl.textContent = 'Error while checking upload status: ' + err; }); } dashcamToggle.addEventListener('change', () => { fetch('/api/upload/dashcam_toggle', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ enabled: dashcamToggle.checked }), }) .then(response => response.json()) .then(status => { uploadStatusEl.textContent = describeUploadStatus(status); dashcamToggle.checked = status.dashcam_upload_enabled; }) .catch(err => { uploadStatusEl.textContent = 'Error while updating toggle: ' + err; }); }); refreshUploadStatus(); setInterval(refreshUploadStatus, 15000);