aethersdr / aethersdr/AetherSDR

Panadapter zoom is offered per-pane but is radio-wide on the HL2, and `panSpanIsRadioWide` reaches no UI code

Open
#5,750 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement GUI maintainer-review multi-pan spectrum
Dominant language
C++
Stars
221
Forks
117
Avg merge
2d 9h
Merged PRs (30d)
302

Description

What happened

Pressing + on one panadapter zooms every panadapter. Reported by an operator running a Hermes-Lite 2 with multiple receivers, who reasonably expected the control to apply to the pane it sits on.

The radio is behaving correctly — the UI is not being honest

On the HL2 the panadapter span is the DDC sample rate, and openHPSDR protocol 1 carries one rate for the whole radio:

Cc ccConfig(SampleRate rate, int numRx, std::uint8_t ocFilterByte) noexcept

One rate, numRx receivers. There is no per-receiver rate to set, so independent spans are not something this hardware can express. Hl2Backend::capabilities() already says so:

span.radioWide = true;

and RadioCapabilities.h's own comment on that field predicts this exact report:

"This is why receivePanBandwidthControl can be absent on a radio that plainly does change its span: the control exists, but it is not a per-panadapter one, and offering it as per-pan would let an operator narrow one window and silently retune the other three."

That is precisely what happened.

The defect

grep -rn 'panSpanIsRadioWide\|radioWide' src/gui/ returns nothing. The declaration exists on the backend and no UI code consumes it. SpectrumWidget builds a +/ pair per pane with the tooltip "Zoom in" and gives the operator no way to know the control is shared.

Same shape as #5744's finding that Hl2Spectrum::reset() had no caller: a fact correctly declared and never read.

It must not be fixed by hard-coding HL2 behaviour

A Flex computes its panadapters in the radio and genuinely does have independent spans. Whatever is done here has to read the capability, or it will be wrong on one family or the other.

Options, for a maintainer to choose

A — Label it. Keep the per-pane buttons; when panSpanIsRadioWide, change the tooltip to say the control moves every panadapter on this radio. One line, no layout change. Leaves a per-pane control that is not per-pane, which is honest but still slightly odd.

B — Hoist it. When panSpanIsRadioWide, render a single span control outside the panes and drop the per-pane pair; when false, keep it exactly as today. Truthful on both families, and the first real consumer of the capability record. Costs a layout decision about where the shared control lives.

C — Mark the panes. Keep the buttons per-pane and add a shared-span indicator to each panadapter. Cheaper than B, but four indicators each saying "this one isn't mine" reads worse than one control that is.

We would implement whichever is preferred — this is filed as a report rather than a PR because the choice is a UI-shape question that belongs to the maintainers, not to us.

Our own preference is B, on the grounds that a per-pane control which silently is not per-pane will mislead the next operator the same way, and B is the only option that is correct on a Flex without a family check.

A second constraint worth recording, since it bears on any UI that offers span freely

Span and receiver count share one 100BASE-T link, so they trade off:

span max receivers EP6 at 4 RX
48 kHz 12 11 Mbit/s
96 kHz 11 22 Mbit/s
192 kHz 6 44 Mbit/s
384 kHz 3 89 Mbit/s

Computed from ep6BitsPerSecond() and maxReceiversAtRate() in MetisProtocol.h, whose own comment notes that four receivers at 384 kHz is "not a safety margin below 100" — and the link does not refuse, it drops. Dropped EP6 packets are gaps in every panadapter at once.

Not verified

Only the HL2 was exercised. The Flex and ANAN paths are read from source, not run — in particular whether a Flex's per-pane zoom is already correct in this widget was not tested.

🤖 Generated with Claude Code

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in src/gui/ and inspect SpectrumWidget's per-pane zoom controls, then trace how RadioCapabilities.h is exposed to the UI and how Hl2Backend::capabilities() sets panSpanIsRadioWide. Confirm the chosen UI treatment uses the capability rather than an HL2-specific check, and verify the resulting behavior for both radio-wide and independent-span radios.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
desktop, frontend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.