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:

Open
#5,396 3 comments 0 reactions 0 assignees View on GitHub

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:

  1. if:<trx>,<vfo>,<offset>; — tune within the passband relative to the DDS. The init block already advertises if_limits, so clients reasonably expect this to work; or
  2. dds:<trx>,<freq>; as a settable command — let a client re-pin the panorama center after a vfo: 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

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

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.