Add support for FW filter width command on TS-480

pull/680/head
Mikael Nousiainen 2021-04-24 19:13:12 +03:00
rodzic e4657a5d16
commit 08a7515e91
3 zmienionych plików z 131 dodań i 16 usunięć

Wyświetl plik

@ -1850,6 +1850,42 @@ static int kenwood_set_filter(RIG *rig, pbwidth_t width)
RETURNFUNC(kenwood_transaction(rig, cmd, NULL, 0));
}
static int kenwood_set_filter_width(RIG *rig, rmode_t mode, pbwidth_t width)
{
struct kenwood_priv_caps *caps = kenwood_caps(rig);
struct kenwood_filter_width *selected_filter_width = NULL;
char cmd[20];
int i;
rig_debug(RIG_DEBUG_VERBOSE, "%s called, width=%ld\n", __func__, width);
if (caps->filter_width == NULL)
{
RETURNFUNC(-RIG_ENAVAIL);
}
for (i = 0; caps->filter_width[i].value >= 0; i++)
{
if (caps->filter_width[i].modes & mode)
{
selected_filter_width = &caps->filter_width[i];
if (caps->filter_width[i].width_hz >= width)
{
break;
}
}
}
if (selected_filter_width == NULL)
{
RETURNFUNC(-RIG_EINVAL);
}
snprintf(cmd, sizeof(cmd), "FW%04d", selected_filter_width->value);
RETURNFUNC(kenwood_transaction(rig, cmd, NULL, 0));
}
/*
* kenwood_set_mode
*/
@ -1995,6 +2031,15 @@ int kenwood_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
kenwood_set_filter(rig, width);
/* non fatal */
}
else if (RIG_IS_TS480)
{
err = kenwood_set_filter_width(rig, mode, width);
if (err != RIG_OK)
{
// Ignore errors as non-fatal
rig_debug(RIG_DEBUG_ERR, "%s: error setting filter width, error: %d\n", __func__, err);
}
}
RETURNFUNC(RIG_OK);
}
@ -2059,6 +2104,44 @@ static int kenwood_get_filter(RIG *rig, pbwidth_t *width)
RETURNFUNC(RIG_OK);
}
static int kenwood_get_filter_width(RIG *rig, rmode_t mode, pbwidth_t *width)
{
struct kenwood_priv_caps *caps = kenwood_caps(rig);
char ackbuf[20];
int i;
int retval;
int filter_value;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
if (caps->filter_width == NULL)
{
RETURNFUNC(-RIG_ENAVAIL);
}
retval = kenwood_safe_transaction(rig, "FW", ackbuf, sizeof(ackbuf), 6);
if (retval != RIG_OK)
{
RETURNFUNC(retval);
}
sscanf(ackbuf, "FW%d", &filter_value);
for (i = 0; caps->filter_width[i].value >= 0; i++)
{
if (caps->filter_width[i].modes & mode)
{
if (caps->filter_width[i].value == filter_value)
{
*width = caps->filter_width[i].width_hz;
RETURNFUNC(RIG_OK);
}
}
}
RETURNFUNC(-RIG_EINVAL);
}
/*
* kenwood_get_mode
*/
@ -2172,8 +2255,20 @@ int kenwood_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
}
}
/* XXX ? */
*width = rig_passband_normal(rig, *mode);
if (RIG_IS_TS480)
{
retval = kenwood_get_filter_width(rig, *mode, width);
if (retval != RIG_OK)
{
// Ignore errors as non-fatal
rig_debug(RIG_DEBUG_ERR, "%s: error getting filter width, error: %d\n", __func__, retval);
*width = rig_passband_normal(rig, *mode);
}
}
else
{
*width = rig_passband_normal(rig, *mode);
}
RETURNFUNC(RIG_OK);
}

Wyświetl plik

@ -112,7 +112,7 @@ struct kenwood_filter_width
{
rmode_t modes;
int value;
int width_hz;
pbwidth_t width_hz;
};
struct kenwood_slope_filter
@ -120,7 +120,7 @@ struct kenwood_slope_filter
rmode_t modes;
int data_mode_filter;
int value;
int frequency_hz;
pbwidth_t frequency_hz;
};
struct kenwood_priv_caps

Wyświetl plik

@ -975,7 +975,7 @@ static int ts480_get_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t *val)
}
static struct kenwood_filter_width ts480_filter_width[] = {
{ RIG_MODE_CW | RIG_MODE_CWR, 0, 50 },
{ RIG_MODE_CW | RIG_MODE_CWR, 50, 50 },
{ RIG_MODE_CW | RIG_MODE_CWR, 80, 80 },
{ RIG_MODE_CW | RIG_MODE_CWR, 100, 100 },
{ RIG_MODE_CW | RIG_MODE_CWR, 150, 150 },
@ -991,14 +991,14 @@ static struct kenwood_filter_width ts480_filter_width[] = {
{ RIG_MODE_RTTY | RIG_MODE_RTTYR, 1000, 1000 },
{ RIG_MODE_RTTY | RIG_MODE_RTTYR, 1500, 1500 },
{ RIG_MODE_SSB, 0, 2400 },
{ RIG_MODE_SSB, 1, 2400 }, // NAR1?
{ RIG_MODE_SSB, 2, 2400 }, // NAR2?
{ RIG_MODE_FM, 0, 2400 },
{ RIG_MODE_FM, 1, 2400 }, // NAR1?
{ RIG_MODE_FM, 2, 2400 }, // NAR2?
{ RIG_MODE_AM, 0, 2400 },
{ RIG_MODE_AM, 1, 2400 }, // NAR1?
{ RIG_MODE_AM, 2, 2400 }, // NAR2?
{ RIG_MODE_SSB, 1, 1200 }, // TODO: NAR1?
{ RIG_MODE_SSB, 2, 1800 }, // TODO: NAR2?
{ RIG_MODE_FM, 0, 14000 },
{ RIG_MODE_FM, 1, 7000 }, // TODO: NAR1?
{ RIG_MODE_FM, 2, 10000 }, // TODO: NAR2?
{ RIG_MODE_AM, 0, 9000 },
{ RIG_MODE_AM, 1, 3000 }, // TODO: NAR1?
{ RIG_MODE_AM, 2, 6000 }, // TODO: NAR2?
{ RIG_MODE_NONE, -1, -1 },
};
@ -1057,6 +1057,7 @@ static struct kenwood_slope_filter ts480_slope_filter_low[] = {
static struct kenwood_priv_caps ts480_priv_caps =
{
.cmdtrm = EOM_KEN,
.filter_width = ts480_filter_width,
.slope_filter_high = ts480_slope_filter_high,
.slope_filter_low = ts480_slope_filter_low,
};
@ -1108,7 +1109,7 @@ const struct rig_caps ts480_caps =
.write_delay = 0,
.post_write_delay = 0,
.timeout = 200,
.retry = 10,
.retry = 3,
.preamp = {12, RIG_DBLST_END,},
.attenuator = {12, RIG_DBLST_END,},
.max_rit = kHz(9.99),
@ -1193,10 +1194,29 @@ const struct rig_caps ts480_caps =
/* mode/filter list, remember: order matters! */
.filters = {
{RIG_MODE_SSB, kHz(2.4)},
{RIG_MODE_CW, Hz(200)},
{RIG_MODE_RTTY, Hz(500)},
{RIG_MODE_SSB, kHz(1.2)},
{RIG_MODE_SSB, kHz(1.8)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(200)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(50)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(1000)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(80)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(100)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(150)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(300)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(400)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(500)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(600)},
{RIG_MODE_CW | RIG_MODE_CWR, Hz(2000)},
{RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(500)},
{RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(250)},
{RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(1000)},
{RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(1500)},
{RIG_MODE_AM, kHz(9)},
{RIG_MODE_AM, kHz(3)},
{RIG_MODE_AM, kHz(6)},
{RIG_MODE_FM, kHz(14)},
{RIG_MODE_FM, kHz(7)},
{RIG_MODE_FM, kHz(10)},
RIG_FLT_END,
},
.vfo_ops = TS480_VFO_OPS,