2
* Kenwood TS590S driver
6
* Copyright 2009, Dave Freese, W1HKJ
15
static const char TS590Sname_[] = "TS-590S";
17
static const char *TS590Smodes_[] = {
18
"LSB", "USB", "CW", "FM", "AM", "FSK", "CW-R", "FSK-R",
19
"LSB-D", "USB-D", "FM-D", NULL};
21
static const char TS590S_mode_chr[] = {
22
'1', '2', '3', '4', '5', '6', '7', '9',
24
static const char TS590S_mode_type[] = {
25
'L', 'U', 'U', 'U', 'U', 'L', 'L', 'U',
28
//----------------------------------------------------------------------
29
static const char *TS590S_empty[] = { "N/A", NULL };
31
//----------------------------------------------------------------------
32
static int DEF_lo_hi = 0x8A03;
33
static const char *TS590S_SSB_lo[] = {
34
"0", "50", "100", "200", "300",
35
"400", "500", "600", "700", "800",
36
"900", "1000", NULL };
38
static const char *TS590S_CAT_ssb_lo[] = {
39
"SL00;", "SL01;", "SL02;", "SL03;", "SL04;",
40
"SL05;", "SL06;", "SL07;", "SL08;", "SL09;",
41
"SL10;", "SL11;", NULL };
42
static const char *TS590S_SSB_lo_tooltip = "lo cutoff";
43
static const char *TS590S_SSB_btn_lo_label = "L";
45
static const char *TS590S_SSB_hi[] = {
46
"1000", "1200", "1400", "1600", "1800",
47
"2000", "2200", "2400", "2600", "2800",
48
"3000", "3400", "4000", "5000", NULL };
50
static const char *TS590S_CAT_ssb_hi[] = {
51
"SH00;", "SH01;", "SH02;", "SH03;", "SH04;",
52
"SH05;", "SH06;", "SH07;", "SH08;", "SH09;",
53
"SH10;", "SH11;", "SH12;", "SH13;", NULL };
54
static const char *TS590S_SSB_hi_tooltip = "hi cutoff";
55
static const char *TS590S_SSB_btn_hi_label = "H";
57
//----------------------------------------------------------------------
58
static int DEF_width_shift = 0x8D05;
59
static const char *TS590S_DATA_width[] = {
60
"50", "80", "100", "150", "200",
61
"250", "300", "400", "500", "600",
62
"1000", "1500", "2000", "2500", NULL };
64
static const char *TS590S_CAT_data_width[] = {
65
"SL00;", "SL01;", "SL02;", "SL03;", "SL04;",
66
"SL05;", "SL06;", "SL07;", "SL08;", "SL09;",
67
"SL10;", "SL11;", "SL12;", "SL13;", NULL };
68
static const char *TS590S_DATA_W_tooltip = "filter width";
69
static const char *TS590S_DATA_W_btn_label = "W";
71
static const char *TS590S_DATA_shift[] = {
72
"1000", "1100", "1200", "1300", "1400",
73
"1500", "1600", "1700", "1800", "1900",
74
"2000", "2100", "2210", NULL };
76
static const char *TS590S_CAT_data_shift[] = {
77
"SH00;", "SH01;", "SH02;", "SH03;", "SH04;",
78
"SH05;", "SH06;", "SH07;", "SH08;", "SH09;",
79
"SH10;", "SH11;", "SH12;", NULL };
80
static const char *TS590S_DATA_S_tooltip = "shift frequency";
81
static const char *TS590S_DATA_S_btn_label = "S";
83
//----------------------------------------------------------------------
84
static int DEF_am = 0x8201;
85
static const char *TS590S_AM_lo[] = {
86
"10", "100", "200", "500", NULL };
88
static const char *TS590S_CAT_am_lo[] = {
89
"SL00;", "SL01;", "SL02;", "SL03;", NULL};
90
static const char *TS590S_AM_lo_tooltip = "lo cutoff";
91
static const char *TS590S_AM_btn_lo_label = "L";
93
static const char *TS590S_AM_hi[] = {
94
"2500", "3000", "4000", "5000", NULL };
96
static const char *TS590S_CAT_am_hi[] = {
97
"SH00;", "SH01;", "SH02;", "SH03;", NULL};
98
static const char *TS590S_AM_hi_tooltip = "hi cutoff";
99
static const char *TS590S_AM_btn_hi_label = "H";
101
//----------------------------------------------------------------------
102
static int DEF_cw = 7;
103
static const char *TS590S_CWwidths[] = {
104
"50", "80", "100", "150", "200",
105
"250", "300", "400", "500", "600",
106
"1000", "1500", "2000", "2500", NULL};
108
static const char *TS590S_CWbw[] = {
109
"FW0050;", "FW0080;", "FW0100;", "FW0150;", "FW0200;",
110
"FW0250;", "FW0300;", "FW0400;", "FW0500;", "FW0600;",
111
"FW1000;", "FW1500;", "FW2000;", "FW2500;", NULL};
113
//----------------------------------------------------------------------
114
static int DEF_fsk = 1;
115
static const char *TS590S_FSKwidths[] = {
116
"250", "500", "1000", "1500", NULL};
118
static const char *TS590S_FSKbw[] = {
119
"FW0250;", "FW0500;", "FW1000;", "FW1500;", NULL };
121
//----------------------------------------------------------------------
123
static GUI rig_widgets[]= {
124
{ (Fl_Widget *)btnVol, 2, 125, 50 },
125
{ (Fl_Widget *)sldrVOLUME, 54, 125, 156 },
126
{ (Fl_Widget *)sldrRFGAIN, 54, 145, 156 },
127
{ (Fl_Widget *)btnIFsh, 214, 105, 50 },
128
{ (Fl_Widget *)sldrIFSHIFT, 266, 105, 156 },
129
{ (Fl_Widget *)btnNotch, 214, 125, 50 },
130
{ (Fl_Widget *)sldrNOTCH, 266, 125, 156 },
131
{ (Fl_Widget *)sldrMICGAIN, 266, 145, 156 },
132
{ (Fl_Widget *)sldrPOWER, 266, 165, 156 },
133
{ (Fl_Widget *)btnNR, 2, 165, 50 },
134
{ (Fl_Widget *)sldrNR, 54, 165, 156 },
135
{ (Fl_Widget *)NULL, 0, 0, 0 }
138
static string menu003;
140
void RIG_TS590S::initialize()
142
rig_widgets[0].W = btnVol;
143
rig_widgets[1].W = sldrVOLUME;
144
rig_widgets[2].W = sldrRFGAIN;
145
rig_widgets[3].W = btnIFsh;
146
rig_widgets[4].W = sldrIFSHIFT;
147
rig_widgets[5].W = btnNotch;
148
rig_widgets[6].W = sldrNOTCH;
149
rig_widgets[7].W = sldrMICGAIN;
150
rig_widgets[8].W = sldrPOWER;
151
rig_widgets[9].W = btnNR;
152
rig_widgets[10].W = sldrNR;
155
if (waitN(11, 100, "read ex 003", ASC) == 11)
157
cmd = "EX003000000;";
161
cmd = "AC000;"; sendCommand(cmd);
167
void RIG_TS590S::shutdown()
169
// restore state of xcvr beeps
175
RIG_TS590S::RIG_TS590S() {
178
modes_ = TS590Smodes_;
179
bandwidths_ = TS590S_SSB_hi;
181
dsp_lo = TS590S_SSB_lo;
182
lo_tooltip = TS590S_SSB_lo_tooltip;
183
lo_label = TS590S_SSB_btn_lo_label;
185
dsp_hi = TS590S_SSB_hi;
186
hi_tooltip = TS590S_SSB_hi_tooltip;
187
hi_label = TS590S_SSB_btn_hi_label;
189
widgets = rig_widgets;
191
comm_baudrate = BR115200;
197
comm_rtsplus = false;
198
comm_dtrplus = false;
203
B.imode = A.imode = USB;
204
B.iBW = A.iBW = DEF_lo_hi;
205
B.freq = A.freq = 14070000;
206
can_change_alt_vfo = true;
210
has_micgain_control =
211
has_ifshift_control = false;
217
has_noise_reduction =
218
has_noise_reduction_control =
226
has_micgain_control =
231
has_attenuator_control =
234
has_bandwidth_control =
235
has_ifshift_control =
236
has_ptt_control = true;
245
noise_reduction_level = 0;
248
const char * RIG_TS590S::get_bwname_(int n, int md)
250
static char bwname[20];
252
int hi = (n >> 8) & 0x7F;
254
snprintf(bwname, sizeof(bwname), "%s/%s",
255
(md == LSB || md == USB || md == FM) ? TS590S_SSB_lo[lo] :
256
(md == AM) ? TS590S_AM_lo[lo] :
257
TS590S_DATA_width[lo],
258
(md == LSB || md == USB || md == FM) ? TS590S_SSB_hi[hi] :
259
(md == AM) ? TS590S_AM_hi[hi] :
260
TS590S_DATA_shift[hi] );
262
snprintf(bwname, sizeof(bwname), "%s",
263
(md == CW || md == CWR) ? TS590S_CWwidths[n] : TS590S_FSKwidths[n]);
268
void RIG_TS590S::selectA()
272
showresp(WARN, ASC, "Rx A", cmd, replystr);
275
showresp(WARN, ASC, "Tx A", cmd, replystr);
279
void RIG_TS590S::selectB()
283
showresp(WARN, ASC, "Rx B", cmd, replystr);
286
showresp(WARN, ASC, "Tx B", cmd, replystr);
290
void RIG_TS590S::set_split(bool val)
297
showresp(WARN, ASC, "Rx on B, Tx on A", cmd, replystr);
301
showresp(WARN, ASC, "Rx on B, Tx on B", cmd, replystr);
307
showresp(WARN, ASC, "Rx on A, Tx on B", cmd, replystr);
311
showresp(WARN, ASC, "Rx on A, Tx on A", cmd, replystr);
314
Fl::awake(highlight_vfo, (void *)0);
317
int RIG_TS590S::get_split()
325
waitN(4, 100, "get split tx vfo", ASC);
326
p = replystr.rfind(rsp);
327
if (p == string::npos) return split;
333
waitN(4, 100, "get split rx vfo", ASC);
335
p = replystr.rfind(rsp);
336
if (p == string::npos) return split;
339
split = (tx == '1' ? 2 : 0) + (rx == '1' ? 1 : 0);
344
long RIG_TS590S::get_vfoA ()
347
int ret = waitN(14, 100, "get vfoA", ASC);
349
if (ret < 14) return A.freq;
350
size_t p = replystr.rfind("FA");
351
if (p == string::npos) return A.freq;
355
for (size_t n = 12; n > 1; n--) {
356
f += (replystr[p + n] - '0') * mul;
363
void RIG_TS590S::set_vfoA (long freq)
366
cmd = "FA00000000000;";
367
for (int i = 12; i > 1; i--) {
372
showresp(WARN, ASC, "set vfo A", cmd, replystr);
375
long RIG_TS590S::get_vfoB ()
378
int ret = waitN(14, 100, "get vfoB", ASC);
380
if (ret < 14) return B.freq;
381
size_t p = replystr.rfind("FB");
382
if (p == string::npos) return B.freq;
386
for (size_t n = 12; n > 1; n--) {
387
f += (replystr[p + n] - '0') * mul;
395
void RIG_TS590S::set_vfoB (long freq)
398
cmd = "FB00000000000;";
399
for (int i = 12; i > 1; i--) {
404
showresp(WARN, ASC, "set vfo B", cmd, replystr);
407
int RIG_TS590S::get_smeter()
411
int ret = waitN(8, 100, "get", ASC);
412
if (ret < 8) return 0;
413
size_t p = replystr.find("SM0");
414
if (p == string::npos) return 0;
417
mtr = atoi(&replystr[p + 3]);
420
if (mtr > 100) mtr = 100;
424
int RIG_TS590S::get_power_out()
428
int ret = waitN(8, 100, "get power", ASC);
430
if (ret < 8) return mtr;
431
size_t p = replystr.rfind("SM0");
432
if (p == string::npos) return mtr;
434
mtr = atoi(&replystr[p + 3]);
437
if (mtr > 100) mtr = 100;
442
static bool read_alc = false;
443
static int alc_val = 0;
445
int RIG_TS590S::get_swr(void)
452
int ret = waitN(8, 100, "get swr/alc", ASC);
453
if (ret < 24) return 0;
455
size_t p = replystr.find("RM3");
456
if (p != string::npos) {
458
alc_val = atoi(&replystr[p + 3]);
461
if (alc_val > 100) alc_val = 100;
465
p = replystr.find("RM1");
466
if (p == string::npos) return 0;
469
mtr = atoi(&replystr[p + 3]);
472
if (mtr > 100) mtr = 100;
477
int RIG_TS590S::get_alc(void)
484
int ret = waitN(8, 100, "get alc", ASC);
485
if (ret < 24) return 0;
487
size_t p = replystr.find("RM3");
488
if (p == string::npos) return 0;
491
alc_val = atoi(&replystr[p + 3]);
494
if (alc_val > 100) alc_val = 100;
498
// Transceiver power level
499
void RIG_TS590S::set_power_control(double val)
503
for (int i = 4; i > 1; i--) {
510
int RIG_TS590S::get_power_control()
513
int ret = waitN(6, 100, "get pwr ctrl", ASC);
515
if (ret < 6) return 0;
516
size_t p = replystr.rfind("PC");
517
if (p == string::npos) return 0;
521
mtr = atoi(&replystr[p + 2]);
526
// Volume control return 0 ... 100
527
int RIG_TS590S::get_volume_control()
530
int ret = waitN(7, 100, "get vol ctrl", ASC);
532
if (ret < 7) return 0;
533
size_t p = replystr.rfind("AG");
534
if (p == string::npos) return 0;
537
int val = atoi(&replystr[p + 3]);
538
return (int)(val / 2.55);
541
void RIG_TS590S::set_volume_control(int val)
543
int ivol = (int)(val * 2.55);
545
for (int i = 5; i > 2; i--) {
552
// Tranceiver PTT on/off
553
void RIG_TS590S::set_PTT_control(int val)
565
void RIG_TS590S::tune_rig()
571
void RIG_TS590S::set_attenuator(int val)
574
if (val) cmd = "RA01;";
579
int RIG_TS590S::get_attenuator()
582
int ret = waitN(7, 100, "get att", ASC);
584
if (ret < 7) return 0;
585
size_t p = replystr.rfind("RA");
586
if (p == string::npos) return 0;
588
if (replystr[p + 2] == '0' &&
589
replystr[p + 3] == '0')
597
void RIG_TS590S::set_preamp(int val)
600
if (val) cmd = "PA1;";
605
int RIG_TS590S::get_preamp()
608
int ret = waitN(5, 100, "get preamp", ASC);
610
if (ret < 5) return 0;
611
size_t p = replystr.rfind("PA");
612
if (p == string::npos) return 0;
614
if (replystr[p + 2] == '1')
621
//======================================================================
623
//======================================================================
625
void RIG_TS590S::set_modeA(int val)
627
active_mode = A.imode = val;
629
cmd += TS590S_mode_chr[val];
632
showresp(ERR, ASC, "set mode A", cmd, replystr);
633
if ( val == LSBD || val == USBD || val == FMD) {
637
showresp(WARN, ASC, "set data A", cmd, replystr);
638
} else if (val == LSB || val == USB || val == FM) {
642
showresp(WARN, ASC, "set data A", cmd, replystr);
647
int RIG_TS590S::get_modeA()
651
int ret = waitN(4, 100, "get mode A", ASC);
653
if (ret < 4) return A.imode;
655
size_t p = replystr.rfind("MD");
656
if (p == string::npos) return A.imode;
658
switch (replystr[p + 2]) {
659
case '1' : md = LSB; break;
660
case '2' : md = USB; break;
661
case '3' : md = CW; break;
662
case '4' : md = FM; break;
663
case '5' : md = AM; break;
664
case '6' : md = FSK; break;
665
case '7' : md = CWR; break;
666
case '9' : md = FSKR; break;
667
default : md = A.imode;
670
if (md == LSB || md == USB || md == FM) {
672
ret = waitN(4, 100, "get data A", ASC);
674
if (ret < 4) return A.imode;
675
p = replystr.rfind("DA");
676
if (p == string::npos) return A.imode;
677
if (replystr[p + 2] == '1') {
679
if (md == LSB) md = LSBD;
680
else if (md == USB) md = USBD;
681
else if (md == FM) md = FMD;
685
active_mode = A.imode = md;
691
void RIG_TS590S::set_modeB(int val)
693
active_mode = B.imode = val;
695
cmd += TS590S_mode_chr[val];
698
showresp(WARN, ASC, "set mode B", cmd, replystr);
699
if ( val == LSBD || val == USBD || val == FMD) {
703
showresp(WARN, ASC, "set data B", cmd, replystr);
704
} else if (val == LSB || val == USB || val == FM) {
707
showresp(WARN, ASC, "set data B", cmd, replystr);
712
int RIG_TS590S::get_modeB()
716
int ret = waitN(4, 100, "get mode B", ASC);
718
if (ret < 4) return B.imode;
719
size_t p = replystr.rfind("MD");
720
if (p == string::npos) return B.imode;
722
switch (replystr[p + 2]) {
723
case '1' : md = LSB; break;
724
case '2' : md = USB; break;
725
case '3' : md = CW; break;
726
case '4' : md = FM; break;
727
case '5' : md = AM; break;
728
case '6' : md = FSK; break;
729
case '7' : md = CWR; break;
730
case '9' : md = FSKR; break;
731
default : md = B.imode;
734
if (md == LSB || md == USB || md == FM) {
736
ret = waitN(4, 100, "get dat B", ASC);
738
if (ret < 4) return B.imode;
739
p = replystr.rfind("DA");
740
if (p == string::npos) return B.imode;
741
if (replystr[p + 2] == '1') {
743
if (md == LSB) md = LSBD;
744
else if (md == USB) md = USBD;
745
else if (md == FM) md = FMD;
749
active_mode = B.imode = md;
755
//======================================================================
756
// Bandpass filter commands
757
//======================================================================
759
int RIG_TS590S::set_widths(int val)
762
if (val == LSB || val == USB || val == FM || val == FMD) {
763
bandwidths_ = TS590S_SSB_hi;
764
dsp_lo = TS590S_SSB_lo;
765
dsp_hi = TS590S_SSB_hi;
766
lo_tooltip = TS590S_SSB_lo_tooltip;
767
lo_label = TS590S_SSB_btn_lo_label;
768
hi_tooltip = TS590S_SSB_hi_tooltip;
769
hi_label = TS590S_SSB_btn_hi_label;
770
bw = DEF_lo_hi; // 200 lower, 3000 upper
771
} else if (val == CW || val == CWR) {
772
bandwidths_ = TS590S_CWwidths;
773
dsp_lo = TS590S_empty;
774
dsp_hi = TS590S_empty;
776
} else if (val == FSK || val == FSKR) {
777
bandwidths_ = TS590S_FSKwidths;
778
dsp_lo = TS590S_empty;
779
dsp_hi = TS590S_empty;
781
} else if (val == AM) { // val == 4 ==> AM
782
bandwidths_ = TS590S_AM_hi;
783
dsp_lo = TS590S_AM_lo;
784
dsp_hi = TS590S_AM_hi;
785
lo_tooltip = TS590S_AM_lo_tooltip;
786
lo_label = TS590S_AM_btn_lo_label;
787
hi_tooltip = TS590S_AM_hi_tooltip;
788
hi_label = TS590S_AM_btn_hi_label;
790
} else if (val == LSBD || val == USBD) {
791
bandwidths_ = TS590S_DATA_width;
793
dsp_lo = TS590S_DATA_shift;
794
lo_tooltip = TS590S_DATA_S_tooltip;
795
lo_label = TS590S_DATA_S_btn_label;
797
dsp_hi = TS590S_DATA_width;
798
hi_tooltip = TS590S_DATA_W_tooltip;
799
hi_label = TS590S_DATA_W_btn_label;
800
bw = DEF_width_shift;
805
const char **RIG_TS590S::bwtable(int m)
807
if (m == LSB || m == USB || m == FM || m == FMD)
808
return TS590S_SSB_hi;
809
else if (m == CW || m == CWR)
810
return TS590S_CWwidths;
811
else if (m == FSK || m == FSKR)
812
return TS590S_FSKwidths;
816
return TS590S_DATA_width;
819
const char **RIG_TS590S::lotable(int m)
821
if (m == LSB || m == USB || m == FM || m == FMD)
822
return TS590S_SSB_lo;
825
else if (m == LSBD || m == USBD)
826
return TS590S_DATA_shift;
831
const char **RIG_TS590S::hitable(int m)
833
if (m == LSB || m == USB || m == FM || m == FMD)
834
return TS590S_SSB_hi;
837
else if (m == LSBD || m == USBD)
838
return TS590S_DATA_width;
843
int RIG_TS590S::adjust_bandwidth(int val)
845
if (val == LSB || val == USB || val == FM || val == FMD)
847
else if (val == LSBD || val == USBD)
848
return DEF_width_shift;
849
else if (val == CW || val == CWR)
851
else if (val == FSK || val == FSKR)
853
// else if (val == AM)
857
int RIG_TS590S::def_bandwidth(int val)
859
return adjust_bandwidth(val);
862
void RIG_TS590S::set_bwA(int val)
864
// LSB, USB, FM, FM-D
865
if (A.imode == LSB || A.imode == USB || A.imode == FM || A.imode == FMD) {
866
if (val < 256) return;
868
cmd = TS590S_CAT_ssb_lo[A.iBW & 0x7F];
870
showresp(WARN, ASC, "set lower", cmd, replystr);
871
cmd = TS590S_CAT_ssb_hi[(A.iBW >> 8) & 0x7F];
873
showresp(WARN, ASC, "set upper", cmd, replystr);
877
if (A.imode == LSBD || A.imode == USBD) {
878
if (val < 256) return;
880
cmd = TS590S_CAT_data_shift[A.iBW & 0x7F];
882
showresp(WARN, ASC, "set shift", cmd, replystr);
883
cmd = TS590S_CAT_data_width[(A.iBW >> 8) & 0x7F];
885
showresp(WARN, ASC, "set width", cmd, replystr);
890
if (val < 256) return;
892
cmd = TS590S_CAT_am_lo[A.iBW & 0x7F];
894
showresp(WARN, ASC, "set lower", cmd, replystr);
895
cmd = TS590S_CAT_am_hi[(A.iBW >> 8) & 0x7F];
897
showresp(WARN, ASC, "set upper", cmd, replystr);
900
if (val > 256) return;
902
if (A.imode == CW || A.imode == CWR) {
904
cmd = TS590S_CWbw[A.iBW];
906
showresp(WARN, ASC, "set CW bw", cmd, replystr);
910
if (A.imode == FSK || A.imode == FSKR) {
912
cmd = TS590S_FSKbw[A.iBW];
914
showresp(WARN, ASC, "set FSK bw", cmd, replystr);
919
void RIG_TS590S::set_bwB(int val)
921
if (B.imode == LSB || B.imode == USB || B.imode == FM || B.imode == FMD) {
922
if (val < 256) return;
924
cmd = TS590S_CAT_ssb_lo[B.iBW & 0x7F];
926
showresp(WARN, ASC, "set lower", cmd, replystr);
927
cmd = TS590S_CAT_ssb_hi[(B.iBW >> 8) & 0x7F];
929
showresp(WARN, ASC, "set upper", cmd, replystr);
932
if (B.imode == LSBD || B.imode == USBD) { // SSB data mode
933
if (val < 256) return;
935
cmd = TS590S_CAT_data_shift[B.iBW & 0x7F];
937
showresp(WARN, ASC, "set shift", cmd, replystr);
938
cmd = TS590S_CAT_data_width[(B.iBW >> 8) & 0x7F];
940
showresp(WARN, ASC, "set width", cmd, replystr);
944
if (val < 256) return;
946
cmd = TS590S_AM_lo[B.iBW & 0x7F];
948
showresp(WARN, ASC, "set lower", cmd, replystr);
949
cmd = TS590S_AM_hi[(B.iBW >> 8) & 0x7F];
951
showresp(WARN, ASC, "set upper", cmd, replystr);
955
if (val > 256) return;
956
if (B.imode == CW || B.imode == CWR) {
958
cmd = TS590S_CWbw[B.iBW];
960
showresp(WARN, ASC, "set CW bw", cmd, replystr);
964
if (B.imode == FSK || B.imode == FSKR) {
966
cmd = TS590S_FSKbw[B.iBW];
968
showresp(WARN, ASC, "set FSK bw", cmd, replystr);
973
int RIG_TS590S::get_bwA()
975
int i = 0, lo = 0, hi = 0;
981
waitN(7, 100, "get CW width", ASC);
982
p = replystr.rfind("FW");
983
if (p != string::npos) {
984
for (i = 0; i < 14; i++)
985
if (replystr.find(TS590S_CWbw[i]) == p)
994
waitN(7, 100, "get FSK width", ASC);
995
p = replystr.rfind("FW");
996
if (p != string::npos) {
997
for (i = 0; i < 4; i++)
998
if (replystr.find(TS590S_FSKbw[i]) == p)
1004
case LSB: case USB: case FM:
1007
hi = (A.iBW >> 8) & 0x7F;
1009
waitN(5, 100, "get lower", ASC);
1010
p = replystr.rfind("SL");
1011
if (p == string::npos) break;
1012
lo = fm_decimal(&replystr[2], 2);
1014
waitN(5, 100, "get upper", ASC);
1015
p = replystr.rfind("SH");
1016
if (p == string::npos) break;
1017
hi = fm_decimal(&replystr[2], 2);
1018
A.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
1020
case LSBD: case USBD: case FMD:
1021
A.iBW = DEF_width_shift;
1023
hi = (A.iBW >> 8) & 0x7F;
1025
waitN(5, 100, "get width", ASC);
1026
p = replystr.rfind("SL");
1027
if (p == string::npos) break;
1028
hi = fm_decimal(&replystr[2], 2);
1030
waitN(5, 100, "get shift", ASC);
1031
p = replystr.rfind("SH");
1032
if (p == string::npos) break;
1033
lo = fm_decimal(&replystr[2], 2);
1034
A.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
1040
int RIG_TS590S::get_bwB()
1042
int i = 0, lo = 0, hi = 0;
1048
waitN(7, 100, "get CW width", ASC);
1049
p = replystr.rfind("FW");
1050
if (p != string::npos) {
1051
for (i = 0; i < 14; i++)
1052
if (replystr.find(TS590S_CWbw[i]) == p)
1054
if (i == 14) i = 13;
1058
case FSK: case FSKR:
1061
waitN(7, 100, "get FSK width", ASC);
1062
p = replystr.rfind("FW");
1063
if (p != string::npos) {
1064
for (i = 0; i < 4; i++)
1065
if (replystr.find(TS590S_FSKbw[i]) == p)
1071
case LSB: case USB: case FM:
1074
hi = (B.iBW >> 8) & 0x7F;
1076
waitN(5, 100, "get lower", ASC);
1077
p = replystr.rfind("SL");
1078
if (p == string::npos) break;
1079
lo = fm_decimal(&replystr[2], 2);
1081
waitN(5, 100, "get upper", ASC);
1082
p = replystr.rfind("SH");
1083
if (p == string::npos) break;
1084
hi = fm_decimal(&replystr[2], 2);
1085
B.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
1087
case LSBD: case USBD: case FMD:
1088
B.iBW = DEF_width_shift;
1090
hi = (B.iBW >> 8) & 0x7F;
1092
waitN(5, 100, "get width", ASC);
1093
p = replystr.rfind("SL");
1094
if (p == string::npos) break;
1095
hi = fm_decimal(&replystr[2], 2);
1097
waitN(5, 100, "get shift", ASC);
1098
p = replystr.rfind("SH");
1099
if (p == string::npos) break;
1100
lo = fm_decimal(&replystr[2], 2);
1101
B.iBW = ((hi << 8) | (lo & 0xFF)) | 0x8000;
1107
int RIG_TS590S::get_modetype(int n)
1109
return TS590S_mode_type[n];
1113
void RIG_TS590S::set_mic_gain(int val)
1116
for (int i = 3; i > 0; i--) {
1117
cmd[1+i] += val % 10;
1120
sendCommand(cmd, 0);
1123
int RIG_TS590S::get_mic_gain()
1127
int ret = waitN(6, 100, "get mic ctrl", ASC);
1130
size_t p = replystr.rfind("MG");
1131
if (p == string::npos) return val;
1132
replystr[p + 5] = 0;
1133
val = atoi(&replystr[p + 2]);
1138
void RIG_TS590S::get_mic_min_max_step(int &min, int &max, int &step)
1145
void RIG_TS590S::set_noise(bool val)
1147
if (nb_level == 0) {
1149
nb_label("NB 1", true);
1150
} else if (nb_level == 1) {
1152
nb_label("NB 2", true);
1153
} else if (nb_level == 2) {
1155
nb_label("NB", false);
1159
LOG_INFO("%s", cmd.c_str());
1160
sendCommand(cmd, 0);
1163
//======================================================================
1164
// IF shift command only available if the transceiver is in the CW mode
1165
// step size is 50 Hz
1166
//======================================================================
1167
void RIG_TS590S::set_if_shift(int val)
1169
if (active_mode == CW || active_mode == CWR) { // cw modes
1170
progStatus.shift_val = val;
1172
cmd.append(to_decimal(abs(val),4)).append(";");
1174
showresp(WARN, ASC, "set IF shift", cmd, replystr);
1178
bool RIG_TS590S::get_if_shift(int &val)
1180
if (active_mode == CW || active_mode == CWR) { // cw modes
1182
waitN(8, 100, "get IF shift", ASC);
1183
size_t p = replystr.rfind("IS");
1184
if (p != string::npos) {
1185
val = fm_decimal(&replystr[p+3], 4);
1187
val = progStatus.shift_val;
1190
val = progStatus.shift_val;
1194
void RIG_TS590S::get_if_min_max_step(int &min, int &max, int &step)
1196
if_shift_min = min = 300;
1197
if_shift_max = max = 1000;
1198
if_shift_step = step = 50;
1202
void RIG_TS590S::set_squelch(int val)
1205
cmd.append(to_decimal(abs(val),3)).append(";");
1207
showresp(WARN, ASC, "set squelch", cmd, replystr);
1210
int RIG_TS590S::get_squelch()
1214
int ret = waitN(7, 100, "get squelch", ASC);
1217
size_t p = replystr.rfind("SQ0");
1218
if (p == string::npos) return val;
1219
replystr[p + 6] = 0;
1220
val = atoi(&replystr[p + 3]);
1225
void RIG_TS590S::get_squelch_min_max_step(int &min, int &max, int &step)
1227
min = 0; max = 255; step = 1;
1230
void RIG_TS590S::set_rf_gain(int val)
1233
int rfval = 255 - val;
1234
for (int i = 4; i > 1; i--) {
1235
cmd[i] = rfval % 10 + '0';
1239
showresp(WARN, ASC, "SET rfgain", cmd, replystr);
1242
int RIG_TS590S::get_rf_gain()
1247
waitN(6, 100, "get rfgain", ASC);
1249
size_t p = replystr.rfind(rsp);
1250
if (p == string::npos) return progStatus.rfgain;
1251
for (int i = 2; i < 5; i++) {
1253
rfval += replystr[p+i] - '0';
1258
void RIG_TS590S::get_rf_min_max_step(int &min, int &max, int &step)
1265
void RIG_TS590S::set_noise_reduction(int val)
1268
if (noise_reduction_level == 1) {
1269
nr_label("NR1", true);
1270
} else if (noise_reduction_level == 2) {
1271
nr_label("NR2", true);
1275
if (noise_reduction_level == 0) {
1276
noise_reduction_level = 1;
1277
nr_label("NR1", true);
1278
} else if (noise_reduction_level == 1) {
1279
noise_reduction_level = 2;
1280
nr_label("NR2", true);
1281
} else if (noise_reduction_level == 2) {
1282
noise_reduction_level = 0;
1283
nr_label("NR", false);
1286
cmd += '0' + noise_reduction_level;
1288
showresp(WARN, ASC, "SET noise reduction", cmd, replystr);
1291
int RIG_TS590S::get_noise_reduction()
1295
waitN(4, 100, "GET noise reduction", ASC);
1296
size_t p = replystr.rfind(rsp);
1297
if (p == string::npos) return noise_reduction_level;
1298
noise_reduction_level = replystr[p+2] - '0';
1300
if (noise_reduction_level == 1) {
1301
nr_label("NR1", true);
1302
} else if (noise_reduction_level == 2) {
1303
nr_label("NR2", true);
1305
nr_label("NR", false);
1308
return noise_reduction_level;
1311
void RIG_TS590S::set_noise_reduction_val(int val)
1313
cmd.assign("RL").append(to_decimal(val, 2)).append(";");
1315
showresp(WARN, ASC, "SET_noise_reduction_val", cmd, replystr);
1318
int RIG_TS590S::get_noise_reduction_val()
1320
if (noise_reduction_level == 0) return 0;
1324
waitN(5, 100, "GET noise reduction val", ASC);
1325
size_t p = replystr.rfind(rsp);
1326
if (p == string::npos) return progStatus.noise_reduction_val;
1327
val = atoi(&replystr[p+2]);
1331
void RIG_TS590S::set_auto_notch(int v)
1333
cmd.assign("NT").append(v ? "1" : "0" ).append("0;");
1335
showresp(WARN, ASC, "SET Auto Notch", cmd, replystr);
1338
int RIG_TS590S::get_auto_notch()
1341
waitN(5, 100, "get auto notch", ASC);
1342
size_t p = replystr.rfind("NT");
1343
if (p == string::npos) return 0;
1344
if (replystr[p+2] == '1') return 1;
1348
void RIG_TS590S::set_notch(bool on, int val)
1351
cmd.assign("NT20;");
1353
showresp(WARN, ASC, "Set notch ON", cmd, replystr);
1354
int bp = (int)((val - 300.0) * 128.0 / 2700.0);
1355
cmd.assign("BP").append(to_decimal(bp, 3)).append(";");
1357
showresp(WARN, ASC, "set notch freq", cmd, replystr);
1359
cmd.assign("NT00;");
1361
showresp(WARN, ASC, "Set notch OFF", cmd, replystr);
1365
bool RIG_TS590S::get_notch(int &val)
1369
waitN(5, 100, "get notch state", ASC);
1370
size_t p = replystr.rfind("NT");
1371
if (p == string::npos)
1373
if (replystr[p+2] == '2') {
1375
waitN(6, 100, "get notch freq", ASC);
1376
size_t p = replystr.rfind("BP");
1377
if (p != string::npos)
1378
val = (int)((atoi(&replystr[p+2]) * 2700.0 / 128.0) + 300.0);
1384
void RIG_TS590S::get_notch_min_max_step(int &min, int &max, int &step)