sjg d547c45a9c [feat](trx-rs): add FT2 decoder support (wired to FT4)
Mirrors the FT4 implementation across the full stack. The trx-ft8
crate wires Ft8Decoder::new_ft2() to FTX_PROTOCOL_FT4 as a
placeholder pending a dedicated FT2 implementation.

Changes:
- trx-ft8: Ft8Decoder::new_ft2() delegates to with_protocol(Ft4)
- trx-core: DecodedMessage::Ft2, AUDIO_MSG_FT2_DECODE (0x15),
  ft2_decode_enabled/ft2_decode_reset_seq state, SetFt2DecodeEnabled/
  ResetFt2Decoder commands, protocol mapping
- trx-server: DecoderHistories::ft2, run_ft2_decoder (7.5s slots),
  run_background_ft2_decoder, history push/replay, decoder task spawn
- trx-frontend-http: ft2_history in FrontendRuntimeContext,
  toggle/clear endpoints, /ft2.js route, bookmark/scheduler/background
  decode support, DecodeHistoryPayload ft2 field
- web: ft2.js plugin (3.75s period timer), FT2 subtab in index.html,
  FT2 map source (distinct hue), app.js dispatch, decode-history-worker
  HISTORY_GROUP_KEYS, bookmarks read/write/apply

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Stanislaw Grams <stanislawgrams@gmail.com>
2026-03-14 19:34:41 +01:00
2025-11-30 23:54:05 +01:00
2025-11-30 23:54:05 +01:00
2025-11-30 23:54:05 +01:00
2025-11-30 23:54:05 +01:00
2025-11-30 23:54:05 +01:00

trx-rs logo

trx-rs

trx-rs is a modular amateur radio control stack written in Rust. It splits radio hardware access from user-facing interfaces so you can run rig control, SDR DSP, decoding, audio streaming, and web access as separate, composable pieces.

The project is built around two primary binaries:

  • trx-server: talks to radios and SDR backends
  • trx-client: connects to the server and exposes frontends such as the web UI

Web UI Demo

GIF placeholder: add an animated walkthrough of the website here.

What It Does

  • Controls supported radios over networked client/server boundaries
  • Exposes a browser UI, a rigctl-compatible frontend, and JSON-based control
  • Supports SDR workflows with live spectrum, waterfall, demodulation, and decode
  • Streams Opus audio between server, client, and browser
  • Runs multiple decoders including AIS, APRS, CW, FT8, RDS, VDES, and WSPR
  • Supports multi-rig deployments and SDR virtual channels
  • Loads backends and frontends via plugins

Architecture

At a high level:

  1. trx-server owns the radio hardware and DSP pipeline.
  2. trx-client connects to the server over TCP for control and audio.
  3. Frontends hang off trx-client, including the HTTP web UI.

This separation is intentional: it keeps hardware access local to one host while making control and monitoring available elsewhere on the network.

Workspace Layout

  • src/trx-core: shared types, rig state, controller logic
  • src/trx-protocol: client/server protocol types and codecs
  • src/trx-app: shared app bootstrapping, config, logging, plugins
  • src/trx-server: server binary and backend integration
  • src/trx-client: client binary and remote connection handling
  • src/trx-client/trx-frontend: frontend abstraction
  • src/decoders: protocol-specific decoder crates
  • examples/trx-plugin-example: minimal plugin example

Supported Pieces

Backends

  • Yaesu FT-817
  • Yaesu FT-450D
  • SoapySDR-based SDR backend

Frontends

  • HTTP web frontend
  • rigctl-compatible TCP frontend
  • JSON-over-TCP frontend

Decoders

  • AIS
  • APRS
  • CW
  • FT8
  • RDS
  • VDES
  • WSPR

Build Requirements

You will need Rust plus a few system libraries.

Common dependencies

  • libopus
  • pkg-config or pkgconf
  • cmake

SDR builds

  • libsoapysdr

Audio builds

  • Core Audio on macOS, or ALSA development packages on Linux

Configuration

Both trx-server and trx-client read from a shared trx-rs.toml.

  • Default lookup order: current directory, ~/.config/trx-rs, /etc/trx-rs
  • Use --config <FILE> to point at an explicit config file
  • Use --print-config to print an example combined config

Start from trx-rs.toml.example.

Quick Start

1. Build

cargo build

2. Create a config file

cp trx-rs.toml.example trx-rs.toml

Adjust backend, frontend, audio, and auth settings for your environment.

3. Run the server

cargo run -p trx-server

4. Run the client

cargo run -p trx-client

5. Open the web UI

Open the configured HTTP frontend address in a browser.

Web Frontend Highlights

  • Real-time spectrum and waterfall
  • Frequency, mode, and bandwidth control
  • Decoder dashboards and history
  • SDR virtual channels
  • Browser RX/TX audio
  • Optional authentication with read-only and control roles

Authentication

The HTTP frontend supports optional passphrase-based authentication.

  • rx: read-only access
  • control: full control access

When exposing the web UI beyond a trusted LAN, run it behind HTTPS and enable secure cookie settings in the config.

Audio

Audio is transported as Opus between server, client, and browser.

  • trx-server captures and encodes audio
  • trx-client relays audio to the HTTP frontend
  • Browsers connect over /audio

Plugins

Both binaries can discover shared-library plugins through:

  • ./plugins
  • ~/.config/trx-rs/plugins
  • TRX_PLUGIN_DIRS

See examples/trx-plugin-example/README.md.

Documentation

Project Status

This is an active project with evolving APIs and frontend behavior. Expect some rough edges and ongoing refactors.

License

Licensed under BSD-2-Clause.

See LICENSES for bundled third-party license files.

S
Description
Experimental ham rig and SDR controller written in Rust
Readme 31 MiB
Languages
Rust 68.2%
JavaScript 24.1%
CSS 4.6%
HTML 3.1%