6
* Copyright 2009, Dave Freese, W1HKJ
10
#include "IC756PRO3.h"
14
//=============================================================================
17
const char IC756PRO3name_[] = "IC-756PRO-III";
19
const char *IC756PRO3modes_[] = {
20
"LSB", "USB", "AM", "CW", "RTTY", "FM", "CW-R", "RTTY-R",
21
"D-LSB", "D-USB", "D-FM", NULL};
23
const char IC756PRO3_mode_type[] =
24
{ 'L', 'U', 'U', 'U', 'L', 'U', 'L', 'U',
27
const char *IC756PRO3_SSBwidths[] = {
28
"50", "100", "150", "200", "250", "300", "350", "400", "450", "500",
29
"600", "700", "800", "900", "1000", "1100", "1200", "1300", "1400", "1500",
30
"1600", "1700", "1800", "1900", "2000", "2100", "2200", "2300", "2400", "2500",
31
"2600", "2700", "2800", "2900", "3000", "3100", "3200", "3300", "3400", "3500",
35
const char *IC756PRO3_RTTYwidths[] = {
36
"50", "100", "150", "200", "250", "300", "350", "400", "450", "500",
37
"600", "700", "800", "900", "1000", "1100", "1200", "1300", "1400", "1500",
38
"1600", "1700", "1800", "1900", "2000", "2100", "2200", "2300", "2400", "2500",
42
const char *IC756PRO3_AMFMwidths[] = { "FILT-1", "FILT-2", "FILT-3", NULL };
44
static GUI ic756pro3_widgets[]= {
45
{ (Fl_Widget *)btnVol, 2, 125, 50 },
46
{ (Fl_Widget *)sldrVOLUME, 54, 125, 156 },
47
{ (Fl_Widget *)sldrRFGAIN, 54, 145, 156 },
48
{ (Fl_Widget *)sldrSQUELCH, 54, 165, 156 },
49
{ (Fl_Widget *)btnNR, 214, 125, 50 },
50
{ (Fl_Widget *)sldrNR, 266, 125, 156 },
51
{ (Fl_Widget *)btnIFsh, 214, 105, 50 },
52
{ (Fl_Widget *)sldrIFSHIFT, 266, 105, 156 },
53
{ (Fl_Widget *)sldrMICGAIN, 266, 145, 156 },
54
{ (Fl_Widget *)sldrPOWER, 266, 165, 156 },
55
{ (Fl_Widget *)NULL, 0, 0, 0 }
58
RIG_IC756PRO3::RIG_IC756PRO3() {
60
name_ = IC756PRO3name_;
61
modes_ = IC756PRO3modes_;
62
bandwidths_ = IC756PRO3_SSBwidths;
63
_mode_type = IC756PRO3_mode_type;
64
atten_level = 3; // will force initializing to 0 dB
65
preamp_level = 2; // will force initializaing to 0 dB
67
widgets = ic756pro3_widgets;
69
def_freq = freqA = freqB = A.freq = 14070000;
70
def_mode = modeA = modeB = B.imode = 1;
71
def_bw = bwA = bwB = A.iBW = B.iBW = 32;
76
has_bandwidth_control =
90
has_attenuator_control =
94
has_noise_reduction_control =
97
has_rf_control = true;
99
adjustCIV(defaultCIV);
106
void RIG_IC756PRO3::initialize()
108
ic756pro3_widgets[0].W = btnVol;
109
ic756pro3_widgets[1].W = sldrVOLUME;
110
ic756pro3_widgets[2].W = sldrRFGAIN;
111
ic756pro3_widgets[3].W = sldrSQUELCH;
112
ic756pro3_widgets[4].W = btnNR;
113
ic756pro3_widgets[5].W = sldrNR;
114
ic756pro3_widgets[6].W = btnIFsh;
115
ic756pro3_widgets[7].W = sldrIFSHIFT;
116
ic756pro3_widgets[8].W = sldrMICGAIN;
117
ic756pro3_widgets[9].W = sldrPOWER;
120
void RIG_IC756PRO3::selectA()
129
void RIG_IC756PRO3::selectB()
138
void RIG_IC756PRO3::A2B()
147
long RIG_IC756PRO3::get_vfoA ()
149
string cstr = "\x03";
150
string resp = pre_fm;
155
if (waitFOR(11, "get vfo A")) {
156
size_t p = replystr.rfind(resp);
157
if (p != string::npos)
158
A.freq = fm_bcd_be(&replystr[p+5], 10);
163
void RIG_IC756PRO3::set_vfoA (long freq)
168
cmd.append( to_bcd_be( freq, 10 ) );
173
long RIG_IC756PRO3::get_vfoB ()
175
string cstr = "\x03";
176
string resp = pre_fm;
181
if (waitFOR(11, "get vfo B")) {
182
size_t p = replystr.rfind(resp);
183
if (p != string::npos)
184
B.freq = fm_bcd_be(&replystr[p+5], 10);
189
void RIG_IC756PRO3::set_vfoB (long freq)
194
cmd.append( to_bcd_be( freq, 10 ) );
199
int RIG_IC756PRO3::get_smeter()
201
string cstr = "\x15\x02";
202
string resp = pre_fm;
207
if (waitFOR(9, "get smeter")) {
208
size_t p = replystr.rfind(resp);
209
if (p != string::npos)
210
return (int)ceil(fm_bcd(&replystr[p+6], 3) / 2.55);
215
int RIG_IC756PRO3::get_power_out()
217
string cstr = "\x15\x11";
218
string resp = pre_fm;
223
if (waitFOR(9, "get pout")) {
224
size_t p = replystr.rfind(resp);
225
if (p != string::npos)
226
return (int)ceil(fm_bcd(&replystr[p+6], 3) / 2.55);
231
int RIG_IC756PRO3::get_alc()
233
string cstr = "\x15\x13";
234
string resp = pre_fm;
239
if (waitFOR(9, "get alc")) {
240
size_t p = replystr.rfind(resp);
241
if (p != string::npos)
242
return (int)ceil(fm_bcd(&replystr[p+6], 3) / 2.55);
247
int RIG_IC756PRO3::get_swr()
249
string cstr = "\x15\x12";
250
string resp = pre_fm;
255
if (waitFOR(9, "get swr")) {
256
size_t p = replystr.rfind(resp);
257
if (p != string::npos)
258
return (int)ceil(fm_bcd(&replystr[p+6], 3) / 2.55);
263
// Volume control val 0 ... 100
265
void RIG_IC756PRO3::set_volume_control(int val)
267
ICvol = (int)(val * 2.55);
269
cmd.append("\x14\x01");
270
cmd.append(to_bcd(ICvol, 3));
275
int RIG_IC756PRO3::get_volume_control()
277
string cstr = "\x14\x01";
278
string resp = pre_fm;
283
if (waitFOR(9, "get vol")) {
284
size_t p = replystr.rfind(resp);
285
if (p != string::npos)
286
return (int)ceil(fm_bcd(&replystr[p+6],3) / 2.55);
291
void RIG_IC756PRO3::get_vol_min_max_step(int &min, int &max, int &step)
293
min = 0; max = 100; step = 1;
296
// Tranceiver PTT on/off
297
void RIG_IC756PRO3::set_PTT_control(int val)
302
cmd += (unsigned char) val;
307
// changed noise blanker to noise reduction
308
void RIG_IC756PRO3::set_noise(bool val)
311
cmd.append("\x16\x22");
317
int RIG_IC756PRO3::get_noise()
319
string cstr = "\x16\x22";
320
string resp = pre_fm;
325
if (waitFOR(8, "get noise")) {
326
size_t p = replystr.rfind(resp);
327
if (p != string::npos)
328
return (replystr[p+6] ? 1 : 0);
330
return progStatus.noise;
333
void RIG_IC756PRO3::set_noise_reduction(int val)
336
cmd.append("\x16\x40");
342
int RIG_IC756PRO3::get_noise_reduction()
344
string cstr = "\x16\x40";
345
string resp = pre_fm;
350
if (waitFOR(8, "get NR")) {
351
size_t p = replystr.rfind(resp);
352
if (p != string::npos)
353
return (replystr[p+6] ? 1 : 0);
355
return progStatus.noise_reduction;
359
void RIG_IC756PRO3::set_noise_reduction_val(int val)
362
cmd.append("\x14\x06");
363
cmd.append(to_bcd(val * 2.55, 3));
365
waitFB("set NR val");
368
int RIG_IC756PRO3::get_noise_reduction_val()
370
string cstr = "\x14\x06";
371
string resp = pre_fm;
376
if (waitFOR(9, "get NR val")) {
377
size_t p = replystr.rfind(resp);
378
if (p != string::npos)
379
return (int)ceil(fm_bcd(&replystr[p+6],3) / 2.55);
381
return progStatus.noise_reduction_val;
384
int RIG_IC756PRO3::get_modetype(int n)
386
return _mode_type[n];
389
int RIG_IC756PRO3::get_mic_gain()
391
string cstr = "\x14\x0B";
392
string resp = pre_fm;
397
if (waitFOR(9, "get mic")) {
398
size_t p = replystr.rfind(resp);
399
if (p != string::npos)
400
return (int)ceil(fm_bcd(&replystr[p+6],3) / 2.55);
405
void RIG_IC756PRO3::set_mic_gain(int val)
407
val = (int)(val * 2.55);
409
cmd.append("\x14\x0B");
410
cmd.append(to_bcd(val,3));
415
void RIG_IC756PRO3::get_mic_gain_min_max_step(int &min, int &max, int &step)
422
void RIG_IC756PRO3::set_if_shift(int val)
424
int shift = (int)(val * 128.0 / 825.0 + 128);
426
cmd.append("\x14\x07");
427
cmd.append(to_bcd(shift, 3));
429
waitFB("set if-shift");
432
bool RIG_IC756PRO3::get_if_shift(int &val)
434
string cstr = "\x14\x07";
435
string resp = pre_fm;
440
val = progStatus.shift_val;
441
if (waitFOR(9, "get if-shift")) {
442
size_t p = replystr.rfind(resp);
443
if (p != string::npos)
444
val = (int)((fm_bcd(&replystr[p+6], 3) - 128) * 825.0 / 128.0);
446
return (progStatus.shift = (val != 0));
449
void RIG_IC756PRO3::get_if_min_max_step(int &min, int &max, int &step)
456
void RIG_IC756PRO3::set_squelch(int val)
458
int IC756PRO3sql = (int)(val * 2.55);
460
cmd.append("\x14\x03");
461
cmd.append(to_bcd(IC756PRO3sql, 3));
466
int RIG_IC756PRO3::get_squelch()
468
string cstr = "\x14\x03";
469
string resp = pre_fm;
474
if (waitFOR(9, "get sql")) {
475
size_t p = replystr.rfind(resp);
476
if (p != string::npos)
477
return (int)ceil(fm_bcd(&replystr[p+6], 3) / 2.55);
479
return progStatus.squelch;
482
void RIG_IC756PRO3::set_rf_gain(int val)
484
int IC756PRO3rfg = (int)(val * 2.55);
486
cmd.append("\x14\x02");
487
cmd.append(to_bcd(IC756PRO3rfg, 3));
489
waitFB("set rf gain");
492
int RIG_IC756PRO3::get_rf_gain()
494
string cstr = "\x14\x02";
495
string resp = pre_fm;
497
cmd.append(cstr).append(post);
499
if (waitFOR(9, "get rfgain")) {
500
size_t p = replystr.rfind(resp);
501
if (p != string::npos)
502
return (int)ceil(fm_bcd(&replystr[p + 6],3) / 2.55);
504
return progStatus.rfgain;
507
void RIG_IC756PRO3::set_power_control(double val)
510
cmd.append("\x14\x0A");
511
cmd.append(to_bcd((int)(val * 2.55), 3));
516
int RIG_IC756PRO3::get_power_control()
518
string cstr = "\x14\x0A";
519
string resp = pre_fm;
522
cmd.append(cstr).append(post);
523
if (waitFOR(9, "get power")) {
524
size_t p = replystr.rfind(resp);
525
if (p != string::npos)
526
return (int)ceil(fm_bcd(&replystr[p + 6],3) / 2.55);
528
return progStatus.power_level;
531
void RIG_IC756PRO3::set_split(bool val)
535
cmd += val ? 0x01 : 0x00;
540
int RIG_IC756PRO3::get_split()
542
LOG_WARN("%s", "get split - not implemented");
543
return progStatus.split;
546
int RIG_IC756PRO3::adjust_bandwidth(int m)
548
if (m == 0 || m == 1 || m == 8 || m == 9) { //SSB
549
bandwidths_ = IC756PRO3_SSBwidths;
552
if (m == 3 || m == 6) { //CW
553
bandwidths_ = IC756PRO3_SSBwidths;
556
if (m == 4 || m == 7) { //RTTY
557
bandwidths_ = IC756PRO3_RTTYwidths;
560
bandwidths_ = IC756PRO3_AMFMwidths;
564
int RIG_IC756PRO3::def_bandwidth(int m)
566
if (m == 0 || m == 1 || m == 8 || m == 9) { //SSB
569
if (m == 3 || m == 6) { //CW
572
if (m == 4 || m == 7) { //RTTY
575
bandwidths_ = IC756PRO3_AMFMwidths;
579
const char **RIG_IC756PRO3::bwtable(int m)
581
if (m == 0 || m == 1 || m == 8 || m == 9) //SSB
582
return IC756PRO3_SSBwidths;
583
if (m == 3 || m == 6) //CW
584
return IC756PRO3_SSBwidths;
585
if (m == 4 || m == 7) //RTTY
586
return IC756PRO3_RTTYwidths;
587
return IC756PRO3_AMFMwidths;
590
void RIG_IC756PRO3::tune_rig()
593
cmd.append("\x1c\x01\x02");
598
void RIG_IC756PRO3::set_bwA(int val)
600
if (bandwidths_ == IC756PRO3_AMFMwidths) {
608
cmd.append("\x1A\x03");
609
cmd.append(to_bcd(A.iBW,2));
614
int RIG_IC756PRO3::get_bwA()
616
if (bandwidths_ == IC756PRO3_AMFMwidths) {
619
string cstr = "\x1A\x03";
620
string resp = pre_fm;
625
if (waitFOR(8, "get bw A")) {
626
size_t p = replystr.rfind(resp);
627
if (p != string::npos)
628
A.iBW = (int)(fm_bcd(&replystr[p + 6], 2));
633
void RIG_IC756PRO3::set_bwB(int val)
635
if (bandwidths_ == IC756PRO3_AMFMwidths) {
643
cmd.append("\x1A\x03");
644
cmd.append(to_bcd(B.iBW,2));
649
int RIG_IC756PRO3::get_bwB()
651
if (bandwidths_ == IC756PRO3_AMFMwidths) {
654
string cstr = "\x1A\x03";
655
string resp = pre_fm;
660
if (waitFOR(8, "get bw B")) {
661
size_t p = replystr.rfind(resp);
662
if (p != string::npos)
663
B.iBW = (int)(fm_bcd(&replystr[p + 6], 2));
668
bool IC756PRO3_notchon = false;
669
void RIG_IC756PRO3::set_notch(bool on, int val)
671
int notch = (int)(val/20.0 + 128);
672
if (notch > 256) notch = 255;
673
if (on != IC756PRO3_notchon) {
675
cmd.append("\x16\x48");
676
cmd += on ? '\x01' : '\x00';
679
IC756PRO3_notchon = on;
684
cmd.append("\x14\x0D");
685
cmd.append(to_bcd(notch,3));
687
waitFB("set notch val");
691
bool RIG_IC756PRO3::get_notch(int &val)
696
string cstr = "\x16\x48";
697
string resp = pre_fm;
702
if (waitFOR(8, "get notch")) {
703
size_t p = replystr.rfind(resp);
704
if (p != string::npos)
705
on = replystr[p + 6] ? 1 : 0;
712
if (waitFOR(9, "get notch val")) {
713
size_t p = replystr.rfind(resp);
714
if (p != string::npos)
715
val = 20*ceil(fm_bcd(&replystr[p + 6],3) - 128);
721
void RIG_IC756PRO3::get_notch_min_max_step(int &min, int &max, int &step)
728
void RIG_IC756PRO3::set_attenuator(int val)
731
if (atten_level == 0) {
733
atten_label("6 dB", true);
735
} else if (atten_level == 1) {
737
atten_label("12 dB", true);
739
} else if (atten_level == 2) {
741
atten_label("18 dB", true);
743
} else if (atten_level == 3) {
745
atten_label("Att", false);
755
int RIG_IC756PRO3::get_attenuator()
757
string cstr = "\x11";
758
string resp = pre_fm;
763
if (waitFOR(7, "get att")) {
764
size_t p = replystr.rfind(resp);
765
if (p != string::npos) {
766
if (replystr[p+5] == 0x06) {
768
atten_label("6 dB", true);
769
} else if (replystr[p+5] == 0x12) {
771
atten_label("12 dB", true);
772
} else if (replystr[p+5] == 0x18) {
774
atten_label("18 dB", true);
775
} else if (replystr[p+5] == 0x00) {
777
atten_label("Att", false);
784
void RIG_IC756PRO3::set_preamp(int val)
786
if (preamp_level == 0) {
788
preamp_label("Pre 1", true);
789
} else if (preamp_level == 1) {
791
preamp_label("Pre 2", true);
792
} else if (preamp_level == 2) {
794
preamp_label("Pre", false);
799
cmd += (unsigned char) preamp_level;
801
waitFB("set preamp");
804
int RIG_IC756PRO3::get_preamp()
806
string cstr = "\x16\x02";
807
string resp = pre_fm;
812
if (waitFOR(8, "get preamp")) {
813
size_t p = replystr.rfind(resp);
814
if (p != string::npos) {
815
if (replystr[p+6] == 0x01) {
816
preamp_label("Pre 1", true);
818
} else if (replystr[p+6] == 0x02) {
819
preamp_label("Pre 2", true);
822
preamp_label("Pre", false);
831
void RIG_IC756PRO3::set_modeA(int val)
834
bool datamode = false;
836
case 10 : val = 5; datamode = true; break;
837
case 9 : val = 1; datamode = true; break;
838
case 8 : val = 0; datamode = true; break;
839
case 7 : val = 8; break;
840
case 6 : val = 7; break;
847
waitFB("set mode A");
848
if (datamode) { // LSB / USB ==> use DATA mode
850
cmd.append("\x1A\x06\x01");
856
int RIG_IC756PRO3::get_modeA()
859
string cstr = "\x04";
860
string resp = pre_fm;
865
if (waitFOR(8, "get mode A")) {
866
size_t p = replystr.rfind(resp);
867
if (p != string::npos) {
870
A.iBW = replystr[p+6];
877
if (waitFOR(9, "data mode?")) {
878
p = replystr.rfind(resp);
879
if (p != string::npos) {
882
case 0 : md = 8; break;
883
case 1 : md = 9; break;
884
case 5 : md = 10; break;
896
void RIG_IC756PRO3::set_modeB(int val)
899
bool datamode = false;
901
case 10 : val = 5; datamode = true; break;
902
case 9 : val = 1; datamode = true; break;
903
case 8 : val = 0; datamode = true; break;
904
case 7 : val = 8; break;
905
case 6 : val = 7; break;
912
waitFB("set mode B");
913
if (datamode) { // LSB / USB ==> use DATA mode
915
cmd.append("\x1A\x06\x01");
921
int RIG_IC756PRO3::get_modeB()
924
string cstr = "\x04";
925
string resp = pre_fm;
930
if (waitFOR(8, "get mode B")) {
931
size_t p = replystr.rfind(resp);
932
if (p != string::npos) {
935
B.iBW = replystr[p+6];
942
if (waitFOR(9, "data mode?")) {
943
p = replystr.rfind(resp);
944
if (p != string::npos) {
947
case 0 : md = 8; break;
948
case 1 : md = 9; break;
949
case 5 : md = 10; break;
961
void RIG_IC756PRO3::set_auto_notch(int val)
966
cmd += val ? 0x01 : 0x00;
971
int RIG_IC756PRO3::get_auto_notch()
973
string cstr = "\x16\x41";
974
string resp = pre_fm;
979
if (waitFOR(8, "get AN")) {
980
size_t p = replystr.rfind(resp);
981
if (p != string::npos) {
982
if (replystr[p+6] == 0x01) {
983
auto_notch_label("AN", true);
986
auto_notch_label("AN", false);
991
return progStatus.auto_notch;