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)); 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 * 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); kenwood_set_filter(rig, width);
/* non fatal */ /* 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); RETURNFUNC(RIG_OK);
} }
@ -2059,6 +2104,44 @@ static int kenwood_get_filter(RIG *rig, pbwidth_t *width)
RETURNFUNC(RIG_OK); 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 * kenwood_get_mode
*/ */
@ -2172,8 +2255,20 @@ int kenwood_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
} }
} }
/* XXX ? */ if (RIG_IS_TS480)
*width = rig_passband_normal(rig, *mode); {
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); RETURNFUNC(RIG_OK);
} }

Wyświetl plik

@ -112,7 +112,7 @@ struct kenwood_filter_width
{ {
rmode_t modes; rmode_t modes;
int value; int value;
int width_hz; pbwidth_t width_hz;
}; };
struct kenwood_slope_filter struct kenwood_slope_filter
@ -120,7 +120,7 @@ struct kenwood_slope_filter
rmode_t modes; rmode_t modes;
int data_mode_filter; int data_mode_filter;
int value; int value;
int frequency_hz; pbwidth_t frequency_hz;
}; };
struct kenwood_priv_caps 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[] = { 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, 80, 80 },
{ RIG_MODE_CW | RIG_MODE_CWR, 100, 100 }, { RIG_MODE_CW | RIG_MODE_CWR, 100, 100 },
{ RIG_MODE_CW | RIG_MODE_CWR, 150, 150 }, { 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, 1000, 1000 },
{ RIG_MODE_RTTY | RIG_MODE_RTTYR, 1500, 1500 }, { RIG_MODE_RTTY | RIG_MODE_RTTYR, 1500, 1500 },
{ RIG_MODE_SSB, 0, 2400 }, { RIG_MODE_SSB, 0, 2400 },
{ RIG_MODE_SSB, 1, 2400 }, // NAR1? { RIG_MODE_SSB, 1, 1200 }, // TODO: NAR1?
{ RIG_MODE_SSB, 2, 2400 }, // NAR2? { RIG_MODE_SSB, 2, 1800 }, // TODO: NAR2?
{ RIG_MODE_FM, 0, 2400 }, { RIG_MODE_FM, 0, 14000 },
{ RIG_MODE_FM, 1, 2400 }, // NAR1? { RIG_MODE_FM, 1, 7000 }, // TODO: NAR1?
{ RIG_MODE_FM, 2, 2400 }, // NAR2? { RIG_MODE_FM, 2, 10000 }, // TODO: NAR2?
{ RIG_MODE_AM, 0, 2400 }, { RIG_MODE_AM, 0, 9000 },
{ RIG_MODE_AM, 1, 2400 }, // NAR1? { RIG_MODE_AM, 1, 3000 }, // TODO: NAR1?
{ RIG_MODE_AM, 2, 2400 }, // NAR2? { RIG_MODE_AM, 2, 6000 }, // TODO: NAR2?
{ RIG_MODE_NONE, -1, -1 }, { 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 = static struct kenwood_priv_caps ts480_priv_caps =
{ {
.cmdtrm = EOM_KEN, .cmdtrm = EOM_KEN,
.filter_width = ts480_filter_width,
.slope_filter_high = ts480_slope_filter_high, .slope_filter_high = ts480_slope_filter_high,
.slope_filter_low = ts480_slope_filter_low, .slope_filter_low = ts480_slope_filter_low,
}; };
@ -1108,7 +1109,7 @@ const struct rig_caps ts480_caps =
.write_delay = 0, .write_delay = 0,
.post_write_delay = 0, .post_write_delay = 0,
.timeout = 200, .timeout = 200,
.retry = 10, .retry = 3,
.preamp = {12, RIG_DBLST_END,}, .preamp = {12, RIG_DBLST_END,},
.attenuator = {12, RIG_DBLST_END,}, .attenuator = {12, RIG_DBLST_END,},
.max_rit = kHz(9.99), .max_rit = kHz(9.99),
@ -1193,10 +1194,29 @@ const struct rig_caps ts480_caps =
/* mode/filter list, remember: order matters! */ /* mode/filter list, remember: order matters! */
.filters = { .filters = {
{RIG_MODE_SSB, kHz(2.4)}, {RIG_MODE_SSB, kHz(2.4)},
{RIG_MODE_CW, Hz(200)}, {RIG_MODE_SSB, kHz(1.2)},
{RIG_MODE_RTTY, Hz(500)}, {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(9)},
{RIG_MODE_AM, kHz(3)},
{RIG_MODE_AM, kHz(6)},
{RIG_MODE_FM, kHz(14)}, {RIG_MODE_FM, kHz(14)},
{RIG_MODE_FM, kHz(7)},
{RIG_MODE_FM, kHz(10)},
RIG_FLT_END, RIG_FLT_END,
}, },
.vfo_ops = TS480_VFO_OPS, .vfo_ops = TS480_VFO_OPS,