You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
7.2 KiB
197 lines
7.2 KiB
const btnPreheat = document.getElementById('validateChauffeManuelle'); |
|
const btnProfil = document.getElementById('validateChauffeAuto'); |
|
|
|
// WebSocket pour affichage température en temps réel |
|
function connectWS() { |
|
const ws = new WebSocket(`ws://${window.location.hostname}/ws`); |
|
ws.onopen = () => console.log('WebSocket connecté'); |
|
ws.onclose = () => setTimeout(connectWS, 2000); |
|
ws.onmessage = e => { |
|
const tempDiv = document.getElementById('temp'); |
|
const powerBar = document.getElementById('power-bar'); |
|
const powerBarValue = document.getElementById('power-bar-value'); |
|
try { |
|
const data = JSON.parse(e.data); |
|
if (tempDiv) tempDiv.textContent = `${data.temp} °C /${data.setpoint}°C`; |
|
if (powerBar && powerBarValue && typeof data.output !== 'undefined') { |
|
let pct = Math.max(0, Math.min(100, Math.round(data.output))); |
|
powerBar.value = pct; |
|
powerBarValue.textContent = pct + '%'; |
|
} |
|
|
|
// Mettre à jour l'état des boutons selon le mode (manuel/auto) |
|
if (typeof data.auto !== 'undefined' || typeof data.manual !== 'undefined') { |
|
try { |
|
updateButton(btnPreheat, !!data.manual); |
|
updateButton(btnProfil, !!data.auto); |
|
} catch (e) { |
|
// ignore si les boutons ne sont pas encore disponibles |
|
} |
|
} |
|
|
|
// Si mode automatique, appliquer la classe 'active' sur la row correspondante |
|
if (typeof data.step !== 'undefined') { |
|
const mapping = {0: 'row-preheat', 1: 'row-soak', 2: 'row-reflow'}; |
|
// Retirer la classe active de toutes |
|
Object.values(mapping).forEach(id => { |
|
const el = document.getElementById(id); |
|
if (el) el.classList.remove('active'); |
|
}); |
|
// Si auto activé, ajouter la classe sur la step active |
|
if (data.auto) { |
|
const target = mapping[data.step]; |
|
if (target) { |
|
const el = document.getElementById(target); |
|
if (el) el.classList.add('active'); |
|
} |
|
} |
|
} |
|
} catch { |
|
if (tempDiv) tempDiv.textContent = e.data; |
|
} |
|
}; |
|
} |
|
|
|
connectWS(); |
|
|
|
// Récupérer l'état initial depuis le serveur (après reload de la page) |
|
function refreshState() { |
|
fetch('/state').then(r => { |
|
if (!r.ok) throw new Error('no state'); |
|
return r.json(); |
|
}).then(data => { |
|
const btnPreheatEl = document.getElementById('validateChauffeManuelle'); |
|
const btnProfilEl = document.getElementById('validateChauffeAuto'); |
|
if (btnPreheatEl) updateButton(btnPreheatEl, !!data.manual); |
|
if (btnProfilEl) updateButton(btnProfilEl, !!data.auto); |
|
const powerBar = document.getElementById('power-bar'); |
|
const powerBarValue = document.getElementById('power-bar-value'); |
|
if (powerBar && typeof data.power !== 'undefined') { |
|
let pct = Math.max(0, Math.min(100, Math.round(data.power))); |
|
powerBar.value = pct; |
|
if (powerBarValue) powerBarValue.textContent = pct + '%'; |
|
} |
|
// Ajuster la jauge de préchauffage sur la valeur de setpoint si présente |
|
const gauge = document.getElementById('preheat-gauge'); |
|
const gaugeValue = document.getElementById('preheat-gauge-value'); |
|
if (gauge && gaugeValue && typeof data.setpoint !== 'undefined') { |
|
gauge.value = Math.round(data.setpoint); |
|
gaugeValue.textContent = gauge.value + '°C'; |
|
} |
|
|
|
// Gérer la classe 'active' sur les lignes (si mode auto) |
|
const mapping = {0: 'row-preheat', 1: 'row-soak', 2: 'row-reflow'}; |
|
Object.values(mapping).forEach(id => { |
|
const el = document.getElementById(id); |
|
if (el) el.classList.remove('active'); |
|
}); |
|
if (data.auto && typeof data.step !== 'undefined') { |
|
const target = mapping[data.step]; |
|
if (target) { |
|
const el = document.getElementById(target); |
|
if (el) el.classList.add('active'); |
|
} |
|
} |
|
}).catch(err => console.log('refreshState failed', err)); |
|
} |
|
|
|
// Fonction utilitaire pour modifier l'aspect d'un bouton |
|
function updateButton(btn, isActive) { |
|
if (isActive) { |
|
btn.textContent = 'STOP'; |
|
btn.className = 'stop'; |
|
} else { |
|
btn.textContent = 'VALIDER'; |
|
btn.className = 'start'; |
|
} |
|
} |
|
|
|
// L'état initial est chargé depuis le serveur |
|
|
|
|
|
btnPreheat.onclick = function() { |
|
if (btnPreheat.className === 'stop') { |
|
// Désactive tout |
|
updateButton(btnPreheat, false); |
|
updateButton(btnProfil, false); |
|
fetch('/action/stop', { method: 'POST' }); |
|
return; |
|
} |
|
// Active le mode manuel |
|
const temp = document.getElementById('preheat-gauge').value; |
|
const params = new URLSearchParams(); |
|
params.append('temp', temp); |
|
fetch('/action/preheat', { |
|
method: 'POST', |
|
headers: {'Content-Type': 'application/x-www-form-urlencoded'}, |
|
body: params.toString() |
|
}).then(r => { |
|
if (r.ok){ |
|
updateButton(btnPreheat, true); |
|
updateButton(btnProfil, false); |
|
console.log('Préchauffage lancé à ' + temp + '°C'); |
|
} |
|
else console.log('Erreur serveur'); |
|
}); |
|
}; |
|
|
|
// Chauffe profil : bouton VALIDER |
|
btnProfil.onclick = function() { |
|
if (btnProfil.className === 'stop') { |
|
// Désactive tout |
|
updateButton(btnPreheat, false); |
|
updateButton(btnProfil, false); |
|
fetch('/action/stop', { method: 'POST' }); |
|
return; |
|
} |
|
// Active le mode automatique |
|
const preheatTemp = document.getElementById('preheat-temp').value; |
|
const preheatTime = document.getElementById('preheat-time').value; |
|
const soakTemp = document.getElementById('soak-temp').value; |
|
const soakTime = document.getElementById('soak-time').value; |
|
const reflowTemp = document.getElementById('reflow-temp').value; |
|
const reflowTime = document.getElementById('reflow-time').value; |
|
const params = new URLSearchParams(); |
|
params.append('preheatTemp', preheatTemp); |
|
params.append('preheatTime', preheatTime); |
|
params.append('soakTemp', soakTemp); |
|
params.append('soakTime', soakTime); |
|
params.append('reflowTemp', reflowTemp); |
|
params.append('reflowTime', reflowTime); |
|
fetch('/action/auto', { |
|
method: 'POST', |
|
headers: {'Content-Type': 'application/x-www-form-urlencoded'}, |
|
body: params.toString() |
|
}).then(r => { |
|
if (r.ok){ |
|
updateButton(btnPreheat, false); |
|
updateButton(btnProfil, true); |
|
console.log('Profil lancé'); |
|
} |
|
else console.log('Erreur serveur'); |
|
}); |
|
}; |
|
|
|
// Jauge préchauffage : affichage dynamique |
|
document.addEventListener('DOMContentLoaded', () => { |
|
const gauge = document.getElementById('preheat-gauge'); |
|
const gaugeValue = document.getElementById('preheat-gauge-value'); |
|
const btnPreheat = document.getElementById('validateChauffeManuelle'); |
|
if (gauge && gaugeValue) { |
|
gauge.oninput = function() { |
|
gaugeValue.textContent = this.value + '°C'; |
|
// Si le mode manuel est actif, on met à jour le setpoint côté serveur |
|
if (btnPreheat && btnPreheat.className === 'stop') { |
|
const params = new URLSearchParams(); |
|
params.append('temp', this.value); |
|
fetch('/action/preheat', { |
|
method: 'POST', |
|
headers: {'Content-Type': 'application/x-www-form-urlencoded'}, |
|
body: params.toString() |
|
}); |
|
} |
|
}; |
|
} |
|
// Après que le DOM est prêt, récupérer et appliquer l'état initial |
|
refreshState(); |
|
});
|
|
|