Skip to content

IC-7300 (Icom) — CI-V manual vs implementation

Manual: Icom IC-7300 Full Manual (English) v6, §19 CONTROL COMMAND command table (manuals/ic7300.txt, extracted from the official Icom UK PDF). The standalone "CI-V Reference Guide" PDF that Icom now ships only covers the IC-7300MK2; the original IC-7300 CI-V table is published inside the Full Manual §19 — that is the authoritative source used here. (The profile header cites "IC-7300MK2 CI-V Reference Guide" + wfview IC-7300.rig; sub-command numbering matches the original §19 table.) Driver: shared Icom CI-V core — src/rigplane/backends/ic7300/{serial,core}.py are 22-line shims over backends/_icom_serial_base._IcomSerialRadioBase + runtime/radio.CoreRadio (185 get_/set_) + _scope_runtime mixin (26) + _dual_rx_runtime (3). Zero IC-7300-specific command code — every method is shared with IC-7610 / IC-705 / IC-9700 / X6200 and routed by rigs/ic7300.toml. Profile: rigs/ic7300.toml. Validation: src/rigplane/validation/registry/* (capability-gated template; see _builders.py). Live run: none — this is a template/static audit. No /tmp/ic7300.live.json hardware run was performed; "Validation" column reflects the generated matrix declaration, not observed pass/fail.

Protocol: Icom CI-V, FE FE 94 E0 … FD, transceiver address 0x94. Default baud 115200 (required for serial scope data).

IC-7300 vs IC-7610 divergence (7300-specific)

  • Single receiver — no dual-watch, no MAIN/SUB band select, no 0x29 (cmd29). Scope is 27 12=Main-only, 27 13=Single-only.
  • Single antenna + ATU0x12 is a 1-of-1 selector; no RX antenna, no ANT1/ANT2 (profile has_rx_ant=false, tx_count=1).
  • APF is a plain ON/OFF toggle (16 32, 0/1) — not the IC-7610 WIDE/MID/NAR 3-level. Profile maps audio_peak_filter16 32; the 3-level apf_type_level14 05 is flagged NOT_IMPLEMENTED in-profile.
  • 2 preamp levels (16 02: 0/1/2), no DIGI-SEL, no drive_gain, single DATA sub-mode.

Command matrix (operator-facing)

Legend — Backend: method name or . Profile: [commands] key or cap. Validation: check_id + declaration (RMVR=round-trip / PRESENCE=synthetic .presence only / MANUAL/TX-ADJ / READ / =none).

CI-V cmd Documented S/R Backend method Profile cap / cmd Validation
03 / 05 freq read/set get_freq/set_freq get_freq/set_freq freq.write RMVR (structural)
04 / 06 mode read/set get_mode/set_mode get_mode/set_mode mode.set RMVR (structural)
02 band-edge freqs get_band_edge_freq band_edge
25 / 26 sel/unsel VFO freq+mode get_selected_freq get_selected_* (structural reads)
07 VFO A/B, swap, equalize get_vfo/set_vfo get_vfo/set_vfo, vfo scheme ab (via VFO scheme)
0F split read/set set_split/get_split get_split/set_split split.set RMVR
10 tuning step get_/set_tuning_step tuning_step — (declared, presence only)
11 attenuator 0/20dB get_/set_attenuator attenuator attenuator.set RMVR
14 01 AF level get_/set_af_level af_level af_level.set RMVR
14 02 RF gain get_/set_rf_gain rf_gain rf_gain.set RMVR
14 03 squelch get_/set_squelch squelch squelch.set RMVR
14 06 NR level get_/set_nr_level nr (covered by nr.set)
14 07/08 TWIN PBT inner/outer get_/set_pbt_inner/_outer pbt pbt.presence
14 09 CW pitch get_/set_cw_pitch cw — (cw check = key_speed only)
14 0A RF power get_/set_rf_power power_control power_control.presence
14 0B MIC gain get_/set_mic_gain power_control power_control.presence
14 0C KEY SPEED get_/set_key_speed cw key_speed.set RMVR
14 0D NOTCH position get_/set_notch_filter notch (covered by notch.set)
14 0E COMP level get_/set_compressor_level compressor compressor.presence
14 0F break-in delay get_/set_break_in_delay break_in break_in.presence
14 12 NB level get_/set_nb_level nb (covered by nb.set)
14 15 monitor gain get_/set_monitor_gain monitor monitor.presence
14 16 VOX gain get_/set_vox_gain vox vox_gain.set TX-ADJ
14 17 anti-VOX gain get_/set_anti_vox_gain vox
15 02 S-meter get_s_meter meters meters.read READ
15 11/12/13/14/15/16 PO/SWR/ALC/COMP/Vd/Id meters get_power_meterget_id_meter meters (covered by meters.read)
16 02 preamp 0/1/2 get_/set_preamp preamp preamp.set RMVR
16 12 AGC FAST/MID/SLOW get_/set_agc agc agc.set RMVR
16 22 NB on/off get_/set_nb nb nb.set RMVR
16 40 NR on/off get_/set_nr nr nr.set RMVR
16 41 auto-notch get_/set_auto_notch notch (covered by notch.set)
16 42 repeater tone get_/set_repeater_tone repeater_tone repeater_tone.set RMVR
16 43 tone squelch get_/set_repeater_tsql tsql tsql.set RMVR
16 44 compressor on/off get_/set_compressor compressor compressor.presence
16 45 monitor on/off get_/set_monitor monitor monitor.presence
16 46 VOX on/off get_/set_vox vox vox.read READ + vox.set PRESENCE
16 47 BK-IN OFF/SEMI/FULL get_/set_break_in break_in break_in.presence
16 48 manual notch on/off get_/set_manual_notch notch notch.set RMVR
16 4F Twin Peak Filter get_/set_twin_peak_filter twin_peak twin_peak.presence
16 50 dial lock get_/set_dial_lock dial_lock dial_lock.set RMVR
16 56 DSP filter type get_/set_filter_shape filter_shape filter_shape.presence
16 57 manual notch width get_/set_manual_notch_width notch (covered by notch.set)
16 58 SSB TX bandwidth get_/set_ssb_tx_bandwidth ssb_tx_bw ssb_tx_bw.presence
16 32 APF ON/OFF (7300: toggle) get_/set_audio_peak_filter apf apf.presence
16 65 IP+ get_/set_ip_plus ip_plus ip_plus.presence
17 send/stop CW msg send_cw/stop_cw send_cw/stop_cw — (feature)
18 power on/off get_/set_powerstat power_control power_control.presence
19 00 transceiver ID get_transceiver_id get_transceiver_id discovery.identify (structural)
1A 01 band-stack register set_bsr (get_bsr NIE) bsr bsr.select MANUAL (set-only)
1A 03 filter width (BCD idx) get_/set_filter_width filter_width filter_width.set RMVR
1A 04 AGC time constant get_/set_agc_time_constant agc (covered by agc.set)
1A 05 … EQ (RX/TX bass/treble, HPF/LPF) get_/set_*_rx_bass [commands.overrides] system_settings
1A 05 0064/0065 ACC/USB MOD level get_/set_acc1_mod_level, _usb_mod_level mod cmds — (audio path)
1A 05 0066/0067 MOD input (DATA OFF / DATA) get_/set_data_off_mod_input, _data1_mod_input data inputs — (audio path)
1A 05 0071 CI-V transceive get_/set_civ_transceive civ cmds
1A 05 0073 CI-V output (for ANT) get_/set_civ_output_ant civ cmds
1A 05 0094/0095/0096 date / time / UTC offset get_/set_system_date/_time/_utc_offset system cmds system_date.read/system_time.read READ
1A 05 0189/0190 NB depth / width get_/set_nb_depth/_width nb cmds — (covered loosely by nb.set)
1A 05 0191/0192 VOX delay / voice delay get_/set_vox_delay vox cmds
1A 06 DATA mode get_/set_data_mode data_mode data_mode.presence
1B 00/01 repeater-tone freq / TSQL freq get_/set_tone_freq/_tsql_freq tone cmds tone_freq.set / tsql_freq.set RMVR
1C 00 PTT TX/RX set_ptt ptt_on/ptt_off tx.ptt TX-ADJ
1C 01 antenna tuner OFF/ON/tune get_/set_tuner_status tuner tuner.tune TX-ADJ
1C 02 TX freq monitor (XFC) get_/set_xfc_status xfc xfc.presence
1C 03 read TX freq get_/set_tx_freq_monitor tx cmds
21 00 RIT freq get_/set_rit_frequency rit rit.set RMVR
21 01 RIT on/off get_/set_rit_status rit (covered by rit.set)
21 02 ∂TX (XIT) on/off get_/set_rit_tx_status xit xit.set RMVR
27 00 scope waveform data get_/set_scope_wave scope cmds (audio/scope surface)
27 10/11 scope on/off, data output scope_on/scope_data_output scope cmds scope.capture MANUAL
27 14 center/fixed mode get_/set_scope_mode scope cmds scope_mode.set RMVR
27 15 span get_/set_scope_span scope cmds scope_span.set RMVR
27 16 edge number get_/set_scope_edge scope cmds scope_edge.set RMVR
27 17 hold get_/set_scope_hold scope cmds scope_hold.set RMVR
27 19 reference level get_/set_scope_ref scope cmds scope_ref.set RMVR
27 1A sweep speed get_/set_scope_speed scope cmds scope_speed.set RMVR
27 1B scope-during-TX get_/set_scope_during_tx scope cmds scope_during_tx.set RMVR
27 1C center type get_/set_scope_center_type scope cmds scope_center_type.set RMVR
27 1D VBW get_/set_scope_vbw scope cmds scope_vbw.set RMVR
27 1E fixed-edge freqs get_/set_scope_fixed_edge scope cmds scope_fixed_edge.read READ
27 1F RBW get_/set_scope_rbw scope cmds scope_rbw.set RMVR
27 12/13 main/sub, single/dual get_scope_single_dual scope cmds scope_dual.set/scope_receiver.set (no-op on 7300, single-RX)
0E scan start/stop scan_start/scan_stop scan scan.presence
13 speech synthesizer get_speech set_speech — (device front-panel)

Intentionally OUT OF SCOPE (device front panel / menu — nothing to mirror into browser UI)

  • 08/09/0A/0B + 1A 00/1A 02 memory & memory-keyer family — memory ops, feature, not an operator real-time control.
  • 1A 05 0021…0197 settings-menu mass (beep, screen capture, fonts, RTTY decode, QSO recorder, contest number, keyboard layout, screen saver, colors, waterfall styling) — device settings menu (hundreds of params); only the audio-path (mod level/input), clock, NB depth/width, VOX delay, and per-band scope edges are surfaced.
  • 1E user-set TX band edges · 1A 05 0072 CI-V address · 0081 LCD backlight — config, not operating controls.
  • 28 00 Voice TX memory — voice keyer (feature, same class as CW keyer).

Gap lists (priority-ordered)

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

CI-V rigplane symbol Fix Ticket
1B 00/01 repeater-tone freq + TSQL freq get_/set_tone_freq, get_/set_tsql_freq exist + tone_freq/tsql_freq registry checks RMVR — but they are gated on capability="repeater_tone"/"tsql"; the 7300 declares both, so they DO run. No gap (listed to confirm parity with FTX-1 audit). none
14 16/17 VOX gain + anti-VOX get_/set_vox_gain (REAL), get_/set_anti_vox_gain (REAL) — backend + profile present, but only vox_gain.set is checked (TX-adjacent, manual); anti-VOX has no check_id Add anti_vox_gain.set RMVR (or fold under vox) NEW
1A 05 0191/0192 VOX delay / voice delay get_/set_vox_delay (REAL) + get_vox_delay/set_vox_delay cmd strings present — no registry check at all Add vox_delay.set RMVR NEW
1A 05 0189/0190 NB depth / width get_/set_nb_depth/_width (REAL) + cmd strings present — no dedicated check (only generic nb.set toggle) Add nb_depth.set RMVR NEW

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

Per _builders.py, a declared capability with no registry CheckSpec gets only a synthetic <cap>.presence entry at UNSUPPORTED_PENDING_EVIDENCE. These 7300 features have a REAL backend method + profile declaration but no functional check — so the matrix can never go green for them:

Capability CI-V Backend (REAL) Fix Ticket
pbt 14 07/08 get_/set_pbt_inner/_outer Add pbt.set RMVR (raw 0/128/255) NEW
compressor (+level) 16 44 / 14 0E get_/set_compressor(+_level) Add compressor.set RMVR NEW
monitor (+gain) 16 45 / 14 15 get_/set_monitor(+_gain) Add monitor.set RMVR NEW
break_in (+delay) 16 47 / 14 0F get_/set_break_in(+_delay) Add break_in.set RMVR NEW
twin_peak 16 4F get_/set_twin_peak_filter Add twin_peak.set RMVR NEW
apf (7300 toggle) 16 32 get_/set_audio_peak_filter Add apf.set RMVR (0/1) NEW
ip_plus 16 65 get_/set_ip_plus Add ip_plus.set RMVR NEW
filter_shape 16 56 get_/set_filter_shape Add filter_shape.set RMVR (SHARP/SOFT) NEW
ssb_tx_bw 16 58 get_/set_ssb_tx_bandwidth Add ssb_tx_bw.set RMVR NEW
data_mode 1A 06 get_/set_data_mode Add data_mode.set RMVR NEW
tuning_step 10 get_/set_tuning_step Add tuning_step.set RMVR NEW
xfc 1C 02 get_/set_xfc_status Add xfc.set RMVR NEW
power_control (rf_power/mic_gain) 14 0A/0B, 18 get_/set_rf_power/_mic_gain/powerstat Split rf_power.set+mic_gain.set RMVR NEW
cw_pitch (under cw) 14 09 get_/set_cw_pitch Add cw_pitch.set RMVR (cw check currently = key_speed only) NEW

All RMVR-able level/toggle controls above are shared with IC-7610; one registry CheckSpec per capability fixes every Icom rig at once (_levels.py/_dsp.py/_tx.py).

C. MISSING BACKEND — documented operator command, no backend method

CI-V Function Value Ticket
1A 01 (read) band-stack register get_bsr raises NotImplementedError for all Icom — only set_bsr works; bsr.select is set-only/manual Med — implement BSR read (firmware DOES answer 1A 01); the NIE is a stale IC-7610-era assumption NEW
1A 05 0030 quick split no get_quick_split/set_quick_split method (profile has the cmd string get_/set_quick_split, no backend async def) Low — operating convenience NEW
0E A1–A7 ∂F scan span / select-scan variants scan_set_df_span/scan_set_resume exist; the select-memory-scan + ∂F-span enumerations are not surfaced Low — feature (scan family)
1A 02 / 17 memory & CW message keyer memory ops + CW keyer text Feature (out of scope, see above)

D. MISMATCH / WRONG — declared/checked but behaves differently

CI-V rigplane symbol Issue Ticket
14 05 APF type/level get_/set_apf_type_level Method sends 0x14 (REAL on IC-7610's 3-level APF), but the IC-7300 has no 14 05 APF position — it is a plain 16 32 toggle. Profile correctly maps apf16 32 and flags get_apf_type_level=[0x14,0x05] as NOT_IMPLEMENTED. Calling apf_type_level on a 7300 would emit a command the radio ignores. Cosmetic (method unreachable via 7300 UI) but the cmd string should be removed, not just commented. NEW (low)
1A 01 get_bsr band-stack read get_bsr raise NotImplementedError(...) cites "IC-7610 does not support reading band stack" — inherited verbatim by the 7300 even though the 7300 §19 table documents 1A 01 as Send/read. Driver-wide stale assumption (see list C). NEW
header provenance rigs/ic7300.toml Header & two [commands] comments cite "IC-7300MK2 CI-V Reference Guide" as source, but the profile targets the original IC-7300 (addr 0x94, 2-level preamp, single DATA). MK2 has a different command set. Update provenance to the IC-7300 Full Manual §19 to avoid future mis-merges. NEW (doc)

Summary

  • No live hardware validation was run for the IC-7300 — this is a static/template audit. Recommend an /tmp/ic7300.live.json run to confirm the ~26 RMVR checks and resolve list-B presence-only items.
  • The IC-7300 is 100% shared-backend with the IC-7610 — every gap in lists A/B is also an IC-7610/IC-705/IC-9700 gap; fixes are one CheckSpec per capability, rig-agnostic.
  • Biggest single lever: list B — ~14 declared+implemented capabilities (pbt, compressor, monitor, break_in, twin_peak, apf, ip_plus, filter_shape, ssb_tx_bw, data_mode, tuning_step, xfc, power_control, cw_pitch) have a working backend method but only a synthetic .presence stub, so they can never validate green. Add functional _levels/_dsp/_tx CheckSpecs.
  • Real bugs: get_bsr NIE blocks 1A 01 read on hardware that supports it (lists C+D); apf_type_level14 05 is a dead command on the 7300 (list D).