diff --git a/scripts/calibrazione_pagina.py b/scripts/calibrazione_pagina.py index 740925d..e19b0d9 100644 --- a/scripts/calibrazione_pagina.py +++ b/scripts/calibrazione_pagina.py @@ -220,6 +220,12 @@ PAGINA = r"""

Parametri camera

-
+ +
+ + +
+
@@ -470,6 +476,7 @@ function cambioSorgente(salva) { dire("msgElenco", ""); // #91 aggiornaStato(); caricaParametri(); + caricaOrientamento(); // #110: specchiatura della nuova sorgente if (era) avviaAnteprima(); } @@ -793,6 +800,80 @@ async function caricaParametri() { } } +// #110: specchiatura per sorgente; gen scarta le risposte di una sorgente ormai lasciata, dati = ultimo stato noto del servizio +var O = { gen: 0, dati: { orizzontale: false, verticale: false } }; + +function caselleSpecchia(attive) { // #110: abilita o disabilita le due caselle + $("specchiaO").disabled = $("specchiaV").disabled = !attive; +} + +async function caricaOrientamento() { // #110 + var sorgente = $("sorgente").value; + var g = ++O.gen; + dire("msgSpecchia", ""); + O.dati = { orizzontale: false, verticale: false }; + $("specchiaO").checked = $("specchiaV").checked = false; + caselleSpecchia(false); // spente finche' non si sa lo stato (e senza sorgente) + if (!sorgente) return; + try { + var r = await fetch("/camera/orientamento?source=" + encodeURIComponent(sorgente)); + if (g !== O.gen) return; + if (!r.ok) { dire("msgSpecchia", await dettaglio(r), "errore"); return; } + var j = await r.json(); + if (g !== O.gen) return; + O.dati = { orizzontale: !!j.orizzontale, verticale: !!j.verticale }; + $("specchiaO").checked = O.dati.orizzontale; + $("specchiaV").checked = O.dati.verticale; + caselleSpecchia(true); + } catch (e) { + if (g === O.gen) dire("msgSpecchia", "Servizio non raggiungibile.", "errore"); + } +} + +async function salvaOrientamento() { // #110: onchange di una casella -> PUT + var sorgente = $("sorgente").value; + if (!sorgente) return; + var g = ++O.gen; + var nuovo = { orizzontale: $("specchiaO").checked, verticale: $("specchiaV").checked }; + caselleSpecchia(false); // durante la PUT niente altri cambi + dire("msgSpecchia", ""); + var rimetti = function () { // #110: casella com'era prima del clic + $("specchiaO").checked = O.dati.orizzontale; + $("specchiaV").checked = O.dati.verticale; + }; + try { + var r = await fetch("/camera/orientamento", { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ source: sorgente, orizzontale: nuovo.orizzontale, verticale: nuovo.verticale }) + }); + if (g !== O.gen) return; // sorgente cambiata: ci pensa caricaOrientamento + if (!r.ok) { + var d = await dettaglio(r); + if (g !== O.gen) return; + rimetti(); + caselleSpecchia(true); + dire("msgSpecchia", d, "errore"); + return; + } + var j = await r.json(); + if (g !== O.gen) return; + O.dati = nuovo; + caselleSpecchia(true); + if (j.avviso) dire("msgSpecchia", j.avviso, "avviso"); // es. calibrazione da rifare + else dire("msgSpecchia", "Specchiatura salvata.", "ok"); + if (!A.attiva) { // anteprima ferma: un frame solo per vedere l'effetto (se e' attiva, il prossimo esce gia' specchiato) + while (A.inVolo) await pausa(50); + if (g === O.gen && !A.attiva) unaAnteprima(A.lato); + } + } catch (e) { + if (g !== O.gen) return; + rimetti(); + caselleSpecchia(true); + dire("msgSpecchia", "Servizio non raggiungibile.", "errore"); + } +} + function costruisciParametri(j) { var box = $("parametri"); box.textContent = ""; @@ -1393,6 +1474,7 @@ $("acquisisci").onclick = calcola; $("salva").onclick = salvaNome; $("nomeCal").onkeydown = function (e) { if (e.key === "Enter") salvaNome(); }; $("sorgente").onchange = function () { dire("msgSorgente", ""); cambioSorgente(true); }; // #92 +$("specchiaO").onchange = $("specchiaV").onchange = salvaOrientamento; // #110 scegliTab(memoria("tmf.acq.tab") === "cal" ? "cal" : "acq", false); // #91: tab ricordata caricaSorgenti(); diff --git a/scripts/tests/test_pagina_acquisizione.py b/scripts/tests/test_pagina_acquisizione.py index 1c68ae3..5d5404c 100644 --- a/scripts/tests/test_pagina_acquisizione.py +++ b/scripts/tests/test_pagina_acquisizione.py @@ -52,3 +52,10 @@ def test_localstorage_protetto(): # ogni uso di localStorage sta dentro un try for m in re.finditer(r"localStorage[.]", PAGINA): assert "try {" in PAGINA[max(0, m.start() - 200):m.start()] + + +def test_specchiatura_per_sorgente(): # #110 + ids = set(re.findall(r'id="([^"]+)"', PAGINA)) + assert {"specchiaO", "specchiaV", "msgSpecchia"} <= ids + assert '"/camera/orientamento' in PAGINA + assert "Specchia orizzontale" in PAGINA and "Specchia verticale" in PAGINA