aethersdr / aethersdr/AetherSDR

Support HaliKey Serial as a PTT/CW input device

Open
#4,155 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

CW enhancement external devices GUI maintainer-review
Dominant language
C++
Stars
221
Forks
117
Avg merge
2d 7h
Merged PRs (30d)
299

Description

Request preparation
  • I used an AI assistant to help structure this request
  • I checked for existing issues covering the same feature
What would you like?

What

Add first-class support for the HaliKey Serial device (Halibut Electronics)
as a physical PTT/CW-paddle input for AetherSDR, so a user can plug in a
HaliKey Serial dongle, select it in AetherSDR's external-device settings, and
have a physical PTT switch or paddle key the radio.

Why

HaliKey Serial is a small FTDI-based USB-to-serial adapter designed to let
remote operators use a physical PTT switch or CW paddle with SDR client
software that reads serial port flow-control lines (CTS/DSR) as input
signals. It's popular in the FlexRadio remote-operating community as a
low-cost, driver-simple way to get "physical PTT while operating remote."
AetherSDR already advertises generic USB-serial PTT/CW keying, but there's
no confirmed support, device-selection entry, or documented pin mapping for
HaliKey Serial specifically — users have no way to know whether it works
out of the box or how it's expected to be wired in Settings.

How Other Clients Do It

  • SmartSDR for Windows — the primary reference target for HaliKey
    Serial. It reads the CTS line off a serial port to trigger PTT.
  • SmartSDR for macOS (Marcus DL8MRE build) — also reads serial
    flow-control signals (CTS and DCD, per the vendor's own troubleshooting
    notes) for PTT and CW paddle input, and includes a built-in CW keyer.
  • HaliKey MIDI variant / NetKeyer — a separate, MIDI-based sibling
    device exists for platforms without serial-flow-control APIs (iOS, web).
    Not relevant to AetherSDR since Linux has full serial access, but useful
    context: MIDI-mapping infrastructure already in AetherSDR (FlexControl,
    MIDI learn) could eventually cover HaliKey MIDI as a separate issue.
  • GQRX / SDR++ — RX-focused, no comparable external PTT-hardware
    integration to model against.

Suggested Behavior

  • In external-device settings (wherever the existing generic serial
    PTT/CW-keyer config lives — likely alongside AppletPanel → external
    devices, or a dedicated SerialDeviceDialog), add a device preset/entry
    for "HaliKey Serial" that:
    • Auto-detects the FTDI VID/PID HaliKey Serial uses, defaulting the port
      selection to it if plugged in (falls back to manual /dev/ttyUSB*
      picker otherwise, consistent with existing generic serial support).
    • Maps CTS → PTT input and DSR → CW key input by default (matching
      HaliKey's documented behavior), with the existing generic serial config
      UI still available for advanced/manual pin remapping.
  • On triggering PTT via the mapped line, AetherSDR should key the radio the
    same way the existing generic serial-PTT path does (whatever internal
    command/model call that already uses).
  • Settings persist via AppSettings per project convention — no QSettings.

Protocol Hints

This is entirely client-side external-hardware handling — it does not touch
the FlexLib/SmartSDR TCP/UDP protocol. The relevant hardware detail:

  • HaliKey Serial is a plain FTDI-chip serial device; on Linux it enumerates
    as /dev/ttyUSB* (FTDI driver), not /dev/ttyACM*.
  • It exposes standard RS-232 flow-control lines (CTS/RTS, DTR/DSR) as the
    PTT/CW signaling mechanism — no custom protocol or vendor SDK needed,
    just reading serial flow-control pin state via Qt SerialPort
    (qt6-serialport, already a build dependency).
  • Whatever internal call the existing generic "Serial PTT/CW keying"
    feature uses to trigger radio TX (transmit set ... / netcw path per
    CLAUDE.md notes on CW keying) should be reusable here — needs
    confirmation from whoever implemented the existing generic serial
    support.

Acceptance Criteria

  • A HaliKey Serial device connected via USB is detectable/selectable in
    AetherSDR's external-device settings without manual port-guessing.
  • Toggling the PTT switch wired to a HaliKey Serial device correctly
    keys/unkeys AetherSDR's TX, verified against a real FLEX radio.
  • CW paddle input via HaliKey Serial correctly drives AetherSDR's CW
    keyer path (iambic or straight key, matching existing CW paddle
    support).
  • Settings for the selected device/port persist across restarts via
    AppSettings.
  • Behavior is documented in README/user docs alongside the existing
    "Serial PTT/CW keying" bullet.

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 by locating the existing generic Serial PTT/CW support, the external-device settings around AppletPanel or SerialDeviceDialog, and AppSettings usage; review the relevant CLAUDE.md CW-keying notes. Check the qt6-serialport flow-control APIs and existing radio TX or netcw path. Done means selectable HaliKey behavior, persisted settings, verified PTT and CW operation, and README/user documentation.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, linux
Domain
desktop, embedded-iot
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.