Camera déconnectée : retour accueil automatique + abort capture

- camera_erreur pendant la capture : abort immédiat + afficherErreurCapture()
  → retour accueil en 4s (au lieu de rester bloqué sur "Reconnexion en cours...")
- camera_ok : cache l'erreur et reset le flag captureAbortee
- captureAbortee flag : permet à lancerCapture() de sortir proprement
  sans déclencher de capture fantôme après une déconnexion

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 11:53:30 +02:00
parent a51d235faf
commit 7e239ea0f9

View File

@@ -3,6 +3,7 @@
let previewActif = false; let previewActif = false;
let previewTimeoutId = null; let previewTimeoutId = null;
const PREVIEW_TIMEOUT_MS = 3000; const PREVIEW_TIMEOUT_MS = 3000;
let captureAbortee = false;
const EMOJI_CAR = { 3: '🤪', 2: '😱', 1: '🔥' }; const EMOJI_CAR = { 3: '🤪', 2: '😱', 1: '🔥' };
@@ -71,18 +72,23 @@ wsOnMessage('preview', (msg) => {
resetPreviewTimeout(); resetPreviewTimeout();
}); });
// Erreur camera pendant la preview // Erreur camera : abort capture en cours + retour accueil automatique
wsOnMessage('camera_erreur', () => { wsOnMessage('camera_erreur', () => {
if (previewActif) afficherErreurPreview(true); captureAbortee = true;
if (ecranActuel === 'capture') {
afficherErreurCapture('Appareil photo déconnecté', 'Retour dans 4 secondes...');
}
}); });
wsOnMessage('camera_ok', () => { wsOnMessage('camera_ok', () => {
captureAbortee = false;
afficherErreurPreview(false); afficherErreurPreview(false);
}); });
// --- Capture --- // --- Capture ---
async function lancerCapture() { async function lancerCapture() {
captureAbortee = false;
photosSession = []; photosSession = [];
photoImpression = null; photoImpression = null;
formatImpression = null; formatImpression = null;
@@ -108,6 +114,8 @@ async function lancerCapture() {
const compteurEl = document.getElementById('capture-compteur'); const compteurEl = document.getElementById('capture-compteur');
for (let i = 0; i < nbPhotos; i++) { for (let i = 0; i < nbPhotos; i++) {
if (captureAbortee) return;
if (nbPhotos > 1) { if (nbPhotos > 1) {
compteurEl.textContent = `Photo ${i + 1} / ${nbPhotos}`; compteurEl.textContent = `Photo ${i + 1} / ${nbPhotos}`;
} }
@@ -116,6 +124,8 @@ async function lancerCapture() {
await compteARebours(); await compteARebours();
arreterPreview(); // Libère le bus USB gphoto2 pour la capture arreterPreview(); // Libère le bus USB gphoto2 pour la capture
if (captureAbortee) return;
afficherFlash(); afficherFlash();
const promesseCapture = apiPost('/api/capturer').catch(() => null); const promesseCapture = apiPost('/api/capturer').catch(() => null);