diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 6ee1f58e4..50f83084e 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -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); } diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index bbdf016ef..ff43580db 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -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 diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 8f653b8f8..37fa31364 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -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,