What happened?
When switching between bands using AetherSDR 0.7.18.3 on macOS with a FLEX-8400, the panadapter zoom level (bandwidth) is reset to a default value every time a new band is selected. Any zoom level previously set for that band is lost — the application does not remember per-band zoom preferences. This affects all bands: whether returning to a band visited earlier in the same session or across restarts, the zoom always reverts to a default rather than restoring the last-used zoom for that band.
What did you expect?
Switching to a band should restore the zoom level (panadapter bandwidth) that was last used for that band. Each band should have its own independently persisted zoom level, saved to AppSettings and restored when the band is re-selected — matching the per-band settings behaviour users would expect from a full-featured SDR client.
Steps to reproduce
Connect to a FLEX-8400 running firmware 4.1.5.39794.
On any band (e.g. 20 m), adjust the panadapter zoom to a non-default bandwidth (e.g. zoom in to 200 kHz span).
Switch to a different band (e.g. 40 m). Note the zoom level.
Adjust the zoom on 40 m to a different non-default value (e.g. 500 kHz span).
Switch back to 20 m.
Observed: zoom level is at the default, not the 200 kHz set in step 2.
Quit and relaunch AetherSDR, reconnect, and navigate to any band previously zoomed.
Observed: zoom level is again at the default — no per-band zoom was persisted.
Radio model & firmware
Radio: FLEX-8400
Firmware: 4.1.5.39794
OS & version
OS: macOS
AetherSDR: 0.7.18.3
Qt: 6.7.3
Developer Notes
Relevant source files and classes:
src/models/BandSettings — This is the primary suspect. BandSettings is described in the architecture as handling per-band persistent settings. Zoom level (panadapter bandwidth) should be stored and retrieved here, keyed by band. If zoom is not included in the set of values BandSettings saves/restores, that is the gap to fill.
src/models/PanadapterModel — Owns the per-panadapter state including center, bandwidth, dBm range. The bandwidth field is the zoom level. Check whether PanadapterModel reads from or writes to BandSettings on band change, or whether it only reflects the radio's last-known state without consulting local persistence.
src/core/AppSettings — All persistence must go through AppSettings (XML at ~/.config/AetherSDR/AetherSDR.settings), never QSettings. A per-band zoom key should follow the existing PascalCase convention, e.g. BandZoom_20m or a structured key like Band/<band_name>/ZoomBandwidth.
src/core/RadioConnection — Band changes are likely triggered via a command through RadioConnection. Confirm that the band-change handler in RadioModel or MainWindow calls into BandSettings to save the outgoing band's zoom and restore the incoming band's zoom around the transition.
src/gui/MainWindow — Wires band-change signals to model updates. Check whether a bandChanged or equivalent signal triggers a BandSettings save/load cycle for zoom, or whether zoom is simply left to whatever the radio reports after the band switch.
src/gui/PanadapterApplet — Contains display settings controls including zoom/bandwidth. Verify whether user zoom interactions write back to BandSettings or only send a panadapter set bandwidth= command to the radio with no local persistence.
Suggested logging to enable (Help → Support):
Enable the following diagnostic categories before reproducing:
PanadapterStream — to capture bandwidth/zoom values arriving via VITA-49 and TCP status after a band change.
RadioConnection / RadioModel — to confirm what display pan status messages the radio sends after a band switch, and what bandwidth value is being applied.
AppSettings (if available as a category) — to verify whether any zoom-related key is being written or read at band-change time.
Potential root causes:
BandSettings does not include zoom/bandwidth as a saved field. The band-change handler saves and restores antenna, mode, and filter, but zoom was never added to the per-band settings bundle.
Zoom is treated as radio-side state only. After a band change the radio sends a display pan status update with its own bandwidth value; AetherSDR applies it without checking whether a locally persisted zoom preference should override it.
No save-on-zoom-change hook. The user's zoom gesture (scroll wheel or pinch) sends panadapter set bandwidth= to the radio but does not persist the new value to BandSettings, so there is nothing to restore even if the restore path exists.
GUIClientID session restore vs. per-band zoom: The VFO frequency is restored via the client gui session persistence mechanism (see CLAUDE.md — VFO Frequency Sync). Zoom level is a panadapter property and is unlikely to be covered by that same mechanism, so it needs an explicit client-side BandSettings round-trip.
Suggested fix direction:
cpp// In BandSettings: add zoom persistence
void BandSettings::saveBand(const QString& band, ..., double zoomBandwidth) {
AppSettings::instance().setValue(
QStringLiteral("Band/%1/ZoomBandwidth").arg(band),
QString::number(zoomBandwidth));
}
double BandSettings::loadZoom(const QString& band, double defaultBw) {
return AppSettings::instance()
.value(QStringLiteral("Band/%1/ZoomBandwidth").arg(band),
QString::number(defaultBw))
.toDouble();
}
Then hook saveBand() whenever the user changes zoom on the active band, and call loadZoom() (sending panadapter set bandwidth=) immediately after a band change completes and the new panadapter stream ID is established.
What happened?
When switching between bands using AetherSDR 0.7.18.3 on macOS with a FLEX-8400, the panadapter zoom level (bandwidth) is reset to a default value every time a new band is selected. Any zoom level previously set for that band is lost — the application does not remember per-band zoom preferences. This affects all bands: whether returning to a band visited earlier in the same session or across restarts, the zoom always reverts to a default rather than restoring the last-used zoom for that band.
What did you expect?
Switching to a band should restore the zoom level (panadapter bandwidth) that was last used for that band. Each band should have its own independently persisted zoom level, saved to AppSettings and restored when the band is re-selected — matching the per-band settings behaviour users would expect from a full-featured SDR client.
Steps to reproduce
Connect to a FLEX-8400 running firmware 4.1.5.39794.
On any band (e.g. 20 m), adjust the panadapter zoom to a non-default bandwidth (e.g. zoom in to 200 kHz span).
Switch to a different band (e.g. 40 m). Note the zoom level.
Adjust the zoom on 40 m to a different non-default value (e.g. 500 kHz span).
Switch back to 20 m.
Observed: zoom level is at the default, not the 200 kHz set in step 2.
Quit and relaunch AetherSDR, reconnect, and navigate to any band previously zoomed.
Observed: zoom level is again at the default — no per-band zoom was persisted.
Radio model & firmware
Radio: FLEX-8400
Firmware: 4.1.5.39794
OS & version
OS: macOS
AetherSDR: 0.7.18.3
Qt: 6.7.3
Developer Notes
Relevant source files and classes:
src/models/BandSettings — This is the primary suspect. BandSettings is described in the architecture as handling per-band persistent settings. Zoom level (panadapter bandwidth) should be stored and retrieved here, keyed by band. If zoom is not included in the set of values BandSettings saves/restores, that is the gap to fill.
src/models/PanadapterModel — Owns the per-panadapter state including center, bandwidth, dBm range. The bandwidth field is the zoom level. Check whether PanadapterModel reads from or writes to BandSettings on band change, or whether it only reflects the radio's last-known state without consulting local persistence.
src/core/AppSettings — All persistence must go through AppSettings (XML at ~/.config/AetherSDR/AetherSDR.settings), never QSettings. A per-band zoom key should follow the existing PascalCase convention, e.g. BandZoom_20m or a structured key like Band/<band_name>/ZoomBandwidth.
src/core/RadioConnection — Band changes are likely triggered via a command through RadioConnection. Confirm that the band-change handler in RadioModel or MainWindow calls into BandSettings to save the outgoing band's zoom and restore the incoming band's zoom around the transition.
src/gui/MainWindow — Wires band-change signals to model updates. Check whether a bandChanged or equivalent signal triggers a BandSettings save/load cycle for zoom, or whether zoom is simply left to whatever the radio reports after the band switch.
src/gui/PanadapterApplet — Contains display settings controls including zoom/bandwidth. Verify whether user zoom interactions write back to BandSettings or only send a panadapter set bandwidth= command to the radio with no local persistence.
Suggested logging to enable (Help → Support):
Enable the following diagnostic categories before reproducing:
PanadapterStream — to capture bandwidth/zoom values arriving via VITA-49 and TCP status after a band change.
RadioConnection / RadioModel — to confirm what display pan status messages the radio sends after a band switch, and what bandwidth value is being applied.
AppSettings (if available as a category) — to verify whether any zoom-related key is being written or read at band-change time.
Potential root causes:
BandSettings does not include zoom/bandwidth as a saved field. The band-change handler saves and restores antenna, mode, and filter, but zoom was never added to the per-band settings bundle.
Zoom is treated as radio-side state only. After a band change the radio sends a display pan status update with its own bandwidth value; AetherSDR applies it without checking whether a locally persisted zoom preference should override it.
No save-on-zoom-change hook. The user's zoom gesture (scroll wheel or pinch) sends panadapter set bandwidth= to the radio but does not persist the new value to BandSettings, so there is nothing to restore even if the restore path exists.
GUIClientID session restore vs. per-band zoom: The VFO frequency is restored via the client gui session persistence mechanism (see CLAUDE.md — VFO Frequency Sync). Zoom level is a panadapter property and is unlikely to be covered by that same mechanism, so it needs an explicit client-side BandSettings round-trip.
Suggested fix direction:
cpp// In BandSettings: add zoom persistence
void BandSettings::saveBand(const QString& band, ..., double zoomBandwidth) {
AppSettings::instance().setValue(
QStringLiteral("Band/%1/ZoomBandwidth").arg(band),
QString::number(zoomBandwidth));
}
double BandSettings::loadZoom(const QString& band, double defaultBw) {
return AppSettings::instance()
.value(QStringLiteral("Band/%1/ZoomBandwidth").arg(band),
QString::number(defaultBw))
.toDouble();
}
Then hook saveBand() whenever the user changes zoom on the active band, and call loadZoom() (sending panadapter set bandwidth=) immediately after a band change completes and the new panadapter stream ID is established.