6
* Copyright 2009, Dave Freese, W1HKJ
12
bool DEBUG_7200 = true;
14
//=============================================================================
17
const char IC7200name_[] = "IC-7200";
18
const char *IC7200modes_[] = {
19
"LSB", "USB", "AM", "CW", "RTTY", "CW-R", "RTTY-R",
20
"LSB-D", "USB-D", NULL};
22
const char IC7200_mode_type[] = {
23
'L', 'U', 'U', 'L', 'L', 'U', 'U',
26
const char *IC7200_SSBwidths[] = {
27
"50", "100", "150", "200", "250", "300", "350", "400", "450", "500",
28
"600", "700", "800", "900", "1000", "1100", "1200", "1300", "1400", "1500",
29
"1600", "1700", "1800", "1900", "2000", "2100", "2200", "2300", "2400", "2500",
30
"2600", "2700", "2800", "2900", "3000", "3100", "3200", "3300", "3400", "3500",
34
const char *IC7200_RTTYwidths[] = {
35
"50", "100", "150", "200", "250", "300", "350", "400", "450", "500",
36
"600", "700", "800", "900", "1000", "1100", "1200", "1300", "1400", "1500",
37
"1600", "1700", "1800", "1900", "2000", "2100", "2200", "2300", "2400", "2500",
41
const char *IC7200_AMwidths[] = {
42
"200", "400", "600", "800", "1000", "1200", "1400", "1600", "1800", "2000",
43
"2200", "2400", "2600", "2800", "3000", "3200", "3400", "3600", "3800", "4000",
44
"4200", "4400", "4600", "4800", "5000", "5200", "5400", "5600", "5800", "5000",
45
"6200", "6400", "6600", "6800", "6000", "6200", "6400", "6600", "6800", "6000",
48
static GUI rig_widgets[]= {
49
{ (Fl_Widget *)btnVol, 2, 125, 50 },
50
{ (Fl_Widget *)sldrVOLUME, 54, 125, 156 },
51
{ (Fl_Widget *)sldrRFGAIN, 54, 145, 156 },
52
{ (Fl_Widget *)sldrMICGAIN, 54, 165, 156 },
53
{ (Fl_Widget *)sldrSQUELCH, 266, 125, 156 },
54
{ (Fl_Widget *)btnNR, 214, 145, 50 },
55
{ (Fl_Widget *)sldrNR, 266, 145, 156 },
56
{ (Fl_Widget *)sldrPOWER, 266, 165, 156 },
57
{ (Fl_Widget *)NULL, 0, 0, 0 }
60
//======================================================================
61
// IC7200 unique commands
62
//======================================================================
64
RIG_IC7200::RIG_IC7200() {
66
modes_ = IC7200modes_;
67
_mode_type = IC7200_mode_type;
68
bandwidths_ = IC7200_SSBwidths;
69
widgets = rig_widgets;
71
comm_baudrate = BR9600;
96
has_sql_control = true;
97
has_power_control = true;
98
has_volume_control = true;
99
has_mode_control = true;
100
has_bandwidth_control = true;
101
has_micgain_control = true;
102
has_attenuator_control = true;
103
has_preamp_control = true;
104
has_noise_control = true;
105
has_noise_reduction = true;
106
has_noise_reduction_control = true;
107
has_auto_notch = true;
108
has_rf_control = true;
110
has_vox_onoff = true;
111
has_ptt_control = true;
112
has_tune_control = true;
115
adjustCIV(defaultCIV);
122
void RIG_IC7200::initialize()
124
rig_widgets[0].W = btnVol;
125
rig_widgets[1].W = sldrVOLUME;
126
rig_widgets[2].W = sldrRFGAIN;
127
rig_widgets[3].W = sldrMICGAIN;
128
rig_widgets[4].W = sldrSQUELCH;
129
rig_widgets[5].W = btnNR;
130
rig_widgets[6].W = sldrNR;
131
rig_widgets[7].W = sldrPOWER;
134
//=============================================================================
135
void RIG_IC7200::selectA()
144
void RIG_IC7200::selectB()
153
long RIG_IC7200::get_vfoA ()
155
string resp = pre_fm;
160
if (waitFOR(11, "get vfo A")) {
161
size_t p = replystr.rfind(resp);
162
if (p != string::npos)
163
A.freq = fm_bcd_be(&replystr[p+5], 10);
168
void RIG_IC7200::set_vfoA (long freq)
173
cmd.append( to_bcd_be( freq, 10 ) );
178
long RIG_IC7200::get_vfoB ()
180
string resp = pre_fm;
185
if (waitFOR(11, "get vfo B")) {
186
size_t p = replystr.rfind(resp);
187
if (p != string::npos)
188
B.freq = fm_bcd_be(&replystr[p+5], 10);
193
void RIG_IC7200::set_vfoB (long freq)
199
cmd.append( to_bcd_be( freq, 10 ) );
204
void RIG_IC7200::set_split(bool b)
208
cmd += b ? '\x01' : '\x00';
213
// Tranceiver PTT on/off
214
void RIG_IC7200::set_PTT_control(int val)
219
cmd += (unsigned char) val;
225
// Volume control val 0 ... 100
226
void RIG_IC7200::set_volume_control(int val)
228
int ICvol = (int)(val * 255 / 100);
230
cmd.append("\x14\x01");
231
cmd.append(to_bcd(ICvol, 3));
236
int RIG_IC7200::get_volume_control()
238
string cstr = "\x14\x01";
239
string resp = pre_fm;
244
if (waitFOR(9, "get vol")) {
245
size_t p = replystr.rfind(resp);
246
if (p != string::npos)
247
return (int)ceil(fm_bcd(&replystr[p + 6],3) * 100 / 255);
249
return progStatus.volume;
252
void RIG_IC7200::get_vol_min_max_step(int &min, int &max, int &step)
254
min = 0; max = 100; step = 1;
257
int RIG_IC7200::get_smeter()
259
string cstr = "\x15\x02";
260
string resp = pre_fm;
266
if (waitFOR(9, "get smeter")) {
267
size_t p = replystr.rfind(resp);
268
if (p != string::npos) {
269
mtr = fm_bcd(&replystr[p+6], 3);
270
mtr = (int)ceil(mtr /2.55);
271
if (mtr > 100) mtr = 100;
277
int RIG_IC7200::get_power_out(void)
279
string cstr = "\x15\x11";
280
string resp = pre_fm;
286
if (waitFOR(9, "get power out")) {
287
size_t p = replystr.rfind(resp);
288
if (p != string::npos) {
289
mtr = fm_bcd(&replystr[p+6], 3);
290
mtr = (int)ceil(mtr /2.55);
291
if (mtr > 100) mtr = 100;
297
int RIG_IC7200::get_swr(void)
299
string cstr = "\x15\x12";
300
string resp = pre_fm;
306
if (waitFOR(9, "get swr")) {
307
size_t p = replystr.rfind(resp);
308
if (p != string::npos) {
309
mtr = fm_bcd(&replystr[p+6], 3);
310
mtr = (int)ceil(mtr /2.55);
311
if (mtr > 100) mtr = 100;
317
int RIG_IC7200::get_alc(void)
319
string cstr = "\x15\x13";
320
string resp = pre_fm;
326
if (waitFOR(9, "get alc")) {
327
size_t p = replystr.rfind(resp);
328
if (p != string::npos) {
329
mtr = fm_bcd(&replystr[p+6], 3);
330
mtr = (int)ceil(mtr /2.55);
331
if (mtr > 100) mtr = 100;
337
void RIG_IC7200::set_attenuator(int val)
341
cmd += val ? '\x20' : '\x00';
346
void RIG_IC7200::set_noise(bool val)
349
cmd.append("\x16\x22");
355
int RIG_IC7200::get_noise()
357
string cstr = "\x16\x22";
358
string resp = pre_fm;
363
if (waitFOR(8, "get noise")) {
364
size_t p = replystr.rfind(resp);
365
if (p != string::npos)
366
return (replystr[p+6] ? 1 : 0);
368
return progStatus.noise;
371
void RIG_IC7200::set_noise_reduction(int val)
374
cmd.append("\x16\x40");
380
int RIG_IC7200::get_noise_reduction()
382
string cstr = "\x16\x40";
383
string resp = pre_fm;
388
if (waitFOR(8, "get NR")) {
389
size_t p = replystr.rfind(resp);
390
if (p != string::npos)
391
return (replystr[p+6] ? 1 : 0);
393
return progStatus.noise_reduction;
397
void RIG_IC7200::set_noise_reduction_val(int val)
400
cmd.append("\x14\x06");
401
cmd.append(to_bcd(val * 255 / 100, 3));
406
int RIG_IC7200::get_noise_reduction_val()
408
string cstr = "\x14\x06";
409
string resp = pre_fm;
414
if (waitFOR(9, "get NRval")) {
415
size_t p = replystr.rfind(resp);
416
if (p != string::npos)
417
return (int)ceil(fm_bcd(&replystr[p+6],3) * 100 / 255);
419
return progStatus.noise_reduction_val;
422
void RIG_IC7200::set_preamp(int val)
427
cmd += (unsigned char)val;
432
int RIG_IC7200::get_preamp()
434
string cstr = "\x16\x02";
435
string resp = pre_fm;
440
if (waitFOR(8, "get Pre")) {
441
size_t p = replystr.rfind(resp);
442
if (p != string::npos) {
443
if (replystr[p+6] == 0x01) {
444
preamp_label("Pre", true);
447
preamp_label("Pre", false);
452
return progStatus.preamp;
455
void RIG_IC7200::set_rf_gain(int val)
457
int ICrfg = (int)(val * 255 / 100);
459
cmd.append("\x14\x02");
460
cmd.append(to_bcd(ICrfg, 3));
465
int RIG_IC7200::get_rf_gain()
467
string cstr = "\x14\x02";
468
string resp = pre_fm;
470
cmd.append(cstr).append(post);
472
if (waitFOR(9, "get RF")) {
473
size_t p = replystr.rfind(resp);
474
if (p != string::npos)
475
return (int)ceil(fm_bcd(&replystr[p + 6],3) * 100 / 255);
477
return progStatus.rfgain;
480
void RIG_IC7200::set_squelch(int val)
482
int ICsql = (int)(val * 255 / 100);
484
cmd.append("\x14\x03");
485
cmd.append(to_bcd(ICsql, 3));
490
int RIG_IC7200::get_squelch()
492
string cstr = "\x14\x03";
493
string resp = pre_fm;
498
if (waitFOR(9, "get squelch")) {
499
size_t p = replystr.rfind(resp);
500
if (p != string::npos)
501
return (int)ceil(fm_bcd(&replystr[p+6], 3) * 100 / 255);
503
return progStatus.squelch;
506
void RIG_IC7200::set_power_control(double val)
509
cmd.append("\x14\x0A");
510
cmd.append(to_bcd((int)(val * 255 / 100), 3));
515
int RIG_IC7200::get_power_control()
517
string cstr = "\x14\x0A";
518
string resp = pre_fm;
520
cmd.append(cstr).append(post);
522
if (waitFOR(9, "get power")) {
523
size_t p = replystr.rfind(resp);
524
if (p != string::npos)
525
return (int)ceil(fm_bcd(&replystr[p + 6],3) * 100 / 255);
527
return progStatus.power_level;
530
void RIG_IC7200::get_mic_gain_min_max_step(int &min, int &max, int &step)
537
int RIG_IC7200::get_mic_gain()
539
string cstr = "\x14\x0B";
540
string resp = pre_fm;
545
if (waitFOR(9, "get mic")) {
546
size_t p = replystr.rfind(resp);
547
if (p != string::npos)
548
return (int)ceil(fm_bcd(&replystr[p+6],3) / 2.55);
553
void RIG_IC7200::set_mic_gain(int val)
555
val = (int)(val * 255 / 100);
557
cmd.append("\x14\x0B");
558
cmd.append(to_bcd(val,3));
563
int RIG_IC7200::get_modeA()
566
string resp = pre_fm;
571
if (waitFOR(8, "get mode A")) {
572
size_t p = replystr.rfind(resp);
573
if (p != string::npos) {
574
md = replystr[p + 5];
576
A.iBW = replystr[p + 6];
584
if (waitFOR(9, "data mode?")) {
585
size_t p = replystr.rfind(resp);
586
if (p != string::npos) {
587
if ((replystr[p+6] & 0x01) == 0x01) {
593
return (A.imode = md);
596
void RIG_IC7200::set_modeA(int val)
599
if (val > 6) val -= 7;
602
cmd += val > 4 ? val + 2 : val;
604
waitFB("set mode A");
607
cmd += '\x1A'; cmd += '\x04';
608
if (A.imode > 6) cmd += '\x01';
614
int RIG_IC7200::get_modeB()
620
string resp = pre_fm;
622
if (waitFOR(8, "get mode B")) {
623
size_t p = replystr.rfind(resp);
624
if (p != string::npos) {
627
B.iBW = replystr[p+6];
635
if (waitFOR(9, "get data B")) {
636
size_t p = replystr.rfind(resp);
637
if (p != string::npos) {
638
if ((replystr[p+6] & 0x01) == 0x01) {
644
return (B.imode = md);
647
void RIG_IC7200::set_modeB(int val)
650
if (val > 6) val -= 7;
653
cmd += val > 4 ? val + 2 : val;
655
waitFB("set mode B");
658
cmd += '\x1A'; cmd += '\x04';
659
if (B.imode > 6) cmd += '\x01';
665
int RIG_IC7200::get_modetype(int n)
667
return _mode_type[n];
670
int RIG_IC7200::adjust_bandwidth(int m)
674
bandwidths_ = IC7200_AMwidths;
679
bandwidths_ = IC7200_SSBwidths;
684
bandwidths_ = IC7200_RTTYwidths;
692
bandwidths_ = IC7200_SSBwidths;
698
int RIG_IC7200::def_bandwidth(int m)
700
return adjust_bandwidth(m);
703
const char ** RIG_IC7200::bwtable(int m)
707
return IC7200_AMwidths;
711
return IC7200_SSBwidths;
715
return IC7200_RTTYwidths;
722
return IC7200_SSBwidths;
724
return IC7200_SSBwidths;
727
void RIG_IC7200::set_bwA(int val)
731
cmd.append("\x1A\x02");
732
cmd.append(to_bcd(val, 2));
737
int RIG_IC7200::get_bwA()
742
string resp = pre_fm;
744
if (waitFOR(8, "get BW A")) {
745
size_t p = replystr.rfind(resp);
746
if (p != string::npos)
747
A.iBW = (fm_bcd(&replystr[p+6],2));
752
void RIG_IC7200::set_bwB(int val)
756
cmd.append("\x1A\x02");
757
cmd.append(to_bcd(val, 2));
762
int RIG_IC7200::get_bwB()
767
string resp = pre_fm;
769
if (waitFOR(8, "get BW B")) {
770
size_t p = replystr.rfind(resp);
771
if (p != string::npos)
772
B.iBW = (fm_bcd(&replystr[p+6],2));
777
void RIG_IC7200::set_auto_notch(int val)
782
cmd += (unsigned char)val;
787
int RIG_IC7200::get_auto_notch()
789
string cstr = "\x16\x41";
790
string resp = pre_fm;
795
if (waitFOR(8, "get AN")) {
796
size_t p = replystr.rfind(resp);
797
if (p != string::npos) {
798
if (replystr[p+6] == 0x01) {
799
auto_notch_label("AN", true);
802
auto_notch_label("AN", false);
807
return progStatus.auto_notch;
810
void RIG_IC7200::set_compression()
812
if (progStatus.compON) {
814
cmd.append("\x16\x44");
817
waitFB("set Comp ON");
820
cmd.append("\x16\x44");
823
waitFB("set Comp OFF");
827
void RIG_IC7200::set_vox_onoff()
829
if (progStatus.vox_onoff) {
831
cmd.append("\x16\x46");
834
waitFB("set Vox ON");
837
cmd.append("\x16\x46");
840
waitFB("set Vox OFF");
844
void RIG_IC7200::tune_rig()
847
cmd.append("\x1c\x01\x02");