Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -881,6 +881,7 @@ set(AETHER_SETTINGS_SOURCES
)

set(CORE_SOURCES
src/models/ConnectionWorkspace.cpp
src/core/control/ControlProtocolCodec.cpp # aetherd v1 bounded JSON envelopes
src/core/control/ControlResourceStore.cpp # typed snapshots and revisions
src/core/control/ControlSession.cpp # subscriptions and bounded event queues
Expand Down
5 changes: 5 additions & 0 deletions docs/BUILDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ builds qtkeychain against it, then configure as usual:
```bash
scripts/setup/setup-qt.sh
cmake -B build -G Ninja \
-DREQUIRE_KEYCHAIN=ON \
-DCMAKE_PREFIX_PATH="$(scripts/setup/setup-qt.sh --print-prefix);$(brew --prefix)"
```

Expand All @@ -38,6 +39,10 @@ for fftw, librtlsdr, portaudio and hidapi, but a Homebrew `qt` formula (often
pulled in by something else) lives under the same prefix; naming the pinned Qt
first keeps it the one CMake finds.

`REQUIRE_KEYCHAIN=ON` makes a missing credential store a configuration error.
Keep it enabled when testing saved SmartLink accounts or Icom connections;
without QtKeychain those credentials last only for the current session.

Qt 6.12 needs **Xcode 16** (the macOS 15 SDK): Qt's own CMake stops at
configure with "Qt requires at least version 16 of Xcode" on anything older,
and the script checks before it downloads. Xcode 16 itself needs a macOS 14.5+
Expand Down
6 changes: 6 additions & 0 deletions docs/architecture/aetherd-touchpoint-tags.json
Original file line number Diff line number Diff line change
Expand Up @@ -1732,5 +1732,11 @@
"note": "Explicit per-radio amplifier telemetry association; no radio or tuner commands.",
"split": "",
"confidence": "high"
},
"models/ConnectionWorkspace.h": {
"tag": "universal",
"note": "Versioned local station membership, connection references and operator audio/layout configuration. QtCore only; no vendor wire API or radio operating state.",
"split": "",
"confidence": "high"
}
}
3 changes: 2 additions & 1 deletion docs/architecture/aetherd-touchpoints.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

Burndown manifest for the engine/UI decoupling ([RFC](../aetherd-headless-engine-design.md) §2, §10). One row per engine header the UI includes; converting a touchpoint means the UI reaches that surface through the versioned protocol instead of the header.

**Totals:** 274 touchpoint headers (223 core, 51 models) — 274/274 tagged, 0/274 converted.
**Totals:** 275 touchpoint headers (223 core, 52 models) — 275/275 tagged, 0/275 converted.

| Header | Includers | Tag | Status |
|---|---:|---|---|
Expand Down Expand Up @@ -239,6 +239,7 @@ Burndown manifest for the engine/UI decoupling ([RFC](../aetherd-headless-engine
| `models/BandDefs.h` | 5 | universal — Static ARRL band plan table (edges, default freq/mode, GEN/WWV); canonical band-plan data, no vendor ties. | unconverted |
| `models/BandPlanManager.h` | 9 | universal — Band-plan overlay data (segments/spots/license classes, region merge) from JSON; radio-agnostic canon | unconverted |
| `models/BandSettings.h` | 6 | universal — Per-band save/restore of canonical state (freq/mode/filter/AGC/WNB/display range) — band memories, no vendor fields | unconverted |
| `models/ConnectionWorkspace.h` | 1 | universal — Versioned local station membership, connection references and operator audio/layout configuration. QtCore only; no vendor wire API or radio operating state. | unconverted |
| `models/Ctr2ProxyModel.h` | 5 | peripheral(ctr2) — CTR2-Max controller relay: an operator-enabled opaque byte relay between the controller (TCP listener in Wi-Fi mode, USB HID link in USB mode) and a dedicated radio TCP connection. The CTR2 is an independent radio client; nothing passes RadioModel, a backend socket or IRadioBackend. A device that negotiates link extensions (HID Feature report 0x02; never a stock CTR2) also receives AetherSDR's own audio spectrum, from the GUI's Ctr2AudioSpectrumFeeder, beside the relayed stream. A peripheral accessory transport, NOT behind the radio seam. See docs/ctr2-tcp-proxy-design.md and docs/ctr2-usb-relay-design.md (RFC #6091). | unconverted |
| `models/CwDecodeSettings.h` | 9 | ui-support — CW receive backend selection and display preferences in the existing feature-owned settings blob; no radio state. | unconverted |
| `models/CwRxModel.h` | 2 | universal — Receive CW backend catalog and lifecycle over typed PCM; decoder workers remain private and TX is separate. | unconverted |
Expand Down
16 changes: 15 additions & 1 deletion docs/automation-bridge.md
Original file line number Diff line number Diff line change
Expand Up @@ -2785,6 +2785,9 @@ Bare-line forms are also accepted:

```text
connect list
connect profiles
connect profile stations <station-id>
connect profile operators <operator-id>
connect show
connect hide
connect local first
Expand All @@ -2795,6 +2798,17 @@ connect wait 30000
disconnect
```

`connect profiles` returns the versioned connection workspace: saved locations and
their connection paths, operator audio/layout preferences, account labels and
references, and the selected IDs. The API retains the `stations` collection name
for compatibility with saved documents; the UI calls these **Locations**.
It never contains passwords or refresh tokens.
It is available in Observe-only mode. `connect profile stations|operators <id>`
persists a selection for the next connection, including while a radio is live;
it neither connects nor applies audio or radio state. This mutation is refused
in Observe-only mode. Profile creation and editing are exercised through the
normal `connectionProfileEditor` widgets with `invoke`.

`connect show` and `connect hide` idempotently show/raise or hide the
modeless **Connect to Radio** dialog for visual debugging; they do not toggle,
so `connect show` is safe when the dialog is already open. `connect local first`
Expand Down Expand Up @@ -4916,7 +4930,7 @@ audio devices require separate hardware validation.
| `invoke` | — | invoke <target> <action> [value…] — drive a control (TX-guarded) |
| `get` | — | get <model> [selector] [property] — live model snapshot; get eqstats [selector] [reset] reports Client EQ paint/cache counters |
| `meterwindow` | — | meterwindow <start [duration_ms]\|status\|stop> — bounded meter ages and unrounded peaks; never keys TX |
| `connect` | — | connect <list\|show\|hide\|local\|ip\|wait> [args] |
| `connect` | — | connect <list\|profiles\|profile stations\|operators <id>\|show\|hide\|local\|ip\|wait> [args] |
| `disconnect` | — | disconnect from the radio |
| `txtest` | — | txtest <twotone\|off> — TX-gated test signal |
| `atu` | — | atu <bypass\|start> — antenna tuner (start is TX-gated) |
Expand Down
2 changes: 1 addition & 1 deletion docs/user/docs/anan-g2.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ AetherSDR can receive with an Apache Labs **ANAN-G2** over openHPSDR Protocol 2.

## Setup

The G2 is found automatically on your LAN: open **File → Connect to Radio...** → **On This Network**, select it and click **Connect Selected Radio**.
The G2 is found automatically on your LAN: open **File → Connect to Radio...** → **Nearby radios**, select it and click **Connect Selected Radio**.

Discovery also sends a directed broadcast to each attached IPv4 subnet. This can find a G2 on a second NIC with its own subnet. Two NICs sharing a subnet still use the preferred route; VPNs and routers may block broadcast discovery. If the G2 does not appear, use **Connect by IP** with **Radio type:** set to **ANAN-G2** (see [Manual Connection](./manual-connection.md)).

Expand Down
2 changes: 1 addition & 1 deletion docs/user/docs/demo-mode.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Demo mode runs the full AetherSDR interface against a built-in simulator, so you
## Setup

1. Open the **Connect to Radio** window (**File → Connect to Radio...**).
2. On **On This Network**, the list includes **AetherSDR Demo**, labeled **"Simulator (not on the air)"**.
2. Under **Nearby radios**, the list includes **AetherSDR Demo**, labeled **"Simulator (not on the air)"**.
3. Select it and click **Connect Selected Radio**.

The demo always sorts below real radios and is never chosen over one. There is no menu item or command-line flag; you connect to it like any radio.
Expand Down
25 changes: 13 additions & 12 deletions docs/user/docs/first-connection.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,22 @@ This page walks through connecting to a FlexRadio for the first time. AetherSDR

## Setup

<img src="/img/screens/connect-dialog.png" width="760" alt="Connect to Radio window. Three cards across the top read On This Network (selected), Remote with SmartLink and Connect by IP. The Available radios list holds three entries: Hermes-Lite 2, ready on your local network, highlighted, with its address blacked out; FLEX-8600 FLX8600 KK7GWY, shared radio on your network via multiFLEX at AetherSDR, USA; and AetherSDR Demo, Simulator (not on the air), DEMO, ready on your local network at 127.0.0.1. A Connect Selected Radio button and checkboxes for the adaptive frame-rate throttle, connecting to the last radio on start-up, waking an Icom on connect and showing the demo simulator follow, with Connected and a Disconnect button at the bottom." />

*The Connect to Radio window, On This Network: every radio discovery found on the LAN. The addresses are blacked out.*
The **Connect to a radio** window keeps your saved radios together in named locations, such as Home, POTA or Cabin. The initial **Home** location preserves your current connection settings. See [Location and Operator Profiles](./station-profiles.md).

The window has no title bar. It opens above the status bar; drag any empty part of it to move it, and drag an edge or corner to resize it. Close it with the round **✕** in the top-right corner, **Esc** or **Ctrl+W** (**⌘W** on macOS). **View → Frameless Window** does not apply to it, and pressing **Return** in a field (an IP address, a SmartLink password) does only what that field does.

The window automatically fits its height to the available screen space, including room for a horizontal scrollbar when the contents are wider than the window. On a smaller screen, scroll the body to reach its controls; the connection status and **Disconnect** button remain below it.

1. **Launch AetherSDR.** The **Connect to Radio** window opens. You can reopen it at any time with **File → Connect to Radio...**, or from the **+** button beside the title bar's radio tabs.
2. Choose **On This Network** ("Recommended for new users when the radio and computer are on the same LAN").
3. Your radio appears under **Available radios** within a few seconds.
4. Select it and click **Connect Selected Radio**.
5. The spectrum and waterfall appear, and audio starts playing through your default output device.
<img src="/img/screens/connect-dialog.png" width="912" alt="Connect to a radio window with Locations, the Radios at Home list, selected radio details, operator selection and SmartLink accounts." />

*Choose a location, select a radio and use Connect to connect to that radio.*

1. **Launch AetherSDR.** The **Connect to a radio** window opens. Reopen it with **File → Connect to Radio...**, or the **+** beside the title bar's radio tabs.
2. Select your location. If it has no saved connections, discovered radios appear directly in its list.
3. Select your radio and click **Connect**. The connection is saved in this location.
4. The spectrum, waterfall and receive audio start.

If no radio appears, the window shows "No local radios found yet" with **Retry Discovery**, **Remote with SmartLink**, **Connect by IP** and **Open Network Diagnostics** buttons. See [Troubleshooting](#troubleshooting).
**Nearby radios** opens the full discovery list. Select a radio and click **Save selected radio to location**, then **Back to location** to return to the launcher. Discovery continues as you browse locations. If nothing appears, use **Retry Discovery** or **Open Network Diagnostics** there.

The list can also include:
- **Hermes-Lite 2** and **ANAN-G2** radios on the same LAN, and RTL-SDR dongles plugged into this computer (on builds with the RTL-SDR backend).
Expand All @@ -61,15 +62,15 @@ Controls that the connected radio cannot use are hidden or dimmed with a reason.

### Auto-connect

With **Connect to last radio on start up** checked (the default), AetherSDR reconnects to the last radio on the next launch if it is reachable. Untick it in the Connect to Radio window to choose a radio yourself each time. If startup auto-connect gives up, the Connect to Radio window opens again.
With **Connect to last radio on start up** checked (the default), AetherSDR reconnects to the last radio on the next launch if it is reachable. Untick it under **Startup and connection preferences** in the connection window to choose a radio yourself each time. If startup auto-connect gives up, the Connect to Radio window opens again.

### Connect by IP (routed networks)

If your radio is on a different subnet or behind a VPN, discovery cannot see it. Choose the **Connect by IP** card, set **Radio type:**, enter **Radio IP:** and click **Connect by IP**. See [Manual Connection](./manual-connection.md).
If your radio is on a different subnet or behind a VPN, discovery cannot see it. Choose **+ Add radio by IP**, set **Radio type:**, enter **Radio IP:** and click **Connect by IP**. See [Manual Connection](./manual-connection.md).

### SmartLink (remote operation)

Choose **Remote with SmartLink** to reach a FlexRadio over the internet. See [SmartLink Setup](./smartlink-setup.md).
Choose **SmartLink accounts…** to reach a FlexRadio over the internet. See [SmartLink Setup](./smartlink-setup.md).

## Known issues

Expand Down
2 changes: 1 addition & 1 deletion docs/user/docs/hermes-lite-2.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ The HL2 has no on-board DSP, so AetherSDR does the demodulation, filtering, AGC,

### Connecting

The HL2 is found automatically on your LAN: open **File → Connect to Radio...** → **On This Network**, select it and click **Connect Selected Radio**. AetherSDR probes from every active IPv4 interface, so a computer with several network adapters finds the HL2 on the one it is connected to, and keeps using that interface for the session and its reconnects.
The HL2 is found automatically on your LAN: open **File → Connect to Radio...** → **Nearby radios**, select it and click **Connect Selected Radio**. AetherSDR probes from every active IPv4 interface, so a computer with several network adapters finds the HL2 on the one it is connected to, and keeps using that interface for the session and its reconnects.

Across a VPN or another subnet, use **Connect by IP** with **Radio type:** set to **Hermes-Lite 2** (see [Manual Connection](./manual-connection.md)).

Expand Down
13 changes: 8 additions & 5 deletions docs/user/docs/manual-connection.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ Use **Connect by IP** for:

## Setup

<img src="/img/screens/connect-by-ip-card.png" width="760" alt="Connect to Radio window with the Connect by IP card selected. The Radio IP address group has Radio type: FlexRadio, Radio IP: 192.0.2.25, Network Diagnostics and Connect by IP buttons, and an Advanced: choose the VPN source path expander. Below are Connection options for slower links with a Use low bandwidth mode checkbox, and the shared checkboxes for the adaptive frame-rate throttle, connecting to the last radio, waking an Icom and showing the demo simulator." />
<img src="/img/screens/connect-by-ip-card.png" width="912" alt="Connect to a radio manual form with Connection name above the radio family, host and source path, and Save connection beside Connect by IP." />

*The Connect by IP card, with a documentation address typed in.*
*The saved manual connection form, with a documentation address typed in.*

1. Open the **Connect to Radio** window: **File → Connect to Radio...**, or the **+** button beside the title bar's radio tabs → **Connect manually…**.
2. Choose the **Connect by IP** card ("Best for VPN or routed station access when you already know the radio IP").
1. Open **File → Connect to Radio...** and select the destination location.
2. Choose **+ Add radio by IP**.

The **Radio IP address** group starts with two rows:

Expand All @@ -33,6 +33,9 @@ The **Radio IP address** group starts with two rows:

## Using Connect by IP

Enter an optional **Connection name:** at the top of the form, then choose **Save connection**, beside **Connect by IP**, to save without connecting. **Edit connection**, under **Connection settings** on the selected radio, restores its host, radio family, source interface, Icom settings and low bandwidth preference for editing. A saved connection stays visible while offline. An address is a saved locator; it is not proof that the same physical radio is still there.


### Connecting to a FlexRadio

1. Set **Radio type:** to **FlexRadio**.
Expand All @@ -54,7 +57,7 @@ For a networked Icom behind NAT, see the **Icom ports:** row on [Networked Icom]

### Slower links

**Use low bandwidth mode** and **Enable adaptive frame-rate throttle** are in the same window, under "Connection options for slower links". See [Low Bandwidth Connections](./low-bandwidth-connections.md).
**Use low bandwidth mode** is under **Connection options for slower links**. **Enable adaptive frame-rate throttle** is under **Startup and connection preferences**. See [Low Bandwidth Connections](./low-bandwidth-connections.md).

### Auto-reconnect

Expand Down
4 changes: 2 additions & 2 deletions docs/user/docs/networked-icom.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ Enable network (remote) control and create a network user name and password. Aet

### Connecting

Networked Icoms are not discovered automatically. Open **File → Connect to Radio...**, choose **Connect by IP** and set **Radio type:** to **Icom (network)**. The form gains these rows:
Networked Icoms are not discovered automatically. Open **File → Connect to Radio...**, choose **+ Add radio by IP** and set **Radio type:** to **Icom (network)**. The form gains these rows:

<img src="/img/screens/connect-icom-rows.png" width="734" alt="Radio IP address group with Radio type: Icom (network), Radio IP: 192.0.2.30, empty Icom user and Icom password fields, Icom ports: Standard (50001–50003), Icom CI-V: Auto-detect (recommended), Network Diagnostics and Connect by IP buttons, and an Advanced: choose the VPN source path expander." />
<img src="/img/screens/connect-icom-rows.png" width="912" alt="Radio IP address group with Radio type: Icom (network), Radio IP: 192.0.2.30, empty Icom user and Icom password fields, Icom ports: Standard (50001–50003), Icom CI-V: Auto-detect (recommended), Network Diagnostics and Connect by IP buttons, and an Advanced: choose the VPN source path expander." />

*Connect by IP with Radio type set to Icom (network): the Icom user, password, ports and CI-V rows appear.*

Expand Down
2 changes: 1 addition & 1 deletion docs/user/docs/rtl-sdr.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Building from source: the `ENABLE_RTL` option is on by default and takes effect
## Setup

1. Plug in the dongle.
2. Open **File → Connect to Radio...** → **On This Network**. Supported dongles on USB are listed with the network radios.
2. Open **File → Connect to Radio...** → **Nearby radios**. Supported dongles on USB are listed with the network radios.
3. Select the dongle and click **Connect Selected Radio**.

The radio tab shows **Connected** with a green status dot once the USB connection is established. Amber indicates discovery; a USB receiver does not need a network heartbeat to show its connected state.
Expand Down
Loading
Loading