Fix IC-905 10Ghz+ set/get freq and lower frequencies too

https://github.com/Hamlib/Hamlib/issues/1375
pull/1389/head
Mike Black W9MDB 2023-08-27 15:43:28 -05:00
rodzic 6e7aec3077
commit 5d12e5f8bd
4 zmienionych plików z 162 dodań i 78 usunięć

Wyświetl plik

@ -1347,7 +1347,6 @@ int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq)
{
// 10Hz resolution and > 5.85MHz is 6 bytes
if (freq > 5.85e9) { freq_len = 6; }
freq /= 10;
}
/*
@ -1799,8 +1798,6 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
if (freq_len == 3) { *freq *= 10000; } // 3-byte freq for ID5100 is in 10000Hz units so convert to Hz
if (RIG_IS_IC905) { *freq *= 10; }
if (vfo == RIG_VFO_MEM && civ_731_mode) { priv->civ_731_mode = 1; }
switch (vfo)

Wyświetl plik

@ -540,9 +540,8 @@ case 0x26:
frame[6] = frame[5] == 0 ? modeA : modeB;
frame[7] = frame[5] == 0 ? datamodeA : datamodeB;
frame[8] = 0xfb;
frame[9] = 0xfd;
n = write(fd, frame, 10);
frame[8] = 0xfd;
n = write(fd, frame, 9);
}
else
{

Wyświetl plik

@ -33,10 +33,12 @@ int split = 0;
// we make B different from A to ensure we see a difference at startup
float freqA = 14074000;
float freqB = 14074500;
mode_t modeA = RIG_MODE_PKTUSB;
mode_t modeB = RIG_MODE_PKTUSB;
int datamodeA = 0;
int datamodeB = 0;
mode_t modeA = 1;
mode_t modeB = 0;
int datamodeA = 2;
int datamodeB = 1;
int filterA = 3;
int filterB = 2;
pbwidth_t widthA = 0;
pbwidth_t widthB = 1;
ant_t ant_curr = 0;
@ -49,8 +51,9 @@ int powerstat = 1;
int datamode = 0;
int keyspd = 130; // 130=20WPM
int attenuator;
int filterA = 2;
int filterB = 3;
int notch = 0;
int speechcompressor = 0;
int vox = 0;
void dumphex(unsigned char *buf, int n)
{
@ -75,7 +78,8 @@ again:
if (c == 0xfd)
{
dumphex(buf, i);
// printf("Read: ");
// dumphex(buf, i);
return i;
}
@ -105,7 +109,7 @@ void frameParse(int fd, unsigned char *frame, int len)
double freq;
int n = 0;
dumphex(frame, len);
//dumphex(frame, len);
if (frame[0] != 0xfe && frame[1] != 0xfe)
{
@ -114,7 +118,7 @@ void frameParse(int fd, unsigned char *frame, int len)
return;
}
int echo = 1;
int echo = 0;
if (echo)
{
@ -131,12 +135,12 @@ void frameParse(int fd, unsigned char *frame, int len)
//from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2);
if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN)
{
printf("get_freqA\n");
//printf("get_freqA\n");
to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2);
}
else
{
printf("get_freqB\n");
//printf("get_freqB\n");
to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2);
}
@ -152,13 +156,13 @@ void frameParse(int fd, unsigned char *frame, int len)
case 0x04:
if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN)
{
printf("get_modeA\n");
//printf("get_modeA\n");
frame[5] = modeA;
frame[6] = widthA;
}
else
{
printf("get_modeB\n");
//printf("get_modeB\n");
frame[5] = modeB;
frame[6] = widthB;
}
@ -169,7 +173,7 @@ void frameParse(int fd, unsigned char *frame, int len)
case 0x05:
freq = from_bcd(&frame[5], (civ_731_mode ? 4 : 5) * 2);
printf("set_freq to %.0f\n", freq);
//printf("set_freq to %.0f\n", freq);
if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { freqA = freq; }
else { freqB = freq; }
@ -190,12 +194,12 @@ void frameParse(int fd, unsigned char *frame, int len)
case 0x07:
printf("******* [5] = 0x07\n");
//printf("******* [5] = 0x07\n");
switch (frame[5])
{
case 0xd2:
printf("******* [6] = 0x07\n");
//printf("******* [6] = 0x07\n");
switch (frame[6])
{
@ -205,11 +209,11 @@ void frameParse(int fd, unsigned char *frame, int len)
}
}
printf("set_vfo to %s\n", rig_strvfo(current_vfo));
//printf("set_vfo to %s\n", rig_strvfo(current_vfo));
frame[4] = 0xfb;
frame[5] = 0xfd;
printf("0x07 0xd2 answer: \n");
//printf("0x07 0xd2 answer: \n");
dump_hex(frame, 6);
n = write(fd, frame, 6);
break;
@ -221,13 +225,13 @@ void frameParse(int fd, unsigned char *frame, int len)
if (frame[5] == 0xfd)
{
printf("get split %d\n", 1);
//printf("get split %d\n", 1);
frame[7] = 0xfd;
n = write(fd, frame, 8);
}
else
{
printf("set split %d\n", 1);
//printf("set split %d\n", 1);
frame[4] = 0xfb;
frame[5] = 0xfd;
n = write(fd, frame, 6);
@ -245,37 +249,36 @@ void frameParse(int fd, unsigned char *frame, int len)
}
else
{
frame[6] = attenuator;
frame[7] = 0xfd;
n = write(fd, frame, 8);
frame[5] = attenuator;
frame[6] = 0xfd;
n = write(fd, frame, 7);
}
break;
case 0x12: // we're simulating the 3-byte version -- not the 2-byte
if (frame[5] != 0xfd)
{
printf("Set ant %d\n", -1);
//printf("Set ant %d\n", -1);
ant_curr = frame[5];
ant_option = frame[6];
dump_hex(frame, 8);
}
else
{
printf("Get ant\n");
//printf("Get ant\n");
}
frame[5] = ant_curr;
frame[6] = ant_option;
frame[7] = 0xfd;
printf("write 8 bytes\n");
//printf("write 8 bytes\n");
dump_hex(frame, 8);
n = write(fd, frame, 8);
break;
case 0x14:
printf("******** 0x14 received frame[5]=0x%02x\n", frame[5]);
//printf("******** 0x14 received frame[5]=0x%02x\n", frame[5]);
switch (frame[5])
{
@ -285,28 +288,28 @@ void frameParse(int fd, unsigned char *frame, int len)
case 0x08:
if (frame[6] != 0xfd)
{
printf("DEBUG#1\n");
//printf("DEBUG#1\n");
frame[4] = 0xfb;
frame[5] = 0xfd;
dumphex(frame, 6);
n = write(fd, frame, 6);
printf("ACK x14 x08\n");
//printf("ACK x14 x08\n");
}
else
{
printf("DEBUG#2\n");
//printf("DEBUG#2\n");
to_bcd(&frame[6], (long long)128, 2);
frame[8] = 0xfb;
frame[9] = 0xfd;
dumphex(frame, 10);
n = write(fd, frame, 10);
printf("SEND x14 x08\n");
//printf("SEND x14 x08\n");
}
break;
case 0x0a:
printf("Using power level %d\n", power_level);
//printf("Using power level %d\n", power_level);
power_level += 10;
if (power_level > 250) { power_level = 0; }
@ -331,7 +334,7 @@ void frameParse(int fd, unsigned char *frame, int len)
break;
default:
printf("*********** NAK\n");
//printf("*********** NAK\n");
frame[5] = 0xfa;
frame[6] = 0xfd;
n = write(fd, frame, 7);
@ -353,7 +356,7 @@ void frameParse(int fd, unsigned char *frame, int len)
break;
case 0x11:
printf("Using meter level %d\n", meter_level);
//printf("Using meter level %d\n", meter_level);
meter_level += 10;
if (meter_level > 250) { meter_level = 0; }
@ -374,6 +377,51 @@ void frameParse(int fd, unsigned char *frame, int len)
case 0x16:
switch (frame[5])
{
case 0x44:
if (frame[6] == 0xfe)
{
frame[6] = speechcompressor;
frame[7] = 0xfd;
n = write(fd, frame, 8);
}
else
{
speechcompressor = frame[6];
frame[4] = 0xfb;
frame[5] = 0xfd;
n = write(fd, frame, 6);
}
break;
case 0x46:
if (frame[6] == 0xfe)
{
frame[6] = vox;
frame[7] = 0xfd;
n = write(fd, frame, 8);
}
else
{
vox = frame[6];
frame[4] = 0xfb;
frame[5] = 0xfd;
n = write(fd, frame, 6);
}
break;
case 0x48:
if (frame[6] == 0xfe)
{
frame[6] = notch;
frame[7] = 0xfd;
n = write(fd, frame, 8);
}
else
{
notch = frame[6];
frame[4] = 0xfb;
frame[5] = 0xfd;
n = write(fd, frame, 6);
}
break;
case 0x5a:
if (frame[6] == 0xfe)
{
@ -415,7 +463,7 @@ void frameParse(int fd, unsigned char *frame, int len)
break;
case 0x04: // AGC TIME
printf("frame[6]==x%02x, frame[7]=0%02x\n", frame[6], frame[7]);
//printf("frame[6]==x%02x, frame[7]=0%02x\n", frame[6], frame[7]);
if (frame[6] == 0xfd) // the we are reading
{
@ -425,7 +473,7 @@ void frameParse(int fd, unsigned char *frame, int len)
}
else
{
printf("AGC_TIME RESPONSE******************************");
//printf("AGC_TIME RESPONSE******************************");
agc_time = frame[6];
frame[4] = 0xfb;
frame[5] = 0xfd;
@ -494,12 +542,12 @@ void frameParse(int fd, unsigned char *frame, int len)
if (frame[5] == 0x00)
{
to_bcd(&frame[6], (long long)freqA, (civ_731_mode ? 4 : 5) * 2);
printf("X25 get_freqA=%.0f\n", freqA);
//printf("X25 get_freqA=%.0f\n", freqA);
}
else
{
to_bcd(&frame[6], (long long)freqB, (civ_731_mode ? 4 : 5) * 2);
printf("X25 get_freqB=%.0f\n", freqB);
//printf("X25 get_freqB=%.0f\n", freqB);
}
frame[11] = 0xfd;
@ -524,7 +572,7 @@ void frameParse(int fd, unsigned char *frame, int len)
else
{
freq = from_bcd(&frame[6], (civ_731_mode ? 4 : 5) * 2);
printf("set_freq to %.0f\n", freq);
//printf("set_freq to %.0f\n", freq);
if (frame[5] == 0x00) { freqA = freq; }
else { freqB = freq; }
@ -548,31 +596,36 @@ void frameParse(int fd, unsigned char *frame, int len)
break;
case 0x26:
for (int i = 0; i < 6; ++i) { printf("%02x:", frame[i]); }
for (int i = 0; i < 7; ++i) { printf("%02x:", frame[i]); }
if (frame[6] == 0xfd) // then a query
{
for (int i = 0; i < 6; ++i) { printf("%02x:", frame[i]); }
printf("GET MODE XXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n");
// fe fe e0 8e 26 00 01 00 fd fd
frame[6] = frame[5] == 0 ? modeA : modeB;
frame[7] = frame[5] == 0 ? datamodeA : datamodeB;
frame[8] = frame[5] == 0 ? filterA : filterB;
frame[9] = 0xfd;
printf("x26 response: ");
dumphex(frame, 10);
n = write(fd, frame, 10);
}
else
{
printf("SET MODE YYYYYYYYYYYYYYYYYYYYYYYYYYYYY\n");
for (int i = 0; i < 12; ++i) { printf("%02x:", frame[i]); }
if (frame[6] == 0)
if (frame[5] == 0)
{
modeA = frame[7];
datamodeA = frame[8];
modeA = frame[6];
datamodeA = frame[7];
filterA = frame[8];
}
else
{
modeB = frame[7];
datamodeB = frame[8];
modeB = frame[6];
datamodeB = frame[7];
filterB = frame[8];
}
frame[4] = 0xfb;
@ -701,7 +754,7 @@ int main(int argc, char **argv)
hl_usleep(1000 * 1000);
}
rigStatus();
//rigStatus();
}
return 0;

Wyświetl plik

@ -32,12 +32,14 @@ vfo_t current_vfo = RIG_VFO_A;
int split = 0;
// we make B different from A to ensure we see a difference at startup
float freqA = 14074000;
float freqB = 14074500;
double freqA = 1407400;
double freqB = 1407450;
mode_t modeA = RIG_MODE_PKTUSB;
mode_t modeB = RIG_MODE_PKTUSB;
int datamodeA = 0;
int datamodeB = 0;
int filterA = 1;
int filterB = 2;
pbwidth_t widthA = 0;
pbwidth_t widthB = 1;
ant_t ant_curr = 0;
@ -47,6 +49,7 @@ int satmode = 0;
int agc_time = 1;
int ovf_status = 0;
int powerstat = 1;
int keyspd = 25;
void dumphex(unsigned char *buf, int n)
{
@ -115,18 +118,21 @@ void frameParse(int fd, unsigned char *frame, int len)
case 0x03:
//from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2);
int freq_len = 5;
if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN)
{
printf("get_freqA\n");
to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2);
if (freqA > 5.85e5) freq_len = 6;
printf("get_freqA len=%d\n", freq_len);
to_bcd(&frame[5], (long long)freqA, freq_len * 2);
}
else
{
printf("get_freqB\n");
to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2);
if (freqB > 5.85e5) freq_len = 6;
printf("get_freqB len=%d\n", freq_len);
to_bcd(&frame[5], (long long)freqB, freq_len * 2);
}
frame[10] = 0xfd;
frame[4+freq_len] = 0xfd;
if (powerstat)
{
@ -182,9 +188,9 @@ void frameParse(int fd, unsigned char *frame, int len)
case 0x01: current_vfo = RIG_VFO_B; break;
case 0xd0: current_vfo = RIG_VFO_MAIN; break;
case 0xa0: freqB = freqA;modeB = modeA; break;
case 0xd1: current_vfo = RIG_VFO_SUB; break;
case 0xb0: current_vfo = RIG_VFO_SUB; exit(1);break;
}
printf("set_vfo to %s\n", rig_strvfo(current_vfo));
@ -195,19 +201,17 @@ void frameParse(int fd, unsigned char *frame, int len)
break;
case 0x0f:
if (frame[5] == 0) { split = 0; }
else if (frame[5] == 1) { split = 1; }
else { frame[6] = split; }
if (frame[5] == 0xfd)
{
printf("get split %d\n", 1);
frame[7] = 0xfd;
n = write(fd, frame, 8);
printf("get split %d\n", split);
frame[5] = split;
frame[6] = 0xfd;
n = write(fd, frame, 7);
}
else
{
printf("set split %d\n", 1);
split = frame[5];
frame[4] = 0xfb;
frame[5] = 0xfd;
n = write(fd, frame, 6);
@ -271,10 +275,32 @@ void frameParse(int fd, unsigned char *frame, int len)
frame[8] = 0xfd;
n = write(fd, frame, 9);
break;
case 0x0c:
dumphex(frame, 10);
printf("subcmd=0x0c #1\n");
if (frame[6] != 0xfd) // then we have data
{
printf("subcmd=0x0c #1\n");
keyspd = from_bcd(&frame[6], 2);
frame[6] = 0xfb;
n = write(fd, frame, 7);
}
else
{
printf("subcmd=0x0c #1\n");
to_bcd(&frame[6], keyspd, 2);
frame[8] = 0xfd;
n = write(fd, frame, 9);
}
break;
}
break;
case 0x15:
switch (frame[5])
{
@ -402,20 +428,24 @@ void frameParse(int fd, unsigned char *frame, int len)
case 0x25:
if (frame[6] == 0xfd)
{
int freq_len = 5;
if (frame[5] == 0x00)
{
to_bcd(&frame[6], (long long)freqA, 6 * 2);
if (freqA > 5.85e5) freq_len = 6;
to_bcd(&frame[6], (long long)freqA, freq_len * 2);
printf("X25 get_freqA=%.0f\n", freqA);
}
else
{
to_bcd(&frame[6], (long long)freqB, 6 * 2);
if (freqB > 5.85e5) freq_len = 6;
to_bcd(&frame[6], (long long)freqB, freq_len * 2);
printf("X25 get_freqB=%.0f\n", freqB);
}
frame[12] = 0xfd;
unsigned char frame2[12];
frame[6+freq_len] = 0xfd;
//unsigned char frame2[12];
#if 0
frame2[0] = 0xfe;
frame2[1] = 0xfe;
frame2[2] = 0x00; // send transceive frame
@ -429,11 +459,14 @@ void frameParse(int fd, unsigned char *frame, int len)
frame2[10] = 0x00;
frame2[11] = 0xfd;
n = write(fd, frame2, 12);
n = write(fd, frame, 13);
#endif
n = write(fd, frame, 7+freq_len);
}
else
{
freq = from_bcd(&frame[6], (civ_731_mode ? 4 : 5) * 2);
int freq_len = 5;
if (frame[11] != 0xfd) freq_len = 6;
freq = from_bcd(&frame[6], freq_len * 2);
printf("set_freq to %.0f\n", freq);
if (frame[5] == 0x00) { freqA = freq; }
@ -442,6 +475,7 @@ void frameParse(int fd, unsigned char *frame, int len)
frame[4] = 0xfb;
frame[5] = 0xfd;
n = write(fd, frame, 6);
#if 0
// send async frame
frame[2] = 0x00; // async freq
frame[3] = 0xa2;
@ -453,6 +487,7 @@ void frameParse(int fd, unsigned char *frame, int len)
frame[9] = 0x12;
frame[10] = 0xfd;
n = write(fd, frame, 11);
#endif
}
break;
@ -466,7 +501,7 @@ void frameParse(int fd, unsigned char *frame, int len)
frame[6] = frame[5] == 0 ? modeA : modeB;
frame[7] = frame[5] == 0 ? datamodeA : datamodeB;
frame[8] = 0xfb;
frame[8] = frame[5] == 0 ? filterA : filterB;
frame[9] = 0xfd;
n = write(fd, frame, 10);
}