Flash Canon configurable, choix de cadre a l'impression, fixes capture/reconnexion DSLR
- Flash integre Canon activable/desactivable depuis l'admin (configurer_flash) - Popup de choix de cadre juste avant impression, layout sans defilement (flex nowrap + aspect-ratio) - Capture : ignore camera_erreur pendant une capture en cours (laisse l'API trancher) - surveiller_dslr : grace period preview augmentee a 2s, reapplique la config camera apres reconnexion - start.sh simplifie (Chromium gere par kiosk-session.sh), remote debugging port 9222 active
This commit is contained in:
@@ -2,8 +2,10 @@
|
||||
|
||||
let previewActif = false;
|
||||
let previewTimeoutId = null;
|
||||
let previewInterval = null;
|
||||
const PREVIEW_TIMEOUT_MS = 3000;
|
||||
let captureAbortee = false;
|
||||
let captureEnCours = false; // true pendant tout le flux lancerCapture()
|
||||
|
||||
const EMOJI_CAR = { 3: '🤪', 2: '😱', 1: '🔥' };
|
||||
|
||||
@@ -73,13 +75,16 @@ wsOnMessage('preview', (msg) => {
|
||||
resetPreviewTimeout();
|
||||
});
|
||||
|
||||
// Erreur camera : abort capture + retour accueil si on est en train de capturer
|
||||
// Erreur camera pendant preview idle : retour accueil
|
||||
// Si on est en cours de capture (compte à rebours ou attente API), on ignore :
|
||||
// l'API /api/capturer retournera elle-même une erreur si le DSLR est vraiment mort.
|
||||
wsOnMessage('camera_erreur', () => {
|
||||
captureAbortee = true;
|
||||
arreterPreview();
|
||||
if (ecranActuel === 'capture') {
|
||||
// Retour accueil automatique en 4s (afficherErreurCapture le fait)
|
||||
afficherErreurCapture('Appareil photo déconnecté', 'Reconnexion en cours...');
|
||||
if (!captureEnCours) {
|
||||
captureAbortee = true;
|
||||
if (ecranActuel === 'capture') {
|
||||
afficherErreurCapture('Appareil photo déconnecté', 'Reconnexion en cours...');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -91,6 +96,7 @@ wsOnMessage('camera_ok', () => {
|
||||
// --- Capture ---
|
||||
|
||||
async function lancerCapture() {
|
||||
captureEnCours = true;
|
||||
captureAbortee = false;
|
||||
photosSession = [];
|
||||
photoImpression = null;
|
||||
@@ -105,10 +111,12 @@ async function lancerCapture() {
|
||||
try {
|
||||
const statut = await apiGet('/api/camera/statut');
|
||||
if (!statut.connectee || statut.mode === 'erreur') {
|
||||
captureEnCours = false;
|
||||
afficherErreurCapture('Appareil photo non disponible', 'Verifiez la connexion USB du DSLR');
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
captureEnCours = false;
|
||||
afficherErreurCapture('Impossible de joindre le serveur', 'Verifiez que le photobooth est bien demarre');
|
||||
return;
|
||||
}
|
||||
@@ -117,20 +125,14 @@ async function lancerCapture() {
|
||||
const compteurEl = document.getElementById('capture-compteur');
|
||||
|
||||
for (let i = 0; i < nbPhotos; i++) {
|
||||
if (captureAbortee) return;
|
||||
|
||||
if (nbPhotos > 1) {
|
||||
compteurEl.textContent = `Photo ${i + 1} / ${nbPhotos}`;
|
||||
}
|
||||
|
||||
lancerPreview(); // Miroir live pendant le compte à rebours
|
||||
await compteARebours();
|
||||
arreterPreview(); // Libère le bus USB gphoto2 pour la capture
|
||||
|
||||
if (captureAbortee) return;
|
||||
|
||||
afficherFlash();
|
||||
document.getElementById('capture-en-cours').classList.remove('cache');
|
||||
arreterPreview();
|
||||
await pause(150);
|
||||
|
||||
const promesseCapture = apiPost('/api/capturer').catch(() => null);
|
||||
let resultat = await promesseCapture;
|
||||
@@ -140,16 +142,19 @@ async function lancerCapture() {
|
||||
if (!resultat) {
|
||||
erreurReseau = true;
|
||||
} else if (resultat.erreur === 'Limite de photos atteinte') {
|
||||
captureEnCours = false;
|
||||
afficherErreurCapture('Limite de photos atteinte', 'La session est terminee');
|
||||
return;
|
||||
}
|
||||
|
||||
if (erreurReseau) {
|
||||
captureEnCours = false;
|
||||
afficherErreurCapture('Erreur reseau', 'Le serveur ne repond pas — redemarrez le photobooth');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!resultat || resultat.erreur) {
|
||||
captureEnCours = false;
|
||||
const msg = resultat?.erreur || 'Erreur inconnue';
|
||||
afficherErreurCapture('Echec de la capture', msg.includes('Echec') ? 'Verifiez le DSLR et reessayez' : msg);
|
||||
return;
|
||||
@@ -160,6 +165,7 @@ async function lancerCapture() {
|
||||
}
|
||||
}
|
||||
|
||||
captureEnCours = false;
|
||||
await traiterCapture();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user