feat: relay inversé, LED idle solid, luminosité manuelle, auto-flash lux
🚀 Deploy — JH Photomaton / 🔍 Vérification (push) Has been cancelled
🚀 Deploy — JH Photomaton / 🍓 Deploy sur le Pi (push) Has been cancelled

This commit is contained in:
2026-07-17 10:32:43 +02:00
parent 3de55821b7
commit 4b188ce819
8 changed files with 260 additions and 6 deletions
+97
View File
@@ -361,6 +361,51 @@ select.field {
</div>
<!-- Luminosité LED -->
<div class="card" style="margin-top:1rem">
<div class="card-title">&#x1F4A1; Luminosit&eacute; LED</div>
<div style="display:grid; gap:1rem;">
<div>
<label style="font-size:.82rem; color:var(--text-muted)">
Luminosit&eacute; 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&eacute;e en permanence (idle, countdown, captured…). Le flash peut d&eacute;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()">&#x1F441; Aperçu</button>
<button class="btn btn-primary btn-sm" onclick="saveBrightness()">&#x1F4BE; 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;">&#x1F31E; Luminosit&eacute; flash automatique</div>
<div style="font-size:.78rem; color:var(--text-muted); margin-top:.2rem;">
Analyse une frame de la cam&eacute;ra avant la prise pour adapter le flash.<br>
Salle sombre → flash plein (255) &nbsp;|&nbsp; Salle claire → flash r&eacute;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;">
&#x23F3; Chargement…
</p>
</div>
</div>
</div>
<!-- Flash LED -->
<div class="card" style="margin-top:1rem">
<div class="card-title">&#x26A1; 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
// ════════════════════════════════════════════════════════════════════════════