1 /*
2 * Hamlib Kenwood backend - TS-811 description
3 * Copyright (c) 2000-2004 by Stephane Fillod
4 *
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 */
21
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25
26 #include <stdlib.h>
27
28 #include <hamlib/rig.h>
29 #include "kenwood.h"
30
31
32 #define TS811_ALL_MODES (RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM)
33
34
35 #define TS811_LEVEL_ALL (RIG_LEVEL_STRENGTH)
36
37 #define TS811_VFO (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM)
38
39 #define TS811_VFO_OP (RIG_OP_UP|RIG_OP_DOWN)
40 #define TS811_SCAN_OP (RIG_SCAN_VFO)
41
42 static struct kenwood_priv_caps ts811_priv_caps =
43 {
44 .cmdtrm = EOM_KEN,
45 };
46
47 /*
48 * vfo defines
49 */
50 #define VFO_A '0'
51 #define VFO_B '1'
52 #define VFO_MEM '2'
53
54
55 /* Note: The 140/680/711/811 need this to set the VFO on the radio */
56 static int
ts811_set_vfo(RIG * rig,vfo_t vfo)57 ts811_set_vfo(RIG *rig, vfo_t vfo)
58 {
59 char cmdbuf[16];
60 char vfo_function;
61
62 switch (vfo)
63 {
64 case RIG_VFO_VFO:
65 case RIG_VFO_A: vfo_function = VFO_A; break;
66
67 case RIG_VFO_B: vfo_function = VFO_B; break;
68
69 case RIG_VFO_MEM: vfo_function = VFO_MEM; break;
70
71 case RIG_VFO_CURR: return RIG_OK;
72
73 default:
74 rig_debug(RIG_DEBUG_ERR, "%s: unsupported VFO %s\n",
75 __func__, rig_strvfo(vfo));
76 return -RIG_EINVAL;
77 }
78
79 sprintf(cmdbuf, "FN%c", vfo_function);
80 return kenwood_transaction(rig, cmdbuf, NULL, 0);
81 }
82
83 /*
84 * ts811 rig capabilities.
85 */
86 const struct rig_caps ts811_caps =
87 {
88 RIG_MODEL(RIG_MODEL_TS811),
89 .model_name = "TS-811",
90 .mfg_name = "Kenwood",
91 .version = BACKEND_VER ".0",
92 .copyright = "LGPL",
93 .status = RIG_STATUS_UNTESTED,
94 .rig_type = RIG_TYPE_TRANSCEIVER,
95 .ptt_type = RIG_PTT_RIG,
96 .dcd_type = RIG_DCD_RIG,
97 .port_type = RIG_PORT_SERIAL,
98 .serial_rate_min = 4800,
99 .serial_rate_max = 4800,
100 .serial_data_bits = 8,
101 .serial_stop_bits = 2,
102 .serial_parity = RIG_PARITY_NONE,
103 .serial_handshake = RIG_HANDSHAKE_HARDWARE,
104 .write_delay = 0,
105 .post_write_delay = 0,
106 .timeout = 1000,
107 .retry = 10,
108
109 .has_get_func = RIG_FUNC_LOCK,
110 .has_set_func = RIG_FUNC_LOCK,
111 .has_get_level = TS811_LEVEL_ALL,
112 .has_set_level = RIG_LEVEL_SET(TS811_LEVEL_ALL),
113 .has_get_parm = RIG_PARM_NONE,
114 .has_set_parm = RIG_PARM_NONE,
115 .level_gran = {}, /* FIXME: granularity */
116 .parm_gran = {},
117 .ctcss_list = kenwood38_ctcss_list,
118 .preamp = { RIG_DBLST_END, },
119 .attenuator = { RIG_DBLST_END, },
120 .max_rit = kHz(9.9),
121 .max_xit = 0,
122 .max_ifshift = 0,
123 .targetable_vfo = RIG_TARGETABLE_FREQ,
124 .transceive = RIG_TRN_RIG,
125 .bank_qty = 0,
126 .chan_desc_sz = 0,
127
128 /* FIXME: split memories, call channel, etc. */
129 .chan_list = {
130 { 1, 59, RIG_MTYPE_MEM },
131 RIG_CHAN_END,
132 },
133
134 .rx_range_list1 = {
135 {MHz(430), MHz(440), TS811_ALL_MODES, -1, -1, TS811_VFO},
136 RIG_FRNG_END,
137 }, /* rx range */
138 .tx_range_list1 = {
139 {MHz(430), MHz(440), TS811_ALL_MODES, W(5), W(25), TS811_VFO},
140 RIG_FRNG_END,
141 }, /* tx range */
142
143 .rx_range_list2 = {
144 {MHz(430), MHz(450), TS811_ALL_MODES, -1, -1, TS811_VFO},
145 RIG_FRNG_END,
146 }, /* rx range */
147 .tx_range_list2 = {
148 {MHz(430), MHz(450), TS811_ALL_MODES, W(5), W(25), TS811_VFO},
149 RIG_FRNG_END,
150 }, /* tx range */
151
152
153 .tuning_steps = {
154 {TS811_ALL_MODES, 50},
155 {TS811_ALL_MODES, 100},
156 {TS811_ALL_MODES, kHz(1)},
157 {TS811_ALL_MODES, kHz(5)},
158 {TS811_ALL_MODES, kHz(9)},
159 {TS811_ALL_MODES, kHz(10)},
160 {TS811_ALL_MODES, 12500},
161 {TS811_ALL_MODES, kHz(20)},
162 {TS811_ALL_MODES, kHz(25)},
163 {TS811_ALL_MODES, kHz(100)},
164 {TS811_ALL_MODES, MHz(1)},
165 {TS811_ALL_MODES, 0}, /* any tuning step */
166 RIG_TS_END,
167 },
168 /* mode/filter list, remember: order matters! */
169 .filters = {
170 {RIG_MODE_SSB | RIG_MODE_CW, kHz(2.2)},
171 {RIG_MODE_FM, kHz(12)},
172 RIG_FLT_END,
173 },
174 .priv = (void *)& ts811_priv_caps,
175
176 .rig_init = kenwood_init,
177 .rig_open = kenwood_open,
178 .rig_close = kenwood_close,
179 .rig_cleanup = kenwood_cleanup,
180 .set_freq = kenwood_set_freq,
181 .get_freq = kenwood_get_freq,
182 .set_rit = kenwood_set_rit,
183 .get_rit = kenwood_get_rit,
184 .set_mode = kenwood_set_mode,
185 .get_mode = kenwood_get_mode_if,
186 .set_vfo = ts811_set_vfo,
187 .get_vfo = kenwood_get_vfo_if,
188 .set_ptt = kenwood_set_ptt,
189 .set_func = kenwood_set_func,
190 .get_func = kenwood_get_func,
191 .vfo_op = kenwood_vfo_op,
192 .set_mem = kenwood_set_mem,
193 .get_mem = kenwood_get_mem_if,
194 .reset = kenwood_reset,
195 };
196
197 /*
198 * Function definitions below
199 */
200
201