Repository navigation
v0.3.0 — ANAN / Protocol 2, a whole station, and a noise bench
The biggest update since the test bench. flex-sim grows a second radio family — an Apache Labs ANAN-G2 / openHPSDR Protocol 2 receiver simulator — plus a whole station of accessory simulators, an HF noise bench for testing noise reduction, radio-side notch filters, a TX slice, and a real CI suite.
About the binaries below: they are the Flex radio sim (
flex_sim.py). The ANAN / Protocol 2 tools and the accessory simulators run from source — pure Python standard library, no install. See the README.
ANAN-G2 / openHPSDR Protocol 2 (new)
anan_sim.py— answers discovery, completes the General → DDC-Specific → DUC-Specific → High-Priority handshake, and streams DDC I/Q at the sample rate the client commands. Enough for a Protocol 2 client to find the radio and paint a panadapter and waterfall. Receive only.- Checked against more than itself. RX geometry confirmed against real ANAN-G2 captures (16 B header + 1428 B = 238 samples — the widely-quoted 1440 B / 240 is the TX layout, #3); an independent probe (
tools/p2stream.c) built from piHPSDR's offsets; and an end-to-end session with NereusSDR 0.5.2, which found four sim defects the documentation-derived checks could not — session-port streaming, the DDC enable mask, commanded re-rating, and Windows pacing (#4, #6; reported in #5). p2verify.py— a stdlib pcapng reader that reports what a real Protocol 2 radio puts on the wire, and tells DDC (RX) from DUC (TX) by each frame's own declared fields rather than by port. It guards against nanosecond pcapng timestamps and multicast traffic hiding the session (#7).- ⚠ Not yet run against AetherSDR's ANAN backend (aethersdr/AetherSDR#5143) — which is exactly what it is for. Reports welcome. One observation remains open: an RX-audio click comb in NereusSDR with a clean wire (#5).
- The scoping doc is corrected: it had the RX packet geometry wrong (#7).
A whole station, no hardware
- SPE Expert amplifier sim (
spe_sim.py, :4531), including the ser2net / RFC 2217 power-on path, and a scripted wire bench (spe_bench.py). - ACOM 600S amplifier sim (
acom_sim.py, :9600). station.pynow hosts SPE and ACOM alongside the Antenna Genius, Power Genius XL and Tuner Genius XL — five accessories, one process, one prompt — plus--radio-portand--patternfor the radio it spawns.- Amplifier meters published, with per-unit meter scaling fixed.
HF noise bench
- Additive HF noise for testing AetherSDR's noise reduction, with text-to-speech voice fixtures so there is something realistic to recover.
- The noise scene renders on the waterfall, tones sit at their true frequency via the live span, and noise rises from the floor rather than floating as a band above it.
Radio-side emulation
- Tracking Notch Filter and Auto-Notch Filter, emulated end to end.
- A TX slice (
tx=) and 2-SCU diversity RX. - Radio-side two-tone generation and
--txlog. - DAX TX chain observer — names the first missing stage rather than the symptom — with multiFLEX contention modelled.
Models, CLI and wire
- FLEX-8400 added and the FLEX-8600 slice count corrected — thanks @Ozy311 (#1).
--modelsselects the model for a single radio too; the real model is logged.--serialprefix, and the serial now defaults to the hostname, so two sims on one network are distinguishable.- Waterfall tiles encode VitaFrequency (Hz × 2²⁰), following AetherSDR #4412's removal of the plain-Hz fallback.
Fixes
sig_cwkeys real Morse — duration and key state had been conflated.- SPE: a partial sync run is carried across receive boundaries.
- The accessory sims now ship, so
station.pyruns from a clean clone. - The control panel's noise controls were dead; rebuilt.
Docker and CI
- The Docker image ships every sim, not just the radio.
- The test suite actually runs now. It was previously uncollectable —
pytestreported "no tests ran" and exited 0. It runs on every push and PR on Linux and Windows, and CI fails if it ever collects fewer than four tests again.