Skip to content

Discovery TX-500 (Lab599) — CAT manual vs implementation

Manual: Lab599 CAT Protocol rev. 2 (official) — full per-command parameter tables; cross-checked against TX-500 User Manual v1.12.08 (04.2022) and the Ham Radio Deluxe support note. Sources + SHA in manuals/tx500.txt. Protocol family (CONFIRMED): Kenwood-style ASCII CAT, ;-terminated (FA/MD/IF/…), modeled on the Kenwood TS-2000 set with Lab599 extensions — NOT Icom CI-V. ID;ID019 (TS-2000 compat) or ID500/ID505 (native Lab599). PL2303 USB-serial cable, 38400 baud. Driver: NONE. No kenwood_cat backend exists. backends/factory.py has no Kenwood path; create_radio(SerialBackendConfig(model="TX-500")) raises ValueError: Unsupported serial model (asserted by tests/test_backend_factory.py:143). probe_serial_kenwood_cat() in discovery.py:540 is a stub that always returns None ("reserved for future use"). The yaesu_cat backend is Yaesu-specific ASCII CAT and does not speak the Kenwood wire shape. Profile: rigs/tx500.toml (protocol.type = "kenwood_cat") — the single canonical profile. As of MOR-684 it carries the rev.2-accurate mode map, power_control, and the full CAT [commands] set; the divergent reference sketch rigs/examples/lab599_tx500.toml was removed. Validation: src/rigplane/validation/registry/* — capability-driven; the matrix template is derived from [capabilities] features (_builders.build_template_from_capabilities), so checks are emitted for the TX-500's declared features regardless of backend existence. With no backend, every functional check would resolve unsupported/error at runtime. Live run: not run — no hardware, and there is no instantiable backend to run against. All live cells below are n/a (no backend).

Bottom line: the TX-500 is a profile-only, no-backend radio. This audit therefore reads differently from ftx1.md: the dominant gap is C (missing backend) — the entire operator command surface — not scattered per-command gaps. Lists A/B/D are mostly N/A until a Kenwood backend exists, and are filled with the profile-level mismatches that already exist on disk.


Command matrix (operator-facing)

Documented = present in Lab599 CAT Protocol rev. 2. Backend = method on a real TX-500 driver (none exists → always ). Profile cap/cmd = rigs/tx500.toml [capabilities] / [commands]. Validation = registry check_id that would be emitted from the declared capability + its status.

CAT Documented (Lab599 rev.2) Backend method Profile cap / cmd Validation check_id · status
FA/FB VFO A/B freq, 11-digit Hz — (no driver) tx implies; example has get/set_freq_a/b strings, tx500.toml has none freq.* · n/a (no backend)
MD Mode (1=LSB 2=USB 3=CW 4=FM 5=AM 6=DIG 7=CW-R) modes list declared mode.* · n/a
IF Full status (freq+RIT/XIT+mode+split+tone) — (no get_info string) (feeds freq/mode/rit) · n/a
FR/FT VFO/Memory select (0=A 1=B 2=Mem) split implies; no string vfo_select · n/a
SP Split ON/OFF (TX500) split split.presence · n/a
RX/TX Set RX / Set TX (PTT) tx ptt.* (manual/tx-adjacent) · n/a
PT Read PTT (0=RX 1=TX) tx ptt read · n/a
PS Power ON/OFF not in tx500.toml (example: power_control) powerstat · n/a
AG AF gain 000–250 af_level af_level.* · n/a
RG RF gain 000–100 rf_gain rf_gain.* · n/a
SQ Squelch 000–255 squelch squelch.* · n/a
PA Preamp ON/OFF preamp (+PA; string in example) preamp.* · n/a
RA RF attenuator ON/OFF attenuator (+RA; string in example) attenuator.* · n/a
FL Filter select (RX 0-3 / TX 0-1) filter_width filter_width.* · n/a
IS DSP IF set (0/1) not declared
NB / NL Noise blanker ON/OFF / level 030–100 nb nb.* · n/a
NR / RL Noise reduction ON/OFF / level 01–100 nr nr.* · n/a
NT Notch (0=OFF 1=Auto) not in tx500.toml (example: notch) notch.* (only if declared) · n/a
GT AGC time constant 01–10 not declared agc.* (not declared)
RT RIT ON/OFF rit rit.* · n/a
XT XIT ON/OFF (TX-500) not in tx500.toml (example: xit) xit.* (only if declared) · n/a
PC Output power 010–100 not declared (example notes "NOT via CAT" — contradicted by rev.2)
TP TX-Tune output power 005–050 not declared
AC Internal antenna tuner (TX500MP) tuner tuner.* · n/a
PR / PL Speech compressor ON/OFF / level 001–100 not declared
VX / VG / VD VOX ON/OFF / gain 000–100 / delay 0–5000ms not in tx500.toml (example: vox) vox.* (only if declared) · n/a
KS CW keyer speed 004–060 cw declared, no keyer cap cw keyer · n/a
MG Mic gain 000–100 not declared
MA DIG (data) gain 000–100 not declared (example: data_mode)
ML / MO TX-Monitor level 000–250 / mute not declared
LK Lock (dial lock) dial_lock dial_lock.* · n/a
SM Read S-meter / TX power (0000–0030) meters meters/s_meter · n/a
RM Meter select (POWER/SWR/MIC/ALC) + value meters meters · n/a
VL Read supply voltage (Lab599) not declared
BY Read busy/squelch-open not declared
AL NF (noise-floor) type 1/2 (Lab599) not declared
CG Carrier/TUNE-TONE level 10–100 not declared
AI Auto-information on/off (per HRD note) not declared

Intentionally OUT OF SCOPE (memory / scan / tone / band-step — not browser-operator surface)

  • MC / MR / MW memory channel read/write · VV VFO copy (A=B) · BD/BU band up/down · CN / CT / TO CTCSS/Tone (TX500MP only; TX-500 has no repeater FM use case in scope) · SC scan (referenced by IF P11, no standalone row in rev.2).

Gap lists (priority-ordered)

C. MISSING BACKEND — documented operator command, no backend method (dominant list for this radio)

The TX-500 has no driver at all; the single root fix dwarfs every per-command row.

Item Function Value Ticket
Kenwood-CAT backend (root) A backends/kenwood_cat/ ASCII-CAT driver (transport + get_/set_ surface), wired into factory.create_radio for protocol.type="kenwood_cat" / model="TX-500". Today instantiation raises ValueError (factory.py:100-107, asserted test_backend_factory.py:143). Without it, the entire matrix above is dead. Critical — unblocks the radio entirely NEW
probe_serial_kenwood_cat Real probe (currently return None, discovery.py:558) so the TX-500 is auto-discoverable; ID;ID019/500/505 is the natural fingerprint. High — discovery/setup NEW
FA/FB · MD · IF · FR/FT · RX/TX/PT Core tuning + mode + PTT methods on the new driver High (operating) NEW (sub-tasks of root)
AG · RG · SQ · PA · RA · FL Level + front-end + filter methods High NEW
NB/NL · NR/RL · NT · GT DSP methods Med NEW
RT · XT · SP RIT / XIT / split Med NEW
PC · TP · AC · PR/PL · VX/VG/VD · KS · MG · ML/MO Power, tuner, compressor, VOX, keyer, mic, TX-monitor Med (operating) NEW
SM · RM · VL · BY Meters + voltage + busy readback Med (UI meters) NEW
Hamlib-bridge raw-byte seam hamlib_bridge.py only carries CI-V bytes; non-CI-V ASCII rigs (Yaesu/Kenwood, TX-500) need a raw-byte pipe seam (noted as follow-up in the module docstring). Low — rigctld interop NEW

D. MISMATCH / WRONG — profile declares/implies something the doc contradicts

RESOLVED (MOR-684). The four profile-level mismatches below were fixed: the TX-500 mode map now matches rev.2 (6=DIG, 7=CW-R, no FSK/RTTY/9), power is declared CAT-settable via PC/TP, the empty [commands] stub was replaced with the rev.2-accurate CAT command set, and the divergent reference sketch rigs/examples/lab599_tx500.toml was removedrigs/tx500.toml is now the single canonical source of truth.

Where Item Issue Status
(was examples/lab599_tx500.toml:117-123) rf_power "NOT controllable via CAT (TS-2000 PA/RA only)" Wrong per rev.2PC (010–100) and TP (005–050) DO set power. FIXED (MOR-684)power_control declared; set_power = "PC{power:03d};", set_tune_power = "TP{power:03d};".
tx500.toml modes set_mode comment 6=FSK … 9=FSK-R; modes list RTTY/RTTY-R; DIGI label Wrong per rev.2 — map is 6=DIG, 7=CW-R; no FSK/RTTY/9. FIXED (MOR-684) — modes ["LSB","USB","CW","FM","AM","DIG","CW-R"]; rev.2 register map documented in [modes].
tx500.toml vs examples/ Two divergent profiles, different feature sets Decide the canonical profile before backend work. FIXED (MOR-684) — example removed (never loaded, schema-invalid, [protocol.commands] ignored by loader); tx500.toml is canonical.
tx500.toml [commands] Empty comment stub (# ID FA FB MD FR FT PA RA) No CAT strings wired. FIXED (MOR-684) — full rev.2 CAT set wired as { cat = { read/write/parse } } entries.
profile attenuator label attenuator.values=[0,1] "20dB" rev.2 RA is 00/01 ON/OFF (2-char) — value mapping fine, but width (2-char) must be honored by the backend. note — set_att = "RA{val:02d};" honors the 2-char width.

A. UNDER-DECLARED — backend implements, profile/registry can't see it

N/A — there is no backend, so nothing is implemented-but-hidden. (Revisit after the Kenwood backend lands: e.g. if it implements VL voltage / RM meter-select but the profile omits the cap, those become real A-rows.)

B. VALIDATION GAPS — implemented + declared, but presence-only (no round-trip)

N/A today (no backend → no round-trips to downgrade). After the backend lands, the capability-driven registry will emit standard checks; expect the usual presence-only suspects to need RMVR round-trips: split (SP), tuner (AC), dial_lock (LK), vox (VX/VG/VD) — same pattern as the FTX-1 B-list. Pre-flagged NEW for when they apply.


Documentation quality note

  • HIGH confidence on the mnemonic set, parameter widths, and the mode map — source [1] is Lab599's own protocol PDF (rev. 2) with per-command parameter tables.
  • Variant ambiguity (needs live capture): rev.2 annotates some rows for a specific variant — AC/CN/CT/MA-ish rows marked TX500MP, SP/BD/BU/VV/XT marked TX500, and several Lab599/LAB599 extension rows (FL, IS, RM, VL, AL, MR/MW). Which of these answer on a plain TX-500 at a given firmware is unconfirmed — a ;-terminated read sweep (ID;, AG;, PC;, KS;, NT;, VL;, RM0;) on real hardware is required before declaring caps.
  • MD label: doc says DIG; tx500.toml says DIGI — confirm the exact answer byte map live.
  • Stale third-party docs: the HRD support note (source [3]) lists only the legacy TS-2000-compat subset and wrongly says AF/power/keyer are unsupported; do not scope the backend from it — rev.2 supersedes it.
  • Live status: every cell in this audit is doc-vs-code only; no hardware was driven. Mark all live results "not run / no backend" until the Kenwood backend + a real TX-500 capture exist.