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