- Per-signal, per-plot vertical scale state (sigVScale keyed by plotId:signalKey)
so the same signal in two plots has fully independent vscale config
- Active signal redrawn on top of all series with 2× line width for clear
visual identification; badge click toggles selection and opens/closes the
embedded vscale toolbar (click same badge again to deselect)
- Vscale configurator moved from floating popup to a slim toolbar strip
anchored inside the plot card, with an × close button
- Trigger dropdown shows one entry per array signal with [0…N-1] label;
opening it shows an index-picker dialog to choose the element
- Zoom resampling: when server returns no data for a zoomed range, fall
back to the local circular buffer instead of returning empty arrays
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
UDPStreamer:
- Add PublishingMode = "Strict" | "Auto" config parameter
- Add MinRefreshRate (Hz) for Auto mode; uses HRT phase-locked tick
counting to rate-limit sends without accumulation buffers
- Fix high-frequency integration test configs to use newline-separated
key-value pairs (MARTe2 StandardParser does not treat ';' as delimiter)
- Add 3 new unit tests (AutoMode_Valid, AutoMode_MissingRefreshRate,
UnknownPublishingMode); all 33 tests passing
WebUI hub:
- Skip ring-buffer LTTB writes when zoom has not been accessed in 10 s,
reducing idle CPU usage
- Use unsafe float64→bytes reinterpretation to eliminate per-element
encoding overhead in the hot broadcast path
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Reorder Execute() main stage so the background thread waits on dataSem
(sleeping until the RT thread posts) before doing the socket select().
The socket poll is now non-blocking (timeout=0) since command latency
bounded by UDPS_DATA_WAIT_MS is acceptable for CONNECT/DISCONNECT.
Also force-remove old udpstreamer-webui binary in run.sh before rebuild
so stale embedded assets are never served.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>