docs(arch): correct RadioSession v3 scope (#3351 / #3445)#3555
Merged
Conversation
…items The v1 class doc (merged in #3544) listed two v3 items that don't hold up on closer inspection. Documenting why, so neither gets attempted as written: 1. "wire bodies move onto RadioSession" — they can't. wireDiscovery / wireRadioModel / wirePanLifecycle are ~100 connect() calls with ~76 references to MainWindow's widgets; they're application-layer model→UI glue. Moving them to a models/ class inverts the dependency (the model layer would have to #include the GUI). They stay in the GUI layer. 2. "per-session settings facade" — premature. There is no per-radio AppSettings namespace to wrap: per-radio state is global (StationName, LastConnectedRadioSerial), radio-side (slice/pan/mode live in SSDR profiles, #3384), or already correctly namespaced. BandStackSettings::sanitizeSerial() ("Radio_<serial>") is the one working per-radio pattern and is the template to follow when a second session creates a real consumer. Doc-only; no code change. Captures the finding from the post-v2 review of what genuinely remains for multi-radio (#3445). Principle XI.
G6PWY-Chris
pushed a commit
to G6PWY-Chris/AetherSDR
that referenced
this pull request
Jun 22, 2026
…#3445) (aethersdr#3555) ## Summary Doc-only. Corrects two items the RadioSession v1 class doc (merged in aethersdr#3544) listed as "v3 scope" that don't survive closer inspection. No code change — captures a finding so neither gets attempted as written. I went to build the **SessionSettings facade** (the documented next step) and the investigation showed it's premature. Rather than build speculative infrastructure with no consumer — the first such thing in the 12-PR series — here's the finding, recorded in the class doc where the next contributor will see it. ## Finding 1: the wire bodies can't move onto RadioSession `wireDiscovery` / `wireRadioModel` / `wirePanLifecycle` are **~100 `connect()` calls with ~76 references to MainWindow's widgets** (applet panel, title bar, pan stack, spectrum widgets, status bar). They're application-layer model→UI glue. Moving them onto a `src/models/` class would invert the dependency — RadioSession would have to `#include` the GUI. They belong in the GUI layer (where they are now), full stop. ## Finding 2: the SessionSettings facade is premature There is no per-radio AppSettings namespace to wrap. Per-radio state today is: | Category | Examples | Where it lives | |---|---|---| | Global | `StationName`, `LastConnectedRadioSerial` | flat AppSettings (genuinely global — station is per-operator, last-serial is a reconnect pointer) | | Radio-side | slice/pan positions, modes | FlexRadio SSDR profiles (`profile global info`) — see aethersdr#3384 | | Already per-radio | band-stack entries | `BandStackSettings::sanitizeSerial()` → `"Radio_<serial>"` keys | **`BandStackSettings` is the one working per-radio-namespacing pattern in the codebase** — it's the template multi-radio should follow when a second session creates a real consumer. A facade built now would wrap nothing and have no caller. ## What this means for the series The aethersdr#3351 refactor is **complete**. The architecturally hard work — the 19,474→8,135-line decomposition and the by-value→session-collection extraction (937 call sites) — is merged. RadioSession owns `{RadioModel, TciServer, CatPort[8], identity}`; the aethersdr#2385 crash class is structurally impossible. What remains for multi-radio (aethersdr#3445) is feature/design work — the `m_sessions.size() > 1` activation, the active-radio UI, the audio-plane decision — which is the team's call, not more refactoring. Refs aethersdr#3351 aethersdr#3445 aethersdr#3384
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
Doc-only. Corrects two items the RadioSession v1 class doc (merged in #3544) listed as "v3 scope" that don't survive closer inspection. No code change — captures a finding so neither gets attempted as written.
I went to build the SessionSettings facade (the documented next step) and the investigation showed it's premature. Rather than build speculative infrastructure with no consumer — the first such thing in the 12-PR series — here's the finding, recorded in the class doc where the next contributor will see it.
Finding 1: the wire bodies can't move onto RadioSession
wireDiscovery/wireRadioModel/wirePanLifecycleare ~100connect()calls with ~76 references to MainWindow's widgets (applet panel, title bar, pan stack, spectrum widgets, status bar). They're application-layer model→UI glue. Moving them onto asrc/models/class would invert the dependency — RadioSession would have to#includethe GUI. They belong in the GUI layer (where they are now), full stop.Finding 2: the SessionSettings facade is premature
There is no per-radio AppSettings namespace to wrap. Per-radio state today is:
StationName,LastConnectedRadioSerialprofile global info) — see #3384BandStackSettings::sanitizeSerial()→"Radio_<serial>"keysBandStackSettingsis the one working per-radio-namespacing pattern in the codebase — it's the template multi-radio should follow when a second session creates a real consumer. A facade built now would wrap nothing and have no caller.What this means for the series
The #3351 refactor is complete. The architecturally hard work — the 19,474→8,135-line decomposition and the by-value→session-collection extraction (937 call sites) — is merged. RadioSession owns
{RadioModel, TciServer, CatPort[8], identity}; the #2385 crash class is structurally impossible. What remains for multi-radio (#3445) is feature/design work — them_sessions.size() > 1activation, the active-radio UI, the audio-plane decision — which is the team's call, not more refactoring.Refs #3351 #3445 #3384