GopherTrunk v0.1.7 — P25 cc-lock fixes, per-system Prometheus metrics, RadioReference import unblocked
v0.1.7 is out.
This release is mostly observability + fixing two silent-failure
modes that kept the P25 control channel from locking on a freshly
plugged-in RTL-SDR. Twelve PRs.
## The fixes that matter if you actually run this thing
- **P25 cc never locks after device open** (issue #275). The pool
was opening devices and applying PPM / gain / bias-tee but never
calling `SetSampleRate`. The chip's resampler stayed at whatever
divisor it powered up with while every decoder did matched-filter
and symbol-clock math against your configured rate. Symbol timing
wrong, FSW sync never matched, and the only log line you saw was
the cc-hunt retune. Now programs the rate at open and drops the
device if `SetSampleRate` fails.
- **`sdr list --probe` fatal on Windows cold boot.** The WinUSB
warmup write returned `ErrTimeout` (Windows equivalent of the
Linux EPIPE stall), but the bring-up `USBDEVFS_RESET` + re-claim
envelope only matched EPIPE. Now treats timeout as resetable too.
- **RadioReference PDF parser broken on newer exports.** RR shipped
a new PDF font encoding (proper CMap instead of +27-shifted raw
glyphs); the extractor now sniffs anchor strings and only applies
the shift when needed.
- **Non-US RR systems work.** Australian MMR layout (dash-joined
`RFSS-Site (X-Y)` rows, `System Frequencies` / `System Talkgroups`
markers, `Display` alias for `Alpha Tag`, `a`-suffix secondary cc,
hex columns with leading zeros) is now accepted.
- **`import-pdf` TUI usable on large systems.** Sites + talkgroups
paginate to terminal height with pgup/pgdn/home/end/g/G nav and a
`Site N of M (showing X-Y)` indicator.
## New observability
- **`gophertrunk_sdr_iq_power_dbfs{system}`** updated ~1 Hz from the
cc decoder. Idle ~-45 dBFS, healthy ~-25, > -3 means the ADC is
clipping. Paired with a throttled `iq power very low — check
antenna, gain, USB` log when it drops below -55 dBFS. Catches the
gain-at-zero / antenna-disconnected / USB-stuck cases without
flooding the log.
- **Per-system call rate, encryption breakdown, cc transitions, SDR
tuning state** (gain / auto-gain / PPM / bias-tee) — all as labeled
Prometheus series. `gophertrunk_calls_total` and `_calls_active`
now carry `{system,protocol,encrypted}` labels (breaking — recover
the old shape with
`sum without(system,protocol,encrypted) (...)`).
## New telemetry
- **P25 affiliation + unit-registration events** on
`/api/v1/events`. TSBK opcodes 0x28 and 0x2C were being recognised
but silently dropped at `dispatchTSBK`'s default branch. Now flow
through as `KindAffiliation` and `KindUnitRegistration` DTOs with
pinned JSON shape for Grafana / dashboards.
## Native RadioReference CSV import
`/db/sid/<sid>/download` ships a flat talkgroup-only CSV with no
metadata. New `-name` / `-sysid` flags supply the missing fields;
combine with a `-pdf` (or bundle CSV) for control-channel
frequencies. `-extract-only` dumps positioned-text rows as JSON for
bug-report fixtures so you don't have to share the original PDF.
## Plus
- Per-(VID, PID) bias-tee GPIO table in the pure-Go RTL-SDR driver
— the GPIO 0 constant is gone, the table is the source of truth,
non-standard pinouts can be added without forking the driver.
- "The Story of GopherTrunk" page on the docs site.
## Links
- Download (Linux/macOS/Windows/ARM64): https://gophertrunk.org/downloads.html
- Release notes: https://github.com/MattCheramie/GopherTrunk/releases/tag/v0.1.7
- Full changelog: https://github.com/MattCheramie/GopherTrunk/blob/main/CHANGELOG.md
- Source: https://github.com/MattCheramie/GopherTrunk
Feedback on hardware that still doesn't lock after the cc-rate fix
is the most useful thing you can send — `RTLSDR_DEBUG_USB=1
gophertrunk sdr list --probe 2> usb-trace.log` plus the matching
`LIBUSB_DEBUG=4 rtl_test -t 2> rtl-test-trace.log` is the trace pair
that tells us where librtlsdr and gophertrunk diverge on your
specific dongle.