6
* Copyright 2009, Dave Freese, W1HKJ
10
#include "IC756PRO2.h"
14
const char IC756PRO2name_[] = "IC-756PRO-II";
16
//=============================================================================
17
const char *IC756PRO2modes_[] = {
18
"LSB", "USB", "AM", "CW", "RTTY", "FM", "CW-R", "RTTY-R",
19
"D-LSB", "D-USB", "D-FM", NULL};
21
const char IC756PRO2_mode_type[] =
22
{ 'L', 'U', 'U', 'U', 'L', 'U', 'L', 'U',
25
const char *IC756PRO2_SSBwidths[] = {
26
"50", "100", "150", "200", "250", "300", "350", "400", "450", "500",
27
"600", "700", "800", "900", "1000", "1100", "1200", "1300", "1400", "1500",
28
"1600", "1700", "1800", "1900", "2000", "2100", "2200", "2300", "2400", "2500",
29
"2600", "2700", "2800", "2900", "3000", "3100", "3200", "3300", "3400", "3500",
33
const char *IC756PRO2_RTTYwidths[] = {
34
"50", "100", "150", "200", "250", "300", "350", "400", "450", "500",
35
"600", "700", "800", "900", "1000", "1100", "1200", "1300", "1400", "1500",
36
"1600", "1700", "1800", "1900", "2000", "2100", "2200", "2300", "2400", "2500",
40
const char *IC756PRO2_AMFMwidths[] = { "FILT-1", "FILT-2", "FILT-3", NULL };
42
static GUI ic756pro2_widgets[]= {
43
{ (Fl_Widget *)btnVol, 2, 125, 50 },
44
{ (Fl_Widget *)sldrVOLUME, 54, 125, 156 },
45
{ (Fl_Widget *)sldrRFGAIN, 54, 145, 156 },
46
{ (Fl_Widget *)btnNR, 2, 165, 50 },
47
{ (Fl_Widget *)sldrNR, 54, 165, 156 },
48
{ (Fl_Widget *)btnIFsh, 214, 125, 50 },
49
{ (Fl_Widget *)sldrIFSHIFT, 266, 125, 156 },
50
{ (Fl_Widget *)sldrMICGAIN, 266, 145, 156 },
51
{ (Fl_Widget *)sldrPOWER, 266, 165, 156 },
52
{ (Fl_Widget *)NULL, 0, 0, 0 }
55
RIG_IC756PRO2::RIG_IC756PRO2() {
57
name_ = IC756PRO2name_;
58
modes_ = IC756PRO2modes_;
59
bandwidths_ = IC756PRO2_SSBwidths;
60
_mode_type = IC756PRO2_mode_type;
62
widgets = ic756pro2_widgets;
64
def_freq = freqA = freqB = A.freq = 14070000;
65
def_mode = modeA = modeB = B.imode = 1;
66
def_bw = bwA = bwB = A.iBW = B.iBW = 32;
71
adjustCIV(defaultCIV);
74
has_bandwidth_control =
85
has_attenuator_control =
89
has_noise_reduction_control =
91
has_rf_control = true;
98
void RIG_IC756PRO2::initialize()
100
ic756pro2_widgets[0].W = btnVol;
101
ic756pro2_widgets[1].W = sldrVOLUME;
102
ic756pro2_widgets[2].W = sldrRFGAIN;
103
ic756pro2_widgets[3].W = btnNR;
104
ic756pro2_widgets[4].W = sldrNR;
105
ic756pro2_widgets[5].W = btnIFsh;
106
ic756pro2_widgets[6].W = sldrIFSHIFT;
107
ic756pro2_widgets[7].W = sldrMICGAIN;
108
ic756pro2_widgets[8].W = sldrPOWER;
111
void RIG_IC756PRO2::selectA()
120
void RIG_IC756PRO2::selectB()
129
void RIG_IC756PRO2::A2B()
138
long RIG_IC756PRO2::get_vfoA ()
140
string cstr = "\x03";
141
string resp = pre_fm;
146
if (waitFOR(11, "get vfo A")) {
147
size_t p = replystr.rfind(resp);
148
if (p != string::npos)
149
A.freq = fm_bcd_be(&replystr[p+5], 10);
154
void RIG_IC756PRO2::set_vfoA (long freq)
159
cmd.append( to_bcd_be( freq, 10 ) );
164
long RIG_IC756PRO2::get_vfoB ()
166
string cstr = "\x03";
167
string resp = pre_fm;
172
if (waitFOR(11, "get vfo B")) {
173
size_t p = replystr.rfind(resp);
174
if (p != string::npos)
175
B.freq = fm_bcd_be(&replystr[p+5], 10);
180
void RIG_IC756PRO2::set_vfoB (long freq)
185
cmd.append( to_bcd_be( freq, 10 ) );
190
int RIG_IC756PRO2::get_smeter()
192
string cstr = "\x15\x02";
193
string resp = pre_fm;
198
if (waitFOR(9, "get smeter")) {
199
size_t p = replystr.rfind(resp);
200
if (p != string::npos)
201
return (int)ceil(fm_bcd(&replystr[p+6], 3) / 2.55);
206
// Volume control val 0 ... 100
208
void RIG_IC756PRO2::set_volume_control(int val)
212
cmd.append("\x14\x01");
213
cmd.append(to_bcd(ICvol, 3));
218
int RIG_IC756PRO2::get_volume_control()
220
string cstr = "\x14\x01";
221
string resp = pre_fm;
226
if (waitFOR(9, "get vol")) {
227
size_t p = replystr.rfind(resp);
228
if (p != string::npos)
229
return ((int)(fm_bcd(&replystr[p+6],3)));
234
void RIG_IC756PRO2::get_vol_min_max_step(int &min, int &max, int &step)
236
min = 0; max = 255; step = 1;
239
// Tranceiver PTT on/off
240
void RIG_IC756PRO2::set_PTT_control(int val)
245
cmd += (unsigned char) val;
250
// changed noise blanker to noise reduction
251
void RIG_IC756PRO2::set_noise(bool val)
254
cmd.append("\x16\x22");
260
int RIG_IC756PRO2::get_noise()
262
string cstr = "\x16\x22";
263
string resp = pre_fm;
268
if (waitFOR(8, "get noise")) {
269
size_t p = replystr.rfind(resp);
270
if (p != string::npos)
271
return (replystr[p+6] ? 1 : 0);
276
void RIG_IC756PRO2::set_noise_reduction(int val)
279
cmd.append("\x16\x40");
285
int RIG_IC756PRO2::get_noise_reduction()
287
string cstr = "\x16\x40";
288
string resp = pre_fm;
293
if (waitFOR(8, "get NR")) {
294
size_t p = replystr.rfind(resp);
295
if (p != string::npos)
296
return (replystr[p+6] ? 1 : 0);
302
void RIG_IC756PRO2::set_noise_reduction_val(int val)
305
cmd.append("\x14\x06");
306
cmd.append(to_bcd(val * 255 / 100, 3));
308
waitFB("set NR val");
311
int RIG_IC756PRO2::get_noise_reduction_val()
313
string cstr = "\x14\x06";
314
string resp = pre_fm;
319
if (waitFOR(9, "get NR val")) {
320
size_t p = replystr.rfind(resp);
321
if (p != string::npos)
322
return (int)ceil(fm_bcd(&replystr[p+6],3) / 2.55);
328
int RIG_IC756PRO2::get_modetype(int n)
330
return _mode_type[n];
333
void RIG_IC756PRO2::set_mic_gain(int val)
335
val = (int)(val * 255 / 100);
337
cmd.append("\x14\x0B");
338
cmd.append(to_bcd(val,3));
343
void RIG_IC756PRO2::get_mic_gain_min_max_step(int &min, int &max, int &step)
350
void RIG_IC756PRO2::set_if_shift(int val)
352
int shift = (int)((val + 50) * 2.56 );
353
if (shift == 256) shift = 255;
355
cmd.append("\x14\x07");
356
cmd.append(to_bcd(shift, 3));
358
waitFB("set IF on/off");
361
cmd.append("\x14\x08");
362
cmd.append(to_bcd(shift, 3));
364
waitFB("set IF val");
367
void RIG_IC756PRO2::get_if_min_max_step(int &min, int &max, int &step)
374
int IC756PRO2sql = 0;
375
void RIG_IC756PRO2::set_squelch(int val)
377
IC756PRO2sql = (int)(val * 255 / 100);
379
cmd.append("\x14\x03");
380
cmd.append(to_bcd(IC756PRO2sql, 3));
385
int IC756PRO2rfg = 0;
386
void RIG_IC756PRO2::set_rf_gain(int val)
388
IC756PRO2rfg = (int)(val * 255 / 100);
390
cmd.append("\x14\x02");
391
cmd.append(to_bcd(IC756PRO2rfg, 3));
393
waitFB("set rf gain");
396
void RIG_IC756PRO2::set_power_control(double val)
399
cmd.append("\x14\x0A");
400
cmd.append(to_bcd((int)(val * 255 / 100), 3));
405
void RIG_IC756PRO2::set_split(bool val)
409
cmd += val ? 0x01 : 0x00;
414
//======================================================================
415
// IC756PRO2 unique commands
416
//======================================================================
418
void RIG_IC756PRO2::set_modeA(int val)
421
bool datamode = false;
423
case 10 : val = 5; datamode = true; break;
424
case 9 : val = 1; datamode = true; break;
425
case 8 : val = 0; datamode = true; break;
426
case 7 : val = 8; break;
427
case 6 : val = 7; break;
434
waitFB("set mode A");
435
if (datamode) { // LSB / USB ==> use DATA mode
437
cmd.append("\x1A\x06\x01");
443
int RIG_IC756PRO2::get_modeA()
446
string cstr = "\x04";
447
string resp = pre_fm;
452
if (waitFOR(8, "get mode A")) {
453
size_t p = replystr.rfind(resp);
454
if (p != string::npos) {
457
A.iBW = replystr[p+6];
464
if (waitFOR(8, "data ?")) {
465
p = replystr.rfind(resp);
466
if (p != string::npos) {
469
case 0 : md = 8; break;
470
case 1 : md = 9; break;
471
case 5 : md = 10; break;
483
void RIG_IC756PRO2::set_modeB(int val)
486
bool datamode = false;
488
case 10 : val = 5; datamode = true; break;
489
case 9 : val = 1; datamode = true; break;
490
case 8 : val = 0; datamode = true; break;
491
case 7 : val = 8; break;
492
case 6 : val = 7; break;
499
waitFB("set mode B");
500
if (datamode) { // LSB / USB ==> use DATA mode
502
cmd.append("\x1A\x06\x01");
508
int RIG_IC756PRO2::get_modeB()
511
string cstr = "\x04";
512
string resp = pre_fm;
517
if (waitFOR(8, "get mode B")) {
518
size_t p = replystr.rfind(resp);
519
if (p != string::npos) {
522
B.iBW = replystr[p+6];
529
if (waitFOR(8, "data ?")) {
530
p = replystr.rfind(resp);
531
if (p != string::npos) {
534
case 0 : md = 8; break;
535
case 1 : md = 9; break;
536
case 5 : md = 10; break;
548
int RIG_IC756PRO2::adjust_bandwidth(int m)
550
if (m == 0 || m == 1 || m == 8 || m == 9) { //SSB
551
bandwidths_ = IC756PRO2_SSBwidths;
554
if (m == 3 || m == 6) { //CW
555
bandwidths_ = IC756PRO2_SSBwidths;
558
if (m == 4 || m == 7) { //RTTY
559
bandwidths_ = IC756PRO2_RTTYwidths;
562
bandwidths_ = IC756PRO2_AMFMwidths;
566
int RIG_IC756PRO2::def_bandwidth(int m)
568
if (m == 0 || m == 1 || m == 8 || m == 9) { //SSB
571
if (m == 3 || m == 6) { //CW
574
if (m == 4 || m == 7) { //RTTY
577
bandwidths_ = IC756PRO2_AMFMwidths;
581
const char **RIG_IC756PRO2::bwtable(int m)
583
if (m == 0 || m == 1 || m == 8 || m == 9) //SSB
584
return IC756PRO2_SSBwidths;
585
if (m == 3 || m == 6) //CW
586
return IC756PRO2_SSBwidths;
587
if (m == 4 || m == 7) //RTTY
588
return IC756PRO2_RTTYwidths;
589
return IC756PRO2_AMFMwidths;
592
int RIG_IC756PRO2::get_swr()
594
string cstr = "\x15\x12";
595
string resp = pre_fm;
600
if (waitFOR(9, "get swr")) {
601
size_t p = replystr.rfind(resp);
602
if (p != string::npos)
603
return (int)ceil(fm_bcd(&replystr[p + 6],3) / 2.55 );
608
int RIG_IC756PRO2::get_alc()
610
string cstr = "\x15\x13";
611
string resp = pre_fm;
616
if (waitFOR(9, "get alc")) {
617
size_t p = replystr.rfind(resp);
618
if (p != string::npos)
619
return (int)ceil(fm_bcd(&replystr[p + 6],3) / 2.55 );
624
// Transceiver power level return power in watts
625
int RIG_IC756PRO2::get_power_out()
627
string cstr = "\x15\x11";
628
string resp = pre_fm;
633
if (waitFOR(9, "get power")) {
634
size_t p = replystr.rfind(resp);
635
if (p != string::npos)
636
return (int)ceil(fm_bcd(&replystr[p + 6],3) / 2.55 );
641
void RIG_IC756PRO2::tune_rig()
644
cmd.append("\x1c\x01\x02");
649
void RIG_IC756PRO2::set_bwA(int val)
651
if (bandwidths_ == IC756PRO2_AMFMwidths) {
659
cmd.append("\x1A\x03");
660
cmd.append(to_bcd(A.iBW,2));
665
int RIG_IC756PRO2::get_bwA()
667
if (bandwidths_ == IC756PRO2_AMFMwidths) {
670
string cstr = "\x1A\x03";
671
string resp = pre_fm;
676
if (waitFOR(8, "get bw A")) {
677
size_t p = replystr.rfind(resp);
678
if (p != string::npos)
679
A.iBW = (int)(fm_bcd(&replystr[p + 6], 2));
684
void RIG_IC756PRO2::set_bwB(int val)
686
if (bandwidths_ == IC756PRO2_AMFMwidths) {
694
cmd.append("\x1A\x03");
695
cmd.append(to_bcd(B.iBW,2));
700
int RIG_IC756PRO2::get_bwB()
702
if (bandwidths_ == IC756PRO2_AMFMwidths) {
705
string cstr = "\x1A\x03";
706
string resp = pre_fm;
711
if (waitFOR(8, "get bw B")) {
712
size_t p = replystr.rfind(resp);
713
if (p != string::npos)
714
B.iBW = (int)(fm_bcd(&replystr[p + 6], 2));
719
bool IC756PRO2_notchon = false;
720
void RIG_IC756PRO2::set_notch(bool on, int val)
722
int notch = (int)(val/20.0 + 128);
723
if (notch > 256) notch = 255;
724
if (on != IC756PRO2_notchon) {
726
cmd.append("\x16\x48");
727
cmd += on ? '\x01' : '\x00';
730
IC756PRO2_notchon = on;
735
cmd.append("\x14\x0D");
736
cmd.append(to_bcd(notch,3));
738
waitFB("set notch val");
742
bool RIG_IC756PRO2::get_notch(int &val)
747
string cstr = "\x16\x48";
748
string resp = pre_fm;
753
if (waitFOR(8, "get notch")) {
754
size_t p = replystr.rfind(resp);
755
if (p != string::npos)
756
on = replystr[p + 6] ? 1 : 0;
763
if (waitFOR(9, "get notch val")) {
764
size_t p = replystr.rfind(resp);
765
if (p != string::npos)
766
val = 20*ceil(fm_bcd(&replystr[p + 6],3) - 128);
772
void RIG_IC756PRO2::get_notch_min_max_step(int &min, int &max, int &step)
779
void RIG_IC756PRO2::set_attenuator(int val)
782
if (atten_level == 0) {
784
atten_label("6 dB", true);
786
} else if (atten_level == 1) {
788
atten_label("12 dB", true);
790
} else if (atten_level == 2) {
792
atten_label("18 dB", true);
794
} else if (atten_level == 3) {
796
atten_label("Att", false);
806
int RIG_IC756PRO2::get_attenuator()
808
string cstr = "\x11";
809
string resp = pre_fm;
814
if (waitFOR(7, "get att")) {
815
size_t p = replystr.rfind(resp);
816
if (p != string::npos) {
817
if (replystr[p+5] == 0x06) {
819
atten_label("6 dB", true);
820
} else if (replystr[p+5] == 0x12) {
822
atten_label("12 dB", true);
823
} else if (replystr[p+5] == 0x18) {
825
atten_label("18 dB", true);
826
} else if (replystr[p+5] == 0x00) {
828
atten_label("Att", false);
835
void RIG_IC756PRO2::set_preamp(int val)
837
if (preamp_level == 0) {
839
preamp_label("Pre 1", true);
840
} else if (preamp_level == 1) {
842
preamp_label("Pre 2", true);
843
} else if (preamp_level == 2) {
845
preamp_label("Pre", false);
850
cmd += (unsigned char) preamp_level;
852
waitFB("set preamp");
855
int RIG_IC756PRO2::get_preamp()
857
string cstr = "\x16\x02";
858
string resp = pre_fm;
863
if (waitFOR(8, "get preamp")) {
864
size_t p = replystr.rfind(resp);
865
if (p != string::npos) {
866
if (replystr[p+6] == 0x01) {
867
preamp_label("Pre 1", true);
869
} else if (replystr[p+6] == 0x02) {
870
preamp_label("Pre 2", true);
873
preamp_label("Pre", false);