Przeglądaj źródła

feat: add refinement window controls to UI

master
Jan Svabenik 9 godzin temu
rodzic
commit
1e2d4f0f74
2 zmienionych plików z 32 dodań i 0 usunięć
  1. +18
    -0
      web/app.js
  2. +14
    -0
      web/index.html

+ 18
- 0
web/app.js Wyświetl plik

@@ -62,6 +62,10 @@ const recMinSNR = qs('recMinSNR');
const recMaxDisk = qs('recMaxDisk'); const recMaxDisk = qs('recMaxDisk');
const recClassFilter = qs('recClassFilter'); const recClassFilter = qs('recClassFilter');


const refineAutoSpan = qs('refineAutoSpan');
const refineMinSpan = qs('refineMinSpan');
const refineMaxSpan = qs('refineMaxSpan');

const signalList = qs('signalList'); const signalList = qs('signalList');
const eventList = qs('eventList'); const eventList = qs('eventList');
const recordingList = qs('recordingList'); const recordingList = qs('recordingList');
@@ -668,6 +672,9 @@ function applyConfigToUI(cfg) {
if (recMaxDisk) recMaxDisk.value = cfg.recorder.max_disk_mb ?? 0; if (recMaxDisk) recMaxDisk.value = cfg.recorder.max_disk_mb ?? 0;
if (recClassFilter) recClassFilter.value = (cfg.recorder.class_filter || []).join(', '); if (recClassFilter) recClassFilter.value = (cfg.recorder.class_filter || []).join(', ');
} }
if (refineAutoSpan) refineAutoSpan.value = String(cfg.refinement?.auto_span ?? true);
if (refineMinSpan) refineMinSpan.value = cfg.refinement?.min_span_hz ?? 0;
if (refineMaxSpan) refineMaxSpan.value = cfg.refinement?.max_span_hz ?? 0;
spanInput.value = (cfg.sample_rate / zoom / 1e6).toFixed(3); spanInput.value = (cfg.sample_rate / zoom / 1e6).toFixed(3);
isSyncingConfig = false; isSyncingConfig = false;
} }
@@ -1926,6 +1933,17 @@ if (recClassFilter) recClassFilter.addEventListener('change', () => {
.filter(Boolean); .filter(Boolean);
queueConfigUpdate({ recorder: { class_filter: list } }); queueConfigUpdate({ recorder: { class_filter: list } });
}); });
if (refineAutoSpan) refineAutoSpan.addEventListener('change', () => {
queueConfigUpdate({ refinement: { auto_span: refineAutoSpan.value === 'true' } });
});
if (refineMinSpan) refineMinSpan.addEventListener('change', () => {
const v = parseFloat(refineMinSpan.value);
if (Number.isFinite(v)) queueConfigUpdate({ refinement: { min_span_hz: v } });
});
if (refineMaxSpan) refineMaxSpan.addEventListener('change', () => {
const v = parseFloat(refineMaxSpan.value);
if (Number.isFinite(v)) queueConfigUpdate({ refinement: { max_span_hz: v } });
});


avgSelect.addEventListener('change', () => { avgSelect.addEventListener('change', () => {
avgAlpha = parseFloat(avgSelect.value) || 0; avgAlpha = parseFloat(avgSelect.value) || 0;


+ 14
- 0
web/index.html Wyświetl plik

@@ -239,6 +239,20 @@
<label class="field"><span>Max Disk (MB)</span><input id="recMaxDisk" type="number" step="256" min="0" /></label> <label class="field"><span>Max Disk (MB)</span><input id="recMaxDisk" type="number" step="256" min="0" /></label>
<label class="field"><span>Class Filter (CSV)</span><input id="recClassFilter" type="text" placeholder="e.g. NFM,USB" /></label> <label class="field"><span>Class Filter (CSV)</span><input id="recClassFilter" type="text" placeholder="e.g. NFM,USB" /></label>
</div> </div>

<div class="form-group">
<div class="grp-title">Refinement Windows</div>
<label class="field"><span>Auto Span</span>
<select id="refineAutoSpan" class="ctrl-select">
<option value="true">Auto</option>
<option value="false">Manual</option>
</select>
</label>
<div class="field-pair">
<label class="field"><span>Min Span (Hz)</span><input id="refineMinSpan" type="number" step="500" min="0" /></label>
<label class="field"><span>Max Span (Hz)</span><input id="refineMaxSpan" type="number" step="500" min="0" /></label>
</div>
</div>
</section> </section>


<!-- ── Signals Tab ── --> <!-- ── Signals Tab ── -->


Ładowanie…
Anuluj
Zapisz