Fix IC7300 (and other Icoms) set/get_dsp_filter

All Icoms will now try the 1A 03 command once and if it is rejected won't try again.
https://github.com/Hamlib/Hamlib/issues/811
pull/816/head
Mike Black W9MDB 2021-10-02 17:33:21 -05:00
rodzic a5ad107c63
commit eadd1da009
2 zmienionych plików z 36 dodań i 50 usunięć

Wyświetl plik

@ -1738,6 +1738,7 @@ int icom_set_xit_new(RIG *rig, vfo_t vfo, shortfreq_t ts)
this subcommand this subcommand
*/ */
int filtericom[] = { 50,100,150,200,250,300,350,400,450,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500,2600,2700,2800,2900,3000,3100,3200,3300,3400,3500,3600 };
pbwidth_t icom_get_dsp_flt(RIG *rig, rmode_t mode) pbwidth_t icom_get_dsp_flt(RIG *rig, rmode_t mode)
{ {
@ -1752,9 +1753,6 @@ pbwidth_t icom_get_dsp_flt(RIG *rig, rmode_t mode)
rig_debug(RIG_DEBUG_VERBOSE, "%s called, mode=%s\n", __func__, rig_debug(RIG_DEBUG_VERBOSE, "%s called, mode=%s\n", __func__,
rig_strrmode(mode)); rig_strrmode(mode));
// only these models that we know of -- keep set_dsp_flt in sync
if ((rig->caps->rig_model & (RIG_MODEL_IC7000 | RIG_MODEL_IC7800 | RIG_MODEL_IC7300 || RIG_MODEL_IC9700 || RIG_MODEL_IC7610)) == 0) RETURNFUNC(RIG_OK);
if (rig_has_get_func(rig, RIG_FUNC_RF) if (rig_has_get_func(rig, RIG_FUNC_RF)
&& (mode & (RIG_MODE_RTTY | RIG_MODE_RTTYR))) && (mode & (RIG_MODE_RTTY | RIG_MODE_RTTYR)))
{ {
@ -1790,14 +1788,14 @@ pbwidth_t icom_get_dsp_flt(RIG *rig, rmode_t mode)
if (-RIG_ERJCTED == retval) if (-RIG_ERJCTED == retval)
{ {
priv->no_1a_03_cmd = -1; /* do not keep asking */ priv->no_1a_03_cmd = -1; /* do not keep asking */
return (0); return (RIG_OK);
} }
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
rig_debug(RIG_DEBUG_ERR, "%s: protocol error (%#.2x), " rig_debug(RIG_DEBUG_ERR, "%s: protocol error (%#.2x), "
"len=%d\n", __func__, resbuf[0], res_len); "len=%d\n", __func__, resbuf[0], res_len);
return (0); /* use default */ return (RIG_OK); /* use default */
} }
if (res_len == 3 && resbuf[0] == C_CTL_MEM) if (res_len == 3 && resbuf[0] == C_CTL_MEM)
@ -1809,18 +1807,22 @@ pbwidth_t icom_get_dsp_flt(RIG *rig, rmode_t mode)
if (mode & RIG_MODE_AM) if (mode & RIG_MODE_AM)
{ {
return ((i + 1) * 200); /* Ic_7800 */ if (i > 49) {
rig_debug(RIG_DEBUG_ERR, "%s: Expected max 49, got %d for filter\n", __func__, i);
RETURNFUNC(-RIG_EPROTO);
}
return ((i + 1) * 200); /* All Icoms that we know of */
} }
else if (mode & else if (mode &
(RIG_MODE_CW | RIG_MODE_USB | RIG_MODE_LSB | RIG_MODE_RTTY | (RIG_MODE_CW | RIG_MODE_USB | RIG_MODE_LSB | RIG_MODE_RTTY |
RIG_MODE_RTTYR | RIG_MODE_PKTUSB | RIG_MODE_PKTLSB)) RIG_MODE_RTTYR | RIG_MODE_PKTUSB | RIG_MODE_PKTLSB))
{ {
rig_debug(RIG_DEBUG_TRACE, "%s: using width=%d\n", __func__, i); rig_debug(RIG_DEBUG_TRACE, "%s: using filtericom width=%d\n", __func__, i);
RETURNFUNC(i < 10 ? (i + 1) * 50 : (i - 4) * 100); RETURNFUNC(filtericom[i]);
} }
} }
RETURNFUNC(0); RETURNFUNC(RIG_OK);
} }
int icom_set_dsp_flt(RIG *rig, rmode_t mode, pbwidth_t width) int icom_set_dsp_flt(RIG *rig, rmode_t mode, pbwidth_t width)
@ -1830,13 +1832,12 @@ int icom_set_dsp_flt(RIG *rig, rmode_t mode, pbwidth_t width)
unsigned char flt_ext; unsigned char flt_ext;
value_t rfwidth; value_t rfwidth;
int ack_len = sizeof(ackbuf), flt_idx; int ack_len = sizeof(ackbuf), flt_idx;
struct icom_priv_data *priv = (struct icom_priv_data *) rig->state.priv;
unsigned char fw_sub_cmd = RIG_MODEL_IC7200 == rig->caps->rig_model ? 0x02 : unsigned char fw_sub_cmd = RIG_MODEL_IC7200 == rig->caps->rig_model ? 0x02 :
S_MEM_FILT_WDTH; S_MEM_FILT_WDTH;
ENTERFUNC; ENTERFUNC;
// only these models that we know of -- keep get_dsp in sync here
if ((rig->caps->rig_model & (RIG_MODEL_IC7000 | RIG_MODEL_IC7800 | RIG_MODEL_IC7300 || RIG_MODEL_IC9700 || RIG_MODEL_IC7610)) == 0) RETURNFUNC(RIG_OK);
if (RIG_PASSBAND_NOCHANGE == width) if (RIG_PASSBAND_NOCHANGE == width)
{ {
@ -1869,11 +1870,8 @@ int icom_set_dsp_flt(RIG *rig, rmode_t mode, pbwidth_t width)
RETURNFUNC(-RIG_EINVAL); RETURNFUNC(-RIG_EINVAL);
} }
} }
if (priv->no_1a_03_cmd) RETURNFUNC(RIG_OK); // don't bother to try since it doesn't work
switch (rig->caps->rig_model)
{
case RIG_MODEL_IC7000:
case RIG_MODEL_IC7800:
if (mode & RIG_MODE_AM) if (mode & RIG_MODE_AM)
{ {
flt_idx = (width / 200) - 1; /* TBC: IC_7800? */ flt_idx = (width / 200) - 1; /* TBC: IC_7800? */
@ -1891,25 +1889,7 @@ int icom_set_dsp_flt(RIG *rig, rmode_t mode, pbwidth_t width)
} }
else else
{ {
RETURNFUNC(RIG_OK); rig_debug(RIG_DEBUG_VERBOSE, "%s: unknown mode=%s\n", __func__, rig_strrmode(mode));
}
break;
case RIG_MODEL_IC7300:
if (mode & RIG_MODE_AM)
{
flt_idx = (width / 200) - 1; /* TBC: IC_7800? */
}
else
{
flt_idx =
width <= 500 ? ((width + 49) / 50) - 1 : ((width + 99) / 100) + 4;
}
break;
default:
RETURNFUNC(RIG_OK); RETURNFUNC(RIG_OK);
} }
@ -1918,6 +1898,12 @@ int icom_set_dsp_flt(RIG *rig, rmode_t mode, pbwidth_t width)
retval = icom_transaction(rig, C_CTL_MEM, fw_sub_cmd, &flt_ext, 1, retval = icom_transaction(rig, C_CTL_MEM, fw_sub_cmd, &flt_ext, 1,
ackbuf, &ack_len); ackbuf, &ack_len);
if (-RIG_ERJCTED == retval)
{
priv->no_1a_03_cmd = -1; /* do not keep asking */
return (RIG_OK);
}
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
rig_debug(RIG_DEBUG_ERR, "%s: protocol error (%#.2x), " rig_debug(RIG_DEBUG_ERR, "%s: protocol error (%#.2x), "
@ -7663,7 +7649,7 @@ int icom_set_powerstat(RIG *rig, powerstat_t status)
} }
i = 0; i = 0;
retry = 1; retry = 3;
if (status == RIG_POWER_ON) // wait for wakeup only if (status == RIG_POWER_ON) // wait for wakeup only
{ {

Wyświetl plik

@ -30,7 +30,7 @@
#include <sys/time.h> #include <sys/time.h>
#endif #endif
#define BACKEND_VER "20210929" #define BACKEND_VER "20211002"
#define ICOM_IS_SECONDARY_VFO(vfo) ((vfo) & (RIG_VFO_B | RIG_VFO_SUB | RIG_VFO_SUB_B | RIG_VFO_MAIN_B)) #define ICOM_IS_SECONDARY_VFO(vfo) ((vfo) & (RIG_VFO_B | RIG_VFO_SUB | RIG_VFO_SUB_B | RIG_VFO_MAIN_B))
#define ICOM_GET_VFO_NUMBER(vfo) (ICOM_IS_SECONDARY_VFO(vfo) ? 0x01 : 0x00) #define ICOM_GET_VFO_NUMBER(vfo) (ICOM_IS_SECONDARY_VFO(vfo) ? 0x01 : 0x00)