2
* Kenwood TS450S driver
3
* originally based on Kenwood TS2000 driver
7
* Copyright 2009, Dave Freese, W1HKJ
15
static const char TS450Sname_[] = "TS-450S";
17
static const char *TS450Smodes_[] = {
18
"LSB", "USB", "CW", "FM", "AM", "FSK", "CW-R", "FSK-R", NULL};
19
static const char TS450S_mode_chr[] = { '1', '2', '3', '4', '5', '6', '7', '9' };
20
static const char TS450S_mode_type[] = { 'L', 'U', 'U', 'U', 'U', 'L', 'L', 'U' };
22
static const char *TS450S_widths[] = {
23
"NONE", "FM-W", "FM-N", "AM", "SSB", "CW", NULL};
24
static const char *TS450S_filters[] = {
25
"000", "002", "003", "005", "007", "009", NULL};
27
RIG_TS450S::RIG_TS450S() {
30
modes_ = TS450Smodes_;
31
_mode_type = TS450S_mode_type;
32
bandwidths_ = TS450S_widths;
33
comm_baudrate = BR4800;
44
modeB = modeA = def_mode = 1;
45
bwB = bwA = def_bw = 1;
46
freqB = freqA = def_freq = 14070000;
47
can_change_alt_vfo = true;
54
has_attenuator_control =
58
has_swr_control = false;
63
has_bandwidth_control =
64
has_ptt_control = true;
71
void RIG_TS450S::initialize()
73
cmd = "RM1;"; // select measurement '1' (swr)
77
long RIG_TS450S::get_vfoA ()
80
int ret = sendCommand(cmd);
81
showresp(WARN, ASC, "get vfo A", cmd, replystr);
82
if (ret < 14) return freqA;
84
size_t p = replystr.rfind("FA");
85
if (p == string::npos) return freqA;
88
for (size_t n = 2; n < 13; n++)
89
f = f*10 + replystr[p + n] - '0';
94
void RIG_TS450S::set_vfoA (long freq)
97
cmd = "FA00000000000;";
98
for (int i = 12; i > 1; i--) {
103
showresp(WARN, ASC, "set vfo A", cmd, replystr);
106
long RIG_TS450S::get_vfoB ()
109
int ret = sendCommand(cmd);
110
showresp(WARN, ASC, "get vfo B", cmd, replystr);
111
if (ret < 14) return freqB;
112
size_t p = replystr.rfind("FB");
113
if (p == string::npos) return freqB;
116
for (size_t n = 2; n < 13; n++)
117
f = f*10 + replystr[p + n] - '0';
122
void RIG_TS450S::set_vfoB (long freq)
125
cmd = "FB00000000000;";
126
for (int i = 12; i > 1; i--) {
131
showresp(WARN, ASC, "set vfoB", cmd, replystr);
134
// SM cmd 0 ... 100 (rig values 0 ... 15)
135
int RIG_TS450S::get_smeter()
138
int ret = sendCommand(cmd);
139
showresp(WARN, ASC, "get smeter", cmd, replystr);
140
if (ret < 7) return 0;
142
size_t p = replystr.rfind("SM");
143
if (p == string::npos) return 0;
146
int mtr = atoi(&replystr[p + 2]);
147
mtr = (mtr * 100) / 30;
151
// RM cmd 0 ... 100 (rig values 0 ... 8)
152
int RIG_TS450S::get_swr()
155
int ret = sendCommand(cmd);
156
showresp(WARN, ASC, "get swr", cmd, replystr);
157
if (ret < 8) return 0;
159
size_t p = replystr.rfind("RM");
160
if (p == string::npos) return 0;
163
int mtr = atoi(&replystr[p + 3]);
164
mtr = (mtr * 50) / 30;
169
// Tranceiver PTT on/off
170
void RIG_TS450S::set_PTT_control(int val)
172
if (val) cmd = "TX;";
177
void RIG_TS450S::set_modeA(int val)
181
cmd += TS450S_mode_chr[val];
184
showresp(WARN, ASC, "set mode A", cmd, replystr);
187
int RIG_TS450S::get_modeA()
190
int ret = sendCommand(cmd);
191
showresp(WARN, ASC, "info mode A", cmd, replystr);
192
if (ret < 38) return split;
193
size_t p = replystr.rfind("IF");
194
if (p == string::npos) return modeA;
195
modeA = replystr[p+29] - '1'; // 0 - 6, 8
196
if (modeA == 8) modeA = 7;
200
void RIG_TS450S::set_modeB(int val)
204
cmd += TS450S_mode_chr[val];
207
showresp(WARN, ASC, "set mode B", cmd, replystr);
210
int RIG_TS450S::get_modeB()
213
int ret = sendCommand(cmd);
214
showresp(WARN, ASC, "info mode B", cmd, replystr);
215
if (ret < 38) return split;
216
size_t p = replystr.rfind("IF");
217
if (p == string::npos) return modeA;
218
modeB = replystr[p+29] - '1'; // 0 - 6, 8
219
if (modeB == 8) modeB = 7;
223
int RIG_TS450S::get_modetype(int n)
225
return _mode_type[n];
228
void RIG_TS450S::set_bwA(int val)
232
cmd.append(TS450S_filters[val]).append(TS450S_filters[val]);
235
showresp(WARN, ASC, "set bw A", cmd, replystr);
238
int RIG_TS450S::get_bwA()
241
int ret = sendCommand(cmd);
242
showresp(WARN, ASC, "get bw A", cmd, replystr);
243
if (ret < 9) return bwA;
244
size_t p = replystr.rfind("FL");
245
if (p == string::npos) return bwA;
249
while (TS450S_filters[bw]) {
250
if (strcmp(&replystr[p + 5], TS450S_filters[bw]) == 0)
257
void RIG_TS450S::set_bwB(int val)
261
cmd.append(TS450S_filters[val]).append(TS450S_filters[val]);
264
showresp(WARN, ASC, "set bw b", cmd, replystr);
267
int RIG_TS450S::get_bwB()
270
int ret = sendCommand(cmd);
271
showresp(WARN, ASC, "get bw B", cmd, replystr);
272
if (ret < 9) return bwB;
273
size_t p = replystr.rfind("FL");
274
if (p == string::npos) return bwB;
278
while (TS450S_filters[bw]) {
279
if (strcmp(&replystr[p + 5], TS450S_filters[bw]) == 0)
286
int RIG_TS450S::def_bandwidth(int val)
288
if (val == 0 || val == 1)
290
else if (val == 2 || val == 6)
296
else if (val == 5 || val == 7)
301
void RIG_TS450S::selectA()
303
showresp(WARN, ASC, "select A", "", "");
306
showresp(WARN, ASC, "rx on A", cmd, replystr);
309
showresp(WARN, ASC, "tx on A", cmd, replystr);
312
void RIG_TS450S::selectB()
314
showresp(WARN, ASC, "select B", "", "");
317
showresp(WARN, ASC, "rx on B", cmd, replystr);
320
showresp(WARN, ASC, "tx on B", cmd, replystr);
323
bool RIG_TS450S::can_split()
328
void RIG_TS450S::set_split(bool val)
333
showresp(WARN, ASC, "rx on A", cmd, replystr);
336
showresp(WARN, ASC, "tx on B", cmd, replystr);
340
showresp(WARN, ASC, "rx on A", cmd, replystr);
343
showresp(WARN, ASC, "tx on A", cmd, replystr);
347
int RIG_TS450S::get_split()
350
int ret = sendCommand(cmd);
351
showresp(WARN, ASC, "info split", cmd, replystr);
352
if (ret < 38) return split;
353
size_t p = replystr.rfind("IF");
354
if (p == string::npos) return split;
355
split = replystr[p+32] ? true : false;