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 is27 12=Main-only,27 13=Single-only. - Single antenna + ATU —
0x12is a 1-of-1 selector; no RX antenna, no ANT1/ANT2 (profilehas_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 mapsaudio_peak_filter→16 32; the 3-levelapf_type_level→14 05is flaggedNOT_IMPLEMENTEDin-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_meter…get_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 02memory & memory-keyer family — memory ops, feature, not an operator real-time control.1A 05 0021…0197settings-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.1Euser-set TX band edges ·1A 05 0072CI-V address ·0081LCD backlight — config, not operating controls.28 00Voice 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 apf→16 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.jsonrun 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
.presencestub, so they can never validate green. Add functional_levels/_dsp/_txCheckSpecs. - Real bugs:
get_bsrNIE blocks1A 01read on hardware that supports it (lists C+D);apf_type_level→14 05is a dead command on the 7300 (list D).