aethersdr / aethersdr/AetherSDR
TCI: no way to tune the VFO without moving the DDS/IQ center - implement if: (advertised in init block) or a settable dds:
Nobody has claimed this yet.
- Dominant language
- C++
- Stars
- 221
- Forks
- 117
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 299
Description
Summary
Over TCI on AetherSDR 26.9.1 there is no way to move the receive frequency without also moving the DDS — and with it the panadapter center and the center of any running IQ stream. vfo: works but drags the DDS along; if:, dds: (as a command), and rit_offset: all appear unimplemented, even though the init block advertises if_limits:-48000,48000; and rit_offset:.
For an IQ-consuming client (I'm building a CW skimmer that consumes the TCI IQ stream), this means every click-to-tune re-centers the whole band view and shifts the frequency mapping of every decode channel. The TCI protocol's if: command exists for exactly this: tune within the passband while the DDS stays put.
Environment
- AetherSDR 26.9.1, Windows 11
- FLEX-6400, SmartSDR firmware v4.2.20.41343
- TCI over
ws://localhost:50001, IQ stream at 192 kHz on TRX 0
What I tested (live, 26.9.1)
| Command sent | Observed result |
|---|---|
vfo:0,0,<hz>; |
Works. Two status bursts: vfo: updates at ~t+25 ms with dds: still at the old center; dds: reports the new center at ~t+65 ms. DDS is slaved to the VFO. |
dds:0,<hz>; |
No reply, no effect — tested alone and in both orders relative to vfo:. Proven by the next vfo: move still reporting the old DDS value. |
if:0,0,<offset>; |
No reply, no effect — despite if_limits:-48000,48000; in the init block. |
rit_offset:0,<hz>; |
No reply, no effect. Control comparison: rit_enable:0,true; does echo on the same connection, so the silence is an unimplemented command, not a broken socket. |
vfo:0,1,<hz>; (VFO B) |
Settable, but spawns a second slice (active_slice:1,B, its own dds:1,…), and TRX 0's DDS still follows its VFO. |
(Following the convention that a rejected/unimplemented TCI command sends no reply, the three silent commands read as not implemented in this build.)
Request
Implement either of:
if:<trx>,<vfo>,<offset>;— tune within the passband relative to the DDS. The init block already advertisesif_limits, so clients reasonably expect this to work; ordds:<trx>,<freq>;as a settable command — let a client re-pin the panorama center after avfo:move.
Either one lets a skimmer/panadapter-style client keep its band view and channel-to-frequency mapping stable while tuning the operator's VFO to a signal. My client already sends vfo: followed by dds:<old center> — harmless today, and it would start working the moment the server honors it.
Happy to provide logs, wire captures, or to test a build.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
The issue names no source files or tests; start by locating the TCI command handlers and the init-block capability advertisement for if_limits and dds. Trace how vfo changes the DDS, then implement one requested command path and verify that tuning preserves the DDS or allows it to be explicitly repositioned without shifting the IQ frequency mapping.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- backend-api-design, networking
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100