feat: relay inversé, LED idle solid, luminosité manuelle, auto-flash lux
This commit is contained in:
@@ -361,6 +361,51 @@ select.field {
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Luminosité LED -->
|
||||
<div class="card" style="margin-top:1rem">
|
||||
<div class="card-title">💡 Luminosité LED</div>
|
||||
|
||||
<div style="display:grid; gap:1rem;">
|
||||
<div>
|
||||
<label style="font-size:.82rem; color:var(--text-muted)">
|
||||
Luminosité ambiante : <strong id="brightness-val">180</strong> / 255
|
||||
</label>
|
||||
<input type="range" id="brightness-slider" min="0" max="255" step="5" value="180"
|
||||
oninput="document.getElementById('brightness-val').textContent=this.value"
|
||||
style="width:100%">
|
||||
<div style="font-size:.72rem; color:var(--text-muted)">
|
||||
Appliquée en permanence (idle, countdown, captured…). Le flash peut dépasser cette valeur.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="display:flex; gap:.5rem; align-items:center; flex-wrap:wrap;">
|
||||
<button class="btn btn-ghost btn-sm" onclick="previewBrightness()">👁 Aperçu</button>
|
||||
<button class="btn btn-primary btn-sm" onclick="saveBrightness()">💾 Sauvegarder</button>
|
||||
<span id="brightness-status" style="font-size:.82rem; color:var(--text-muted)"></span>
|
||||
</div>
|
||||
|
||||
<div style="border-top:1px solid var(--border); padding-top:1rem;">
|
||||
<div style="display:flex; align-items:center; justify-content:space-between;">
|
||||
<div>
|
||||
<div style="font-weight:600; font-size:.9rem;">🌞 Luminosité flash automatique</div>
|
||||
<div style="font-size:.78rem; color:var(--text-muted); margin-top:.2rem;">
|
||||
Analyse une frame de la caméra avant la prise pour adapter le flash.<br>
|
||||
Salle sombre → flash plein (255) | Salle claire → flash réduit (80+).
|
||||
</div>
|
||||
</div>
|
||||
<label class="toggle" style="flex-shrink:0; margin-left:1rem;">
|
||||
<input type="checkbox" id="toggle-auto-brightness"
|
||||
onchange="setAutoBrightness(this.checked)">
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<p id="auto-brightness-status" style="font-size:.78rem; color:var(--text-muted); margin-top:.5rem;">
|
||||
⏳ Chargement…
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Flash LED -->
|
||||
<div class="card" style="margin-top:1rem">
|
||||
<div class="card-title">⚡ Flash photo (LED)</div>
|
||||
@@ -744,6 +789,58 @@ async function refreshScreen() {
|
||||
}
|
||||
|
||||
|
||||
// ════════════════════════════════════════════════════════════════════════════
|
||||
// Luminosité LED
|
||||
// ════════════════════════════════════════════════════════════════════════════
|
||||
async function loadBrightnessConfig() {
|
||||
try {
|
||||
const d = await api('GET', '/api/leds/brightness');
|
||||
document.getElementById('brightness-slider').value = d.brightness ?? 180;
|
||||
document.getElementById('brightness-val').textContent = d.brightness ?? 180;
|
||||
const auto = d.auto_brightness ?? false;
|
||||
document.getElementById('toggle-auto-brightness').checked = auto;
|
||||
document.getElementById('auto-brightness-status').textContent = auto
|
||||
? '✅ Auto-flash actif — le flash s\'adapte à l\'ambiance'
|
||||
: '⏸ Auto-flash désactivé — luminosité flash fixe à 100 %';
|
||||
} catch(e) { console.warn('loadBrightnessConfig:', e); }
|
||||
}
|
||||
|
||||
async function previewBrightness() {
|
||||
const v = parseInt(document.getElementById('brightness-slider').value);
|
||||
await api('PUT', `/api/leds/brightness?value=${v}&save=false`);
|
||||
showToast(`Luminosité ${v}/255 appliquée`, 'info');
|
||||
}
|
||||
|
||||
async function saveBrightness() {
|
||||
const v = parseInt(document.getElementById('brightness-slider').value);
|
||||
const status = document.getElementById('brightness-status');
|
||||
try {
|
||||
await api('PUT', `/api/leds/brightness?value=${v}&save=true`);
|
||||
status.textContent = '✅ Sauvegardé';
|
||||
showToast(`Luminosité ${v}/255 sauvegardée`, 'success');
|
||||
} catch(e) {
|
||||
status.textContent = '❌ Erreur';
|
||||
showToast('Erreur : ' + e.message, 'error');
|
||||
}
|
||||
setTimeout(() => { status.textContent = ''; }, 3000);
|
||||
}
|
||||
|
||||
async function setAutoBrightness(enabled) {
|
||||
const statusEl = document.getElementById('auto-brightness-status');
|
||||
try {
|
||||
await api('PUT', `/api/leds/auto-brightness?enabled=${enabled}&save=true`);
|
||||
statusEl.textContent = enabled
|
||||
? '✅ Auto-flash actif — le flash s\'adapte à l\'ambiance'
|
||||
: '⏸ Auto-flash désactivé — luminosité flash fixe à 100 %';
|
||||
showToast(enabled ? '✅ Auto-luminosité activée' : '⏸ Auto-luminosité désactivée', 'success');
|
||||
} catch(e) {
|
||||
showToast('Erreur : ' + e.message, 'error');
|
||||
document.getElementById('toggle-auto-brightness').checked = !enabled;
|
||||
}
|
||||
}
|
||||
|
||||
loadBrightnessConfig();
|
||||
|
||||
// ════════════════════════════════════════════════════════════════════════════
|
||||
// Flash LED
|
||||
// ════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user