diff --git a/backend/api/leds_api.py b/backend/api/leds_api.py index e6cee72..e4cd072 100644 --- a/backend/api/leds_api.py +++ b/backend/api/leds_api.py @@ -158,6 +158,36 @@ async def measure_ambient_lux(request: Request): return JSONResponse({"ok": False, "error": str(e)}, status_code=500) +@router.get("/leds/flash-timing") +async def get_flash_timing(request: Request): + """Retourne les paramètres de timing du flash.""" + cfg = request.app.state.config.leds + return { + "pre_flash_advance": cfg.pre_flash_advance, + "countdown_duration": cfg.countdown_duration, + } + + +@router.put("/leds/flash-timing") +async def set_flash_timing( + request: Request, + pre_flash_advance: float = Query(..., ge=0.0, le=3.0, description="Secondes avant fin countdown pour démarrer le flash"), + save: bool = Query(default=True), +): + """Règle combien de secondes avant la fin du countdown le flash démarre (0–3s).""" + cfg = request.app.state.config.leds + cfg.pre_flash_advance = pre_flash_advance + if save: + config_svc = request.app.state.config_service + with open(config_svc.path, encoding="utf-8") as f: + import yaml + raw = yaml.safe_load(f) or {} + raw.setdefault("leds", {})["pre_flash_advance"] = pre_flash_advance + with open(config_svc.path, "w", encoding="utf-8") as f: + yaml.dump(raw, f, allow_unicode=True, default_flow_style=False) + return {"ok": True, "pre_flash_advance": pre_flash_advance} + + @router.put("/leds/effect/{effect_name}") async def update_effect( request: Request, diff --git a/frontend/templates/admin/settings.html b/frontend/templates/admin/settings.html index 4838197..7b96e1e 100644 --- a/frontend/templates/admin/settings.html +++ b/frontend/templates/admin/settings.html @@ -466,6 +466,19 @@ select.field { + +
+ + +
+ 0 s (au moment de la capture)3 s (très en avance) +
+ + +
@@ -883,6 +896,25 @@ async function loadFlashConfig() { document.getElementById('flash-count').value = cap.flashes; } } catch(e) { console.warn('loadFlashConfig:', e); } + // Charger le timing pre-flash + try { + const t = await api('GET', '/api/leds/flash-timing'); + const v = t.pre_flash_advance ?? 0.5; + document.getElementById('pre-flash-advance').value = v; + document.getElementById('pre-flash-val').textContent = v.toFixed(1); + } catch(e) { console.warn('loadFlashTiming:', e); } +} + +async function savePreFlash() { + const v = parseFloat(document.getElementById('pre-flash-advance').value); + const status = document.getElementById('pre-flash-status'); + try { + await api('PUT', `/api/leds/flash-timing?pre_flash_advance=${v}`); + status.textContent = `✅ Sauvegardé (${v.toFixed(1)} s)`; + setTimeout(() => status.textContent = '', 3000); + } catch(e) { + status.textContent = '❌ Erreur'; + } } async function measureAmbient() {