Preview: overlay erreur si DSLR deconnecte pendant la capture

- Overlay semi-transparent sur le preview quand camera_erreur recue
- Timeout 3s : si aucune frame recue, affiche l'erreur automatiquement
- Disparait des que les frames reprennent (camera_ok ou nouvelle frame)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-08 20:42:05 +02:00
parent c27b7152d6
commit ef6679dc97
3 changed files with 73 additions and 0 deletions

View File

@@ -303,6 +303,39 @@ html, body {
object-fit: contain; object-fit: contain;
} }
.preview-erreur-camera {
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0, 0, 0, 0.85);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1rem;
color: #fff;
z-index: 10;
}
.preview-erreur-camera.cache {
display: none;
}
.preview-erreur-icon {
font-size: 5rem;
animation: pulse-texte 1.5s ease-in-out infinite;
}
.preview-erreur-camera p {
font-size: 1.8rem;
font-weight: bold;
margin: 0;
}
.preview-erreur-camera span {
font-size: 1.2rem;
opacity: 0.7;
}
.compte-a-rebours { .compte-a-rebours {
position: absolute; position: absolute;
top: 0; left: 0; top: 0; left: 0;

View File

@@ -63,6 +63,11 @@
<section id="ecran-capture" class="ecran"> <section id="ecran-capture" class="ecran">
<div id="preview-live" class="preview-live"> <div id="preview-live" class="preview-live">
<img id="img-preview" src="" alt="Preview"> <img id="img-preview" src="" alt="Preview">
<div id="preview-erreur-camera" class="preview-erreur-camera cache">
<div class="preview-erreur-icon">&#128247;</div>
<p>Appareil photo deconnecte</p>
<span>Reconnexion en cours...</span>
</div>
</div> </div>
<div id="compte-a-rebours" class="compte-a-rebours cache"> <div id="compte-a-rebours" class="compte-a-rebours cache">
<span id="chiffre-car">3</span> <span id="chiffre-car">3</span>

View File

@@ -2,18 +2,37 @@
let previewActif = false; let previewActif = false;
let previewInterval = null; let previewInterval = null;
let previewTimeoutId = null;
const PREVIEW_TIMEOUT_MS = 3000;
const EMOJI_CAR = { 3: '🤪', 2: '😱', 1: '🔥' }; const EMOJI_CAR = { 3: '🤪', 2: '😱', 1: '🔥' };
// --- Preview live --- // --- Preview live ---
function afficherErreurPreview(visible) {
const el = document.getElementById('preview-erreur-camera');
if (!el) return;
if (visible) el.classList.remove('cache');
else el.classList.add('cache');
}
function resetPreviewTimeout() {
if (previewTimeoutId) clearTimeout(previewTimeoutId);
previewTimeoutId = setTimeout(() => {
if (previewActif) afficherErreurPreview(true);
}, PREVIEW_TIMEOUT_MS);
}
function lancerPreview() { function lancerPreview() {
if (previewActif) return; if (previewActif) return;
previewActif = true; previewActif = true;
afficherErreurPreview(false);
previewInterval = setInterval(() => { previewInterval = setInterval(() => {
if (previewActif) wsEnvoyer({ type: 'preview' }); if (previewActif) wsEnvoyer({ type: 'preview' });
}, 100); }, 100);
resetPreviewTimeout();
} }
function arreterPreview() { function arreterPreview() {
@@ -22,12 +41,28 @@ function arreterPreview() {
clearInterval(previewInterval); clearInterval(previewInterval);
previewInterval = null; previewInterval = null;
} }
if (previewTimeoutId) {
clearTimeout(previewTimeoutId);
previewTimeoutId = null;
}
afficherErreurPreview(false);
} }
wsOnMessage('preview', (msg) => { wsOnMessage('preview', (msg) => {
if (!previewActif) return; if (!previewActif) return;
const img = document.getElementById('img-preview'); const img = document.getElementById('img-preview');
if (img) img.src = msg.image; if (img) img.src = msg.image;
afficherErreurPreview(false);
resetPreviewTimeout();
});
// Erreur camera pendant la preview
wsOnMessage('camera_erreur', () => {
if (previewActif) afficherErreurPreview(true);
});
wsOnMessage('camera_ok', () => {
afficherErreurPreview(false);
}); });
// --- Capture --- // --- Capture ---