17
static const char TS990name_[] = "TS-990";
19
static const char *TS990modes_[] = {
20
"LSB", "USB", "CW", "FM", "AM",
21
"FSK", "PSK", "CW-R", "FSK-R", "PSK-R",
22
"LSB-D1", "USB-D1", "FM-D1", "AM-D1",
23
"LSB-D2", "USB-D2", "FM-D2", "AM-D2",
24
"LSB-D3", "USB-D3", "FM-D3", "AM-D3", NULL};
26
static const char TS990_mode_chr[] = {
27
'1', '2', '3', '4', '5',
28
'6', 'A', '7', '9', 'B',
33
static const char TS990_mode_type[] = {
34
'L', 'U', 'U', 'U', 'U',
35
'U', 'U', 'L', 'U', 'U',
40
//==============================================================================
41
static const char *TS990_empty[] = { "N/A", NULL };
43
//==============================================================================
44
// SSB - Width / Shift filters
46
// BW indicates 0x8000 & (width << 8) & shift
47
// Maximum assignable BW value 0x910C
48
// Default BW value 0x9005
49
//==============================================================================
51
static const char *TS990_filt_width[] = {
52
"50", "80", "100", "150", "200",
53
"250", "300", "400", "500", "600",
54
"1000", "1500", "2000", "2200", "2400",
55
"2600", "2800", "3000", NULL };
57
static const char *TS990_CAT_filt_width[] = {
58
"00;", "01;", "02;", "03;", "04;",
59
"05;", "06;", "07;", "08;", "09;",
60
"10;", "11;", "12;", "13;", "14;",
61
"15;", "16;", "17;", NULL };
63
static const char *TS990_filt_width_tooltip = "filter width";
64
static const char *TS990_filt_width_label = "W";
66
static const char *TS990_filt_shift[] = {
67
"1000", "1100", "1200", "1300", "1400",
68
"1500", "1600", "1700", "1800", "1900",
69
"2000", "2100", "2210", NULL };
71
static const char *TS990_CAT_filt_shift[] = {
72
"00;", "01;", "02;", "03;", "04;",
73
"05;", "06;", "07;", "08;", "09;",
74
"10;", "11;", "12;", NULL };
76
static const char *TS990_filt_shift_tooltip = "shift frequency";
77
static const char *TS990_filt_shift_label = "S";
79
//==============================================================================
80
// SSB, FM, Other lo/hi cutoff filters
82
// BW indicates 0x8000 & (hi << 8) & lo
83
// Maximum assignable BW value 0x8D0B
84
// Default BW value 0x8A02 for SSB 3000 / 100
85
// Default BW value 0x8201 for FM 4000 / 200
86
//==============================================================================
88
static const char *TS990_filt_hi[] = {
89
"1000", "1200", "1400", "1600", "1800",
90
"2000", "2200", "2400", "2600", "2800",
91
"3000", "3400", "4000", "5000", NULL };
93
static const char *TS990_CAT_filt_hi[] = {
94
"00;", "01;", "02;", "03;", "04;",
95
"05;", "06;", "07;", "08;", "09;",
96
"10;", "11;", "12;", "13;", NULL };
98
static const char *TS990_filt_hi_tooltip = "hi cutoff";
99
static const char *TS990_filt_hi_label = "H";
101
static const char *TS990_filt_lo[] = {
102
"0", "50", "100", "200", "300",
103
"400", "500", "600", "700", "800",
104
"900", "1000", NULL };
106
static const char *TS990_CAT_filt_lo[] = {
107
"00;", "01;", "02;", "03;", "04;",
108
"05;", "06;", "07;", "08;", "09;",
109
"10;", "11;", NULL };
111
static const char *TS990_filt_lo_tooltip = "lo cutoff";
112
static const char *TS990_filt_lo_label = "L";
114
//==============================================================================
117
// BW indicates 0x8000 & (width << 8) & shift
118
// Maximum assignable BW value 0x8D20
119
// Default BW value 0x8810 --> no shift, bandwidth = 500 Hz
120
//==============================================================================
122
static const char *TS990_CW_width[] = {
123
"50", "80", "100", "150", "200",
124
"250", "300", "400", "500", "600",
125
"1000", "1500", "2000", "2500", NULL };
127
static const char *TS990_CAT_CW_width[] = {
128
"00;", "01;", "02;", "03;", "04;",
129
"05;", "06;", "07;", "08;", "09;",
130
"10;", "11;", "12;", "13;", NULL };
132
static const char *TS990_CW_W_tooltip = "filter width";
133
static const char *TS990_CW_W_btn_label = "W";
135
static const char *TS990_CW_shift[] = {
136
"-800", "-750", "-700", "-650", "-600",
137
"-550", "-500", "-450", "-400", "-350",
138
"-300", "-250", "-200", "-150", "-100",
139
"-50", "0", "50", "100", "150",
140
"200", "250", "300", "350", "400",
141
"450", "500", "550", "600", "650",
142
"700", "750", "800", NULL };
144
static const char *TS990_CAT_CW_shift[] = {
145
"00;", "01;", "02;", "03;", "04;",
146
"05;", "06;", "07;", "08;", "09;",
147
"10;", "11;", "12;", "13;", "14;",
148
"15;", "16;", "17;", "18;", "19;",
149
"20;", "21;", "22;", "23;", "24;",
150
"25;", "26;", "27;", "28;", "29;",
151
"30;", "31;", "32;", NULL };
153
static const char *TS990_CW_S_tooltip = "shift frequency";
154
static const char *TS990_CW_S_btn_label = "S";
156
//==============================================================================
158
static const char *TS990_AM_lo[] = {
159
"0", "100", "200", "300", NULL };
161
static const char *TS990_CAT_AM_lo[] = {
162
"00;", "01;", "02;", "03;", NULL};
164
static const char *TS990_AM_lo_tooltip = "lo cutoff";
165
static const char *TS990_AM_btn_lo_label = "L";
167
static const char *TS990_AM_hi[] = {
168
"2500", "3000", "4000", "5000", NULL };
170
static const char *TS990_CAT_AM_hi[] = {
171
"00;", "01;", "02;", "03;", NULL};
173
static const char *TS990_AM_hi_tooltip = "hi cutoff";
174
static const char *TS990_AM_btn_hi_label = "H";
176
//==============================================================================
178
static const char *TS990_FSK_filt[] = {
179
"250", "300", "400", "500", "1000", "1500", NULL};
181
static const char *TS990_CAT_FSK_filt[] = {
182
"00;", "01;", "02;", "03;", "04;", "05;", NULL };
184
//==============================================================================
186
static const char *TS990_PSK_filt[] = {
187
"50", "80", "100", "150", "200", "250", "300", "400", "500", "600",
188
"1000", "1500", NULL};
190
static const char *TS990_CAT_PSK_filt[] = {
191
"00;", "01;", "02;", "03;", "04;",
192
"05;", "06;", "07;", "08;", "09;",
193
"10;", "11;", NULL };
195
//==============================================================================
197
static GUI rig_widgets[]= {
198
{ (Fl_Widget *)btnVol, 2, 125, 50 },
199
{ (Fl_Widget *)sldrVOLUME, 54, 125, 156 },
200
{ (Fl_Widget *)sldrRFGAIN, 54, 145, 156 },
201
{ (Fl_Widget *)btnIFsh, 214, 105, 50 },
202
{ (Fl_Widget *)sldrIFSHIFT, 266, 105, 156 },
203
{ (Fl_Widget *)btnNotch, 214, 125, 50 },
204
{ (Fl_Widget *)sldrNOTCH, 266, 125, 156 },
205
{ (Fl_Widget *)sldrMICGAIN, 266, 145, 156 },
206
{ (Fl_Widget *)sldrPOWER, 266, 165, 156 },
207
{ (Fl_Widget *)btnNR, 2, 165, 50 },
208
{ (Fl_Widget *)sldrNR, 54, 165, 156 },
209
{ (Fl_Widget *)NULL, 0, 0, 0 }
212
static string menu_0001;
214
void RIG_TS990::initialize()
216
rig_widgets[0].W = btnVol;
217
rig_widgets[1].W = sldrVOLUME;
218
rig_widgets[2].W = sldrRFGAIN;
219
rig_widgets[3].W = btnIFsh;
220
rig_widgets[4].W = sldrIFSHIFT;
221
rig_widgets[5].W = btnNotch;
222
rig_widgets[6].W = sldrNOTCH;
223
rig_widgets[7].W = sldrMICGAIN;
224
rig_widgets[8].W = sldrPOWER;
225
rig_widgets[9].W = btnNR;
226
rig_widgets[10].W = sldrNR;
234
if (waitN(11, 100, "read ex 00100", ASC) == 11)
235
menu_0001 = replystr;
236
cmd = "EX00100 00"; // turn off beeps
247
set_menu_0607(false); // SSB uses lower/upper cutoff frequencies
248
set_menu_0608(true); // SSB data uses shift/width frequencies
250
A_default_SH_WI = 0x9005;
251
A_default_SH_WI_D1 = 0x8E05;
252
A_default_SH_WI_D2 = 0x8A05;
253
A_default_SH_WI_D3 = 0x8805;
254
A_default_HI_LO = 0x8A03;
255
A_default_FM = 0x8C05;
256
A_default_FM_D1 = 0x8903;
257
A_default_FM_D2 = 0x8707;
258
A_default_FM_D3 = 0x850B;
259
A_default_CW = 0x8810;
260
A_default_AM = 0x8201;
261
A_default_AM_D1 = 0x8202;
262
A_default_AM_D2 = 0x8102;
263
A_default_AM_D3 = 0x8002;
264
A_default_FSK = 0x0001;
265
A_default_PSK = 0x0006;
267
B_default_SH_WI = 0x9005;
268
B_default_SH_WI_D1 = 0x8E05;
269
B_default_SH_WI_D2 = 0x8A05;
270
B_default_SH_WI_D3 = 0x8805;
271
B_default_HI_LO = 0x8A03;
272
B_default_FM = 0x8C05;
273
B_default_FM_D1 = 0x8903;
274
B_default_FM_D2 = 0x8707;
275
B_default_FM_D3 = 0x850B;
276
B_default_CW = 0x8810;
277
B_default_AM = 0x8201;
278
B_default_AM_D1 = 0x8202;
279
B_default_AM_D2 = 0x8102;
280
B_default_AM_D3 = 0x8002;
281
B_default_FSK = 0x0001;
282
B_default_PSK = 0x0006;
285
void RIG_TS990::shutdown()
287
set_menu_0607(save_menu_0607);
288
set_menu_0608(save_menu_0608);
289
cmd = menu_0001; // restore beep level
293
//==============================================================================
295
RIG_TS990::RIG_TS990() {
298
modes_ = TS990modes_;
300
B.freq = A.freq = 14107500;
303
A.iBW = A_default_HI_LO;
305
B.iBW = B_default_HI_LO;
307
bandwidths_ = TS990_filt_hi;
309
dsp_lo = TS990_filt_lo;
310
lo_tooltip = TS990_filt_lo_tooltip;
311
lo_label = TS990_filt_lo_label;
313
dsp_hi = TS990_filt_hi;
314
hi_tooltip = TS990_filt_hi_label;
315
hi_label = TS990_filt_hi_label;
317
widgets = rig_widgets;
319
comm_baudrate = BR115200;
325
comm_rtsplus = false;
326
comm_dtrplus = false;
331
can_change_alt_vfo = true;
339
has_noise_reduction =
340
has_noise_reduction_control =
348
has_micgain_control =
353
has_attenuator_control =
356
has_bandwidth_control =
357
has_ifshift_control =
358
has_ptt_control = true;
366
//==============================================================================
368
void RIG_TS990::selectA()
372
showresp(INFO, ASC, "Rx A, Tx A", cmd, replystr);
378
get_volume_control();
380
get_noise_reduction_val();
385
void RIG_TS990::selectB()
389
showresp(INFO, ASC, "Rx B, Tx B", cmd, replystr);
395
get_volume_control();
397
get_noise_reduction_val();
402
//==============================================================================
404
// The TS990 actually has 4 attenuator settings.
405
// RA00; = Off, RA01; = 6dB, RA02; = 12dB, RA03; = 18dB
406
//==============================================================================
408
void RIG_TS990::set_attenuator(int val) {
411
if (att_level == 0) { // If attenuator level = 0 (off)
412
att_level = 1; // then turn it on, at 6dB
413
cmd = "RA11;"; // this is the command...
414
atten_label("Att 6", true); // show it in the button...
416
else if (att_level == 1) { // If attenuator level = 1 (6dB)
417
att_level = 2; // then make it 12dB
419
atten_label("Att 12", true);
420
} else if (att_level == 2) { // if it's 12dB
421
att_level = 3; // go to 18dB
423
atten_label("Att 18", true);
424
} else if (att_level == 3) { // If it's 18dB
425
att_level = 0; // Loop back to none.
427
atten_label("Att", false);
430
showresp(INFO, ASC, "set Att B", cmd, replystr);
433
if (att_level == 0) {
436
atten_label("Att 6", true);
438
else if (att_level == 1) {
441
atten_label("Att 12", true);
442
} else if (att_level == 2) {
445
atten_label("Att 18", true);
446
} else if (att_level == 3) {
449
atten_label("Att", false);
452
showresp(INFO, ASC, "set Att A", cmd, replystr);
456
//==============================================================================
457
// Modified to read and show the actual radio setting, in the button.
458
//==============================================================================
459
int RIG_TS990::get_attenuator() {
463
int ret = sendCommand(cmd);
464
showresp(INFO, ASC, "get Att B", cmd, replystr);
465
if (ret < 5) return att_on;
466
size_t p = replystr.rfind("RA");
467
if (p == string::npos) return att_on;
469
if (replystr[p + 2] == '1' && replystr[p + 3] == '0') {
470
att_on = 0; // Attenuator is OFF
471
att_level = 0; // remember it...
472
atten_label("Att", false); // show it...
473
} else if (replystr[p + 2] == '1' && replystr[p + 3] == '1') {
474
att_on = 1; // Attenuator is ON, 6dB
475
att_level = 1; // remember the level
476
atten_label("Att 6", true); // show it...
477
} else if (replystr[p + 2] == '1' && replystr[p + 3] == '2') {
478
att_on = 1; // .. still ON, 12dB
479
att_level = 2; // remember this level
480
atten_label("Att 12", true); // show it.
481
} else if (replystr[p + 2] == '1' && replystr[p + 3] == '3') {
482
att_on = 1; // .. still ON 18dB
483
att_level = 3; // remember...
484
atten_label("Att 18", true); // show this too..
488
int ret = sendCommand(cmd);
489
showresp(INFO, ASC, "get Att A", cmd, replystr);
490
if (ret < 5) return att_on;
491
size_t p = replystr.rfind("RA");
492
if (p == string::npos) return att_on;
494
if (replystr[p + 2] == '0' && replystr[p + 3] == '0') {
497
atten_label("Att", false);
498
} else if (replystr[p + 2] == '0' && replystr[p + 3] == '1') {
501
atten_label("Att 6", true);
502
} else if (replystr[p + 2] == '0' && replystr[p + 3] == '2') {
505
atten_label("Att 12", true);
506
} else if (replystr[p + 2] == '0' && replystr[p + 3] == '3') {
509
atten_label("Att 18", true);
516
//==============================================================================
518
//==============================================================================
520
void RIG_TS990::set_preamp(int val)
525
if (val) cmd = "PA11;";
530
if (val) cmd = "PA01;";
534
showresp(INFO, ASC, "set preamp", cmd, replystr);
537
int RIG_TS990::get_preamp()
541
int ret = waitN(5, 20, "get preamp", ASC);
542
if (ret < 5) return 0;
543
size_t p = replystr.rfind("PA");
544
if (p == string::npos) return 0;
546
if (replystr[p + 3] == '1')
553
int ret = waitN(5, 20, "get preamp", ASC);
554
if (ret < 5) return 0;
555
size_t p = replystr.rfind("PA");
556
if (p == string::npos) return 0;
558
if (replystr[p + 3] == '1')
567
//==============================================================================
569
void RIG_TS990::set_split(bool val)
576
showresp(INFO, ASC, "Rx on B, Tx on A", cmd, replystr);
580
showresp(INFO, ASC, "Rx on B, Tx on B", cmd, replystr);
586
showresp(INFO, ASC, "Rx on A, Tx on B", cmd, replystr);
590
showresp(INFO, ASC, "Rx on A, Tx on A", cmd, replystr);
593
Fl::awake(highlight_vfo, (void *)0);
597
int RIG_TS990::get_split()
605
waitN(4, 20, "get split tx vfo", ASC);
606
p = replystr.rfind(rsp);
607
if (p == string::npos) return split;
613
waitN(4, 20, "get split rx vfo", ASC);
615
p = replystr.rfind(rsp);
616
if (p == string::npos) return split;
619
split = (tx == '1' ? 2 : 0) + (rx == '1' ? 1 : 0);
624
//==============================================================================
625
const char * RIG_TS990::get_bwname_(int n, int md)
627
static char bwname[20];
629
int hi = (n >> 8) & 0x7F;
631
snprintf(bwname, sizeof(bwname), "%s/%s",
632
(md == LSB || md == USB || md == FM) ? TS990_filt_lo[lo] :
633
(md == AM || md == AMD1 || md == AMD2 || md == AMD3) ? TS990_AM_lo[lo] :
634
(md == CW ||md == CWR) ? TS990_CAT_CW_width [lo]:
635
(md == FSK ||md == FSKR) ? TS990_FSK_filt [lo]:
636
(md == PSK ||md == PSKR) ? TS990_PSK_filt [lo]:
637
TS990_filt_shift[lo],
638
(md == LSB || md == USB || md == FM) ? TS990_filt_hi[hi] :
639
(md == AM || md == AMD1 || md == AMD2 || md == AMD3) ? TS990_AM_hi[hi] :
640
(md == CW ||md == CWR) ? TS990_CAT_CW_shift [hi]:
641
(md == FSK ||md == FSKR) ? TS990_FSK_filt [hi]:
642
(md == PSK ||md == PSKR) ? TS990_PSK_filt [hi]:
643
TS990_filt_width[hi] );
648
//==============================================================================
649
// Get/Set VFO for A and B
650
//==============================================================================
652
long RIG_TS990::get_vfoA ()
655
int ret = waitN(14, 20, "get vfoA", ASC);
657
if (ret < 14) return A.freq;
658
size_t p = replystr.rfind("FA");
659
if (p == string::npos) return A.freq;
663
for (size_t n = 12; n > 1; n--) {
664
f += (replystr[p + n] - '0') * mul;
671
void RIG_TS990::set_vfoA (long freq)
674
cmd = "FA00000000000;";
675
for (int i = 12; i > 1; i--) {
680
showresp(INFO, ASC, "set vfo A", cmd, replystr);
683
long RIG_TS990::get_vfoB ()
686
int ret = waitN(14, 20, "get vfoB", ASC);
688
if (ret < 14) return B.freq;
689
size_t p = replystr.rfind("FB");
690
if (p == string::npos) return B.freq;
694
for (size_t n = 12; n > 1; n--) {
695
f += (replystr[p + n] - '0') * mul;
703
void RIG_TS990::set_vfoB (long freq)
706
cmd = "FB00000000000;";
707
for (int i = 12; i > 1; i--) {
712
showresp(INFO, ASC, "set vfo B", cmd, replystr);
715
//==============================================================================
717
//==============================================================================
719
int RIG_TS990::get_smeter()
724
int ret = waitN(8, 20, "get", ASC);
725
if (ret < 8) return 0;
726
size_t p = replystr.find("SM1");
727
if (p == string::npos) return 0;
729
mtr = atoi(&replystr[p + 3]);
732
if (mtr > 100) mtr = 100;
737
int ret = waitN(8, 20, "get", ASC);
738
if (ret < 8) return 0;
739
size_t p = replystr.find("SM0");
740
if (p == string::npos) return 0;
742
mtr = atoi(&replystr[p + 3]);
745
if (mtr > 100) mtr = 100;
750
//==============================================================================
752
//==============================================================================
754
int RIG_TS990::get_power_out()
759
int ret = waitN(8, 20, "get power", ASC);
760
if (ret < 8) return mtr;
761
size_t p = replystr.rfind("SM1");
762
if (p == string::npos) return mtr;
764
mtr = atoi(&replystr[p + 3]);
767
if (mtr > 200) mtr = 200;
772
int ret = waitN(8, 20, "get power", ASC);
773
if (ret < 8) return mtr;
774
size_t p = replystr.rfind("SM0");
775
if (p == string::npos) return mtr;
776
mtr = atoi(&replystr[p + 3]);
779
if (mtr > 200) mtr = 200;
784
//==============================================================================
786
//==============================================================================
788
static bool read_alc = false;
789
static int alc_val = 0;
791
int RIG_TS990::get_swr(void)
799
int ret = waitN(16, 20, "get swr/alc", ASC);
800
if (ret < 16) return 0;
802
size_t p = replystr.find("RM1");
803
if (p != string::npos) {
805
alc_val = atoi(&replystr[p + 3]);
808
if (alc_val > 100) alc_val = 100;
812
p = replystr.find("RM2");
813
if (p == string::npos) return 0;
816
mtr = atoi(&replystr[p + 3]);
819
if (mtr > 100) mtr = 100;
824
int RIG_TS990::get_alc(void)
831
int ret = waitN(8, 20, "get alc", ASC);
832
if (ret < 8) return 0;
834
size_t p = replystr.find("RM1");
835
if (p == string::npos) return 0;
838
alc_val = atoi(&replystr[p + 3]);
841
if (alc_val > 100) alc_val = 100;
845
//==============================================================================
846
// Transceiver power level
847
//==============================================================================
849
void RIG_TS990::set_power_control(double val)
853
for (int i = 4; i > 1; i--) {
860
int RIG_TS990::get_power_control()
863
int ret = waitN(6, 20, "get pwr ctrl", ASC);
865
if (ret < 6) return 0;
866
size_t p = replystr.rfind("PC");
867
if (p == string::npos) return 0;
871
mtr = atoi(&replystr[p + 2]);
877
//==============================================================================
878
// Volume control return 0 ... 100
879
//==============================================================================
881
int RIG_TS990::get_volume_control()
886
int ret = waitN(7, 20, "get vol ctrl", ASC);
888
if (ret < 7) return 0;
889
size_t p = replystr.rfind("AG");
890
if (p == string::npos) return 0;
893
int val = atoi(&replystr[p + 3]);
894
return (int)(val / 2.55);
899
int ret = waitN(7, 20, "get vol ctrl", ASC);
901
if (ret < 7) return 0;
902
size_t p = replystr.rfind("AG");
903
if (p == string::npos) return 0;
906
int val = atoi(&replystr[p + 3]);
907
return (int)(val / 2.55);
912
void RIG_TS990::set_volume_control(int val)
916
int ivol = (int)(val * 2.55);
918
for (int i = 5; i > 2; i--) {
926
int ivol = (int)(val * 2.55);
928
for (int i = 5; i > 2; i--) {
936
//==============================================================================
937
// Tranceiver PTT on/off
938
//==============================================================================
940
void RIG_TS990::set_PTT_control(int val)
952
//==============================================================================
954
//==============================================================================
956
void RIG_TS990::tune_rig()
962
//==============================================================================
964
//==============================================================================
966
void RIG_TS990::set_modeA(int val)
968
active_mode = A.imode = val;
970
cmd += TS990_mode_chr[val];
973
showresp(INFO, ASC, "set mode main band", cmd, replystr);
978
int RIG_TS990::get_modeA()
982
int ret = waitN(5, 20, "get mode main band", ASC);
983
if (ret < 5) return A.imode;
984
size_t p = replystr.rfind("OM");
985
if (p == string::npos) return A.imode;
987
// this switch statement can be replaced with
988
// md = replystr[p+3] - 1;
989
// if (md < LSB) md = LSB;
990
// if (md > AMD3) md = AMD3;
992
switch (replystr[p + 3]) {
993
case '1' : md = LSB; break;
994
case '2' : md = USB; break;
995
case '3' : md = CW; break;
996
case '4' : md = FM; break;
997
case '5' : md = AM; break;
998
case '6' : md = FSK; break;
999
case '7' : md = CWR; break;
1000
case '9' : md = FSKR; break;
1001
case 'A' : md = PSK; break;
1002
case 'B' : md = PSKR; break;
1003
case 'C' : md = LSBD1; break;
1004
case 'D' : md = USBD1; break;
1005
case 'E' : md = FMD1; break;
1006
case 'F' : md = AMD1; break;
1007
case 'G' : md = LSBD2; break;
1008
case 'H' : md = USBD2; break;
1009
case 'I' : md = FMD2; break;
1010
case 'J' : md = AMD2; break;
1011
case 'K' : md = LSBD3; break;
1012
case 'L' : md = USBD3; break;
1013
case 'M' : md = FMD3; break;
1014
case 'N' : md = AMD3; break;
1015
default : md = A.imode;
1017
if (md != A.imode) {
1018
active_mode = A.imode = md;
1025
void RIG_TS990::set_modeB(int val)
1027
active_mode = B.imode = val;
1029
cmd += TS990_mode_chr[val];
1031
sendCommand(cmd, 0);
1032
showresp(INFO, ASC, "set mode sub band", cmd, replystr);
1037
int RIG_TS990::get_modeB()
1042
int ret = waitN(5, 20, "get mode sub band", ASC);
1044
if (ret < 5) return B.imode;
1045
size_t p = replystr.rfind("OM");
1046
if (p == string::npos) return B.imode;
1048
// this switch statement can be replaced with
1049
// md = replystr[p+3] - 1;
1050
// if (md < LSB) md = LSB;
1051
// if (md > AMD3) md = AMD3;
1053
switch (replystr[p + 3]) {
1054
case '1' : md = LSB; break;
1055
case '2' : md = USB; break;
1056
case '3' : md = CW; break;
1057
case '4' : md = FM; break;
1058
case '5' : md = AM; break;
1059
case '6' : md = FSK; break;
1060
case '7' : md = CWR; break;
1061
case '9' : md = FSKR; break;
1062
case 'A' : md = PSK; break;
1063
case 'B' : md = PSKR; break;
1064
case 'C' : md = LSBD1; break;
1065
case 'D' : md = USBD1; break;
1066
case 'E' : md = FMD1; break;
1067
case 'F' : md = AMD1; break;
1068
case 'G' : md = LSBD2; break;
1069
case 'H' : md = USBD2; break;
1070
case 'I' : md = FMD2; break;
1071
case 'J' : md = AMD2; break;
1072
case 'K' : md = LSBD3; break;
1073
case 'L' : md = USBD3; break;
1074
case 'M' : md = FMD3; break;
1075
case 'N' : md = AMD3; break;
1076
default : md = B.imode;
1078
if (md != B.imode) {
1079
active_mode = B.imode = md;
1086
//==============================================================================
1088
//==============================================================================
1090
void RIG_TS990::set_mic_gain(int val)
1093
for (int i = 3; i > 0; i--) {
1094
cmd[1+i] += val % 10;
1097
sendCommand(cmd, 0);
1100
int RIG_TS990::get_mic_gain()
1104
int ret = waitN(6, 20, "get mic ctrl", ASC);
1107
size_t p = replystr.rfind("MG");
1108
if (p == string::npos) return val;
1109
replystr[p + 5] = 0;
1110
val = atoi(&replystr[p + 2]);
1115
void RIG_TS990::get_mic_min_max_step(int &min, int &max, int &step)
1122
//==============================================================================
1123
// Read/Write SSB and Data Mode Filter Settings
1124
//==============================================================================
1126
void RIG_TS990::read_menu_0607()
1128
save_menu_0607 = false;
1129
cmd = "EX00607;"; sendCommand(cmd);
1130
int ret = waitN(12, 20, "Read menu 0607", ASC);
1132
size_t p = replystr.rfind("EX00607");
1133
if (p != string::npos)
1134
save_menu_0607 = (replystr[p+10] == '1');
1138
void RIG_TS990::read_menu_0608()
1140
save_menu_0608 = false;
1141
cmd = "EX00608;"; sendCommand(cmd);
1142
int ret = waitN(12, 20, "Read menu 0608", ASC);
1144
size_t p = replystr.rfind("EX00608");
1145
if (p != string::npos)
1146
save_menu_0608 = (replystr[p+10] == '1');
1150
void RIG_TS990::set_menu_0607(int val)
1152
menu_0607 = (val != 0);
1154
cmd += menu_0607 ? "1" : "0";
1156
sendCommand(cmd, 0);
1159
void RIG_TS990::set_menu_0608(int val)
1161
menu_0608 = (val != 0);
1163
cmd += menu_0608 ? "1" : "0";
1165
sendCommand(cmd, 0);
1168
//==============================================================================
1169
// Bandpass filter commands
1170
//==============================================================================
1172
int RIG_TS990::set_widths(int val)
1175
if (useB) bw = B.iBW;
1180
bandwidths_ = TS990_filt_width;
1181
dsp_hi = TS990_filt_width;
1182
hi_tooltip = TS990_filt_width_tooltip;
1183
hi_label = TS990_filt_width_label;
1184
dsp_lo = TS990_filt_shift;
1185
lo_tooltip = TS990_filt_shift_tooltip;
1186
lo_label = TS990_filt_shift_label;
1188
bandwidths_ = TS990_filt_hi;
1189
dsp_lo = TS990_filt_lo;
1190
lo_tooltip = TS990_filt_lo_tooltip;
1191
lo_label = TS990_filt_lo_label;
1192
dsp_hi = TS990_filt_hi;
1193
hi_tooltip = TS990_filt_hi_tooltip;
1194
hi_label = TS990_filt_hi_label;
1197
case LSBD1: case LSBD2: case LSBD3:
1198
case USBD1: case USBD2: case USBD3:
1200
bandwidths_ = TS990_filt_width;
1201
dsp_hi = TS990_filt_width;
1202
hi_tooltip = TS990_filt_width_tooltip;
1203
hi_label = TS990_filt_width_label;
1204
dsp_lo = TS990_filt_shift;
1205
lo_tooltip = TS990_filt_shift_tooltip;
1206
lo_label = TS990_filt_shift_label;
1208
bandwidths_ = TS990_filt_hi;
1209
dsp_lo = TS990_filt_lo;
1210
lo_tooltip = TS990_filt_lo_tooltip;
1211
lo_label = TS990_filt_lo_label;
1212
dsp_hi = TS990_filt_hi;
1213
hi_tooltip = TS990_filt_hi_tooltip;
1214
hi_label = TS990_filt_hi_label;
1218
bandwidths_ = TS990_CW_width;
1219
dsp_hi = TS990_CW_width;
1220
hi_tooltip = TS990_CW_W_tooltip;
1221
hi_label = TS990_CW_W_btn_label;
1222
dsp_lo = TS990_CW_shift;
1223
lo_tooltip = TS990_CW_S_tooltip;
1224
lo_label = TS990_CW_S_btn_label;
1226
case FSK: case FSKR:
1227
bandwidths_ = TS990_FSK_filt;
1228
dsp_lo = TS990_empty;
1229
dsp_hi = TS990_empty;
1231
case PSK: case PSKR:
1232
bandwidths_ = TS990_PSK_filt;
1233
dsp_lo = TS990_empty;
1234
dsp_hi = TS990_empty;
1236
case AM: case AMD1: case AMD2: case AMD3:
1237
bandwidths_ = TS990_AM_hi;
1238
dsp_lo = TS990_AM_lo;
1239
dsp_hi = TS990_AM_hi;
1240
lo_tooltip = TS990_AM_lo_tooltip;
1241
lo_label = TS990_AM_btn_lo_label;
1242
hi_tooltip = TS990_AM_hi_tooltip;
1243
hi_label = TS990_AM_btn_hi_label;
1245
case FM: case FMD1: case FMD2: case FMD3:
1246
bandwidths_ = TS990_filt_hi;
1247
dsp_lo = TS990_filt_lo;
1248
dsp_hi = TS990_filt_hi;
1249
lo_tooltip = TS990_filt_lo_tooltip;
1250
lo_label = TS990_filt_lo_label;
1251
hi_tooltip = TS990_filt_hi_tooltip;
1252
hi_label = TS990_filt_hi_label;
1259
const char **RIG_TS990::bwtable(int m)
1261
const char **filter = TS990_filt_hi;
1265
filter = TS990_filt_width;
1267
filter = TS990_filt_hi;
1269
case FM: case FMD1: case FMD2: case FMD3:
1270
filter = TS990_filt_hi;
1272
case LSBD1: case LSBD2: case LSBD3:
1273
case USBD1: case USBD2: case USBD3:
1275
filter = TS990_filt_width;
1277
filter = TS990_filt_hi;
1279
case AM: case AMD1: case AMD2: case AMD3:
1280
filter = TS990_AM_hi;
1283
filter = TS990_CW_width;
1285
case FSK: case FSKR:
1286
filter = TS990_FSK_filt;
1288
case PSK: case PSKR:
1289
filter = TS990_PSK_filt;
1295
const char **RIG_TS990::lotable(int m)
1297
const char **filter = TS990_filt_lo;
1301
filter = TS990_filt_shift;
1303
filter = TS990_filt_lo;
1305
case FM: case FMD1: case FMD2: case FMD3:
1306
filter = TS990_filt_lo;
1308
case LSBD1: case LSBD2: case LSBD3:
1309
case USBD1: case USBD2: case USBD3:
1311
filter = TS990_filt_shift;
1313
filter = TS990_filt_lo;
1316
filter = TS990_CW_shift;
1318
case FSK: case FSKR:
1319
filter = TS990_FSK_filt;
1321
case PSK: case PSKR:
1322
filter = TS990_PSK_filt;
1324
case AM: case AMD1: case AMD2: case AMD3:
1325
filter = TS990_AM_lo;
1331
const char **RIG_TS990::hitable(int m)
1333
const char **filter = TS990_filt_hi;
1335
case LSB: case USB: case FM:
1337
filter = TS990_filt_width;
1339
filter = TS990_filt_hi;
1341
case LSBD1: case LSBD2: case LSBD3:
1342
case USBD1: case USBD2: case USBD3:
1344
filter = TS990_filt_width;
1346
filter = TS990_filt_hi;
1349
filter = TS990_CW_width;
1351
case FMD1: case FMD2: case FMD3:
1352
filter = TS990_filt_hi;
1354
case FSK: case FSKR:
1357
case PSK: case PSKR:
1360
case AM: case AMD1: case AMD2: case AMD3:
1361
filter = TS990_AM_hi;
1367
int RIG_TS990::adjust_bandwidth(int val)
1373
retval = menu_0607 ? B_default_SH_WI : B_default_HI_LO;
1375
retval = menu_0607 ? A_default_SH_WI : A_default_HI_LO;
1377
case LSBD1: case USBD1:
1379
retval = menu_0608 ? B_default_SH_WI_D1 : B_default_HI_LO;
1381
retval = menu_0608 ? A_default_SH_WI_D1 : A_default_HI_LO;
1383
case LSBD2: case USBD2:
1385
retval = menu_0608 ? B_default_SH_WI_D2 : B_default_HI_LO;
1387
retval = menu_0608 ? A_default_SH_WI_D2 : A_default_HI_LO;
1389
case LSBD3: case USBD3:
1391
retval = menu_0608 ? B_default_SH_WI_D3 : B_default_HI_LO;
1393
retval = menu_0608 ? A_default_SH_WI_D3 : A_default_HI_LO;
1396
retval = useB ? B_default_FM : A_default_FM;
1399
retval = useB ? B_default_FM_D1 : A_default_FM_D1;
1402
retval = useB ? B_default_FM_D2 : A_default_FM_D2;
1405
retval = useB ? B_default_FM_D3 : A_default_FM_D3;
1408
retval = useB ? B_default_AM : A_default_AM;
1411
retval = useB ? B_default_AM_D1 : A_default_AM_D1;
1414
retval = useB ? B_default_AM_D2 : A_default_AM_D2;
1417
retval = useB ? B_default_AM_D3 : A_default_AM_D3;
1420
retval = useB ? B_default_CW : A_default_CW;
1422
case FSK: case FSKR:
1423
retval = useB ? B_default_FSK : A_default_CW;
1425
case PSK: case PSKR:
1426
retval = useB ? B_default_PSK : A_default_PSK;
1432
int RIG_TS990::def_bandwidth(int val)
1434
return adjust_bandwidth(val);
1437
void RIG_TS990::set_bwA(int val)
1439
size_t lo = 0, hi = 0;
1442
if (val < 256) break;
1445
hi = (val >> 8) & 0x7F;
1446
if (hi >= sizeof(TS990_CAT_filt_width)/sizeof(*TS990_CAT_filt_width) ||
1447
lo >= sizeof(TS990_CAT_filt_shift)/sizeof(*TS990_CAT_filt_shift) )
1448
A.iBW = A_default_SH_WI;
1452
cmd += TS990_CAT_filt_width[(A.iBW >> 8) & 0x7F];
1454
showresp(INFO, ASC, "set filter width", cmd, replystr);
1456
cmd += TS990_CAT_filt_shift[A.iBW & 0x7F];
1458
showresp(INFO, ASC, "set filter shift", cmd, replystr);
1461
hi = (val >> 8) & 0x7F;
1462
if (hi >= sizeof(TS990_CAT_filt_hi)/sizeof(*TS990_CAT_filt_lo) ||
1463
lo >= sizeof(TS990_CAT_filt_lo)/sizeof(*TS990_CAT_filt_lo) )
1464
A.iBW = A_default_HI_LO;
1468
cmd += TS990_CAT_filt_lo[A.iBW & 0x7F];
1470
showresp(INFO, ASC, "set filter lower cutoff", cmd, replystr);
1472
cmd += TS990_CAT_filt_hi[(A.iBW >> 8) & 0x7F];
1474
showresp(INFO, ASC, "set filter upper cutoff", cmd, replystr);
1478
case LSBD1: case LSBD2: case LSBD3:
1479
case USBD1: case USBD2: case USBD3:
1480
if (val < 256) break;
1483
hi = (val >> 8) & 0x7F;
1484
if (hi >= sizeof(TS990_CAT_filt_width)/sizeof(*TS990_CAT_filt_width) ||
1485
lo >= sizeof(TS990_CAT_filt_shift)/sizeof(*TS990_CAT_filt_shift) )
1486
A.iBW = A_default_SH_WI;
1490
cmd += TS990_CAT_filt_width[(A.iBW >> 8) & 0x7F];
1492
showresp(INFO, ASC, "set data width", cmd, replystr);
1494
cmd += TS990_CAT_filt_shift[A.iBW & 0x7F];
1496
showresp(INFO, ASC, "set data shift", cmd, replystr);
1499
hi = (val >> 8) & 0x7F;
1500
if (hi >= sizeof(TS990_CAT_filt_hi)/sizeof(*TS990_CAT_filt_lo) ||
1501
lo >= sizeof(TS990_CAT_filt_lo)/sizeof(*TS990_CAT_filt_lo) )
1502
A.iBW = A_default_HI_LO;
1506
cmd += TS990_CAT_filt_lo[A.iBW & 0x7F];
1508
showresp(INFO, ASC, "set data lower cutoff", cmd, replystr);
1510
cmd += TS990_CAT_filt_hi[(A.iBW >> 8) & 0x7F];
1512
showresp(INFO, ASC, "set data upper cutoff", cmd, replystr);
1516
case AM: case AMD1: case AMD2: case AMD3:
1517
if (val < 256) break;
1519
hi = (val >> 8) & 0x7F;
1520
if (hi >= sizeof(TS990_CAT_AM_hi) / sizeof(*TS990_CAT_AM_hi) ||
1521
lo >= sizeof(TS990_CAT_AM_lo) / sizeof(*TS990_CAT_AM_lo) )
1522
A.iBW = A_default_AM;
1526
cmd += TS990_CAT_AM_lo[A.iBW & 0x7F];
1528
showresp(INFO, ASC, "set AM lower", cmd, replystr);
1530
cmd += TS990_CAT_AM_hi[(A.iBW >> 8) & 0x7F];
1532
showresp(INFO, ASC, "set AM upper", cmd, replystr);
1535
case FM: case FMD1: case FMD2: case FMD3:
1536
if (val < 256) break;
1538
hi = (val >> 8) & 0x7F;
1539
if (hi >= sizeof(TS990_CAT_filt_hi) / sizeof(*TS990_CAT_filt_hi) ||
1540
lo >= sizeof(TS990_CAT_filt_lo) / sizeof(*TS990_CAT_filt_lo) )
1541
A.iBW = A_default_FM;
1545
cmd += TS990_CAT_filt_lo[A.iBW & 0x7F];
1547
showresp(INFO, ASC, "set FM lower", cmd, replystr);
1549
cmd += TS990_CAT_filt_hi[(A.iBW >> 8) & 0x7F];
1551
showresp(INFO, ASC, "set FM upper", cmd, replystr);
1555
if (val < 256) break;
1557
hi = (val >> 8) & 0x7F;
1558
if (hi >= sizeof(TS990_CAT_CW_width) / sizeof(*TS990_CAT_CW_width) ||
1559
lo >= sizeof(TS990_CAT_CW_shift) / sizeof(*TS990_CAT_CW_shift) )
1560
A.iBW = A_default_CW;
1564
cmd += TS990_CAT_CW_width[(A.iBW >> 8) & 0x7F];
1566
showresp(INFO, ASC, "set cw width", cmd, replystr);
1568
cmd += TS990_CAT_CW_shift[A.iBW & 0x7F];
1570
showresp(INFO, ASC, "set cw shift", cmd, replystr);
1573
case FSK: case FSKR:
1574
if (val > 256) break;
1576
if (lo >= sizeof(TS990_CAT_FSK_filt) / sizeof(*TS990_CAT_FSK_filt))
1577
A.iBW = A_default_FSK;
1581
cmd += TS990_CAT_FSK_filt[A.iBW];
1583
showresp(INFO, ASC, "set FSK bw", cmd, replystr);
1586
case PSK: case PSKR:
1587
if (val > 256) break;
1589
if (lo >= sizeof(TS990_CAT_PSK_filt) / sizeof(*TS990_CAT_PSK_filt))
1590
A.iBW = A_default_PSK;
1594
cmd += TS990_CAT_PSK_filt[A.iBW];
1596
showresp(INFO, ASC, "set PSK bw", cmd, replystr);
1601
void RIG_TS990::set_bwB(int val)
1603
size_t lo = 0, hi = 0;
1606
if (val < 256) break;
1609
hi = (val >> 8) & 0x7F;
1610
if (hi >= sizeof(TS990_CAT_filt_width)/sizeof(*TS990_CAT_filt_width) ||
1611
lo >= sizeof(TS990_CAT_filt_shift)/sizeof(*TS990_CAT_filt_shift) )
1612
B.iBW = B_default_SH_WI;
1616
cmd += TS990_CAT_filt_width[(B.iBW >> 8) & 0x7F];
1618
showresp(INFO, ASC, "set filter width", cmd, replystr);
1620
cmd += TS990_CAT_filt_shift[B.iBW & 0x7F];
1622
showresp(INFO, ASC, "set filter shift", cmd, replystr);
1625
hi = (val >> 8) & 0x7F;
1626
if (hi >= sizeof(TS990_CAT_filt_hi)/sizeof(*TS990_CAT_filt_lo) ||
1627
lo >= sizeof(TS990_CAT_filt_lo)/sizeof(*TS990_CAT_filt_lo) )
1628
B.iBW = B_default_HI_LO;
1632
cmd += TS990_CAT_filt_lo[B.iBW & 0x7F];
1634
showresp(INFO, ASC, "set filter lower cutoff", cmd, replystr);
1636
cmd += TS990_CAT_filt_hi[(B.iBW >> 8) & 0x7F];
1638
showresp(INFO, ASC, "set filter upper cutoff", cmd, replystr);
1642
case LSBD1: case LSBD2: case LSBD3:
1643
case USBD1: case USBD2: case USBD3:
1644
if (val < 256) break;
1647
hi = (val >> 8) & 0x7F;
1648
if (hi >= sizeof(TS990_CAT_filt_width)/sizeof(*TS990_CAT_filt_width) ||
1649
lo >= sizeof(TS990_CAT_filt_shift)/sizeof(*TS990_CAT_filt_shift) )
1650
B.iBW = B_default_SH_WI;
1654
cmd += TS990_CAT_filt_width[(B.iBW >> 8) & 0x7F];
1656
showresp(INFO, ASC, "set data width", cmd, replystr);
1658
cmd += TS990_CAT_filt_shift[B.iBW & 0x7F];
1660
showresp(INFO, ASC, "set data shift", cmd, replystr);
1663
hi = (val >> 8) & 0x7F;
1664
if (hi >= sizeof(TS990_CAT_filt_hi)/sizeof(*TS990_CAT_filt_lo) ||
1665
lo >= sizeof(TS990_CAT_filt_lo)/sizeof(*TS990_CAT_filt_lo) )
1666
B.iBW = B_default_HI_LO;
1670
cmd += TS990_CAT_filt_lo[B.iBW & 0x7F];
1672
showresp(INFO, ASC, "set data lower cutoff", cmd, replystr);
1674
cmd += TS990_CAT_filt_hi[(B.iBW >> 8) & 0x7F];
1676
showresp(INFO, ASC, "set data upper cutoff", cmd, replystr);
1680
case AM: case AMD1: case AMD2: case AMD3:
1681
if (val < 256) break;
1683
hi = (val >> 8) & 0x7F;
1684
if (hi >= sizeof(TS990_CAT_AM_hi) / sizeof(*TS990_CAT_AM_hi) ||
1685
lo >= sizeof(TS990_CAT_AM_lo) / sizeof(*TS990_CAT_AM_lo) )
1686
B.iBW = B_default_AM;
1690
cmd += TS990_CAT_AM_lo[B.iBW & 0x7F];
1692
showresp(INFO, ASC, "set AM lower", cmd, replystr);
1694
cmd += TS990_CAT_AM_hi[(B.iBW >> 8) & 0x7F];
1696
showresp(INFO, ASC, "set AM upper", cmd, replystr);
1699
case FM: case FMD1: case FMD2: case FMD3:
1700
if (val < 256) break;
1702
hi = (val >> 8) & 0x7F;
1703
if (hi >= sizeof(TS990_CAT_filt_hi) / sizeof(*TS990_CAT_filt_hi) ||
1704
lo >= sizeof(TS990_CAT_filt_lo) / sizeof(*TS990_CAT_filt_lo) )
1705
B.iBW = B_default_FM;
1709
cmd += TS990_CAT_filt_lo[B.iBW & 0x7F];
1711
showresp(INFO, ASC, "set FM lower", cmd, replystr);
1713
cmd += TS990_CAT_filt_hi[(B.iBW >> 8) & 0x7F];
1715
showresp(INFO, ASC, "set FM upper", cmd, replystr);
1719
if (val < 256) break;
1721
hi = (val >> 8) & 0x7F;
1722
if (hi >= sizeof(TS990_CAT_CW_width) / sizeof(*TS990_CAT_CW_width) ||
1723
lo >= sizeof(TS990_CAT_CW_shift) / sizeof(*TS990_CAT_CW_shift) )
1724
B.iBW = B_default_CW;
1728
cmd += TS990_CAT_CW_width[(B.iBW >> 8) & 0x7F];
1730
showresp(INFO, ASC, "set cw width", cmd, replystr);
1732
cmd += TS990_CAT_CW_shift[B.iBW & 0x7F];
1734
showresp(INFO, ASC, "set cw shift", cmd, replystr);
1737
case FSK: case FSKR:
1738
if (val > 256) break;
1740
if (lo >= sizeof(TS990_CAT_FSK_filt) / sizeof(*TS990_CAT_FSK_filt))
1741
B.iBW = B_default_FSK;
1745
cmd += TS990_CAT_FSK_filt[B.iBW];
1747
showresp(INFO, ASC, "set FSK bw", cmd, replystr);
1750
case PSK: case PSKR:
1751
if (val > 256) break;
1753
if (lo >= sizeof(TS990_CAT_PSK_filt) / sizeof(*TS990_CAT_PSK_filt))
1754
B.iBW = B_default_PSK;
1758
cmd += TS990_CAT_PSK_filt[B.iBW];
1760
showresp(INFO, ASC, "set PSK bw", cmd, replystr);
1765
int RIG_TS990::get_bwA()
1772
A.iBW = A_default_CW;
1774
hi = (A.iBW >> 8) & 0x7F;
1776
waitN(6, 20, "get CW width", ASC);
1777
p = replystr.rfind("SL");
1778
if (p == string::npos) break;
1779
hi = fm_decimal(&replystr[3], 2); //2 2
1781
waitN(6, 20, "get CW shift", ASC);
1782
p = replystr.rfind("SH");
1783
if (p == string::npos) break;
1784
lo = fm_decimal(&replystr[3], 2); //2 2
1785
A_default_CW = A.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
1788
case FSK: case FSKR:
1789
A.iBW = A_default_FSK;
1792
waitN(6, 20, "get FSK Width", ASC);
1793
p = replystr.rfind("SL");
1794
if (p == string::npos) break;
1795
lo = fm_decimal(&replystr[3], 2); //2 2
1796
A_default_FSK = A.iBW = (lo & 0x7F);
1799
case PSK: case PSKR:
1800
A.iBW = A_default_PSK;
1803
waitN(6, 20, "get PSK Width", ASC);
1804
p = replystr.rfind("SL");
1805
if (p == string::npos) break;
1806
lo = fm_decimal(&replystr[3], 2); //2 2
1807
A_default_PSK = A.iBW = (lo & 0x7F);
1812
hi = (A.iBW >> 8) & 0x7F;
1814
A.iBW = A_default_SH_WI;
1816
waitN(6, 20, "get filter width", ASC);
1817
p = replystr.rfind("SL");
1818
if (p == string::npos) break;
1819
hi = fm_decimal(&replystr[3], 2); //2 2
1821
waitN(6, 20, "get filter shift", ASC);
1822
p = replystr.rfind("SH");
1823
if (p == string::npos) break;
1824
lo = fm_decimal(&replystr[3], 2); //2 2
1825
A_default_SH_WI = A.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
1827
A.iBW = A_default_HI_LO;
1829
waitN(6, 20, "get filter lower cutoff", ASC);
1830
p = replystr.rfind("SL");
1831
if (p == string::npos) break;
1832
lo = fm_decimal(&replystr[3], 2); //2 2
1834
waitN(6, 20, "get filter upper cutoff", ASC);
1835
p = replystr.rfind("SH");
1836
if (p == string::npos) break;
1837
hi = fm_decimal(&replystr[3], 2); //2 2
1838
A_default_HI_LO = A.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
1842
case LSBD1: case USBD1:
1844
hi = (A.iBW >> 8) & 0x7F;
1846
A.iBW = A_default_SH_WI_D1;
1848
waitN(6, 20, "get filter width", ASC);
1849
p = replystr.rfind("SL");
1850
if (p == string::npos) break;
1851
hi = fm_decimal(&replystr[3], 2); //2 2
1853
waitN(6, 20, "get filter shift", ASC);
1854
p = replystr.rfind("SH");
1855
if (p == string::npos) break;
1856
lo = fm_decimal(&replystr[3], 2); //2
1857
A_default_SH_WI_D1 = A.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
1860
A.iBW = A_default_HI_LO;
1862
waitN(6, 20, "get filter lower cutoff", ASC);
1863
p = replystr.rfind("SL");
1864
if (p == string::npos) break;
1865
lo = fm_decimal(&replystr[3], 2); //2 2
1867
waitN(6, 20, "get filter upper cutoff", ASC);
1868
p = replystr.rfind("SH");
1869
if (p == string::npos) break;
1870
hi = fm_decimal(&replystr[3], 2); //2 2
1871
A_default_HI_LO = A.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
1875
case LSBD2: case USBD2:
1877
hi = (A.iBW >> 8) & 0x7F;
1879
A.iBW = A_default_SH_WI_D2;
1881
waitN(6, 20, "get filter width", ASC);
1882
p = replystr.rfind("SL");
1883
if (p == string::npos) break;
1884
hi = fm_decimal(&replystr[3], 2); //2 2
1886
waitN(6, 20, "get filter shift", ASC);
1887
p = replystr.rfind("SH");
1888
if (p == string::npos) break;
1889
lo = fm_decimal(&replystr[3], 2); //2
1890
A_default_SH_WI_D2 = A.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
1893
A.iBW = A_default_HI_LO;
1895
waitN(6, 20, "get filter lower cutoff", ASC);
1896
p = replystr.rfind("SL");
1897
if (p == string::npos) break;
1898
lo = fm_decimal(&replystr[3], 2); //2 2
1900
waitN(6, 20, "get filter upper cutoff", ASC);
1901
p = replystr.rfind("SH");
1902
if (p == string::npos) break;
1903
hi = fm_decimal(&replystr[3], 2); //2 2
1904
A_default_HI_LO = A.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
1908
case LSBD3: case USBD3:
1910
hi = (A.iBW >> 8) & 0x7F;
1912
A.iBW = A_default_SH_WI_D3;
1914
waitN(6, 20, "get filter width", ASC);
1915
p = replystr.rfind("SL");
1916
if (p == string::npos) break;
1917
hi = fm_decimal(&replystr[3], 2); //2 2
1919
waitN(6, 20, "get filter shift", ASC);
1920
p = replystr.rfind("SH");
1921
if (p == string::npos) break;
1922
lo = fm_decimal(&replystr[3], 2); //2
1923
A_default_SH_WI_D3 = A.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
1926
A.iBW = A_default_HI_LO;
1928
waitN(6, 20, "get filter lower cutoff", ASC);
1929
p = replystr.rfind("SL");
1930
if (p == string::npos) break;
1931
lo = fm_decimal(&replystr[3], 2); //2 2
1933
waitN(6, 20, "get filter upper cutoff", ASC);
1934
p = replystr.rfind("SH");
1935
if (p == string::npos) break;
1936
hi = fm_decimal(&replystr[3], 2); //2 2
1937
A_default_HI_LO = A.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
1942
A.iBW = A_default_AM;
1944
hi = (A.iBW >> 8) & 0x7F;
1946
waitN(6, 20, "get AM lo", ASC);
1947
p = replystr.rfind("SL");
1948
if (p == string::npos) break;
1949
lo = fm_decimal(&replystr[3], 2); //2 2
1951
waitN(6, 20, "get AM hi", ASC);
1952
p = replystr.rfind("SH");
1953
if (p == string::npos) break;
1954
hi = fm_decimal(&replystr[3], 2); //2 2
1955
A_default_AM = A.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
1959
A.iBW = A_default_AM_D1;
1961
hi = (A.iBW >> 8) & 0x7F;
1963
waitN(6, 20, "get AM lo", ASC);
1964
p = replystr.rfind("SL");
1965
if (p == string::npos) break;
1966
lo = fm_decimal(&replystr[3], 2); //2 2
1968
waitN(6, 20, "get AM hi", ASC);
1969
p = replystr.rfind("SH");
1970
if (p == string::npos) break;
1971
hi = fm_decimal(&replystr[3], 2); //2 2
1972
A_default_AM_D1 = A.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
1976
A.iBW = A_default_AM_D2;
1978
hi = (A.iBW >> 8) & 0x7F;
1980
waitN(6, 20, "get AM lo", ASC);
1981
p = replystr.rfind("SL");
1982
if (p == string::npos) break;
1983
lo = fm_decimal(&replystr[3], 2); //2 2
1985
waitN(6, 20, "get AM hi", ASC);
1986
p = replystr.rfind("SH");
1987
if (p == string::npos) break;
1988
hi = fm_decimal(&replystr[3], 2); //2 2
1989
A_default_AM_D2 = A.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
1993
A.iBW = A_default_AM_D3;
1995
hi = (A.iBW >> 8) & 0x7F;
1997
waitN(6, 20, "get AM lo", ASC);
1998
p = replystr.rfind("SL");
1999
if (p == string::npos) break;
2000
lo = fm_decimal(&replystr[3], 2); //2 2
2002
waitN(6, 20, "get AM hi", ASC);
2003
p = replystr.rfind("SH");
2004
if (p == string::npos) break;
2005
hi = fm_decimal(&replystr[3], 2); //2 2
2006
A_default_AM_D3 = A.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2010
A.iBW = A_default_FM;
2012
hi = (A.iBW >> 8) & 0x7F;
2014
waitN(6, 20, "get FM lo", ASC);
2015
p = replystr.rfind("SL");
2016
if (p == string::npos) break;
2017
lo = fm_decimal(&replystr[3], 2); //2 2
2019
waitN(6, 20, "get FM hi", ASC);
2020
p = replystr.rfind("SH");
2021
if (p == string::npos) break;
2022
hi = fm_decimal(&replystr[3], 2); //2 2
2023
A_default_FM = A.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2027
A.iBW = A_default_FM_D1;
2029
hi = (A.iBW >> 8) & 0x7F;
2031
waitN(6, 20, "get FM lo", ASC);
2032
p = replystr.rfind("SL");
2033
if (p == string::npos) break;
2034
lo = fm_decimal(&replystr[3], 2); //2 2
2036
waitN(6, 20, "get FM hi", ASC);
2037
p = replystr.rfind("SH");
2038
if (p == string::npos) break;
2039
hi = fm_decimal(&replystr[3], 2); //2 2
2040
A_default_FM_D1 = A.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2044
A.iBW = A_default_FM_D2;
2046
hi = (A.iBW >> 8) & 0x7F;
2048
waitN(6, 20, "get FM lo", ASC);
2049
p = replystr.rfind("SL");
2050
if (p == string::npos) break;
2051
lo = fm_decimal(&replystr[3], 2); //2 2
2053
waitN(6, 20, "get FM hi", ASC);
2054
p = replystr.rfind("SH");
2055
if (p == string::npos) break;
2056
hi = fm_decimal(&replystr[3], 2); //2 2
2057
A_default_FM_D2 = A.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2061
A.iBW = A_default_FM_D3;
2063
hi = (A.iBW >> 8) & 0x7F;
2065
waitN(6, 20, "get FM lo", ASC);
2066
p = replystr.rfind("SL");
2067
if (p == string::npos) break;
2068
lo = fm_decimal(&replystr[3], 2); //2 2
2070
waitN(6, 20, "get FM hi", ASC);
2071
p = replystr.rfind("SH");
2072
if (p == string::npos) break;
2073
hi = fm_decimal(&replystr[3], 2); //2 2
2074
A_default_FM_D3 = A.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2080
int RIG_TS990::get_bwB()
2087
B.iBW = B_default_CW;
2089
hi = (B.iBW >> 8) & 0x7F;
2091
waitN(6, 20, "get CW lower", ASC);
2092
p = replystr.rfind("SL");
2093
if (p == string::npos) break;
2094
lo = fm_decimal(&replystr[3], 2); //2 2
2096
waitN(6, 20, "get CW upper", ASC);
2097
p = replystr.rfind("SH");
2098
if (p == string::npos) break;
2099
hi = fm_decimal(&replystr[3], 2); //2 2
2100
B_default_CW = B.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
2103
case FSK: case FSKR:
2104
B.iBW = B_default_FSK;
2107
waitN(6, 20, "get FSK Width", ASC);
2108
p = replystr.rfind("SL");
2109
if (p == string::npos) break;
2110
lo = fm_decimal(&replystr[3], 2); //2 2
2111
B_default_FSK = B.iBW = (lo & 0x7F);
2114
case PSK: case PSKR:
2115
B.iBW = B_default_PSK;
2118
waitN(6, 20, "get PSK Width", ASC);
2119
p = replystr.rfind("SL");
2120
if (p == string::npos) break;
2121
lo = fm_decimal(&replystr[3], 2); //2 2
2122
B_default_PSK = B.iBW = (lo & 0x7F);
2127
hi = (B.iBW >> 8) & 0x7F;
2129
B.iBW = B_default_SH_WI;
2131
waitN(6, 20, "get filter width", ASC);
2132
p = replystr.rfind("SL");
2133
if (p == string::npos) break;
2134
hi = fm_decimal(&replystr[3], 2); //2 2
2136
waitN(6, 20, "get filter shift", ASC);
2137
p = replystr.rfind("SH");
2138
if (p == string::npos) break;
2139
lo = fm_decimal(&replystr[3], 2); //2 2
2140
B_default_SH_WI = B.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
2142
B.iBW = B_default_HI_LO;
2144
waitN(6, 20, "get filter lower cutoff", ASC);
2145
p = replystr.rfind("SL");
2146
if (p == string::npos) break;
2147
lo = fm_decimal(&replystr[3], 2); //2 2
2149
waitN(6, 20, "get filter upper cutoff", ASC);
2150
p = replystr.rfind("SH");
2151
if (p == string::npos) break;
2152
hi = fm_decimal(&replystr[3], 2); //2 2
2153
B_default_HI_LO = B.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
2157
case LSBD1: case USBD1:
2159
hi = (B.iBW >> 8) & 0x7F;
2161
B.iBW = B_default_SH_WI_D1;
2163
waitN(6, 20, "get filter width", ASC);
2164
p = replystr.rfind("SL");
2165
if (p == string::npos) break;
2166
hi = fm_decimal(&replystr[3], 2); //2 2
2168
waitN(6, 20, "get filter shift", ASC);
2169
p = replystr.rfind("SH");
2170
if (p == string::npos) break;
2171
lo = fm_decimal(&replystr[3], 2); //2 2
2172
B_default_SH_WI_D1 = B.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
2174
B.iBW = B_default_HI_LO;
2176
waitN(6, 20, "get filter lower cutoff", ASC);
2177
p = replystr.rfind("SL");
2178
if (p == string::npos) break;
2179
lo = fm_decimal(&replystr[3], 2); //2 2
2181
waitN(6, 20, "get fiter upper cutoff", ASC);
2182
p = replystr.rfind("SH");
2183
if (p == string::npos) break;
2184
hi = fm_decimal(&replystr[3], 2); //2 2
2185
B_default_HI_LO = B.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
2189
case LSBD2: case USBD2:
2191
hi = (B.iBW >> 8) & 0x7F;
2193
B.iBW = B_default_SH_WI_D2;
2195
waitN(6, 20, "get filter width", ASC);
2196
p = replystr.rfind("SL");
2197
if (p == string::npos) break;
2198
hi = fm_decimal(&replystr[3], 2); //2 2
2200
waitN(6, 20, "get filter shift", ASC);
2201
p = replystr.rfind("SH");
2202
if (p == string::npos) break;
2203
lo = fm_decimal(&replystr[3], 2); //2 2
2204
B_default_SH_WI_D2 = B.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
2206
B.iBW = B_default_HI_LO;
2208
waitN(6, 20, "get filter lower cutoff", ASC);
2209
p = replystr.rfind("SL");
2210
if (p == string::npos) break;
2211
lo = fm_decimal(&replystr[3], 2); //2 2
2213
waitN(6, 20, "get fiter upper cutoff", ASC);
2214
p = replystr.rfind("SH");
2215
if (p == string::npos) break;
2216
hi = fm_decimal(&replystr[3], 2); //2 2
2217
B_default_HI_LO = B.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
2221
case LSBD3: case USBD3:
2223
hi = (B.iBW >> 8) & 0x7F;
2225
B.iBW = B_default_SH_WI_D3;
2227
waitN(6, 20, "get filter width", ASC);
2228
p = replystr.rfind("SL");
2229
if (p == string::npos) break;
2230
hi = fm_decimal(&replystr[3], 2); //2 2
2232
waitN(6, 20, "get filter shift", ASC);
2233
p = replystr.rfind("SH");
2234
if (p == string::npos) break;
2235
lo = fm_decimal(&replystr[3], 2); //2 2
2236
B_default_SH_WI_D3 = B.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
2238
B.iBW = B_default_HI_LO;
2240
waitN(6, 20, "get filter lower cutoff", ASC);
2241
p = replystr.rfind("SL");
2242
if (p == string::npos) break;
2243
lo = fm_decimal(&replystr[3], 2); //2 2
2245
waitN(6, 20, "get fiter upper cutoff", ASC);
2246
p = replystr.rfind("SH");
2247
if (p == string::npos) break;
2248
hi = fm_decimal(&replystr[3], 2); //2 2
2249
B_default_HI_LO = B.iBW = ((hi << 8) | (lo & 0x7F )) | 0x8000;
2254
B.iBW = B_default_AM;
2256
hi = (B.iBW >> 8) & 0x7F;
2258
waitN(6, 20, "get AM lo", ASC);
2259
p = replystr.rfind("SL");
2260
if (p == string::npos) break;
2261
lo = fm_decimal(&replystr[3], 2); //2 2
2263
waitN(6, 20, "get AM hi", ASC);
2264
p = replystr.rfind("SH");
2265
if (p == string::npos) break;
2266
hi = fm_decimal(&replystr[3], 2); //2 2
2267
B_default_AM = B.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2271
B.iBW = B_default_AM_D1;
2273
hi = (B.iBW >> 8) & 0x7F;
2275
waitN(6, 20, "get AM lo", ASC);
2276
p = replystr.rfind("SL");
2277
if (p == string::npos) break;
2278
lo = fm_decimal(&replystr[3], 2); //2 2
2280
waitN(6, 20, "get AM hi", ASC);
2281
p = replystr.rfind("SH");
2282
if (p == string::npos) break;
2283
hi = fm_decimal(&replystr[3], 2); //2 2
2284
B_default_AM_D1 = B.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2288
B.iBW = B_default_AM_D2;
2290
hi = (B.iBW >> 8) & 0x7F;
2292
waitN(6, 20, "get AM lo", ASC);
2293
p = replystr.rfind("SL");
2294
if (p == string::npos) break;
2295
lo = fm_decimal(&replystr[3], 2); //2 2
2297
waitN(6, 20, "get AM hi", ASC);
2298
p = replystr.rfind("SH");
2299
if (p == string::npos) break;
2300
hi = fm_decimal(&replystr[3], 2); //2 2
2301
B_default_AM_D2 = B.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2305
B.iBW = B_default_AM_D3;
2307
hi = (B.iBW >> 8) & 0x7F;
2309
waitN(6, 20, "get AM lo", ASC);
2310
p = replystr.rfind("SL");
2311
if (p == string::npos) break;
2312
lo = fm_decimal(&replystr[3], 2); //2 2
2314
waitN(6, 20, "get AM hi", ASC);
2315
p = replystr.rfind("SH");
2316
if (p == string::npos) break;
2317
hi = fm_decimal(&replystr[3], 2); //2 2
2318
B_default_AM_D3 = B.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2322
B.iBW = B_default_FM;
2324
hi = (B.iBW >> 8) & 0x7F;
2326
waitN(6, 20, "get FM lo", ASC);
2327
p = replystr.rfind("SL");
2328
if (p == string::npos) break;
2329
lo = fm_decimal(&replystr[3], 2); //2 2
2331
waitN(6, 20, "get FM hi", ASC);
2332
p = replystr.rfind("SH");
2333
if (p == string::npos) break;
2334
hi = fm_decimal(&replystr[3], 2); //2 2
2335
B_default_FM = B.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2339
B.iBW = B_default_FM_D1;
2341
hi = (B.iBW >> 8) & 0x7F;
2343
waitN(6, 20, "get FM lo", ASC);
2344
p = replystr.rfind("SL");
2345
if (p == string::npos) break;
2346
lo = fm_decimal(&replystr[3], 2); //2 2
2348
waitN(6, 20, "get FM hi", ASC);
2349
p = replystr.rfind("SH");
2350
if (p == string::npos) break;
2351
hi = fm_decimal(&replystr[3], 2); //2 2
2352
B_default_FM_D1 = B.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2356
B.iBW = B_default_FM_D2;
2358
hi = (B.iBW >> 8) & 0x7F;
2360
waitN(6, 20, "get FM lo", ASC);
2361
p = replystr.rfind("SL");
2362
if (p == string::npos) break;
2363
lo = fm_decimal(&replystr[3], 2); //2 2
2365
waitN(6, 20, "get FM hi", ASC);
2366
p = replystr.rfind("SH");
2367
if (p == string::npos) break;
2368
hi = fm_decimal(&replystr[3], 2); //2 2
2369
B_default_FM_D2 = B.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2373
B.iBW = B_default_FM_D3;
2375
hi = (B.iBW >> 8) & 0x7F;
2377
waitN(6, 20, "get FM lo", ASC);
2378
p = replystr.rfind("SL");
2379
if (p == string::npos) break;
2380
lo = fm_decimal(&replystr[3], 2); //2 2
2382
waitN(6, 20, "get FM hi", ASC);
2383
p = replystr.rfind("SH");
2384
if (p == string::npos) break;
2385
hi = fm_decimal(&replystr[3], 2); //2 2
2386
B_default_FM_D3 = B.iBW = ((hi << 8) | (lo & 0x7F)) | 0x8000;
2392
int RIG_TS990::get_modetype(int n)
2394
return TS990_mode_type[n];
2397
void RIG_TS990::set_noise(bool val) //Now Setting AGC
2400
if (nb_level == 2) {
2402
nb_label("AGC F", false);
2404
sendCommand(cmd, 0);
2405
} else if (nb_level == 3) {
2407
nb_label("AGC S", false);
2409
sendCommand(cmd, 0);
2410
} else if (nb_level == 1) {
2412
nb_label("AGC M", false);
2414
sendCommand(cmd, 0);
2417
if (nb_level == 2) {
2419
nb_label("AGC F", false);
2421
sendCommand(cmd, 0);
2422
} else if (nb_level == 3) {
2424
nb_label("AGC S", false);
2426
sendCommand(cmd, 0);
2427
} else if (nb_level == 1) {
2429
nb_label("AGC M", false);
2431
sendCommand(cmd, 0);
2436
//----------------------------------------------------------------------
2437
int RIG_TS990::get_agc()
2442
int ret = sendCommand(cmd);
2443
showresp(INFO, ASC, "get AGC", cmd, replystr);
2444
if (ret < 5) return val;
2445
size_t p = replystr.rfind("GC");
2446
if (p == string::npos) return val;
2447
if (replystr[p + 3] == '1' ) {
2448
nb_label("AGC S", false);
2449
} else if (replystr[p + 3] == '2' ) {
2450
nb_label("AGC M", false);
2451
} else if (replystr[p + 3] == '3' ) {
2452
nb_label("AGC F", false);
2456
int ret = sendCommand(cmd);
2457
showresp(INFO, ASC, "get AGC", cmd, replystr);
2458
if (ret < 5) return val;
2459
size_t p = replystr.rfind("GC");
2460
if (p == string::npos) return val;
2461
if (replystr[p + 3] == '1' ) {
2462
nb_label("AGC S", false);
2463
} else if (replystr[p + 3] == '2' ) {
2464
nb_label("AGC M", false);
2465
} else if (replystr[p + 3] == '3' ) {
2466
nb_label("AGC F", false);
2472
//==============================================================================
2474
void RIG_TS990::set_squelch(int val)
2478
cmd.append(to_decimal(abs(val),3)).append(";");
2480
showresp(INFO, ASC, "set squelch", cmd, replystr);
2483
cmd.append(to_decimal(abs(val),3)).append(";");
2485
showresp(INFO, ASC, "set squelch", cmd, replystr);
2489
int RIG_TS990::get_squelch()
2494
int ret = waitN(7, 20, "get squelch", ASC);
2496
size_t p = replystr.rfind("SQ1");
2497
if (p == string::npos) return val;
2498
replystr[p + 6] = 0;
2499
val = atoi(&replystr[p + 3]);
2503
int ret = waitN(7, 20, "get squelch", ASC);
2505
size_t p = replystr.rfind("SQ0");
2506
if (p == string::npos) return val;
2507
replystr[p + 6] = 0;
2508
val = atoi(&replystr[p + 3]);
2514
void RIG_TS990::get_squelch_min_max_step(int &min, int &max, int &step)
2516
min = 0; max = 255; step = 1;
2519
void RIG_TS990::set_rf_gain(int val)
2523
cmd.append(to_decimal(val,3)).append(";");
2525
showresp(INFO, ASC, "set rf gain", cmd, replystr);
2528
cmd.append(to_decimal(val,3)).append(";");
2530
showresp(INFO, ASC, "set rf gain", cmd, replystr);
2534
int RIG_TS990::get_rf_gain()
2536
int val = progStatus.rfgain;
2539
int ret = waitN(7, 20, "get rf gain", ASC);
2540
if (ret < 7) return val;
2541
size_t p = replystr.rfind("RG");
2542
if (p != string::npos)
2543
val = fm_decimal(&replystr[p+3], 3);
2546
int ret = waitN(7, 20, "get rf gain", ASC);
2547
if (ret < 7) return val;
2548
size_t p = replystr.rfind("RG");
2549
if (p != string::npos)
2550
val = fm_decimal(&replystr[p+3], 3);
2555
void RIG_TS990::get_rf_min_max_step(int &min, int &max, int &step)
2562
static bool nr_on = false;
2564
void RIG_TS990::set_noise_reduction(int val)
2567
cmd.assign("NR1").append(val ? "1" : "0" ).append(";");
2569
showresp(INFO, ASC, "SET noise reduction", cmd, replystr);
2570
if (val) nr_on = true;
2573
cmd.assign("NR0").append(val ? "1" : "0" ).append(";");
2575
showresp(INFO, ASC, "SET noise reduction", cmd, replystr);
2576
if (val) nr_on = true;
2581
int RIG_TS990::get_noise_reduction()
2587
waitN(5, 20, "GET noise reduction", ASC);
2588
size_t p = replystr.rfind(rsp);
2589
if (p == string::npos) return val;
2590
val = replystr[p+3] - '0';
2591
if (val == 1) nr_on = true;
2597
waitN(5, 20, "GET noise reduction", ASC);
2598
size_t p = replystr.rfind(rsp);
2599
if (p == string::npos) return val;
2600
val = replystr[p+3] - '0';
2601
if (val == 1) nr_on = true;
2607
void RIG_TS990::set_noise_reduction_val(int val)
2610
cmd.assign("RL11").append(to_decimal(val, 2)).append(";");
2612
showresp(INFO, ASC, "SET_noise_reduction_val", cmd, replystr);
2614
cmd.assign("RL10").append(to_decimal(val, 2)).append(";");
2616
showresp(INFO, ASC, "SET_noise_reduction_val", cmd, replystr);
2620
int RIG_TS990::get_noise_reduction_val()
2624
if (!nr_on) return val;
2627
waitN(7, 20, "GET noise reduction val", ASC);
2628
size_t p = replystr.rfind(rsp);
2629
if (p == string::npos) return val;
2630
val = fm_decimal(&replystr[p+4], 2);
2632
if (!nr_on) return val;
2635
waitN(7, 20, "GET noise reduction val", ASC);
2636
size_t p = replystr.rfind(rsp);
2637
if (p == string::npos) return val;
2638
val = fm_decimal(&replystr[p+4], 2);
2643
void RIG_TS990::set_auto_notch(int v)
2646
cmd.assign("NT1").append(v ? "1" : "0" ).append(";");
2648
showresp(INFO, ASC, "SET Auto Notch", cmd, replystr);
2650
cmd.assign("NT0").append(v ? "1" : "0" ).append(";");
2652
showresp(INFO, ASC, "SET Auto Notch", cmd, replystr);
2656
int RIG_TS990::get_auto_notch()
2661
waitN(5, 20, "get auto notch", ASC);
2662
size_t p = replystr.rfind("NT");
2663
if (p == string::npos) return val;
2664
if (replystr[p+3] == '1') val = 1;
2667
waitN(5, 20, "get auto notch", ASC);
2668
size_t p = replystr.rfind("NT");
2669
if (p == string::npos) return val;
2670
if (replystr[p+3] == '1') val = 1;
2675
void RIG_TS990::set_notch(bool on, int val)
2679
cmd.assign("NT12;");
2681
showresp(INFO, ASC, "Set notch ON", cmd, replystr);
2682
int bp = (int)(val * 127.0 / 3000);
2683
if (bp == 0) bp = 1;
2684
cmd.assign("BP1").append(to_decimal(bp, 3)).append(";");
2686
showresp(INFO, ASC, "set notch freq", cmd, replystr);
2688
cmd.assign("NT10;");
2690
showresp(INFO, ASC, "Set notch OFF", cmd, replystr);
2694
cmd.assign("NT02;");
2696
showresp(INFO, ASC, "Set notch ON", cmd, replystr);
2697
int bp = (int)(val * 127.0 / 3000);
2698
if (bp == 0) bp = 1;
2699
cmd.assign("BP0").append(to_decimal(bp, 3)).append(";");
2701
showresp(INFO, ASC, "set notch freq", cmd, replystr);
2703
cmd.assign("NT00;");
2705
showresp(INFO, ASC, "Set notch OFF", cmd, replystr);
2710
bool RIG_TS990::get_notch(int &val)
2715
waitN(5, 20, "get notch state", ASC);
2716
size_t p = replystr.rfind("NT");
2717
if (p == string::npos)
2719
if (replystr[p+3] == '2') {
2721
waitN(7, 20, "get notch freq", ASC);
2722
size_t p = replystr.rfind("BP1");
2723
if (p != string::npos)
2724
val = (int)(atoi(&replystr[p+3]) * 3000 / 127.0);
2731
waitN(5, 20, "get notch state", ASC);
2732
size_t p = replystr.rfind("NT");
2733
if (p == string::npos)
2735
if (replystr[p+3] == '2') {
2737
waitN(7, 20, "get notch freq", ASC);
2738
size_t p = replystr.rfind("BP0");
2739
if (p != string::npos)
2740
val = (int)(atoi(&replystr[p+3]) * 3000.0 / 127.0);
2748
void RIG_TS990::get_notch_min_max_step(int &min, int &max, int &step)
2756
//==============================================================================
2758
void RIG_TS990::set_if_shift(int val) //Now doing Monitor
2760
progStatus.shift_val = val;
2762
cmd.append(to_decimal(val,3)).append(";");
2764
showresp(INFO, ASC, "set Mon Level", cmd, replystr);
2767
bool RIG_TS990::get_if_shift(int &val)
2770
waitN(6, 20, "get Mon Level", ASC);
2771
size_t p = replystr.rfind("ML");
2772
if (p != string::npos) {
2773
val = fm_decimal(&replystr[p+2], 3);
2776
val = progStatus.shift_val;
2781
void RIG_TS990::get_if_min_max_step(int &min, int &max, int &step)
2783
if_shift_min = min = 0;
2784
if_shift_max = max = 255;
2785
if_shift_step = step = 1;