Fix multisource and demod lifecycle issues - #59
Draft
ceane wants to merge 149 commits into
Draft
Conversation
- Fixing issue where pause was advancing by a frame or when reloading hitting pause didn't work
…top of continuing fixes
Unify spectrum state ownership, source lifecycle handling, and whole-channel controls across the frontend and backend. Replace the Mock Tx generators with reusable complex-baseband synthesis, preserve signal shape and bandwidth contracts, normalize power consistently across frontend FFT and Tx IFFT sizes, and cover OFDM variance and integrated large-block power. Harden SDR hotplug, source swapping, HackRF TX plumbing, and non-blocking RTL-SDR reader cleanup. Refresh integration, unit, build, and GPU-path tests to match the new ownership and streaming behavior. Validation: cargo test --workspace --all-targets; rustfmt --check on the modified complex-baseband Rust modules.
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Device switches and transport warm-up were able to flash Server Down after a prior live session. Gate unavailable presentation on true post-session control loss only. Co-authored-by: Cursor <cursoragent@cursor.com>
Brief socket closes during reconnect were clearing sources and active ids, which thrashed placeholders and forced source reselection. Co-authored-by: Cursor <cursoragent@cursor.com>
Adds a /settings route with a scroll-spy sidebar covering theme, SDR, login, I/Q capture, and snapshot defaults, plus a new /faq landing page and reusable link-card components for page footers. Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Replaces the FAQ layout's local logo img and back link with the shared Logo and AppBackButton components, drops the redundant "N-APT FAQ" title, and adds a Lingo and Learn link to the FAQ home. Adds hideHeader support to ThemeSection for embedding in the settings page. Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Supports externally controlled open state, a section id for sidebar scroll targets, and an embedded header-free rendering mode. Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Adds lazy routes for /settings, /get-started, and a /faq landing page replacing the old redirect. Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
- add source-owned multiplexed streaming, presentation control, and TX standby handling\n- expand Rust websocket/source lifecycle, SDR recovery, TX monitor, and stream manager behavior\n- reorganize frontend shell, routes, sidebar layouts, Learn Signals, FAQ content, and visualization flows\n- update Redux/WebSocket contracts, frame processing, frequency controls, WebGPU waterfall behavior, and capture policy\n- add focused frontend, integration, Rust, shader, rebuild-status, and streaming regression coverage\n- move Rust hot-reload helpers and document testing conventions and design decisions\n\nValidation: TypeScript typecheck passed; focused Rust and frontend checks were run. Existing full-suite failures and environment-blocked localhost tests remain documented in the task history.
There was a problem hiding this comment.
CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.
Unify source-scoped stream ownership across live, paused, and transmit paths; harden frame presentation and snapshot handling; and keep mirrored spectrum scrolling bounded at signed and hardware frequency limits. Add regression coverage for source switching, pause behavior, frame processing, snapshots, waterfall motion, stream contracts, and negative-frequency reanchoring.
…be seeding to backend state The mirror toggle used to be subscriber-local state, so two clients could render the same live RF stream on opposite sides of the baseband axis. The convention is now held by the server and broadcast in the channels snapshot; settings updates carry it as a device-scoped write, and the Settings toggle sends it through the same shared path. Navigation bounds now always prefer device acquisition bounds so zoom level cannot decide whether 0 Hz is reachable, and the persisted source-view cache keeps only subscriber-local presentation state so page hydration can never retune the shared source. A first subscribe is treated as a read/hydration operation: effective RX options are seeded from the backend's current device state so a stale client cannot become the center-frequency authority during stream hydration. Adds tests for the shared mirror axis, the authoritative subscribe seeding, and subscriber coordination through tune/pause/hydration churn. Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Eliminates 214 oxlint warnings down to zero. Removes unused imports and dead code (including an entire unused drag-and-drop block in SourceInput), underscores unused parameters and locals, and fixes non-unused-vars rules: no-control-regex/no-misleading-character-class are suppressed via a real .oxlintrc.json (the existing oxlint.json was never auto-loaded), ternary expressions become explicit if/else, a dead `if (false && ...)` branch is removed, and regex/array-construction/spread cleanups apply. No behavior changes: typecheck is clean and the full TS suite passes. Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Route source selection through page-scoped multiplexed streams, preserve source ownership across pause and reconnect transitions, and keep hydrated state aligned with the active stream. Add the context boundary and regression coverage for transport, lifecycle, persistence, canvas rendering, source switching, paused frames, and mirrored scrolling.
Honor the configured signal limits while flooring isolated Mock APT and Tx monitor rates to the negotiated sample-rate/FFT-size budget. Keep acquisition-worker and WebSocket settings aligned with the source capability contract, including mirrored-spectrum defaults and source-scoped validation.
Keep subscriber-local source ranges and managed stream ownership independent from process-wide device state. Align Mock Tx monitor geometry with its floored viewer sample rate, preserve and clear frames at source boundaries, and harden source-switch, standby-preview, and transport lifecycle coverage.
Narrow the nullable Mock APT source status before checking the allowed lifecycle states so the integration test satisfies strict TypeScript compilation.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Validation
Notes