1 /*
2  *  Hamlib CI-V backend - description of IC-7300 and variations
3  *  Adapted by J.Watson from IC-7000 code (c) 2004 by Stephane Fillod
4  *  Adapted from IC-7200 (c) 2016 by Michael Black W9MDB
5  *
6  *
7  *   This library is free software; you can redistribute it and/or
8  *   modify it under the terms of the GNU Lesser General Public
9  *   License as published by the Free Software Foundation; either
10  *   version 2.1 of the License, or (at your option) any later version.
11  *
12  *   This library is distributed in the hope that it will be useful,
13  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *   Lesser General Public License for more details.
16  *
17  *   You should have received a copy of the GNU Lesser General Public
18  *   License along with this library; if not, write to the Free Software
19  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20  *
21  */
22 
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26 
27 #include <string.h>  /* String function definitions */
28 
29 #include <hamlib/rig.h>
30 #include "idx_builtin.h"
31 
32 #include "token.h"
33 #include "icom.h"
34 #include "icom_defs.h"
35 #include "frame.h"
36 #include "bandplan.h"
37 #include "tones.h"
38 
39 static int ic7300_set_parm(RIG *rig, setting_t parm, value_t val);
40 static int ic7300_get_parm(RIG *rig, setting_t parm, value_t *val);
41 
42 
43 #define IC7300_ALL_RX_MODES (RIG_MODE_FM|RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM|RIG_MODE_PKTAM)
44 #define IC7300_1HZ_TS_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM|RIG_MODE_PKTAM)
45 #define IC7300_NOT_TS_MODES (IC7300_ALL_RX_MODES &~IC7300_1HZ_TS_MODES)
46 
47 #define IC7300_OTHER_TX_MODES (RIG_MODE_FM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR)
48 #define IC7300_AM_TX_MODES (RIG_MODE_AM|RIG_MODE_PKTAM)
49 
50 #define IC7300_FUNCS (RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_ANF|RIG_FUNC_LOCK|RIG_FUNC_RIT|RIG_FUNC_XIT|RIG_FUNC_SCOPE|RIG_FUNC_TUNER|RIG_FUNC_TRANSCEIVE|RIG_FUNC_SPECTRUM|RIG_FUNC_SPECTRUM_HOLD)
51 
52 #define IC7300_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_SPECTRUM_MODE|RIG_LEVEL_SPECTRUM_SPAN|RIG_LEVEL_SPECTRUM_SPEED|RIG_LEVEL_SPECTRUM_REF|RIG_LEVEL_SPECTRUM_AVG|RIG_LEVEL_SPECTRUM_EDGE_LOW|RIG_LEVEL_SPECTRUM_EDGE_HIGH)
53 
54 #define IC7300_VFOS (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM)
55 #define IC7300_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_TIME|RIG_PARM_BEEP)
56 
57 #define IC7300_VFO_OPS (RIG_OP_CPY|RIG_OP_XCHG|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL|RIG_OP_TUNE)
58 #define IC7300_SCAN_OPS (RIG_SCAN_STOP|RIG_SCAN_MEM|RIG_SCAN_PROG|RIG_SCAN_SLCT)
59 
60 #define IC7300_ANTS (RIG_ANT_1) /* ant-1 is Hf-6m */
61 
62 /*
63  * IC-7300 S-meter levels measured from live signals on multiple bands. Provides a good approximation.
64  */
65 #define IC7300_STR_CAL { 7, \
66     { \
67         {   0, -54 }, \
68         {  10, -48 }, \
69         {  30, -36 }, \
70         {  60, -24 }, \
71         {  90, -12 }, \
72         { 120,  0 }, \
73         { 241,  64 } \
74     } }
75 
76 #define IC7300_SWR_CAL { 5, \
77     { \
78          { 0, 1.0f }, \
79          { 48, 1.5f }, \
80          { 80, 2.0f }, \
81          { 120, 3.0f }, \
82          { 240, 6.0f } \
83     } }
84 
85 #define IC7300_ALC_CAL { 2, \
86     { \
87          { 0, 0.0f }, \
88          { 120, 1.0f } \
89     } }
90 
91 #define IC7300_RFPOWER_METER_CAL { 13, \
92     { \
93          { 0, 0.0f }, \
94          { 21, 5.0f }, \
95          { 43, 10.0f }, \
96          { 65, 15.0f }, \
97          { 83, 20.0f }, \
98          { 95, 25.0f }, \
99          { 105, 30.0f }, \
100          { 114, 35.0f }, \
101          { 124, 40.0f }, \
102          { 143, 50.0f }, \
103          { 183, 75.0f }, \
104          { 213, 100.0f }, \
105          { 255, 120.0f } \
106     } }
107 
108 #define IC7300_COMP_METER_CAL { 3, \
109     { \
110          { 0, 0.0f }, \
111          { 130, 15.0f }, \
112          { 241, 30.0f } \
113     } }
114 
115 #define IC7300_VD_METER_CAL { 3, \
116     { \
117          { 0, 0.0f }, \
118          { 13, 10.0f }, \
119          { 241, 16.0f } \
120     } }
121 
122 #define IC7300_ID_METER_CAL { 4, \
123     { \
124          { 0, 0.0f }, \
125          { 97, 10.0f }, \
126          { 146, 15.0f }, \
127          { 241, 25.0f } \
128     } }
129 
130 
131 /*
132  * IC705 items that differ from IC7300
133  */
134 #define IC705_ALL_TX_MODES (RIG_MODE_FM|RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_DSTAR)
135 #define IC705_ALL_RX_MODES (RIG_MODE_FM|RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM|RIG_MODE_PKTAM|RIG_MODE_DSTAR)
136 #define IC705_OTHER_TX_MODES (RIG_MODE_FM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_DSTAR)
137 #define IC705_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_SPECTRUM_MODE|RIG_LEVEL_SPECTRUM_SPAN|RIG_LEVEL_SPECTRUM_SPEED|RIG_LEVEL_SPECTRUM_REF|RIG_LEVEL_SPECTRUM_AVG|RIG_LEVEL_SPECTRUM_EDGE_LOW|RIG_LEVEL_SPECTRUM_EDGE_HIGH)
138 
139 /*
140  * IC9700 items that differ from IC7300
141  */
142 #define IC9700_VFOS (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MAIN|RIG_VFO_SUB|RIG_VFO_MEM|RIG_VFO_MAIN_A|RIG_VFO_MAIN_B|RIG_VFO_SUB_A|RIG_VFO_SUB_B)
143 #define IC9700_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_TIME|RIG_PARM_BEEP|RIG_PARM_SCREENSAVER)
144 #define IC9700_FUNCS (RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_ANF|RIG_FUNC_LOCK|RIG_FUNC_RIT|RIG_FUNC_SCOPE|RIG_FUNC_SATMODE|RIG_FUNC_AFC|RIG_FUNC_TRANSCEIVE|RIG_FUNC_SPECTRUM|RIG_FUNC_SPECTRUM_HOLD)
145 #define IC9700_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_SPECTRUM_MODE|RIG_LEVEL_SPECTRUM_SPAN|RIG_LEVEL_SPECTRUM_SPEED|RIG_LEVEL_SPECTRUM_REF|RIG_LEVEL_SPECTRUM_AVG|RIG_LEVEL_SPECTRUM_EDGE_LOW|RIG_LEVEL_SPECTRUM_EDGE_HIGH)
146 #define IC9700_VFO_OPS (RIG_OP_CPY|RIG_OP_XCHG|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL)
147 #define IC9700_SCAN_OPS (RIG_SCAN_STOP|RIG_SCAN_MEM|RIG_SCAN_PROG|RIG_SCAN_SLCT)
148 #define IC9700_ALL_TX_MODES (RIG_MODE_FM|RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_DSTAR|RIG_MODE_DD)
149 #define IC9700_ALL_RX_MODES (RIG_MODE_FM|RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_DSTAR|RIG_MODE_DD)
150 
151 #define IC9700_STR_CAL { 7, \
152     { \
153         {   0, -54 }, \
154         {  10, -48 }, \
155         {  30, -36 }, \
156         {  60, -24 }, \
157         {  90, -12 }, \
158         { 120,  0 }, \
159         { 241,  64 } \
160     } }
161 
162 #define IC9700_SWR_CAL { 5, \
163     { \
164          { 0, 1.0f }, \
165          { 48, 1.5f }, \
166          { 80, 2.0f }, \
167          { 120, 3.0f }, \
168          { 240, 6.0f } \
169     } }
170 
171 #define IC9700_ALC_CAL { 2, \
172     { \
173          { 0, 0.0f }, \
174          { 120, 1.0f } \
175     } }
176 
177 #define IC9700_RFPOWER_METER_CAL { 13, \
178     { \
179          { 0, 0.0f }, \
180          { 21, 5.0f }, \
181          { 43, 10.0f }, \
182          { 65, 15.0f }, \
183          { 83, 20.0f }, \
184          { 95, 25.0f }, \
185          { 105, 30.0f }, \
186          { 114, 35.0f }, \
187          { 124, 40.0f }, \
188          { 143, 50.0f }, \
189          { 183, 75.0f }, \
190          { 213, 100.0f }, \
191          { 255, 120.0f } \
192     } }
193 
194 #define IC9700_COMP_METER_CAL { 3, \
195     { \
196          { 0, 0.0f }, \
197          { 130, 15.0f }, \
198          { 210, 25.5f } \
199     } }
200 
201 #define IC9700_VD_METER_CAL { 3, \
202     { \
203          { 0, 0.0f }, \
204          { 13, 10.0f }, \
205          { 241, 16.0f } \
206     } }
207 
208 #define IC9700_ID_METER_CAL { 3, \
209     { \
210          { 0, 0.0f }, \
211          { 121, 10.0f }, \
212          { 241, 20.0f } \
213     } }
214 
215 struct cmdparams ic7300_extcmds[] =
216 {
217     { {.s = RIG_PARM_BEEP}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x23}, CMD_DAT_BOL, 1 },
218     { {.s = RIG_PARM_BACKLIGHT}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x81}, CMD_DAT_LVL, 2 },
219     { {.s = RIG_PARM_TIME}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x95}, CMD_DAT_TIM, 2 },
220     { {.s = RIG_LEVEL_VOXDELAY}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x59}, CMD_DAT_INT, 1 },
221     { {.s = RIG_FUNC_TRANSCEIVE}, CMD_PARAM_TYPE_FUNC, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x71}, CMD_DAT_BOL, 1 },
222     { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x02}, CMD_DAT_INT, 1 },
223     { {.s = RIG_PARM_NONE} }
224 };
225 
226 struct cmdparams ic9700_extcmds[] =
227 {
228     { {.s = RIG_PARM_BEEP}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x29}, CMD_DAT_BOL, 1 },
229     { {.s = RIG_PARM_BACKLIGHT}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x52}, CMD_DAT_LVL, 2 },
230     { {.s = RIG_PARM_SCREENSAVER}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x67}, CMD_DAT_INT, 1 },
231     { {.s = RIG_PARM_TIME}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x80}, CMD_DAT_TIM, 2 },
232     { {.s = RIG_LEVEL_VOXDELAY}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x03, 0x30}, CMD_DAT_INT, 1 },
233     { {.s = RIG_FUNC_TRANSCEIVE}, CMD_PARAM_TYPE_FUNC, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x27}, CMD_DAT_BOL, 1 },
234     { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x92}, CMD_DAT_INT, 1 },
235     { {0} }
236 };
237 
238 struct cmdparams ic705_extcmds[] =
239 {
240     { {.s = RIG_PARM_BEEP}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x31}, CMD_DAT_BOL, 1 },
241     { {.s = RIG_PARM_BACKLIGHT}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x36}, CMD_DAT_LVL, 2 },
242     { {.s = RIG_PARM_SCREENSAVER}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x38}, CMD_DAT_INT, 1 },
243     { {.s = RIG_PARM_TIME}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x66}, CMD_DAT_TIM, 2 },
244     { {.s = RIG_LEVEL_VOXDELAY}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x03, 0x59}, CMD_DAT_INT, 1 },
245     { {.s = RIG_FUNC_TRANSCEIVE}, CMD_PARAM_TYPE_FUNC, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x31}, CMD_DAT_BOL, 1 },
246     { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x78}, CMD_DAT_INT, 1 },
247     { {0} }
248 };
249 
250 int ic7300_ext_tokens[] =
251 {
252     TOK_SCOPE_STX, TOK_SCOPE_CFQ, TOK_SCOPE_EDG, TOK_SCOPE_VBW, TOK_BACKEND_NONE,
253 };
254 
255 int ic9700_ext_tokens[] =
256 {
257     TOK_SCOPE_MSS, TOK_SCOPE_SDS, TOK_SCOPE_STX, TOK_SCOPE_CFQ, TOK_SCOPE_EDG, TOK_SCOPE_VBW, TOK_SCOPE_MKP, TOK_BACKEND_NONE,
258 };
259 
260 int ic705_ext_tokens[] =
261 {
262     TOK_SCOPE_STX, TOK_SCOPE_CFQ, TOK_SCOPE_EDG, TOK_SCOPE_VBW, TOK_BACKEND_NONE,
263 };
264 
265 /*
266  * IC-7300 rig capabilities.
267  */
268 static const struct icom_priv_caps IC7300_priv_caps =
269 {
270     0x94,   /* default address */
271     0,      /* 731 mode */
272     1,      /* no XCHG to avoid display flickering */
273     ic7300_ts_sc_list,
274     .agc_levels_present = 1,
275     .agc_levels = {
276         { .level = RIG_AGC_FAST, .icom_level = 1 },
277         { .level = RIG_AGC_MEDIUM, .icom_level = 2 },
278         { .level = RIG_AGC_SLOW, .icom_level = 3 },
279         { .level = -1, .icom_level = 0 },
280     },
281     .spectrum_scope_caps = {
282         .spectrum_line_length = 475,
283         .single_frame_data_length = 50,
284         .data_level_min = 0,
285         .data_level_max = 160,
286         .signal_strength_min = -80,
287         .signal_strength_max = 0,
288     },
289     .spectrum_edge_frequency_ranges = {
290         {
291             .range_id = 1,
292             .low_freq = 30000,
293             .high_freq = 1600000,
294         },
295         {
296             .range_id = 2,
297             .low_freq = 1600000,
298             .high_freq = 2000000,
299         },
300         {
301             .range_id = 3,
302             .low_freq = 2000000,
303             .high_freq = 6000000,
304         },
305         {
306             .range_id = 4,
307             .low_freq = 6000000,
308             .high_freq = 8000000,
309         },
310         {
311             .range_id = 5,
312             .low_freq = 8000000,
313             .high_freq = 11000000,
314         },
315         {
316             .range_id = 6,
317             .low_freq = 11000000,
318             .high_freq = 15000000,
319         },
320         {
321             .range_id = 7,
322             .low_freq = 15000000,
323             .high_freq = 20000000,
324         },
325         {
326             .range_id = 8,
327             .low_freq = 20000000,
328             .high_freq = 22000000,
329         },
330         {
331             .range_id = 9,
332             .low_freq = 22000000,
333             .high_freq = 26000000,
334         },
335         {
336             .range_id = 10,
337             .low_freq = 26000000,
338             .high_freq = 30000000,
339         },
340         {
341             .range_id = 11,
342             .low_freq = 30000000,
343             .high_freq = 45000000,
344         },
345         {
346             .range_id = 12,
347             .low_freq = 45000000,
348             .high_freq = 60000000,
349         },
350         {
351             .range_id = 13,
352             .low_freq = 60000000,
353             .high_freq = 74800000,
354         },
355         {
356             .range_id = 0,
357             .low_freq = 0,
358             .high_freq = 0,
359         },
360     },
361     .extcmds = ic7300_extcmds,   /* Custom op parameters */
362 };
363 
364 static const struct icom_priv_caps IC9700_priv_caps =
365 {
366     0xA2,   /* default address */
367     0,      /* 731 mode */
368     1,      /* no XCHG to avoid display flickering */
369     ic9700_ts_sc_list,
370     .serial_USB_echo_check = 1,  /* USB CI-V may not echo */
371     .agc_levels_present = 1,
372     .agc_levels = {
373         { .level = RIG_AGC_FAST, .icom_level = 1 },
374         { .level = RIG_AGC_MEDIUM, .icom_level = 2 },
375         { .level = RIG_AGC_SLOW, .icom_level = 3 },
376         { .level = -1, .icom_level = 0 },
377     },
378     .spectrum_scope_caps = {
379         .spectrum_line_length = 475,
380         .single_frame_data_length = 50,
381         .data_level_min = 0,
382         .data_level_max = 160,
383         .signal_strength_min = -80, // TODO: signal strength to be confirmed
384         .signal_strength_max = 0,
385     },
386     .spectrum_edge_frequency_ranges = {
387         {
388             .range_id = 1,
389             .low_freq = 144000000,
390             .high_freq = 148000000,
391         },
392         {
393             .range_id = 2,
394             .low_freq = 430000000,
395             .high_freq = 450000000,
396         },
397         {
398             .range_id = 3,
399             .low_freq = 1240000000,
400             .high_freq = 1300000000,
401         },
402         {
403             .range_id = 0,
404             .low_freq = 0,
405             .high_freq = 0,
406         },
407     },
408     .extcmds = ic9700_extcmds,   /* Custom op parameters */
409 };
410 
411 static const struct icom_priv_caps IC705_priv_caps =
412 {
413     0xA4,   /* default address */
414     0,      /* 731 mode */
415     1,      /* no XCHG to avoid display flickering */
416     ic705_ts_sc_list,
417     .serial_USB_echo_check = 1,  /* USB CI-V may not echo */
418     .agc_levels_present = 1,
419     .agc_levels = {
420         { .level = RIG_AGC_FAST, .icom_level = 1 },
421         { .level = RIG_AGC_MEDIUM, .icom_level = 2 },
422         { .level = RIG_AGC_SLOW, .icom_level = 3 },
423         { .level = -1, .icom_level = 0 },
424     },
425     .spectrum_scope_caps = {
426         .spectrum_line_length = 475,
427         .single_frame_data_length = 50,
428         .data_level_min = 0,
429         .data_level_max = 160,
430         .signal_strength_min = -80, // TODO: signal strength to be confirmed
431         .signal_strength_max = 0,
432     },
433     .spectrum_edge_frequency_ranges = {
434         {
435             .range_id = 1,
436             .low_freq = 30000,
437             .high_freq = 1600000,
438         },
439         {
440             .range_id = 2,
441             .low_freq = 1600000,
442             .high_freq = 2000000,
443         },
444         {
445             .range_id = 3,
446             .low_freq = 2000000,
447             .high_freq = 6000000,
448         },
449         {
450             .range_id = 4,
451             .low_freq = 6000000,
452             .high_freq = 8000000,
453         },
454         {
455             .range_id = 5,
456             .low_freq = 8000000,
457             .high_freq = 11000000,
458         },
459         {
460             .range_id = 6,
461             .low_freq = 11000000,
462             .high_freq = 15000000,
463         },
464         {
465             .range_id = 7,
466             .low_freq = 15000000,
467             .high_freq = 20000000,
468         },
469         {
470             .range_id = 8,
471             .low_freq = 20000000,
472             .high_freq = 22000000,
473         },
474         {
475             .range_id = 9,
476             .low_freq = 22000000,
477             .high_freq = 26000000,
478         },
479         {
480             .range_id = 10,
481             .low_freq = 26000000,
482             .high_freq = 30000000,
483         },
484         {
485             .range_id = 11,
486             .low_freq = 30000000,
487             .high_freq = 45000000,
488         },
489         {
490             .range_id = 12,
491             .low_freq = 45000000,
492             .high_freq = 60000000,
493         },
494         {
495             .range_id = 13,
496             .low_freq = 60000000,
497             .high_freq = 74800000,
498         },
499         {
500             .range_id = 13,
501             .low_freq = 60000000,
502             .high_freq = 74800000,
503         },
504         {
505             .range_id = 14,
506             .low_freq = 74800000,
507             .high_freq = 108000000,
508         },
509         {
510             .range_id = 15,
511             .low_freq = 108000000,
512             .high_freq = 137000000,
513         },
514         {
515             .range_id = 16,
516             .low_freq = 137000000,
517             .high_freq = 200000000,
518         },
519         {
520             .range_id = 17,
521             .low_freq = 400000000,
522             .high_freq = 470000000,
523         },
524         {
525             .range_id = 0,
526             .low_freq = 0,
527             .high_freq = 0,
528         },
529     },
530     .extcmds = ic705_extcmds,     /* Custom parameters */
531 };
532 
533 const struct rig_caps ic7300_caps =
534 {
535     RIG_MODEL(RIG_MODEL_IC7300),
536     .model_name = "IC-7300",
537     .mfg_name =  "Icom",
538     .version =  BACKEND_VER ".4",
539     .copyright =  "LGPL",
540     .status =  RIG_STATUS_STABLE,
541     .rig_type =  RIG_TYPE_TRANSCEIVER,
542     .ptt_type =  RIG_PTT_RIG,
543     .dcd_type =  RIG_DCD_RIG,
544     .port_type =  RIG_PORT_SERIAL,
545     .serial_rate_min =  4800,
546     .serial_rate_max =  115200,
547     .serial_data_bits =  8,
548     .serial_stop_bits =  1,
549     .serial_parity =  RIG_PARITY_NONE,
550     .serial_handshake =  RIG_HANDSHAKE_NONE,
551     .write_delay =  0,
552     .post_write_delay =  0,
553     .timeout =  1000,
554     .retry =  3,
555     .has_get_func =  IC7300_FUNCS,
556     .has_set_func =  IC7300_FUNCS,
557     .has_get_level =  IC7300_LEVELS,
558     .has_set_level =  RIG_LEVEL_SET(IC7300_LEVELS),
559     .has_get_parm =  IC7300_PARMS,
560     .has_set_parm =  RIG_PARM_SET(IC7300_PARMS),
561     .level_gran = {
562         // cppcheck-suppress *
563         [LVL_RAWSTR] = {.min = {.i = 0}, .max = {.i = 255}},
564         [LVL_VOXDELAY] = {.min = {.i = 0}, .max = {.i = 20}, .step = {.i = 1}},
565         [LVL_KEYSPD] = {.min = {.i = 6}, .max = {.i = 48}, .step = {.i = 1}},
566         [LVL_CWPITCH] = {.min = {.i = 300}, .max = {.i = 900}, .step = {.i = 1}},
567         [LVL_SPECTRUM_SPEED] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}},
568         [LVL_SPECTRUM_REF] = {.min = {.f = -20.0f}, .max = {.f = 20.0f}, .step = {.f = 0.5f}},
569         [LVL_SPECTRUM_AVG] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}},
570     },
571     .parm_gran =  {},
572     .ext_tokens = ic7300_ext_tokens,
573     .extlevels = icom_ext_levels,
574     .ctcss_list =  full_ctcss_list,
575     .dcs_list =  NULL,
576     .preamp =   { 1, 2, RIG_DBLST_END, },
577     .attenuator =   { 20, RIG_DBLST_END, },
578     .max_rit =  Hz(9999),
579     .max_xit =  Hz(9999),
580     .max_ifshift =  Hz(0),
581     .agc_level_count = 3,
582     .agc_levels = { RIG_AGC_FAST, RIG_AGC_MEDIUM, RIG_AGC_SLOW },
583     .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE,
584     .vfo_ops =  IC7300_VFO_OPS,
585     .scan_ops =  IC7300_SCAN_OPS,
586     .transceive =  RIG_TRN_RIG,
587     .bank_qty =   1,
588     .chan_desc_sz =  0,
589 
590     .chan_list =  {
591         {   1,  99, RIG_MTYPE_MEM  },
592         RIG_CHAN_END,
593     },
594 
595     .rx_range_list1 =   {
596         {kHz(30), MHz(74.8), IC7300_ALL_RX_MODES, -1, -1, IC7300_VFOS}, RIG_FRNG_END,
597     },
598     .tx_range_list1 =   {
599         FRQ_RNG_HF(1, IC7300_OTHER_TX_MODES, W(2), W(100), IC7300_VFOS, RIG_ANT_1),
600         FRQ_RNG_60m(1, IC7300_OTHER_TX_MODES, W(2), W(100), IC7300_VFOS, RIG_ANT_1),
601         FRQ_RNG_6m(1, IC7300_OTHER_TX_MODES, W(2), W(100), IC7300_VFOS, RIG_ANT_1),
602         FRQ_RNG_4m(1, IC7300_OTHER_TX_MODES, W(2), W(50), IC7300_VFOS, RIG_ANT_1),
603         FRQ_RNG_HF(1, IC7300_AM_TX_MODES, W(1), W(25), IC7300_VFOS, RIG_ANT_1), /* AM class */
604         FRQ_RNG_60m(1, IC7300_AM_TX_MODES, W(1), W(25), IC7300_VFOS, RIG_ANT_1), /* AM class */
605         FRQ_RNG_6m(1, IC7300_AM_TX_MODES, W(1), W(25), IC7300_VFOS, RIG_ANT_1), /* AM class */
606         FRQ_RNG_4m(1, IC7300_AM_TX_MODES, W(1), W(12.5), IC7300_VFOS, RIG_ANT_1), /* AM class */
607         RIG_FRNG_END,
608     },
609 
610     .tuning_steps = {
611         {IC7300_ALL_RX_MODES, Hz(1)},
612         {IC7300_ALL_RX_MODES, kHz(1)},
613         {IC7300_ALL_RX_MODES, kHz(5)},
614         {IC7300_ALL_RX_MODES, kHz(9)},
615         {IC7300_ALL_RX_MODES, kHz(10)},
616         {IC7300_ALL_RX_MODES, kHz(12.5)},
617         {IC7300_ALL_RX_MODES, kHz(20)},
618         {IC7300_ALL_RX_MODES, kHz(25)},
619         RIG_TS_END,
620     },
621 
622     /* mode/filter list, remember: order matters! But duplication may speed up search.  Put the most commonly used modes first!  Remember these are defaults, with dsp rigs you can change them to anything you want except FM and WFM which are fixed */
623     .filters =  {
624         {RIG_MODE_SSB | RIG_MODE_PKTLSB | RIG_MODE_PKTUSB, kHz(2.4)},
625         {RIG_MODE_SSB | RIG_MODE_PKTLSB | RIG_MODE_PKTUSB, kHz(1.8)},
626         {RIG_MODE_SSB | RIG_MODE_PKTLSB | RIG_MODE_PKTUSB, kHz(3)},
627         {RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(500)},
628         {RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(250)},
629         {RIG_MODE_CW | RIG_MODE_CWR, kHz(1.2)},
630         {RIG_MODE_RTTY | RIG_MODE_RTTYR, kHz(2.4)},
631         {RIG_MODE_AM | RIG_MODE_PKTAM, kHz(6)},
632         {RIG_MODE_AM | RIG_MODE_PKTAM, kHz(3)},
633         {RIG_MODE_AM | RIG_MODE_PKTAM, kHz(9)},
634         {RIG_MODE_FM | RIG_MODE_PKTFM, kHz(10)},
635         {RIG_MODE_FM | RIG_MODE_PKTFM, kHz(7)},
636         {RIG_MODE_FM | RIG_MODE_PKTFM, kHz(15)},
637         RIG_FLT_END,
638     },
639 
640     .str_cal = IC7300_STR_CAL,
641     .swr_cal = IC7300_SWR_CAL,
642     .alc_cal = IC7300_ALC_CAL,
643     .rfpower_meter_cal = IC7300_RFPOWER_METER_CAL,
644     .comp_meter_cal = IC7300_COMP_METER_CAL,
645     .vd_meter_cal = IC7300_VD_METER_CAL,
646     .id_meter_cal = IC7300_ID_METER_CAL,
647 
648     .spectrum_scopes = {
649         {
650             .id = 0,
651             .name = "Main",
652         },
653         {
654             .id = -1,
655             .name = NULL,
656         },
657     },
658     .spectrum_modes = {
659         RIG_SPECTRUM_MODE_CENTER,
660         RIG_SPECTRUM_MODE_FIXED,
661         RIG_SPECTRUM_MODE_CENTER_SCROLL,
662         RIG_SPECTRUM_MODE_FIXED_SCROLL,
663         RIG_SPECTRUM_MODE_NONE,
664     },
665     .spectrum_spans = {
666         5000,
667         10000,
668         20000,
669         50000,
670         100000,
671         200000,
672         500000,
673         1000000,
674         0,
675     },
676     .spectrum_avg_modes = {
677         {
678             .id = 0,
679             .name = "OFF",
680         },
681         {
682             .id = 1,
683             .name = "2",
684         },
685         {
686             .id = 2,
687             .name = "3",
688         },
689         {
690             .id = 3,
691             .name = "4",
692         },
693     },
694 
695     .cfgparams =  icom_cfg_params,
696     .set_conf =  icom_set_conf,
697     .get_conf =  icom_get_conf,
698 
699     .priv = (void *)& IC7300_priv_caps,
700     .rig_init =   icom_init,
701     .rig_cleanup =   icom_cleanup,
702     .rig_open =  icom_rig_open,
703     .rig_close =  icom_rig_close,
704 
705     .set_freq =  icom_set_freq,
706     .get_freq =  icom_get_freq,
707     .set_mode =  icom_set_mode_with_data,
708     .get_mode =  icom_get_mode_with_data,
709     .set_vfo =  icom_set_vfo,
710     .set_ant =  NULL,
711     .get_ant =  NULL,
712 
713     .set_rit =  icom_set_rit_new,
714     .get_rit =  icom_get_rit_new,
715     .get_xit =  icom_get_rit_new,
716     .set_xit =  icom_set_xit_new,
717 
718     .decode_event =  icom_decode_event,
719     .set_level =  icom_set_level,
720     .get_level =  icom_get_level,
721     .set_ext_level =  icom_set_ext_level,
722     .get_ext_level =  icom_get_ext_level,
723     .set_func =  icom_set_func,
724     .get_func =  icom_get_func,
725     .set_parm =  ic7300_set_parm,
726     .get_parm =  ic7300_get_parm,
727     .set_mem =  icom_set_mem,
728     .vfo_op =  icom_vfo_op,
729     .scan =  icom_scan,
730     .set_ptt =  icom_set_ptt,
731     .get_ptt =  icom_get_ptt,
732     .get_dcd =  icom_get_dcd,
733     .set_ts =  icom_set_ts,
734     .get_ts =  icom_get_ts,
735     .set_rptr_shift =  NULL,
736     .get_rptr_shift =  NULL,
737     .set_rptr_offs =  NULL,
738     .get_rptr_offs =  NULL,
739     .set_ctcss_tone =  icom_set_ctcss_tone,
740     .get_ctcss_tone =  icom_get_ctcss_tone,
741     .set_ctcss_sql =  icom_set_ctcss_sql,
742     .get_ctcss_sql =  icom_get_ctcss_sql,
743     .set_split_freq =  icom_set_split_freq,
744     .get_split_freq =  icom_get_split_freq,
745     .set_split_mode =  icom_set_split_mode,
746     .get_split_mode =  icom_get_split_mode,
747     .set_split_vfo =  icom_set_split_vfo,
748     .get_split_vfo =  icom_get_split_vfo,
749     .set_powerstat = icom_set_powerstat,
750     .get_powerstat = icom_get_powerstat,
751     .power2mW = icom_power2mW,
752     .mW2power = icom_mW2power,
753     .send_morse = icom_send_morse,
754     .stop_morse = icom_stop_morse,
755     .wait_morse = rig_wait_morse,
756     .send_voice_mem = icom_send_voice_mem
757 };
758 
759 const struct rig_caps ic9700_caps =
760 {
761     RIG_MODEL(RIG_MODEL_IC9700),
762     .model_name = "IC-9700",
763     .mfg_name =  "Icom",
764     .version =  BACKEND_VER ".3",
765     .copyright =  "LGPL",
766     .status =  RIG_STATUS_STABLE,
767     .rig_type =  RIG_TYPE_TRANSCEIVER,
768     .ptt_type =  RIG_PTT_RIG,
769     .dcd_type =  RIG_DCD_RIG,
770     .port_type =  RIG_PORT_SERIAL,
771     .serial_rate_min =  4800,
772     .serial_rate_max =  38400,
773     .serial_data_bits =  8,
774     .serial_stop_bits =  1,
775     .serial_parity =  RIG_PARITY_NONE,
776     .serial_handshake =  RIG_HANDSHAKE_NONE,
777     .write_delay =  0,
778     .post_write_delay =  0,
779     .timeout =  1000,
780     .retry =  3,
781     .has_get_func =  IC9700_FUNCS,
782     .has_set_func =  IC9700_FUNCS,
783     .has_get_level =  IC9700_LEVELS,
784     .has_set_level =  RIG_LEVEL_SET(IC9700_LEVELS),
785     .has_get_parm =  IC9700_PARMS,
786     .has_set_parm =  RIG_PARM_SET(IC9700_PARMS),
787     .level_gran = {
788         [LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } },
789         [LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 20 }, .step = { .i = 1 } },
790         [LVL_KEYSPD] = {.min = {.i = 6}, .max = {.i = 48}, .step = {.i = 1}},
791         [LVL_CWPITCH] = {.min = {.i = 300}, .max = {.i = 900}, .step = {.i = 1}},
792         [LVL_SPECTRUM_SPEED] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}},
793         [LVL_SPECTRUM_REF] = {.min = {.f = -20.0f}, .max = {.f = 20.0f}, .step = {.f = 0.5f}},
794         [LVL_SPECTRUM_AVG] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}},
795     },
796     .parm_gran =  {},
797     .ext_tokens = ic9700_ext_tokens,
798     .extlevels = icom_ext_levels,
799     .ctcss_list =  full_ctcss_list,
800     .dcs_list =  NULL,
801     .preamp =   { 1, 2, RIG_DBLST_END, },
802     .attenuator =   { 10, RIG_DBLST_END, },
803     .max_rit =  Hz(9999),
804     .max_xit =  Hz(9999),
805     .max_ifshift =  Hz(0),
806     .agc_level_count = 3,
807     .agc_levels = { RIG_AGC_FAST, RIG_AGC_MEDIUM, RIG_AGC_SLOW },
808     .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE | RIG_TARGETABLE_SPECTRUM,
809     .vfo_ops =  IC9700_VFO_OPS,
810     .scan_ops =  IC9700_SCAN_OPS,
811     .transceive =  RIG_TRN_RIG,
812     .bank_qty =   3,
813     .chan_desc_sz =  0,
814 
815     .chan_list =  {
816         {   1,  99, RIG_MTYPE_MEM  },
817         RIG_CHAN_END,
818     },
819 
820     // Hopefully any future changes in bandplans can be fixed with firmware updates
821     // So we use the global REGION2 macros in here
822     .rx_range_list1 =   { // USA Version -- United States
823         {MHz(144), MHz(148), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "USA"},
824         {MHz(430), MHz(450), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "USA"},
825         {MHz(1240), MHz(1300), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "USA"},
826         RIG_FRNG_END,
827     },
828     .tx_range_list1 =  {
829         {MHz(144), MHz(148), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(100), IC9700_VFOS, RIG_ANT_CURR, "USA"},
830         {MHz(430), MHz(450), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(75), IC9700_VFOS, RIG_ANT_CURR, "USA"},
831         {MHz(1240), MHz(1300), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.1), W(10), IC9700_VFOS, RIG_ANT_CURR, "USA"},
832         {MHz(144), MHz(148), RIG_MODE_AM, W(0.125), W(25), IC9700_VFOS, RIG_ANT_CURR, "USA"},
833         {MHz(430), MHz(450), RIG_MODE_AM, W(0.125), W(18.75), IC9700_VFOS, RIG_ANT_CURR, "USA"},
834         {MHz(1240), MHz(1300), RIG_MODE_AM, W(0.025), W(2.5), IC9700_VFOS, RIG_ANT_CURR, "USA"},
835         RIG_FRNG_END,
836     },
837 
838     .rx_range_list2 =   { // EUR Version -- Europe
839         {MHz(144), MHz(146), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "EUR"},
840         {MHz(430), MHz(440), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "EUR"},
841         {MHz(1240), MHz(1300), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "EUR"},
842         RIG_FRNG_END,
843     },
844     .tx_range_list2 =   {
845         {MHz(144), MHz(146), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(100), IC9700_VFOS, RIG_ANT_CURR, "EUR"},
846         {MHz(430), MHz(440), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(75), IC9700_VFOS, RIG_ANT_CURR, "EUR"},
847         {MHz(1240), MHz(1300), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.1), W(10), IC9700_VFOS, RIG_ANT_CURR, "EUR"},
848         {MHz(144), MHz(146), RIG_MODE_AM, W(0.125), W(25), IC9700_VFOS, RIG_ANT_CURR, "EUR"},
849         {MHz(430), MHz(440), RIG_MODE_AM, W(0.125), W(18.75), IC9700_VFOS, RIG_ANT_CURR, "EUR"},
850         {MHz(1240), MHz(1300), RIG_MODE_AM, W(0.025), W(2.5), IC9700_VFOS, RIG_ANT_CURR, "EUR"},
851         RIG_FRNG_END,
852     },
853 
854     .rx_range_list3 =   { // ITR Version -- Italy
855         {MHz(144), MHz(146), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "ITR"},
856         {MHz(430), MHz(434), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "ITR"},
857         {MHz(435), MHz(438), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "ITR"},
858         {MHz(1240), MHz(1245), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "ITR"},
859         {MHz(1270), MHz(1298), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "ITR"},
860         RIG_FRNG_END,
861     },
862     .tx_range_list3 =  {
863         {MHz(144), MHz(146), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(100), IC9700_VFOS, RIG_ANT_CURR, "ITR"},
864         {MHz(430), MHz(434), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(75), IC9700_VFOS, RIG_ANT_CURR, "ITR"},
865         {MHz(435), MHz(438), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(75), IC9700_VFOS, RIG_ANT_CURR, "ITR"},
866         {MHz(1240), MHz(1245), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.1), W(10), IC9700_VFOS, RIG_ANT_CURR, "ITR"},
867         {MHz(1270), MHz(1298), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.1), W(10), IC9700_VFOS, RIG_ANT_CURR, "ITR"},
868         {MHz(144), MHz(146), RIG_MODE_AM, W(0.125), W(25), IC9700_VFOS, RIG_ANT_CURR, "ITR"},
869         {MHz(430), MHz(434), RIG_MODE_AM, W(0.125), W(18.75), IC9700_VFOS, RIG_ANT_CURR, "ITR"},
870         {MHz(435), MHz(438), RIG_MODE_AM, W(0.125), W(18.75), IC9700_VFOS, RIG_ANT_CURR, "ITR"},
871         {MHz(1240), MHz(1245), RIG_MODE_AM, W(0.025), W(2.5), IC9700_VFOS, RIG_ANT_CURR, "ITR"},
872         {MHz(1270), MHz(1298), RIG_MODE_AM, W(0.025), W(2.5), IC9700_VFOS, RIG_ANT_CURR, "ITR"},
873         RIG_FRNG_END,
874     },
875 
876     .rx_range_list4 =   { // TPE Version -- Taiwan ??
877         {MHz(144), MHz(146), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "TPE"},
878         {MHz(430), MHz(432), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "TPE"},
879         {MHz(1260), MHz(1265), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "TPE"},
880         RIG_FRNG_END,
881     },
882     .tx_range_list4 =  {
883         {MHz(144), MHz(146), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(100), IC9700_VFOS, RIG_ANT_CURR, "TPE"},
884         {MHz(430), MHz(432), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(75), IC9700_VFOS, RIG_ANT_CURR, "TPE"},
885         {MHz(1260), MHz(1265), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.1), W(10), IC9700_VFOS, RIG_ANT_CURR, "TPE"},
886         {MHz(144), MHz(146), RIG_MODE_AM, W(0.125), W(25), IC9700_VFOS, RIG_ANT_CURR, "TPE"},
887         {MHz(430), MHz(432), RIG_MODE_AM, W(0.125), W(18.75), IC9700_VFOS, RIG_ANT_CURR, "TPE"},
888         {MHz(1260), MHz(1265), RIG_MODE_AM, W(0.025), W(2.5), IC9700_VFOS, RIG_ANT_CURR, "TPE"},
889         RIG_FRNG_END,
890     },
891 
892     .rx_range_list5 =   { // KOR Version -- Republic of Korea
893         {MHz(144), MHz(146), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "KOR"},
894         {MHz(430), MHz(440), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "KOR"},
895         {MHz(1260), MHz(1300), IC9700_ALL_RX_MODES, -1, -1, IC9700_VFOS, RIG_ANT_CURR, "KOR"},
896         RIG_FRNG_END,
897     },
898     .tx_range_list5 =  {
899         {MHz(144), MHz(146), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(100), IC9700_VFOS, RIG_ANT_CURR, "KOR"},
900         {MHz(430), MHz(440), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.5), W(75), IC9700_VFOS, RIG_ANT_CURR, "KOR"},
901         {MHz(1260), MHz(1300), IC9700_ALL_TX_MODES ^ RIG_MODE_AM, W(0.1), W(10), IC9700_VFOS, RIG_ANT_CURR, "KOR"},
902         {MHz(144), MHz(146), RIG_MODE_AM, W(0.125), W(25), IC9700_VFOS, RIG_ANT_CURR, "KOR"},
903         {MHz(430), MHz(440), RIG_MODE_AM, W(0.125), W(18.75), IC9700_VFOS, RIG_ANT_CURR, "KOR"},
904         {MHz(1260), MHz(1300), RIG_MODE_AM, W(0.025), W(2.5), IC9700_VFOS, RIG_ANT_CURR, "KOR"},
905         RIG_FRNG_END,
906     },
907 
908     .tuning_steps = {
909         {IC9700_ALL_RX_MODES, Hz(1)},
910         {IC9700_ALL_RX_MODES, Hz(10)},
911         {IC9700_ALL_RX_MODES, Hz(100)},
912         {IC9700_ALL_RX_MODES, Hz(500)},
913         {IC9700_ALL_RX_MODES, kHz(1)},
914         {IC9700_ALL_RX_MODES, kHz(5)},
915         {IC9700_ALL_RX_MODES, kHz(6.25)},
916         {IC9700_ALL_RX_MODES, kHz(10)},
917         {IC9700_ALL_RX_MODES, kHz(12.5)},
918         {IC9700_ALL_RX_MODES, kHz(20)},
919         {IC9700_ALL_RX_MODES, kHz(25)},
920         {IC9700_ALL_RX_MODES, kHz(50)},
921         {IC9700_ALL_RX_MODES, kHz(100)},
922         RIG_TS_END,
923     },
924 
925     /* mode/filter list, remember: order matters! But duplication may speed up search.  Put the most commonly used modes first!  Remember these are defaults, with dsp rigs you can change them to anything you want except FM and WFM which are fixed */
926     .filters =  {
927         {RIG_MODE_SSB, kHz(2.4)},
928         {RIG_MODE_SSB, kHz(1.8)},
929         {RIG_MODE_SSB, kHz(3)},
930         {RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(500)},
931         {RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(250)},
932         {RIG_MODE_CW | RIG_MODE_CWR, kHz(1.2)},
933         {RIG_MODE_RTTY | RIG_MODE_RTTYR, kHz(2.4)},
934         {RIG_MODE_AM | RIG_MODE_PKTAM, kHz(6)},
935         {RIG_MODE_AM | RIG_MODE_PKTAM, kHz(3)},
936         {RIG_MODE_AM | RIG_MODE_PKTAM, kHz(9)},
937         {RIG_MODE_FM | RIG_MODE_PKTFM, kHz(15)},
938         {RIG_MODE_FM | RIG_MODE_PKTFM, kHz(7)},
939         {RIG_MODE_FM | RIG_MODE_PKTFM, kHz(10)},
940         RIG_FLT_END,
941     },
942 
943     .str_cal = IC9700_STR_CAL,
944     .swr_cal = IC9700_SWR_CAL,
945     .alc_cal = IC9700_ALC_CAL,
946     .rfpower_meter_cal = IC9700_RFPOWER_METER_CAL,
947     .comp_meter_cal = IC9700_COMP_METER_CAL,
948     .vd_meter_cal = IC9700_VD_METER_CAL,
949     .id_meter_cal = IC9700_ID_METER_CAL,
950 
951     .spectrum_scopes = {
952         {
953             .id = 0,
954             .name = "Main",
955         },
956         {
957             .id = 1,
958             .name = "Sub",
959         },
960         {
961             .id = -1,
962             .name = NULL,
963         },
964     },
965     .spectrum_modes = {
966         RIG_SPECTRUM_MODE_CENTER,
967         RIG_SPECTRUM_MODE_FIXED,
968         RIG_SPECTRUM_MODE_CENTER_SCROLL,
969         RIG_SPECTRUM_MODE_FIXED_SCROLL,
970         RIG_SPECTRUM_MODE_NONE,
971     },
972     .spectrum_spans = {
973         5000,
974         10000,
975         20000,
976         50000,
977         100000,
978         200000,
979         500000,
980         1000000,
981         0,
982     },
983     .spectrum_avg_modes = {
984         {
985             .id = 0,
986             .name = "OFF",
987         },
988         {
989             .id = 1,
990             .name = "2",
991         },
992         {
993             .id = 2,
994             .name = "3",
995         },
996         {
997             .id = 3,
998             .name = "4",
999         },
1000     },
1001 
1002     .cfgparams =  icom_cfg_params,
1003     .set_conf =  icom_set_conf,
1004     .get_conf =  icom_get_conf,
1005 
1006     .priv = (void *)& IC9700_priv_caps,
1007     .rig_init =   icom_init,
1008     .rig_cleanup =   icom_cleanup,
1009     .rig_open =  icom_rig_open,
1010     .rig_close =  icom_rig_close,
1011 
1012     .set_freq =  icom_set_freq,
1013     .get_freq =  icom_get_freq,
1014     .set_mode =  icom_set_mode_with_data,
1015     .get_mode =  icom_get_mode_with_data,
1016     .set_vfo =  icom_set_vfo,
1017     .set_ant =  NULL,
1018     .get_ant =  NULL,
1019 
1020     .set_rit =  icom_set_rit_new,
1021     .get_rit =  icom_get_rit_new,
1022 
1023     .decode_event =  icom_decode_event,
1024     .set_level =  icom_set_level,
1025     .get_level =  icom_get_level,
1026     .set_ext_level =  icom_set_ext_level,
1027     .get_ext_level =  icom_get_ext_level,
1028     .set_func =  icom_set_func,
1029     .get_func =  icom_get_func,
1030     .set_parm =  icom_set_parm,
1031     .get_parm =  icom_get_parm,
1032     .set_mem =  icom_set_mem,
1033     .vfo_op =  icom_vfo_op,
1034     .scan =  icom_scan,
1035     .set_ptt =  icom_set_ptt,
1036     .get_ptt =  icom_get_ptt,
1037     .get_dcd =  icom_get_dcd,
1038     .set_ts =  icom_set_ts,
1039     .get_ts =  icom_get_ts,
1040     .set_rptr_shift =  icom_set_rptr_shift,
1041     .get_rptr_shift =  icom_get_rptr_shift,
1042     .set_rptr_offs =  icom_set_rptr_offs,
1043     .get_rptr_offs =  icom_get_rptr_offs,
1044     .set_ctcss_tone =  icom_set_ctcss_tone,
1045     .get_ctcss_tone =  icom_get_ctcss_tone,
1046     .set_ctcss_sql =  icom_set_ctcss_sql,
1047     .get_ctcss_sql =  icom_get_ctcss_sql,
1048     .set_split_freq =  icom_set_split_freq,
1049     .get_split_freq =  icom_get_split_freq,
1050     .set_split_mode =  icom_set_split_mode,
1051     .get_split_mode =  icom_get_split_mode,
1052     .set_split_vfo =  icom_set_split_vfo,
1053     .get_split_vfo =  icom_get_split_vfo,
1054     .set_powerstat = icom_set_powerstat,
1055     .power2mW = icom_power2mW,
1056     .mW2power = icom_mW2power,
1057     .send_morse = icom_send_morse,
1058     .stop_morse = icom_stop_morse,
1059     .wait_morse = rig_wait_morse,
1060     .send_voice_mem = icom_send_voice_mem
1061 };
1062 
1063 const struct rig_caps ic705_caps =
1064 {
1065     RIG_MODEL(RIG_MODEL_IC705),
1066     .model_name = "IC-705",
1067     .mfg_name =  "Icom",
1068     .version =  BACKEND_VER ".2",
1069     .copyright =  "LGPL",
1070     .status =  RIG_STATUS_STABLE,
1071     .rig_type =  RIG_TYPE_TRANSCEIVER,
1072     .ptt_type =  RIG_PTT_RIG,
1073     .dcd_type =  RIG_DCD_RIG,
1074     .port_type =  RIG_PORT_SERIAL,
1075     .serial_rate_min =  4800,
1076     .serial_rate_max =  19200,
1077     .serial_data_bits =  8,
1078     .serial_stop_bits =  1,
1079     .serial_parity =  RIG_PARITY_NONE,
1080     .serial_handshake =  RIG_HANDSHAKE_NONE,
1081     .write_delay =  0,
1082     .post_write_delay =  0,
1083     .timeout =  1000,
1084     .retry =  3,
1085     .has_get_func =  IC7300_FUNCS,
1086     .has_set_func =  IC7300_FUNCS,
1087     .has_get_level =  IC705_LEVELS,
1088     .has_set_level =  RIG_LEVEL_SET(IC705_LEVELS),
1089     .has_get_parm =  IC7300_PARMS,
1090     .has_set_parm =  RIG_PARM_SET(IC7300_PARMS),
1091     .level_gran = {
1092         [LVL_RAWSTR] = {.min = {.i = 0}, .max = {.i = 255}},
1093         [LVL_VOXDELAY] = {.min = {.i = 0}, .max = {.i = 20}, .step = {.i = 1}},
1094         [LVL_KEYSPD] = {.min = {.i = 6}, .max = {.i = 48}, .step = {.i = 1}},
1095         [LVL_CWPITCH] = {.min = {.i = 300}, .max = {.i = 900}, .step = {.i = 1}},
1096         [LVL_SPECTRUM_SPEED] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}},
1097         [LVL_SPECTRUM_REF] = {.min = {.f = -20.0f}, .max = {.f = 20.0f}, .step = {.f = 0.5f}},
1098         [LVL_SPECTRUM_AVG] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}},
1099     },
1100     .parm_gran =  {},
1101     .ext_tokens = ic705_ext_tokens,
1102     .extlevels = icom_ext_levels,
1103     .ctcss_list =  full_ctcss_list,
1104     .dcs_list =  NULL,
1105     .preamp =   { 1, 2, RIG_DBLST_END, },
1106     .attenuator =   { 20, RIG_DBLST_END, },
1107     .max_rit =  Hz(9999),
1108     .max_xit =  Hz(9999),
1109     .max_ifshift =  Hz(0),
1110     .agc_level_count = 3,
1111     .agc_levels = { RIG_AGC_FAST, RIG_AGC_MEDIUM, RIG_AGC_SLOW },
1112     .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE,
1113     .vfo_ops =  IC7300_VFO_OPS,
1114     .scan_ops =  IC7300_SCAN_OPS,
1115     .transceive =  RIG_TRN_RIG,
1116     .bank_qty =   5,
1117     .chan_desc_sz =  0,
1118 
1119     .chan_list =  {
1120         {   1,  99, RIG_MTYPE_MEM  },
1121         RIG_CHAN_END,
1122     },
1123 
1124     .rx_range_list1 =   {
1125         {kHz(30), MHz(199.999999), IC705_ALL_RX_MODES, -1, -1, IC7300_VFOS, RIG_ANT_1, "USA"},
1126         {MHz(400), MHz(470), IC705_ALL_RX_MODES, -1, -1, IC7300_VFOS, RIG_ANT_1, "USA"},
1127         RIG_FRNG_END,
1128     },
1129     .tx_range_list1 =   {
1130         { kHz(1800), MHz(1.999999), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1131         { MHz(3.5), MHz(3.999999), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1132         { MHz(5.255), MHz(5.405), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1133         { MHz(7.0), MHz(7.3), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1134         { MHz(10.1), MHz(10.15), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1135         { MHz(14.0), MHz(14.35), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1136         { MHz(18.068), MHz(18.168), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1137         { MHz(21.00), MHz(21.45), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1138         { MHz(24.89), MHz(24.99), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1139         { MHz(28.00), MHz(29.70), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1140         { MHz(50.00), MHz(54.00), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1141         { MHz(144.00), MHz(148.00), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1142         { MHz(430.00), MHz(450.00), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "USA" },
1143         RIG_FRNG_END,
1144     },
1145 
1146     .rx_range_list2 =   {
1147         {kHz(30), MHz(199.999999), IC705_ALL_RX_MODES, -1, -1, IC7300_VFOS, RIG_ANT_1, "EUR"},
1148         {MHz(400), MHz(470), IC705_ALL_RX_MODES, -1, -1, IC7300_VFOS, RIG_ANT_1, "EUR"},
1149         RIG_FRNG_END,
1150     },
1151     .tx_range_list2 =   {
1152         { kHz(1810), MHz(1.999999), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1153         { MHz(3.5), MHz(3.8), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1154         { MHz(7.0), MHz(7.2), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1155         { MHz(10.1), MHz(10.15), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1156         { MHz(14.0), MHz(14.35), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1157         { MHz(18.068), MHz(18.168), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1158         { MHz(21.00), MHz(21.45), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1159         { MHz(24.89), MHz(24.99), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1160         { MHz(28.00), MHz(29.70), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1161         { MHz(50.00), MHz(52.00), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1162         { MHz(144.00), MHz(146.00), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1163         { MHz(430.00), MHz(440.00), IC705_ALL_TX_MODES, W(0.1), W(10), IC7300_VFOS, RIG_ANT_1, "EUR" },
1164         RIG_FRNG_END,
1165     },
1166 
1167     .tuning_steps = {
1168         {IC7300_ALL_RX_MODES, Hz(100)},
1169         {IC7300_ALL_RX_MODES, kHz(.5)},
1170         {IC7300_ALL_RX_MODES, kHz(1)},
1171         {IC7300_ALL_RX_MODES, kHz(5)},
1172         {IC7300_ALL_RX_MODES, kHz(6.25)},
1173         {IC7300_ALL_RX_MODES, kHz(8.33)},
1174         {IC7300_ALL_RX_MODES, kHz(9)},
1175         {IC7300_ALL_RX_MODES, kHz(10)},
1176         {IC7300_ALL_RX_MODES, kHz(12.5)},
1177         {IC7300_ALL_RX_MODES, kHz(20)},
1178         {IC7300_ALL_RX_MODES, kHz(25)},
1179         {IC7300_ALL_RX_MODES, kHz(50)},
1180         {IC7300_ALL_RX_MODES, kHz(100)},
1181         RIG_TS_END,
1182     },
1183 
1184     /* mode/filter list, remember: order matters! But duplication may speed up search.  Put the most commonly used modes first!  Remember these are defaults, with dsp rigs you can change them to anything you want except FM and WFM which are fixed */
1185     .filters =  {
1186         {RIG_MODE_SSB | RIG_MODE_PKTLSB | RIG_MODE_PKTUSB, kHz(2.4)},
1187         {RIG_MODE_SSB | RIG_MODE_PKTLSB | RIG_MODE_PKTUSB, kHz(1.8)},
1188         {RIG_MODE_SSB | RIG_MODE_PKTLSB | RIG_MODE_PKTUSB, kHz(3.0)},
1189         {RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(500)},
1190         {RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(250)},
1191         {RIG_MODE_CW | RIG_MODE_CWR, kHz(1.2)},
1192         {RIG_MODE_RTTY | RIG_MODE_RTTYR, kHz(2.4)},
1193         {RIG_MODE_AM | RIG_MODE_PKTAM, kHz(6)},
1194         {RIG_MODE_AM | RIG_MODE_PKTAM, kHz(3)},
1195         {RIG_MODE_AM | RIG_MODE_PKTAM, kHz(9)},
1196         {RIG_MODE_FM | RIG_MODE_PKTFM, kHz(10)},
1197         {RIG_MODE_FM | RIG_MODE_PKTFM, kHz(7)},
1198         {RIG_MODE_FM | RIG_MODE_PKTFM, kHz(15)},
1199         RIG_FLT_END,
1200     },
1201 
1202     .str_cal = IC7300_STR_CAL,
1203     .swr_cal = IC7300_SWR_CAL,
1204     .alc_cal = IC7300_ALC_CAL,
1205     .rfpower_meter_cal = IC7300_RFPOWER_METER_CAL,
1206     .comp_meter_cal = IC7300_COMP_METER_CAL,
1207     .vd_meter_cal = IC7300_VD_METER_CAL,
1208     .id_meter_cal = IC7300_ID_METER_CAL,
1209 
1210     .spectrum_scopes = {
1211         {
1212             .id = 0,
1213             .name = "Main",
1214         },
1215         {
1216             .id = -1,
1217             .name = NULL,
1218         },
1219     },
1220     .spectrum_modes = {
1221         RIG_SPECTRUM_MODE_CENTER,
1222         RIG_SPECTRUM_MODE_FIXED,
1223         RIG_SPECTRUM_MODE_CENTER_SCROLL,
1224         RIG_SPECTRUM_MODE_FIXED_SCROLL,
1225         RIG_SPECTRUM_MODE_NONE,
1226     },
1227     .spectrum_spans = {
1228         5000,
1229         10000,
1230         20000,
1231         50000,
1232         100000,
1233         200000,
1234         500000,
1235         1000000,
1236         0,
1237     },
1238     .spectrum_avg_modes = {
1239         {
1240             .id = 0,
1241             .name = "OFF",
1242         },
1243         {
1244             .id = 1,
1245             .name = "2",
1246         },
1247         {
1248             .id = 2,
1249             .name = "3",
1250         },
1251         {
1252             .id = 3,
1253             .name = "4",
1254         },
1255     },
1256 
1257     .cfgparams =  icom_cfg_params,
1258     .set_conf =  icom_set_conf,
1259     .get_conf =  icom_get_conf,
1260 
1261     .priv = (void *)& IC705_priv_caps,
1262     .rig_init =   icom_init,
1263     .rig_cleanup =   icom_cleanup,
1264     .rig_open =  icom_rig_open,
1265     .rig_close =  icom_rig_close,
1266 
1267     .set_freq =  icom_set_freq,
1268     .get_freq =  icom_get_freq,
1269     .set_mode =  icom_set_mode_with_data,
1270     .get_mode =  icom_get_mode_with_data,
1271     .set_vfo =  icom_set_vfo,
1272     .set_ant =  NULL,
1273     .get_ant =  NULL,
1274 
1275     .set_rit =  icom_set_rit_new,
1276     .get_rit =  icom_get_rit_new,
1277     .get_xit =  icom_get_rit_new,
1278     .set_xit =  icom_set_xit_new,
1279 
1280     .decode_event =  icom_decode_event,
1281     .set_level =  icom_set_level,
1282     .get_level =  icom_get_level,
1283     .set_ext_level =  icom_set_ext_level,
1284     .get_ext_level =  icom_get_ext_level,
1285     .set_func =  icom_set_func,
1286     .get_func =  icom_get_func,
1287     .set_parm =  icom_set_parm,
1288     .get_parm =  icom_get_parm,
1289     .set_mem =  icom_set_mem,
1290     .vfo_op =  icom_vfo_op,
1291     .scan =  icom_scan,
1292     .set_ptt =  icom_set_ptt,
1293     .get_ptt =  icom_get_ptt,
1294     .get_dcd =  icom_get_dcd,
1295     .set_ts =  icom_set_ts,
1296     .get_ts =  icom_get_ts,
1297     .set_rptr_shift =  icom_set_rptr_shift,
1298     .get_rptr_shift =  icom_get_rptr_shift,
1299     .set_rptr_offs =  icom_set_rptr_offs,
1300     .get_rptr_offs =  icom_get_rptr_offs,
1301     .set_ctcss_tone =  icom_set_ctcss_tone,
1302     .get_ctcss_tone =  icom_get_ctcss_tone,
1303     .set_ctcss_sql =  icom_set_ctcss_sql,
1304     .get_ctcss_sql =  icom_get_ctcss_sql,
1305     .set_split_freq =  icom_set_split_freq,
1306     .get_split_freq =  icom_get_split_freq,
1307     .set_split_mode =  icom_set_split_mode,
1308     .get_split_mode =  icom_get_split_mode,
1309     .set_split_vfo =  icom_set_split_vfo,
1310     .get_split_vfo =  icom_get_split_vfo,
1311     .set_powerstat = icom_set_powerstat,
1312     .get_powerstat = icom_get_powerstat,
1313     .power2mW = icom_power2mW,
1314     .mW2power = icom_mW2power,
1315     .send_morse = icom_send_morse,
1316     .stop_morse = icom_stop_morse,
1317     .wait_morse = rig_wait_morse,
1318     .send_voice_mem = icom_send_voice_mem
1319 };
1320 
ic7300_set_parm(RIG * rig,setting_t parm,value_t val)1321 int ic7300_set_parm(RIG *rig, setting_t parm, value_t val)
1322 {
1323     rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
1324 
1325     switch (parm)
1326     {
1327         unsigned char prmbuf[MAXFRAMELEN];
1328 
1329     case RIG_PARM_ANN:
1330     {
1331         int ann_mode = -1;
1332         int ann_lang = -1;
1333 
1334         switch (val.i)
1335         {
1336         case RIG_ANN_OFF:
1337             ann_mode = S_ANN_ALL;
1338             break;
1339 
1340         case RIG_ANN_FREQ:
1341             ann_mode = S_ANN_FREQ;
1342             break;
1343 
1344         case RIG_ANN_RXMODE:
1345             ann_mode = S_ANN_MODE;
1346             break;
1347 
1348         case RIG_ANN_ENG:
1349         case RIG_ANN_JAP:
1350             ann_lang = (val.i == RIG_ANN_ENG) ? 0 : 1;
1351             break;
1352 
1353         default:
1354             rig_debug(RIG_DEBUG_ERR, "Unsupported RIG_PARM_ANN %d\n", val.i);
1355             return -RIG_EINVAL;
1356         }
1357 
1358         if (ann_mode >= 0)
1359         {
1360             return icom_set_raw(rig, C_CTL_ANN, ann_mode, 0, NULL, 0, 0);
1361         }
1362         else if (ann_lang >= 0)
1363         {
1364             prmbuf[0] = 0x1a;
1365             prmbuf[1] = 0x05;
1366 
1367             switch (rig->caps->rig_model)
1368             {
1369             case RIG_MODEL_IC7300:
1370                 prmbuf[2] = 0x00;
1371                 prmbuf[3] = 0x39;
1372                 break;
1373 
1374             case RIG_MODEL_IC9700:
1375                 prmbuf[2] = 0x01;
1376                 prmbuf[3] = 0x77;
1377                 break;
1378 
1379             case RIG_MODEL_IC705:
1380                 prmbuf[2] = 0x00;
1381                 prmbuf[3] = 0x53;
1382                 break;
1383 
1384             default:
1385                 return -RIG_ENIMPL;
1386             }
1387 
1388             prmbuf[4] = ann_lang;
1389             return icom_set_raw(rig, C_CTL_MEM, S_MEM_MODE_SLCT, 5, prmbuf, 0, 0);
1390         }
1391 
1392         rig_debug(RIG_DEBUG_ERR, "Unsupported RIG_PARM_ANN %d\n", val.i);
1393         return -RIG_EINVAL;
1394     }
1395 
1396     default:
1397         return icom_set_parm(rig, parm, val);
1398     }
1399 }
1400 
ic7300_get_parm(RIG * rig,setting_t parm,value_t * val)1401 int ic7300_get_parm(RIG *rig, setting_t parm, value_t *val)
1402 {
1403     unsigned char prmbuf[MAXFRAMELEN], resbuf[MAXFRAMELEN];
1404     int prm_len, res_len;
1405     int prm_cn, prm_sc;
1406     int icom_val = 0;
1407     int cmdhead;
1408     int retval;
1409 
1410     rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
1411 
1412     switch (parm)
1413     {
1414     case RIG_PARM_ANN:
1415         return -RIG_ENIMPL; // How can we implement this?
1416 
1417     default:
1418         rig_debug(RIG_DEBUG_TRACE, "%s: using icom routine for PARM=%s\n", __func__,
1419                   rig_strparm(parm));
1420         return icom_get_parm(rig, parm, val);
1421     }
1422 
1423     retval = icom_transaction(rig, prm_cn, prm_sc, prmbuf, prm_len, resbuf,
1424                               &res_len);
1425 
1426     if (retval != RIG_OK)
1427     {
1428         return retval;
1429     }
1430 
1431     cmdhead = 3;
1432     res_len -= cmdhead;
1433 
1434     if (resbuf[0] != ACK && resbuf[0] != prm_cn)
1435     {
1436         rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d\n", __func__, resbuf[0],
1437                   res_len);
1438         return -RIG_ERJCTED;
1439     }
1440 
1441     switch (parm)
1442     {
1443 
1444     case RIG_PARM_ANN:
1445         rig_debug(RIG_DEBUG_WARN, "%s: not implemented\n", __func__);
1446         return -RIG_ENIMPL;
1447 
1448     default:
1449         return icom_get_parm(rig, parm, val);
1450     }
1451 
1452 
1453     rig_debug(RIG_DEBUG_TRACE, "%s: %d %d %d %f\n", __func__, res_len, icom_val,
1454               val->i, val->f);
1455 
1456     return RIG_OK;
1457 }
1458