3
* originally based on Kenwood TS2000 driver
7
* Copyright 2009, Dave Freese, W1HKJ
15
static const char TS570name_[] = "TS-570";
17
static const char *TS570modes_[] = {
18
"LSB", "USB", "CW", "FM", "AM", "FSK", "CW-R", "FSK-R", NULL};
19
static const char TS570_mode_chr[] = { '1', '2', '3', '4', '5', '6', '7', '9' };
20
static const char TS570_mode_type[] = { 'L', 'U', 'U', 'U', 'U', 'L', 'L', 'U' };
22
static const char *TS570_SSBwidths[] = { // same for AM and FM
23
"NARR", "WIDE", NULL};
25
static const char *TS570_SSBbw[] = {
26
"FW0000;", "FW0001;", NULL};
28
static const char *TS570_CWwidths[] = {
29
"50", "100", "200", "300", "400", "600", "1000", "2000", NULL};
31
static const char *TS570_CWbw[] = {
32
"FW0050;", "FW0100;", "FW0200;", "FW0300;",
33
"FW0400;", "FW0600;", "FW1000;", "FW2000;", NULL};
35
static const char *TS570_FSKwidths[] = {
36
"250", "500", "1000", "1500", NULL};
38
static const char *TS570_FSKbw[] = {
39
"FW0250;", "FW0500;", "FW1000;", "FW1500;", NULL};
41
static GUI rig_widgets[]= {
42
{ (Fl_Widget *)btnVol, 2, 125, 50 },
43
{ (Fl_Widget *)sldrVOLUME, 54, 125, 156 },
44
{ (Fl_Widget *)sldrRFGAIN, 266, 145, 156 },
45
{ (Fl_Widget *)sldrPOWER, 54, 165, 368 },
46
{ (Fl_Widget *)btnIFsh, 214, 105, 50 },
47
{ (Fl_Widget *)sldrIFSHIFT, 266, 105, 156 },
48
{ (Fl_Widget *)sldrSQUELCH, 266, 125, 156 },
49
{ (Fl_Widget *)sldrMICGAIN, 54, 145, 156 },
50
{ (Fl_Widget *)NULL, 0, 0, 0 }
53
void RIG_TS570::initialize()
55
rig_widgets[0].W = btnVol;
56
rig_widgets[1].W = sldrVOLUME;
57
rig_widgets[2].W = sldrRFGAIN;
58
rig_widgets[3].W = sldrPOWER;
59
rig_widgets[4].W = btnIFsh;
60
rig_widgets[5].W = sldrIFSHIFT;
61
rig_widgets[6].W = sldrSQUELCH;
62
rig_widgets[7].W = sldrMICGAIN;
64
cmd = "FR0;"; sendCommand(cmd);
65
showresp(WARN, ASC, "Rx on A", cmd, replystr);
66
cmd = "AC001;"; sendCommand(cmd);
67
showresp(WARN, ASC, "Thru - tune ON", cmd, replystr);
70
is_TS570S = get_ts570id();
73
RIG_TS570::RIG_TS570() {
77
bandwidths_ = TS570_SSBwidths;
79
widgets = rig_widgets;
81
comm_baudrate = BR4800;
99
can_change_alt_vfo = true;
101
has_notch_control = false;
105
has_split = has_split_AB =
107
has_ifshift_control =
109
has_micgain_control =
113
has_attenuator_control =
116
has_bandwidth_control =
119
has_ptt_control = true;
126
bool RIG_TS570::get_ts570id()
129
int ret = sendCommand(cmd);
130
showresp(WARN, ASC, "Id", cmd, replystr);
131
if (ret < 6) return false;
132
size_t p = replystr.rfind("ID");
133
if (p == string::npos) return false;
134
if (replystr[p + 3] == '1' &&
135
replystr[p + 4] == '8') return true;
139
void RIG_TS570::selectA()
143
showresp(WARN, ASC, "select A", cmd, replystr);
146
void RIG_TS570::selectB()
150
showresp(WARN, ASC, "select B", cmd, replystr);
153
void RIG_TS570::set_split(bool val)
160
showresp(WARN, ASC, "Rx on B, Tx on A", cmd, replystr);
164
showresp(WARN, ASC, "Rx on B, Tx on B", cmd, replystr);
170
showresp(WARN, ASC, "Rx on A, Tx on B", cmd, replystr);
174
showresp(WARN, ASC, "Rx on A, Tx on A", cmd, replystr);
177
Fl::awake(highlight_vfo, (void *)0);
180
int RIG_TS570::get_split()
183
int ret = sendCommand(cmd);
184
showresp(INFO, ASC, "get info", cmd, replystr);
185
if (ret < 38) return split;
186
size_t p = replystr.rfind("IF");
187
if (p == string::npos) return split;
188
split = replystr[p+32] ? true : false;
192
long RIG_TS570::get_vfoA ()
195
int ret = sendCommand(cmd);
196
showresp(WARN, ASC, "get vfoA", cmd, replystr);
197
if (ret < 14) return A.freq;
198
size_t p = replystr.rfind("FA");
199
if (p == string::npos) return A.freq;
202
for (size_t n = 2; n < 13; n++)
203
f = f*10 + replystr[p + n] - '0';
208
void RIG_TS570::set_vfoA (long freq)
211
cmd = "FA00000000000;";
212
for (int i = 12; i > 1; i--) {
217
showresp(WARN, ASC, "set vfoA", cmd, replystr);
220
long RIG_TS570::get_vfoB ()
223
int ret = sendCommand(cmd);
224
showresp(WARN, ASC, "get vfoB", cmd, replystr);
225
if (ret < 14) return freqB;
226
size_t p = replystr.rfind("FB");
227
if (p == string::npos) return freqB;
230
for (size_t n = 2; n < 13; n++)
231
f = f*10 + replystr[p + n] - '0';
236
void RIG_TS570::set_vfoB (long freq)
239
cmd = "FB00000000000;";
240
for (int i = 12; i > 1; i--) {
245
showresp(WARN, ASC, "set vfoB", cmd, replystr);
248
// SM cmd 0 ... 100 (rig values 0 ... 15)
249
int RIG_TS570::get_smeter()
252
int ret = sendCommand(cmd);
253
showresp(WARN, ASC, "S meter", cmd, replystr);
254
if (ret < 7) return 0;
255
size_t p = replystr.rfind("SM");
256
if (p == string::npos) return -1;
259
int mtr = atoi(&replystr[p + 2]);
260
mtr = (mtr * 100) / 15;
264
// RM cmd 0 ... 100 (rig values 0 ... 8)
265
int RIG_TS570::get_swr()
267
cmd = "RM1;RM;"; // select measurement '1' (swr) and read meter
268
int ret = sendCommand(cmd);
269
showresp(WARN, ASC, "SWR", cmd, replystr);
270
if (ret < 8) return 0;
271
size_t p = replystr.rfind("RM1");
272
if (p == string::npos) return 0;
275
int mtr = atoi(&replystr[p + 3]);
276
mtr = (mtr * 100) / 15;
280
// power output measurement 0 ... 15
281
int RIG_TS570::get_power_out()
284
int ret = sendCommand(cmd);
285
showresp(WARN, ASC, "P out", cmd, replystr);
286
if (ret < 7) return 0;
287
size_t p = replystr.rfind("SM");
288
if (p == string::npos) return 0;
291
int mtr = atoi(&replystr[p + 2]);
292
mtr = (int)(0.34 + (((0.035*mtr - 0.407)*mtr + 5.074)*mtr));
293
if (mtr < 1) mtr = 0;
294
if (mtr > 100) mtr = 100;
298
// (xcvr power level is in 5W increments)
299
void RIG_TS570::set_power_control(double val)
303
for (int i = 4; i > 1; i--) {
308
showresp(WARN, ASC, "set pwr", cmd, replystr);
311
int RIG_TS570::get_power_control()
314
int ret = sendCommand(cmd);
315
showresp(WARN, ASC, "get pwr", cmd, replystr);
316
if (ret < 6) return 0;
317
size_t p = replystr.rfind("PC");
318
if (p == string::npos) return 0;
321
int mtr = atoi(&replystr[p + 2]);
325
// Volume control return 0 ... 100 (rig values 0 ... 255)
326
int RIG_TS570::get_volume_control()
329
int ret = sendCommand(cmd);
330
showresp(WARN, ASC, "get vol", cmd, replystr);
332
if (ret < 6) return 0;
333
size_t p = replystr.rfind("AG");
334
if (p == string::npos) return 0;
337
int val = atoi(&replystr[p + 2]);
338
return (int)(val / 2.55);
341
void RIG_TS570::set_volume_control(int val)
343
int ivol = (int)(val * 2.55);
344
showresp(WARN, ASC, "set vol", cmd, replystr);
346
for (int i = 4; i > 1; i--) {
353
// Tranceiver PTT on/off
354
void RIG_TS570::set_PTT_control(int val)
356
if (val) cmd = "TX;";
359
showresp(WARN, ASC, "PTT", cmd, replystr);
362
void RIG_TS570::tune_rig()
366
showresp(WARN, ASC, "TUNE", cmd, replystr);
369
void RIG_TS570::set_attenuator(int val)
372
if (val) cmd = "RA01;";
375
showresp(WARN, ASC, "set Att", cmd, replystr);
378
int RIG_TS570::get_attenuator()
381
int ret = sendCommand(cmd);
382
showresp(WARN, ASC, "get Att", cmd, replystr);
383
if (ret < 5) return att_on;
384
size_t p = replystr.rfind("RA");
385
if (p == string::npos) return att_on;
387
if (replystr[p + 2] == '0' &&
388
replystr[p + 3] == '0')
395
void RIG_TS570::set_preamp(int val)
398
if (val) cmd = "PA1;";
401
showresp(WARN, ASC, "set pre", cmd, replystr);
404
int RIG_TS570::get_preamp()
407
int ret = sendCommand(cmd);
408
showresp(WARN, ASC, "get pre", cmd, replystr);
409
if (ret < 4 ) return preamp_on;
410
size_t p = replystr.rfind("PA");
411
if (p == string::npos) return preamp_on;
413
if (replystr[p + 2] == '1')
420
void RIG_TS570::set_widths()
427
bandwidths_ = TS570_SSBwidths;
432
bandwidths_ = TS570_CWwidths;
437
bandwidths_ = TS570_FSKwidths;
445
const char **RIG_TS570::bwtable(int m)
452
return TS570_SSBwidths;
456
return TS570_CWwidths;
460
return TS570_FSKwidths;
463
return TS570_SSBwidths;
466
void RIG_TS570::set_modeA(int val)
470
cmd += TS570_mode_chr[val];
473
showresp(WARN, ASC, "set modeA", cmd, replystr);
477
int RIG_TS570::get_modeA()
480
int ret = sendCommand(cmd);
481
showresp(WARN, ASC, "get modeA", cmd, replystr);
482
if (ret < 4) return A.imode;
483
size_t p = replystr.rfind("MD");
484
if (p == string::npos) return A.imode;
486
int md = replystr[p + 2];
494
void RIG_TS570::set_modeB(int val)
498
cmd += TS570_mode_chr[val];
501
showresp(WARN, ASC, "set modeB", cmd, replystr);
505
int RIG_TS570::get_modeB()
508
int ret = sendCommand(cmd);
509
showresp(WARN, ASC, "get modeB", cmd, replystr);
510
if (ret < 4) return B.imode;
511
size_t p = replystr.rfind("MD");
512
if (p == string::npos) return B.imode;
514
int md = replystr[p + 2];
522
int RIG_TS570::adjust_bandwidth(int val)
529
bandwidths_ = TS570_SSBwidths;
533
bandwidths_ = TS570_CWwidths;
537
bandwidths_ = TS570_FSKwidths;
543
int RIG_TS570::def_bandwidth(int val)
561
void RIG_TS570::set_bwA(int val)
570
cmd = TS570_SSBbw[A.iBW];
575
cmd = TS570_CWbw[A.iBW];
580
cmd = TS570_FSKbw[A.iBW];
586
showresp(WARN, ASC, "set bwA", cmd, replystr);
589
int RIG_TS570::get_bwA()
594
int ret = sendCommand(cmd);
595
showresp(WARN, ASC, "get bwA", cmd, replystr);
596
if (ret < 7) return A.iBW;
597
size_t p = replystr.rfind("FW");
598
if (p == string::npos) return A.iBW;
600
string test = replystr.substr(p, 7);
607
for (i = 0; TS570_SSBbw[i] != NULL; i++)
608
if (test == TS570_SSBbw[i]) break;
609
if (TS570_SSBbw[i] != NULL) A.iBW = i;
614
for (i = 0; TS570_CWbw[i] != NULL; i++)
615
if (test == TS570_CWbw[i]) break;
616
if (TS570_CWbw[i] != NULL) A.iBW = i;
621
for (i = 0; TS570_FSKbw[i] != NULL; i++)
622
if (test == TS570_FSKbw[i]) break;
623
if (TS570_FSKbw[i] != NULL) A.iBW = i;
633
void RIG_TS570::set_bwB(int val)
642
cmd = TS570_SSBbw[B.iBW];
647
cmd = TS570_CWbw[B.iBW];
652
cmd = TS570_FSKbw[B.iBW];
658
showresp(WARN, ASC, "set bwB", cmd, replystr);
661
int RIG_TS570::get_bwB()
666
int ret = sendCommand(cmd);
667
showresp(WARN, ASC, "get bwB", cmd, replystr);
668
if (ret < 7) return B.iBW;
669
size_t p = replystr.rfind("FW");
670
if (p == string::npos) return B.iBW;
672
string test = replystr.substr(p,7);
679
for (i = 0; TS570_SSBbw[i] != NULL; i++)
680
if (test == TS570_SSBbw[i]) break;
681
if (TS570_SSBbw[i] != NULL) B.iBW = i;
686
for (i = 0; TS570_CWbw[i] != NULL; i++)
687
if (test == TS570_CWbw[i]) break;
688
if (TS570_CWbw[i] != NULL) B.iBW = i;
693
for (i = 0; TS570_FSKbw[i] != NULL; i++)
694
if (test == TS570_FSKbw[i]) break;
695
if (TS570_FSKbw[i] != NULL) B.iBW = i;
705
int RIG_TS570::get_modetype(int n)
707
return TS570_mode_type[n];
711
void RIG_TS570::set_mic_gain(int val)
714
for (int i = 4; i > 1; i--) {
719
showresp(WARN, ASC, "set mic", cmd, replystr);
722
int RIG_TS570::get_mic_gain()
725
int ret = sendCommand(cmd);
726
showresp(WARN, ASC, "get mic", cmd, replystr);
727
if (ret < 6) return 0;
728
size_t p = replystr.rfind("MG");
729
if (p == string::npos) return 0;
732
int val = atoi(&replystr[p + 2]);
736
void RIG_TS570::get_mic_min_max_step(int &min, int &max, int &step)
743
void RIG_TS570::set_noise(bool b)
750
showresp(WARN, ASC, "set NB", cmd, replystr);
753
int RIG_TS570::get_noise()
756
int ret = sendCommand(cmd);
757
showresp(WARN, ASC, "get NB", cmd, replystr);
758
if (ret < 4) return 0;
759
size_t p = replystr.rfind("NB");
760
if (p == string::npos) return 0;
762
return (replystr[p + 2] == '1');
765
//======================================================================
767
// step size is 100 Hz
768
//======================================================================
769
void RIG_TS570::set_if_shift(int val)
772
if (val < 0) cmd[2] = '-';
774
for (int i = 6; i > 2; i--) {
779
showresp(WARN, ASC, "set IF shift", cmd, replystr);
782
bool RIG_TS570::get_if_shift(int &val)
786
int ret = sendCommand(cmd);
787
showresp(WARN, ASC, "get IF shift", cmd, replystr);
790
p = replystr.rfind("IS");
791
if (p == string::npos) return false;
793
val = atoi(&replystr[p + 3]);
794
if (replystr[p+2] == '-') val = -val;
801
void RIG_TS570::get_if_min_max_step(int &min, int &max, int &step)
808
void RIG_TS570::set_rf_gain(int val)
811
cmd.append(to_decimal(val,3)).append(";");
813
showresp(WARN, ASC, "set rf gain", cmd, replystr);
816
int RIG_TS570::get_rf_gain()
818
int val = progStatus.rfgain;
820
int ret = waitN(6, 100, "get rf gain", ASC);
821
if (ret < 6) return val;
822
size_t p = replystr.rfind("RG");
823
if (p != string::npos)
824
val = fm_decimal(&replystr[p+2], 3);
828
void RIG_TS570::get_rf_min_max_step(int &min, int &max, int &step)
830
min = 0; max = 255; step = 1;
833
void RIG_TS570::set_squelch(int val)
836
cmd.append(to_decimal(abs(val),3)).append(";");
838
showresp(WARN, ASC, "set squelch", cmd, replystr);
841
int RIG_TS570::get_squelch()
844
if (waitN(6, 100, "get squelch", ASC) < 6) return 0;
846
size_t p = replystr.rfind("SQ");
848
if (p == string::npos) return 0;
851
return atoi(&replystr[p + 2]);
854
void RIG_TS570::get_squelch_min_max_step(int &min, int &max, int &step)
856
min = 0; max = 255; step = 1;