Skip to content

v0.4.0

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Jul 16:42

Still an early stage release — and a big one: multi-device support lands. Several analyzers (and the built-in virtual QA403) can now share one bench, each with its own capture loop, signal routing, measurement programs and export identity. The A/B loopback bench against the official application stayed green through every step (24/24 metrics × flat-top and Hann, re-run per merged lot).

What's new

Multi-device (#25, lots A–F)

  • Several devices at once: add a second unit (real or the built-in virtual QA403) from the Traces panel — each device gets its own trace group with per-group Run/Stop/Connect, user-renamable labels, and a focus selector deciding what the toolbar and footer describe. Unplugging a unit leaves a dormant, named group with one-click revive on the same slot.
  • Signal routing matrix: each signal source can drive any device × channel combination (L/R/both per target), edited per source row — a source pinned to device B plays on B while A stays focused, no focus gesture. Persisted slot-keyed, so workspace docs stay bench-portable.
  • Per-device measurement programs: sweeps run on the device they're pinned to (destination picker on the program row), concurrently across devices, with per-device exclusivity gates backend-side. Scripts route to their pinned device too (one script at a time bench-wide).
  • Honest export identity: CSV/SVG headers and PNG footers name the device that OWNS the exported data — never whatever device happens to be focused — with capture-time provenance (capture_* block) whenever the bench moved since capture, and a export_devices roll call on mixed tiles.
  • Rhai device(): scripts can read the identity, live status and capability record of the device their run is bound to. The REST scheme stays deliberately mono-device (official-app parity); multi-device REST is tracked separately.

Oscilloscope (lots A–B of #26)

  • Real trigger: AUTO / NORMAL / SINGLE with Schmitt hysteresis, sub-sample edge alignment, per-endpoint settings and a held-picture provenance snapshot.
  • Measurement suite: Vpp, Vmean, AC RMS, frequency, rise/fall, duty — with sliding statistics and a reset.

Measurements

  • THD vs level sweep (#27) and wow & flutter (DIN/IEC 386, #28) wired to the UI as measurement programs — result curves land as traces you can freeze, compare and persist.
  • User weighting curves (#29): import a CSV response (e.g. ITU-R 468) and apply it as a transform step.

Data & storage

  • CSV / SVG / PNG export with provenance headers (#30): device identity, acquisition settings, converter calibration — plus capture-time provenance per trace (#40). ;-separated CSV with . decimals (locale-proof for spreadsheets).
  • Workspace storage moved to IndexedDB with binary frames (#44): saving a bench full of frozen 32k captures no longer hits the localStorage quota.

What's fixed

  • LINK LED parity (#54): an in-capture ~1 Hz keepalive keeps the front-panel LINK LED lit like the official app.
  • Trigger chip no longer leaks onto spectrum/sweep tiles; scope CSV exports clip to the displayed window; sweep exports carry per-curve units; many smaller fixes from the per-lot adversarial reviews.

Docs

  • doc/device-notes.md grew I2S protocol notes, page selector and trace buffer details.
  • Rhai scripting API (incl. device()) documented in src-tauri/src/script.rs's module doc; example scripts updated in-app.

"Negative Feedback" still welcome ;)