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 removed — rigs/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.2 — PC (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/XTmarked TX500, and severalLab599/LAB599extension 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. MDlabel: doc saysDIG;tx500.tomlsaysDIGI— 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.