Fiabilite Canon : veille/reveil relais, sequence boot, stats diagnostic, fin evenement, compteur consommables

- Preview thread : poll uniquement quand ecran capture actif, keepalive 30s sinon
- Sequence boot Canon : power cycle relais si absent USB au demarrage
- Veille auto 30min : Canon coupe par relais apres inactivite, reveil au preview_start
- Stats diagnostic /api/canon/stats : keepalive, preview, captures, connexions
- Escalade reconnexion adoucie : pas d'USB reset les 2 premieres tentatives
- Hard reset relais 10s (resistance decharge 990ohm sur dummy battery 8V)
- Gestion fin evenement : date_fin + bouton terminer + guard 403 impression
- Compteur base sur min(papier, ruban) avec cap evenement optionnel
- Pre-eclairage countdown : projecteurs ON 3s avant capture pour mesure expo
- Canon _configurer_init() : ISO 800, drivemode Single, viewfinder, EXIF preserve
- Admin : detail evenement, compteur consommables, galerie impression

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WyN9xFp84P9VaWT3Qe2DXu
This commit is contained in:
2026-08-14 19:33:28 +02:00
parent a6766f529e
commit 4e267492c2
16 changed files with 1424 additions and 162 deletions

View File

@@ -2246,6 +2246,38 @@ h3 {
cursor: pointer;
}
/* === Diagnostic Panel === */
.diag-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:.8rem}
.diag-card{background:rgba(255,255,255,.06);border-radius:12px;padding:1rem;text-align:center;border:2px solid transparent;transition:border-color .3s}
.diag-card.ok{border-color:#4caf50}
.diag-card.warn{border-color:#ff9800}
.diag-card.err{border-color:#f44336}
.diag-card.off{border-color:#666}
.diag-icon{font-size:2rem;margin-bottom:.3rem}
.diag-label{font-size:.85rem;color:var(--texte-secondaire)}
.diag-status{font-size:.75rem;margin-top:.3rem;font-weight:600}
.diag-card.ok .diag-status{color:#4caf50}
.diag-card.warn .diag-status{color:#ff9800}
.diag-card.err .diag-status{color:#f44336}
.diag-card.off .diag-status{color:#888}
.diag-actions{display:flex;flex-wrap:wrap;gap:.6rem}
.diag-actions button{flex:1;min-width:140px;font-size:.85rem}
.diag-logs{font-family:monospace;font-size:.65rem;background:#0a0a0a;color:#0f0;padding:.8rem;border-radius:8px;white-space:pre-wrap;max-height:350px;overflow-y:auto;word-break:break-all;line-height:1.4}
.diag-usb{font-family:monospace;font-size:.75rem;background:#0a0a0a;color:#ccc;padding:.6rem;border-radius:6px;white-space:pre-wrap}
/* === Camera/Printer error overlay (user-facing, full-screen) === */
.erreur-overlay{position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,.92);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:2rem;gap:1.5rem}
.erreur-overlay .erreur-icon{font-size:5rem}
.erreur-overlay .erreur-titre{font-size:2rem;font-weight:700;color:#fff}
.erreur-overlay .erreur-msg{font-size:1.3rem;color:#ccc;max-width:600px;line-height:1.5}
.erreur-overlay .erreur-steps{text-align:left;font-size:1.1rem;color:#eee;max-width:500px;line-height:2}
.erreur-overlay .erreur-steps li{margin-bottom:.5rem}
.erreur-overlay .erreur-spinner{width:60px;height:60px;border:5px solid #333;border-top-color:var(--primaire);border-radius:50%;animation:spin 1s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.erreur-overlay .erreur-btn{padding:1rem 2.5rem;font-size:1.3rem;border-radius:1rem;border:none;cursor:pointer;margin-top:1rem}
.erreur-overlay .erreur-btn-primaire{background:var(--primaire);color:#fff}
.erreur-overlay .erreur-btn-secondaire{background:#333;color:#fff}
/* Responsive tactile */
@media (max-width: 800px) {
.accueil-contenu h1 { font-size: 2.5rem; }