On-air test coverage
Which user-visible feature has an automated test on the radio and the SDR bench (tests/hil), and what the last
run showed. Features come from the README's "What it does" and area table, the manual's feature groups
(docs/user/01-introduction.md) and the build switches (docs/build-config.md). APRS has its own coverage notes
(docs/spec/aprs.md 13).
This page covers the DM-1701 only. The other radios' checks are in their bring-up pages and in the feature matrix.
Status: on air = a test checks it over the air and passed; radio = a test checks it on the radio without
RF (or only the radio's side of an RF exchange); partial = only part of the feature can be checked on this
bench (why in the notes); xfail = the test runs and fails for a known, documented gap; fails = the test
runs and finds a real firmware problem (left failing on purpose); not run = a test exists but wasn't in the last
run; none = no automated test. Last run:
2026-10-10 on the DM-1701, firmware 5a13814 (main, every feature built), radio at its lowest power on 467.375 MHz.
| Feature | Test | Status | Notes |
|---|---|---|---|
| DMR group call receive, voice to the speaker | test_dmr_rx, test_dmr_voice |
on air | every burst and frame counted |
| DMR audio both ways (decoded level, frames not repeated, the radio's own over decoded) | test_dmr_audio_smoke |
not run | added 2026-10-22 after the DM-1801 Pro played every call silent with every counter clean |
| DMR late entry | test_dmr_call_features::test_late_entry |
on air | |
| DMR private calls in | test_dmr_call_features |
on air | to us played, to another ID not |
| DMR transmit (voice call) | test_dmr_tx::test_dmr_tx_off_air |
on air | content strict; waveform checks not judged while the SDR clips (8 % at gain 0) |
| Talker alias receive | test_dmr_call_features::test_talker_alias |
on air | |
| Talker alias transmit | test_dmr_tx::test_dmr_tx_talker_alias |
on air | needs --allow-codeplug-write: the test channel's alias flag set over CPS, backed up and restored byte for byte; "N4NQV" decoded by the SDR and the bench modem |
| Basic privacy receive | test_dmr_call_features::test_privacy_service_option |
on air | the bench can't scramble: drop without a key, play with one |
| Basic privacy transmit | test_dmr_tx::test_dmr_privacy_tx |
on air (signaling) | service option 0x40 and FID 0x10 checked; the scrambling itself isn't (unknown microphone frames) |
| ETSI GPS Info in calls, in / out | test_dmr_call_features::test_gps_info, test_dmr_tx::test_dmr_gps_tx |
on air | |
| Data, text messages, call alert, radio check in | test_dmr_data (rf) |
on air | |
| Data, text messages, call alert, radio check out | test_dmr_data (radio_tx) |
on air | 1 to 3 of 3 tries heard with a good CRC, content strict |
| ARS registration, LRRP answers | none on air | none | need a presence server / dispatcher on air; host-tested (dmrDataServiceTest, dmrDataChainTest) |
| Emergency alarm and call in | test_dmr_emergency (rf) |
on air | |
| Emergency alarm and call out, the key | test_dmr_emergency (radio_tx) |
on air | alarm tries counted like the data tries |
| Hotspot protocol | test_hotspot |
radio | |
| Hotspot voice and data, both ways | test_hotspot_voice |
on air | hotspot_cases.py rf_voice8, rf_data_unconf, net_voice, net_data |
| Hotspot CW ID | test_hotspot_cwid |
on air | the Morse tone itself checked since the tone fix |
| MMDVM SFR | test_hotspot_sfr |
passes (2026-10-12) | mode switching; a 3-superframe bench call goes up whole and is repeated whole on TS2 (17-18 of 18 voice bursts, terminator). Repeat delay 210 ms, not 90 ms (docs/spec/sfr.md 3) |
| Split duplex repeater (experimental) | test_split_duplex |
pass | 2026-10-12 (b027277): protocol; TX half with our framing (335 bursts, TC alternating 334/334, AT following SET_AT, 83 short LCs, one key-up); TX half voice (3 headers, 3 superframes with the embedded LC, terminator, no sync errors); RX half (residual 11 µs, the label flips with the epoch). Not yet: a real TX / RX pair (docs/spec/split-duplex.md 10.1) |
| USB network adapter | test_usb_network |
radio | DHCP, ping and the debug link over UDP, back to serial (macOS 26). With ff6268b the Mac once never configured the adapter and the radio stayed in network mode; since 5a13814 it falls back to serial after 10 s |
| Host port protocols over UDP 3334 (split duplex extension, KISS) | test_usb_network_services |
not run | --allow-usb-switch |
| TCP services (HTTP, KISS over TCP, rigctld, APRS-IS) | test_tcp_services |
not run | host-tested against a scripted TCP peer (netSvcTest, tcpTest) |
| mDNS, TFTP codeplug | test_net_services |
not run | host-tested (mdnsTest, tftpTest) |
| SNMP agent over USB | test_snmp |
not run | host-tested against an independent manager (snmpPeer); over the air untested |
| Control station mode (settings, boot as network, fixed link, passthrough) | test_control_station |
not run | passthrough tests need --allow-rf --allow-service-stop |
| IP over DMR, our side (SAP 3 compressed and full headers, confirmed data retries) | test_dmr_ip |
not run | decoded off air by the bench modem with tools/bench/dmr_packet.py; the bench can't answer confirmed data, so ACKs and selective retry are host-tested only |
| IP over DMR, end to end | none | none (rig) | needs a second station that speaks IP over DMR data |
| Roaming (settings, zone flag, roam now) | test_roaming radio tests |
radio | |
| Roaming to the bench repeater, beacon surveys | test_roaming rf tests |
none (rig) | need a repeater-pair channel and a second frequency; only 467.375 MHz is approved |
| FM receive | test_fm::test_noaa_receive |
on air | |
| CTCSS / DCS encode | test_fm_tx |
on air | |
| CTCSS / DCS decode | test_fm::test_rx_tone_squelch |
partial | untoned NOAA stays muted with a tone required; a toned FM source would be needed for the positive case |
| 12.5 / 25 kHz deviation | test_fm_tx::test_fm_tx_bandwidth |
on air | 25 / 12.5 kHz CTCSS deviation ratio 1.99 (368 / 733 Hz) since 0458936 (25 kHz keeps the 12.5 kHz tone deviation field; the mode doubles it); 4.0 on this run |
| 1750 Hz burst | test_fm_tx::test_fm_tx_tone_burst |
on air | 2 s of 1750.0 Hz at 1.43 kHz peak; silent before ff6268b (voice source in the wrong register bits), 3.3 kHz peak at ff6268b |
| Roger beep | test_fm_tx::test_fm_tx_roger_beep |
on air | 1200 / 900 Hz at the end of the over, none when off; silent before ff6268b |
| TX inhibit, TOT warning and time-out | test_radio_features |
radio | the radio's state, not the RF |
| Power levels | test_fm_tx::test_fm_tx_power_levels |
none (rig) | skipped: the RTL-SDR clips at gain 0 even at 50 mW; needs an attenuator |
| VOX | test_radio_features::test_vox_quiet, test_mic_level (the level, radio only) |
partial | no key-up in silence, none from a beep in the speaker; a voice key-up needs sound at the microphone |
| Battery saver | test_radio_features::test_battery_save* |
on air | cycles when idle, MONITOR and a bench call wake it |
| Zone scan stopping for calls | test_radio_features::test_scan_stops_on_dmr_call |
on air | |
| VFO scan | test_radio_features::test_vfo_scan* |
on air | holds on the bench's carrier |
| Dual watch | test_radio_features::test_dual_watch* |
on air | holds on the channel with the call |
| qdmr reads | test_cps |
radio | |
| qdmr writes | test_cps::test_cps_write_dry_run, test_cps_write_restore |
radio | the dry run first; the write only with --allow-codeplug-write |
Before this round
| Feature | Before |
|---|---|
| DMR transmit | test failed on SDR clipping and the overloaded bench modem's FEC corrections |
| Data and emergency out | tests needed all 3 tries heard; the overloaded bench modem heard 1-2 (and read others with bit errors) |
| Talker alias transmit, privacy transmit | no test (the alias check was skipped: the test channel sends none) |
| Hotspot voice round trip | manual bench script only (dmr_bench.py run H1) |
| SFR, USB network, VOX, split duplex | not in the radio's build; tests skipped |
| Hotspot CW ID | passed on a keyed carrier with no tone in it |
| CTCSS / DCS decode | no test |
| 1750 Hz burst, roger beep | radio state only (tone_burst=1, roger=1): passed while nothing went on air |
| Power levels, battery saver | no test |
| VFO scan, dual watch | radio only (no signal to stop for) |
| qdmr writes | test never run; no dry run |