Commit 1aa802a4 authored by vertighel's avatar vertighel
Browse files

control_panel.html: ripopola Frame/Binning/Type/Filter/Exptime da localStorage



Sostituisce il vecchio data-telemetry-init (rotto: chiave binning errata,
valore filter non spacchettato, e comunque nessun endpoint pubblica mai
imagetype/frame/exptime) con data-load-from-storage, letto/scritto in
localStorage lato browser. Non sincronizza tra client diversi, ma risolve
il caso reale: il reload della pagina non deve più resettare ai default
HTML i campi che l'utente ha già impostato, con rischio di un Expose
successivo che sovrascrive le impostazioni correnti della camera.

Co-Authored-By: default avatarClaude Sonnet 5 <noreply@anthropic.com>
parent 3761c4b0
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -265,7 +265,7 @@
    <label class="col-md-2 col-form-label">Type</label>
    <div class="col-md">
      <select class="form-select form-select-sm bg-black" name="imagetype"
              data-telemetry-init="scicam1-imagetype">
              data-load-from-storage="scicam1-imagetype">
        <option value="Light">Light</option>
        <option value="Bias">Bias</option>
        <option value="Flat">Flat</option>
@@ -276,7 +276,7 @@
    <label class="col-md-2 col-form-label">Filter</label>
    <div class="col-md">
      <select class="form-select form-select-sm bg-black" name="filter"
              data-telemetry-init="scicam1-filter">
              data-load-from-storage="scicam1-filter">
        <option value="SDSS u">SDSS u</option>
        <option value="SDSS g">SDSS g</option>
        <option value="SDSS r">SDSS r</option>
@@ -296,7 +296,7 @@
    <label class="col-md-2 col-form-label">Type</label>
    <div class="col-md">
      <select class="form-select form-select-sm bg-black" name="imagetype"
              data-telemetry-init="scicam2-imagetype">
              data-load-from-storage="scicam2-imagetype">
        <option value="Light">Light</option>
        <option value="Bias">Bias</option>
      </select>
@@ -312,7 +312,7 @@
    <label class="col-md-2 col-form-label">Type</label>
    <div class="col-md">
      <select class="form-select form-select-sm bg-black" name="imagetype"
              data-telemetry-init="scicam3-imagetype">
              data-load-from-storage="scicam3-imagetype">
        <option value="Light">Light</option>
        <option value="Bias">Bias</option>
        <option value="Flat">Flat</option>
@@ -323,7 +323,7 @@
    <label class="col-md-2 col-form-label">Filter</label>
    <div class="col-md">
      <select class="form-select form-select-sm bg-black" name="filter"
              data-telemetry-init="scicam3-filter">
              data-load-from-storage="scicam3-filter">
        <option value="FREE">Free</option>
      </select>
    </div>
@@ -349,7 +349,8 @@
    <select class="form-select form-select-sm bg-black select-universal"
            id="frame-preset-{{ camera_id }}"
            data-url="/{{ camera_prefix }}/frame"
            data-url-append>
            data-url-append
            data-load-from-storage="{{ camera_prefix }}-frame">
      {% for lbl, val in frames %}
      <option value="{{ val }}" {{ 'selected' if loop.first }}>{{ lbl }}</option>
      {% endfor %}
@@ -364,7 +365,7 @@
            form="form-{{ camera_id }}"
            data-url="/{{ camera_prefix }}/frame/binning"
            data-inputs="binning-sel-{{ camera_id }},binning-sel-{{ camera_id }}"
            data-telemetry-init="{{ camera_prefix }}-binning">
            data-load-from-storage="{{ camera_prefix }}-binning">
      {% for n in range(1, binning_max + 1) %}
      <option value="{{ n }}">{{ n }}×{{ n }}</option>
      {% endfor %}
@@ -389,7 +390,8 @@
    <div class="input-group input-group-sm">
      <input type="number" class="form-control bg-black"
             name="exptime" form="form-{{ camera_id }}"
             value="1.0" min="0" step="0.1">
             value="1.0" min="0" step="0.1"
             data-load-from-storage="{{ camera_prefix }}-exptime">
      <span class="input-group-text">s</span>
    </div>
  </div>
+17 −17
Original line number Diff line number Diff line
@@ -195,26 +195,26 @@ document.addEventListener('DOMContentLoaded', () => {
    wireFieldBroadcast(document.getElementById('binning-sel-spectro'),                  'binning', MODES.station2.camId);

    // -----------------------------------------------------------------------
    // Init
    // Frame/Binning/Type/Filter/Exptime — restore last value from localStorage
    // on load, so a reload doesn't silently fall back to the HTML defaults
    // and risk an Expose overwriting the camera's current settings.
    //
    // Not telemetry-backed: the camera never reports its current imagetype,
    // frame preset, or exptime back (no such endpoint exists), and binning/
    // filter telemetry — where it does exist — isn't reliable enough to
    // drive this. localStorage only remembers what *this browser* last set,
    // which is what actually matters for the "my own reload" case.
    // -----------------------------------------------------------------------
    document.addEventListener('noctua-telemetry', function(e) {
        const msg = e.detail;
        if (!msg?.name.startsWith('all-')) return;
        const subsystem = msg.name.replace('all-', '');
        document.querySelectorAll(`select[data-telemetry-init^="${subsystem}-"]:not([data-ti-done])`).forEach(sel => {
            const segments = sel.dataset.telemetryInit.split('-').slice(1);
            let val = msg.data;
            for (const p of segments) {
                if (val == null) break;
                val = val[p];
            }
            if (val != null) {
                sel.value = String(val);
                sel.dataset.tiDone = '1';
            }
        });
    document.querySelectorAll('[data-load-from-storage]').forEach(el => {
        const key    = `noctua:${el.dataset.loadFromStorage}`;
        const stored = localStorage.getItem(key);
        if (stored !== null) el.value = stored;
        el.addEventListener('change', () => localStorage.setItem(key, el.value));
    });

    // -----------------------------------------------------------------------
    // Init
    // -----------------------------------------------------------------------
    applyMode('station1');

    // -----------------------------------------------------------------------