[Hamlib-commits] Hamlib -- Ham radio control libraries branch master updated. a281161fcff34034f4c83
Library to control radio transceivers and receivers
Brought to you by:
n0nb
From: Michael B. <mdb...@us...> - 2021-04-27 03:32:50
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Hamlib -- Ham radio control libraries". The branch, master has been updated via a281161fcff34034f4c83e833bd2522a4abcae28 (commit) via b0323be6b7653613ee3a240d39c49e8934857ab8 (commit) via 7ea0a49dcd70e7e10757b47889473c9a3957b915 (commit) via 402fecc43bdc594c30eea37a36054e8f5591b3e2 (commit) via 25eb70d90d3db5dcf7b516e1816eb14e8d1293f6 (commit) via a8b66955472f5964f6b04f2a69ae83bfc6bbbc1f (commit) via 9ca111a5a50308def4be04c037f1f74423599253 (commit) via 95b08de780cec1b1655eb8a29d5fcdc18230d41c (commit) via 6fd5371b12e0befff156e80f6e2de94e79ed2cd1 (commit) via 38e6cf1cd8b5251d1a604945b81a0924647e7a5b (commit) via 08a7515e911bea6a1ece4f66a96f7a45e151c467 (commit) via e4657a5d16087a88f17fb47ee30b61cca207c8a9 (commit) via de5c5a27a11c9b7b97ad0241ea067359b786a34e (commit) via 1f57311fee51a16ffaf496d8e6bf292b78d776cb (commit) via 45a1bf5b454f58257545132d4dee67e8268ff85e (commit) via 6a0df54003128f4537cd28bdc72b839f11e0d6b4 (commit) via 6e5791c221a236301425f4e539ca366858710fc6 (commit) via c13fcd861640b7e3b64e2a14bde19832100b5f0a (commit) via 645941cf9ae21bfbf7ad191ca9fc0153845176c5 (commit) via 6e1977277eda2d4bb02d9ba77dcfebdf5591771e (commit) via ad0569688b5f9c35e65aeb7ffe30a373396698e0 (commit) via bb1d0f83a0feca576c332d3a9574c8f644afd05e (commit) via 212c41f0af56222982cb728fe58ac7b96737a033 (commit) via 9b9a2b551178d080b86207094c795603e454e482 (commit) via 2b44f470fa014d1b22f375f6989524fe4dcedc00 (commit) via 055d4dce88f7b407bd647b42154faf947ee28035 (commit) via 4495b5b43452f88dd1b0f52248f5197b4bfd58e8 (commit) via fc1160c0a5a057553c83b166f01ecced8ddb8274 (commit) via 4f66af6ee1b7dd572c2b0411777b33417dc4c6a5 (commit) via c91baf0f2b3e41f6ad42392cfe1a178351e16021 (commit) via 40169d1dee173407c5f356ba7fa1a09ef8c5293e (commit) from ec68495bd31f0b4525c8b4624b5bd751da03c839 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a281161fcff34034f4c83e833bd2522a4abcae28 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Apr 26 11:32:55 2021 -0500 Improve kenwood set_rit to use the difference requested instead of restarting at zero https://github.com/Hamlib/Hamlib/issues/677 diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index fc0f2779..f3f23cef 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -1734,6 +1734,7 @@ int kenwood_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit) int diff; int rit_enabled; int xit_enabled; + shortfreq_t curr_rit; struct kenwood_priv_data *priv = rig->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called: vfo=%s, rit=%ld\n", @@ -1768,31 +1769,40 @@ int kenwood_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit) } } - // zero out rit - // we might be able to read rit and just do the difference - // see if anybody ever wants that or complain about this being slow + // by getting current rit we can determine how to handle change + // we just use curr_rit - rit to determine how far we need to move + // No need to zero out rit + retval = kenwood_get_rit(rig,RIG_VFO_CURR,&curr_rit); + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } +#if 0 // no longer needed if diff can be done retval = kenwood_transaction(rig, "RC", NULL, 0); if (retval != RIG_OK) { RETURNFUNC(retval); } +#endif - if (rit == 0) + if (rit == 0 && curr_rit == 0) { RETURNFUNC(RIG_OK); } if (priv->has_rit2) { - snprintf(buf, sizeof(buf), "R%c%05d", (rit > 0) ? 'U' : 'D', abs((int) rit)); + diff = curr_rit - rit; + rig_debug(RIG_DEBUG_TRACE, "%s: rit=%ld, curr_rit=%ld, diff=%d\n", __func__, rit, curr_rit, diff); + snprintf(buf, sizeof(buf), "R%c%05d", (diff > 0) ? 'U' : 'D', abs((int) diff)); retval = kenwood_transaction(rig, buf, NULL, 0); } else { snprintf(buf, sizeof(buf), "R%c", (rit > 0) ? 'U' : 'D'); - - diff = labs((rit + rit >= 0 ? 5 : -5) / 10); // round to nearest + diff = labs(((curr_rit - rit) + (curr_rit - rit) >= 0 ? 5 : -5) / 10); // round to nearest 10Hz + rig_debug(RIG_DEBUG_TRACE, "%s: rit=%ld, curr_rit=%ld, diff=%d\n", __func__, rit, curr_rit, diff); rig_debug(RIG_DEBUG_TRACE, "%s: rit change loop=%d\n", __func__, diff); for (i = 0; i < diff; i++) commit b0323be6b7653613ee3a240d39c49e8934857ab8 Merge: 7ea0a49d 402fecc4 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Apr 25 23:20:57 2021 -0500 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit 7ea0a49dcd70e7e10757b47889473c9a3957b915 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Apr 25 23:19:11 2021 -0500 Re-do get_rit for has_rit2 rigs If this works should be able to change get_rit in TS480 to the generic kenwood get_rit https://github.com/Hamlib/Hamlib/issues/677 diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index db931cc6..fc0f2779 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -781,6 +781,18 @@ int kenwood_open(RIG *rig) "%s: no response to get_id from rig...continuing anyways.\n", __func__); } + if (RIG_IS_TS2000 + || RIG_IS_TS480 + || RIG_IS_TS590S + || RIG_IS_TS590SG + || RIG_IS_TS890S + || RIG_IS_TS990S) + { + // rig has Set 2 RIT/XIT function + rig_debug(RIG_DEBUG_TRACE, "%s: rig has_rit2\n", __func__); + priv->has_rit2 = 1; + } + if (RIG_IS_TS590S) { /* we need the firmware version for these rigs to deal with f/w defects */ @@ -1717,41 +1729,77 @@ int kenwood_get_rit(RIG *rig, vfo_t vfo, shortfreq_t *rit) */ int kenwood_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit) { - char buf[4]; + char buf[32]; int retval, i; - shortfreq_t curr_rit; int diff; + int rit_enabled; + int xit_enabled; + struct kenwood_priv_data *priv = rig->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called: vfo=%s, rit=%ld\n", __func__, rig_strvfo(vfo), rit); - retval = kenwood_get_rit(rig, vfo, &curr_rit); + // RC clear command cannot be executed if RIT/XIT is not enabled + retval = kenwood_get_func(rig, vfo, RIG_FUNC_RIT, &rit_enabled); if (retval != RIG_OK) { RETURNFUNC(retval); } - // we'll set the rigs that have a rit step setting to 10Hz steps - retval = kenwood_transaction(rig, "RC;RU00010", NULL, 0); + if (!rit_enabled) + { + retval = kenwood_get_func(rig, vfo, RIG_FUNC_XIT, &xit_enabled); - if (retval != RIG_OK) + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } + } + + if (!rit_enabled && !xit_enabled) { - RETURNFUNC(retval); + retval = kenwood_set_func(rig, vfo, RIG_FUNC_RIT, 1); + + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } } - if (rit == 0) { RETURNFUNC(RIG_OK); } // we're done here + // zero out rit + // we might be able to read rit and just do the difference + // see if anybody ever wants that or complain about this being slow + retval = kenwood_transaction(rig, "RC", NULL, 0); - snprintf(buf, sizeof(buf), "R%c", (rit > 0) ? 'U' : 'D'); + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } - diff = labs((rit + rit >= 0 ? 5 : -5) / 10); // round to nearest - rig_debug(RIG_DEBUG_TRACE, "%s: rit change loop=%d\n", __func__, diff); + if (rit == 0) + { + RETURNFUNC(RIG_OK); + } - for (i = 0; i < diff; i++) + if (priv->has_rit2) { + snprintf(buf, sizeof(buf), "R%c%05d", (rit > 0) ? 'U' : 'D', abs((int) rit)); retval = kenwood_transaction(rig, buf, NULL, 0); } + else + { + snprintf(buf, sizeof(buf), "R%c", (rit > 0) ? 'U' : 'D'); + + diff = labs((rit + rit >= 0 ? 5 : -5) / 10); // round to nearest + rig_debug(RIG_DEBUG_TRACE, "%s: rit change loop=%d\n", __func__, diff); + + for (i = 0; i < diff; i++) + { + retval = kenwood_transaction(rig, buf, NULL, 0); + } + } RETURNFUNC(retval); } @@ -1849,6 +1897,7 @@ static int kenwood_set_filter_width(RIG *rig, rmode_t mode, pbwidth_t width) if (caps->filter_width[i].modes & mode) { selected_filter_width = &caps->filter_width[i]; + if (caps->filter_width[i].width_hz >= width) { break; @@ -2014,10 +2063,12 @@ int kenwood_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) 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); + rig_debug(RIG_DEBUG_ERR, "%s: error setting filter width, error: %d\n", + __func__, err); } } @@ -2100,6 +2151,7 @@ static int kenwood_get_filter_width(RIG *rig, rmode_t mode, pbwidth_t *width) } retval = kenwood_safe_transaction(rig, "FW", ackbuf, sizeof(ackbuf), 6); + if (retval != RIG_OK) { RETURNFUNC(retval); @@ -2238,10 +2290,12 @@ int kenwood_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) 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); + rig_debug(RIG_DEBUG_ERR, "%s: error getting filter width, error: %d\n", + __func__, retval); *width = rig_passband_normal(rig, *mode); } } @@ -2474,7 +2528,8 @@ static int kenwood_get_power_minmax(RIG *rig, int *power_now, int *power_min, RETURNFUNC(RIG_OK); } -static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct kenwood_slope_filter *filter, int frequency_hz, int *value) +static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, + struct kenwood_slope_filter *filter, int frequency_hz, int *value) { int retval; int i; @@ -2492,13 +2547,17 @@ static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct k return -RIG_ENAVAIL; } - retval = rig_get_cache(rig, vfo, &freq, &cache_ms_freq, &mode, &cache_ms_mode, &width, &cache_ms_width); + retval = rig_get_cache(rig, vfo, &freq, &cache_ms_freq, &mode, &cache_ms_mode, + &width, &cache_ms_width); + if (retval != RIG_OK) { return -RIG_EINVAL; } - retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, &data_mode_filter_active); + retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, + &data_mode_filter_active); + if (retval != RIG_OK) { // Ignore errors, e.g. if the command is not supported @@ -2507,13 +2566,15 @@ static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct k for (i = 0; filter[i].value >= 0; i++) { - if (filter[i].modes & mode && filter[i].data_mode_filter == data_mode_filter_active) + if (filter[i].modes & mode + && filter[i].data_mode_filter == data_mode_filter_active) { if (filter[i].frequency_hz >= frequency_hz) { *value = filter[i].value; return RIG_OK; } + last_filter = &filter[i]; } } @@ -2527,7 +2588,8 @@ static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct k return -RIG_EINVAL; } -static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, struct kenwood_slope_filter *filter, int value, int *frequency_hz) +static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, + struct kenwood_slope_filter *filter, int value, int *frequency_hz) { int retval; int i; @@ -2544,13 +2606,17 @@ static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, struct kenwo return -RIG_ENAVAIL; } - retval = rig_get_cache(rig, vfo, &freq, &cache_ms_freq, &mode, &cache_ms_mode, &width, &cache_ms_width); + retval = rig_get_cache(rig, vfo, &freq, &cache_ms_freq, &mode, &cache_ms_mode, + &width, &cache_ms_width); + if (retval != RIG_OK) { return -RIG_EINVAL; } - retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, &data_mode_filter_active); + retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, + &data_mode_filter_active); + if (retval != RIG_OK) { // Ignore errors, e.g. if the command is not supported @@ -2559,7 +2625,8 @@ static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, struct kenwo for (i = 0; filter[i].value >= 0; i++) { - if (filter[i].modes & mode && filter[i].data_mode_filter == data_mode_filter_active) + if (filter[i].modes & mode + && filter[i].data_mode_filter == data_mode_filter_active) { if (filter[i].value == value) { @@ -2750,7 +2817,9 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) break; case RIG_LEVEL_SLOPE_HIGH: - retval = kenwood_find_slope_filter_for_frequency(rig, vfo, caps->slope_filter_high, val.i, &kenwood_val); + retval = kenwood_find_slope_filter_for_frequency(rig, vfo, + caps->slope_filter_high, val.i, &kenwood_val); + if (retval != RIG_OK) { // Fall back to using raw values @@ -2758,6 +2827,7 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { RETURNFUNC(-RIG_EINVAL); } + kenwood_val = val.i; } @@ -2765,7 +2835,9 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) break; case RIG_LEVEL_SLOPE_LOW: - retval = kenwood_find_slope_filter_for_frequency(rig, vfo, caps->slope_filter_low, val.i, &kenwood_val); + retval = kenwood_find_slope_filter_for_frequency(rig, vfo, + caps->slope_filter_low, val.i, &kenwood_val); + if (retval != RIG_OK) { // Fall back to using raw values @@ -2773,6 +2845,7 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { RETURNFUNC(-RIG_EINVAL); } + kenwood_val = val.i; } @@ -2806,6 +2879,7 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { kenwood_val = val.f * 100.0f; } + snprintf(levelbuf, sizeof(levelbuf), "PL%03d%03d", kenwood_val, kenwood_val); break; @@ -3181,7 +3255,9 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) value = atoi(&lvlbuf[2]); - retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_low, value, &val->i); + retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_low, + value, &val->i); + if (retval != RIG_OK) { if (retval == -RIG_ENAVAIL) @@ -3194,6 +3270,7 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) RETURNFUNC(retval); } } + break; case RIG_LEVEL_SLOPE_HIGH: @@ -3206,7 +3283,9 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) value = atoi(&lvlbuf[2]); - retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_high, value, &val->i); + retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_high, + value, &val->i); + if (retval != RIG_OK) { if (retval == -RIG_ENAVAIL) @@ -3219,6 +3298,7 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) RETURNFUNC(retval); } } + break; case RIG_LEVEL_CWPITCH: @@ -3244,7 +3324,8 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) sscanf(lvlbuf + 2, "%d", &val->i); break; - case RIG_LEVEL_COMP: { + case RIG_LEVEL_COMP: + { int raw_value; retval = kenwood_safe_transaction(rig, "PL", lvlbuf, 50, 8); @@ -3263,10 +3344,12 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { val->f = (float) raw_value / 100.0f; } + break; } - case RIG_LEVEL_VOXDELAY: { + case RIG_LEVEL_VOXDELAY: + { int raw_value; retval = kenwood_safe_transaction(rig, "VD", lvlbuf, 50, 6); @@ -3282,7 +3365,8 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; } - case RIG_LEVEL_VOXGAIN: { + case RIG_LEVEL_VOXGAIN: + { int raw_value; retval = kenwood_safe_transaction(rig, "VG", lvlbuf, 50, 5); @@ -3297,7 +3381,8 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; } - case RIG_LEVEL_BKIN_DLYMS: { + case RIG_LEVEL_BKIN_DLYMS: + { int raw_value; retval = kenwood_safe_transaction(rig, "SD", lvlbuf, 50, 6); @@ -3600,7 +3685,8 @@ int kenwood_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) *status = respbuf[3] != '0' ? 1 : 0; RETURNFUNC(RIG_OK); - case RIG_FUNC_FBKIN: { + case RIG_FUNC_FBKIN: + { int raw_value; retval = kenwood_safe_transaction(rig, "SD", respbuf, 20, 6); @@ -4172,7 +4258,8 @@ int kenwood_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) RETURNFUNC(-RIG_EINVAL); } - if (RIG_IS_TS480 || RIG_IS_TS590S || RIG_IS_TS590SG || RIG_IS_TS990S || RIG_IS_TS2000) + if (RIG_IS_TS480 || RIG_IS_TS590S || RIG_IS_TS590SG || RIG_IS_TS990S + || RIG_IS_TS2000) { expected = 4; } @@ -4188,7 +4275,8 @@ int kenwood_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) RETURNFUNC(retval); } - if ((RIG_IS_TS990S && RIG_VFO_SUB == vfo) || (RIG_IS_TS2000 && RIG_VFO_SUB == vfo)) + if ((RIG_IS_TS990S && RIG_VFO_SUB == vfo) || (RIG_IS_TS2000 + && RIG_VFO_SUB == vfo)) { offs = 3; } diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index c0deee97..3376fbf4 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -28,7 +28,7 @@ #include "token.h" #include "misc.h" -#define BACKEND_VER "20210423" +#define BACKEND_VER "20210425" #define EOM_KEN ';' #define EOM_TH '\r' @@ -154,6 +154,7 @@ struct kenwood_priv_data char last_if_response[KENWOOD_MAX_BUF_LEN]; int poweron; /* to avoid powering on more than once */ int ag_format; /* which AG command is being used...see LEVEL_AF in kenwood.c*/ + int has_rit2; /* rig has set 2 rit command -- can set rit 0-99999 directly */ int micgain_min, micgain_max; /* varies by rig so we figure it out automagically */ int is_k2; int is_k3; commit 402fecc43bdc594c30eea37a36054e8f5591b3e2 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Apr 25 23:19:11 2021 -0500 Re-do get_rit for has_rit2 rigs If this works should be able to change get_rit in TS480 to the generic kenwood get_rit diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index db931cc6..fc0f2779 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -781,6 +781,18 @@ int kenwood_open(RIG *rig) "%s: no response to get_id from rig...continuing anyways.\n", __func__); } + if (RIG_IS_TS2000 + || RIG_IS_TS480 + || RIG_IS_TS590S + || RIG_IS_TS590SG + || RIG_IS_TS890S + || RIG_IS_TS990S) + { + // rig has Set 2 RIT/XIT function + rig_debug(RIG_DEBUG_TRACE, "%s: rig has_rit2\n", __func__); + priv->has_rit2 = 1; + } + if (RIG_IS_TS590S) { /* we need the firmware version for these rigs to deal with f/w defects */ @@ -1717,41 +1729,77 @@ int kenwood_get_rit(RIG *rig, vfo_t vfo, shortfreq_t *rit) */ int kenwood_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit) { - char buf[4]; + char buf[32]; int retval, i; - shortfreq_t curr_rit; int diff; + int rit_enabled; + int xit_enabled; + struct kenwood_priv_data *priv = rig->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called: vfo=%s, rit=%ld\n", __func__, rig_strvfo(vfo), rit); - retval = kenwood_get_rit(rig, vfo, &curr_rit); + // RC clear command cannot be executed if RIT/XIT is not enabled + retval = kenwood_get_func(rig, vfo, RIG_FUNC_RIT, &rit_enabled); if (retval != RIG_OK) { RETURNFUNC(retval); } - // we'll set the rigs that have a rit step setting to 10Hz steps - retval = kenwood_transaction(rig, "RC;RU00010", NULL, 0); + if (!rit_enabled) + { + retval = kenwood_get_func(rig, vfo, RIG_FUNC_XIT, &xit_enabled); - if (retval != RIG_OK) + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } + } + + if (!rit_enabled && !xit_enabled) { - RETURNFUNC(retval); + retval = kenwood_set_func(rig, vfo, RIG_FUNC_RIT, 1); + + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } } - if (rit == 0) { RETURNFUNC(RIG_OK); } // we're done here + // zero out rit + // we might be able to read rit and just do the difference + // see if anybody ever wants that or complain about this being slow + retval = kenwood_transaction(rig, "RC", NULL, 0); - snprintf(buf, sizeof(buf), "R%c", (rit > 0) ? 'U' : 'D'); + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } - diff = labs((rit + rit >= 0 ? 5 : -5) / 10); // round to nearest - rig_debug(RIG_DEBUG_TRACE, "%s: rit change loop=%d\n", __func__, diff); + if (rit == 0) + { + RETURNFUNC(RIG_OK); + } - for (i = 0; i < diff; i++) + if (priv->has_rit2) { + snprintf(buf, sizeof(buf), "R%c%05d", (rit > 0) ? 'U' : 'D', abs((int) rit)); retval = kenwood_transaction(rig, buf, NULL, 0); } + else + { + snprintf(buf, sizeof(buf), "R%c", (rit > 0) ? 'U' : 'D'); + + diff = labs((rit + rit >= 0 ? 5 : -5) / 10); // round to nearest + rig_debug(RIG_DEBUG_TRACE, "%s: rit change loop=%d\n", __func__, diff); + + for (i = 0; i < diff; i++) + { + retval = kenwood_transaction(rig, buf, NULL, 0); + } + } RETURNFUNC(retval); } @@ -1849,6 +1897,7 @@ static int kenwood_set_filter_width(RIG *rig, rmode_t mode, pbwidth_t width) if (caps->filter_width[i].modes & mode) { selected_filter_width = &caps->filter_width[i]; + if (caps->filter_width[i].width_hz >= width) { break; @@ -2014,10 +2063,12 @@ int kenwood_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) 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); + rig_debug(RIG_DEBUG_ERR, "%s: error setting filter width, error: %d\n", + __func__, err); } } @@ -2100,6 +2151,7 @@ static int kenwood_get_filter_width(RIG *rig, rmode_t mode, pbwidth_t *width) } retval = kenwood_safe_transaction(rig, "FW", ackbuf, sizeof(ackbuf), 6); + if (retval != RIG_OK) { RETURNFUNC(retval); @@ -2238,10 +2290,12 @@ int kenwood_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) 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); + rig_debug(RIG_DEBUG_ERR, "%s: error getting filter width, error: %d\n", + __func__, retval); *width = rig_passband_normal(rig, *mode); } } @@ -2474,7 +2528,8 @@ static int kenwood_get_power_minmax(RIG *rig, int *power_now, int *power_min, RETURNFUNC(RIG_OK); } -static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct kenwood_slope_filter *filter, int frequency_hz, int *value) +static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, + struct kenwood_slope_filter *filter, int frequency_hz, int *value) { int retval; int i; @@ -2492,13 +2547,17 @@ static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct k return -RIG_ENAVAIL; } - retval = rig_get_cache(rig, vfo, &freq, &cache_ms_freq, &mode, &cache_ms_mode, &width, &cache_ms_width); + retval = rig_get_cache(rig, vfo, &freq, &cache_ms_freq, &mode, &cache_ms_mode, + &width, &cache_ms_width); + if (retval != RIG_OK) { return -RIG_EINVAL; } - retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, &data_mode_filter_active); + retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, + &data_mode_filter_active); + if (retval != RIG_OK) { // Ignore errors, e.g. if the command is not supported @@ -2507,13 +2566,15 @@ static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct k for (i = 0; filter[i].value >= 0; i++) { - if (filter[i].modes & mode && filter[i].data_mode_filter == data_mode_filter_active) + if (filter[i].modes & mode + && filter[i].data_mode_filter == data_mode_filter_active) { if (filter[i].frequency_hz >= frequency_hz) { *value = filter[i].value; return RIG_OK; } + last_filter = &filter[i]; } } @@ -2527,7 +2588,8 @@ static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct k return -RIG_EINVAL; } -static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, struct kenwood_slope_filter *filter, int value, int *frequency_hz) +static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, + struct kenwood_slope_filter *filter, int value, int *frequency_hz) { int retval; int i; @@ -2544,13 +2606,17 @@ static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, struct kenwo return -RIG_ENAVAIL; } - retval = rig_get_cache(rig, vfo, &freq, &cache_ms_freq, &mode, &cache_ms_mode, &width, &cache_ms_width); + retval = rig_get_cache(rig, vfo, &freq, &cache_ms_freq, &mode, &cache_ms_mode, + &width, &cache_ms_width); + if (retval != RIG_OK) { return -RIG_EINVAL; } - retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, &data_mode_filter_active); + retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, + &data_mode_filter_active); + if (retval != RIG_OK) { // Ignore errors, e.g. if the command is not supported @@ -2559,7 +2625,8 @@ static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, struct kenwo for (i = 0; filter[i].value >= 0; i++) { - if (filter[i].modes & mode && filter[i].data_mode_filter == data_mode_filter_active) + if (filter[i].modes & mode + && filter[i].data_mode_filter == data_mode_filter_active) { if (filter[i].value == value) { @@ -2750,7 +2817,9 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) break; case RIG_LEVEL_SLOPE_HIGH: - retval = kenwood_find_slope_filter_for_frequency(rig, vfo, caps->slope_filter_high, val.i, &kenwood_val); + retval = kenwood_find_slope_filter_for_frequency(rig, vfo, + caps->slope_filter_high, val.i, &kenwood_val); + if (retval != RIG_OK) { // Fall back to using raw values @@ -2758,6 +2827,7 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { RETURNFUNC(-RIG_EINVAL); } + kenwood_val = val.i; } @@ -2765,7 +2835,9 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) break; case RIG_LEVEL_SLOPE_LOW: - retval = kenwood_find_slope_filter_for_frequency(rig, vfo, caps->slope_filter_low, val.i, &kenwood_val); + retval = kenwood_find_slope_filter_for_frequency(rig, vfo, + caps->slope_filter_low, val.i, &kenwood_val); + if (retval != RIG_OK) { // Fall back to using raw values @@ -2773,6 +2845,7 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { RETURNFUNC(-RIG_EINVAL); } + kenwood_val = val.i; } @@ -2806,6 +2879,7 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { kenwood_val = val.f * 100.0f; } + snprintf(levelbuf, sizeof(levelbuf), "PL%03d%03d", kenwood_val, kenwood_val); break; @@ -3181,7 +3255,9 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) value = atoi(&lvlbuf[2]); - retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_low, value, &val->i); + retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_low, + value, &val->i); + if (retval != RIG_OK) { if (retval == -RIG_ENAVAIL) @@ -3194,6 +3270,7 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) RETURNFUNC(retval); } } + break; case RIG_LEVEL_SLOPE_HIGH: @@ -3206,7 +3283,9 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) value = atoi(&lvlbuf[2]); - retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_high, value, &val->i); + retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_high, + value, &val->i); + if (retval != RIG_OK) { if (retval == -RIG_ENAVAIL) @@ -3219,6 +3298,7 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) RETURNFUNC(retval); } } + break; case RIG_LEVEL_CWPITCH: @@ -3244,7 +3324,8 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) sscanf(lvlbuf + 2, "%d", &val->i); break; - case RIG_LEVEL_COMP: { + case RIG_LEVEL_COMP: + { int raw_value; retval = kenwood_safe_transaction(rig, "PL", lvlbuf, 50, 8); @@ -3263,10 +3344,12 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { val->f = (float) raw_value / 100.0f; } + break; } - case RIG_LEVEL_VOXDELAY: { + case RIG_LEVEL_VOXDELAY: + { int raw_value; retval = kenwood_safe_transaction(rig, "VD", lvlbuf, 50, 6); @@ -3282,7 +3365,8 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; } - case RIG_LEVEL_VOXGAIN: { + case RIG_LEVEL_VOXGAIN: + { int raw_value; retval = kenwood_safe_transaction(rig, "VG", lvlbuf, 50, 5); @@ -3297,7 +3381,8 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; } - case RIG_LEVEL_BKIN_DLYMS: { + case RIG_LEVEL_BKIN_DLYMS: + { int raw_value; retval = kenwood_safe_transaction(rig, "SD", lvlbuf, 50, 6); @@ -3600,7 +3685,8 @@ int kenwood_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) *status = respbuf[3] != '0' ? 1 : 0; RETURNFUNC(RIG_OK); - case RIG_FUNC_FBKIN: { + case RIG_FUNC_FBKIN: + { int raw_value; retval = kenwood_safe_transaction(rig, "SD", respbuf, 20, 6); @@ -4172,7 +4258,8 @@ int kenwood_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) RETURNFUNC(-RIG_EINVAL); } - if (RIG_IS_TS480 || RIG_IS_TS590S || RIG_IS_TS590SG || RIG_IS_TS990S || RIG_IS_TS2000) + if (RIG_IS_TS480 || RIG_IS_TS590S || RIG_IS_TS590SG || RIG_IS_TS990S + || RIG_IS_TS2000) { expected = 4; } @@ -4188,7 +4275,8 @@ int kenwood_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) RETURNFUNC(retval); } - if ((RIG_IS_TS990S && RIG_VFO_SUB == vfo) || (RIG_IS_TS2000 && RIG_VFO_SUB == vfo)) + if ((RIG_IS_TS990S && RIG_VFO_SUB == vfo) || (RIG_IS_TS2000 + && RIG_VFO_SUB == vfo)) { offs = 3; } diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index c0deee97..3376fbf4 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -28,7 +28,7 @@ #include "token.h" #include "misc.h" -#define BACKEND_VER "20210423" +#define BACKEND_VER "20210425" #define EOM_KEN ';' #define EOM_TH '\r' @@ -154,6 +154,7 @@ struct kenwood_priv_data char last_if_response[KENWOOD_MAX_BUF_LEN]; int poweron; /* to avoid powering on more than once */ int ag_format; /* which AG command is being used...see LEVEL_AF in kenwood.c*/ + int has_rit2; /* rig has set 2 rit command -- can set rit 0-99999 directly */ int micgain_min, micgain_max; /* varies by rig so we figure it out automagically */ int is_k2; int is_k3; commit 25eb70d90d3db5dcf7b516e1816eb14e8d1293f6 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Apr 25 14:59:47 2021 -0500 In iofunc.c only call hl_sleep if needed diff --git a/src/iofunc.c b/src/iofunc.c index b83cabbd..0e58e217 100644 --- a/src/iofunc.c +++ b/src/iofunc.c @@ -481,7 +481,7 @@ int HAMLIB_API write_block(hamlib_port_t *p, const char *txbuffer, size_t count) return -RIG_EIO; } - hl_usleep(p->write_delay * 1000); + if (p->write_delay > 0) hl_usleep(p->write_delay * 1000); } } else commit a8b66955472f5964f6b04f2a69ae83bfc6bbbc1f Merge: ec68495b 9ca111a5 Author: Michael Black <mdb...@ya...> Date: Sun Apr 25 09:42:11 2021 -0500 Merge pull request #680 from mikaelnousiainen/ts480-fixes Extend TS-480 backend functionality significantly commit 9ca111a5a50308def4be04c037f1f74423599253 Author: Mikael Nousiainen <mik...@ik...> Date: Sun Apr 25 17:19:16 2021 +0300 Fix RIT for TS-480 diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 44a2e8ab..8ab25d76 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -26,6 +26,7 @@ #include <stdio.h> #include <stdlib.h> +#include <math.h> #include <hamlib/rig.h> #include "cal.h" @@ -731,7 +732,7 @@ static int ts480_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit) rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); - if (rit < 9999 || rit > 9999) + if (rit < -9999 || rit > 9999) { RETURNFUNC(-RIG_EINVAL); } @@ -781,7 +782,7 @@ static int ts480_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit) RETURNFUNC(RIG_OK); } - snprintf(buf, sizeof(buf), "R%c%05ld", (rit > 0) ? 'U' : 'D', rit); + snprintf(buf, sizeof(buf), "R%c%05d", (rit > 0) ? 'U' : 'D', abs((int) rit)); retval = kenwood_transaction(rig, buf, NULL, 0); RETURNFUNC(retval); commit 95b08de780cec1b1655eb8a29d5fcdc18230d41c Author: Mikael Nousiainen <mik...@ik...> Date: Sun Apr 25 17:14:59 2021 +0300 Fix RIT for TS-480 diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 21cd7775..44a2e8ab 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -724,12 +724,18 @@ kenwood_ts480_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) static int ts480_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit) { + char buf[20]; int retval; int rit_enabled; int xit_enabled; rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); + if (rit < 9999 || rit > 9999) + { + RETURNFUNC(-RIG_EINVAL); + } + // RC clear command cannot be executed if RIT/XIT is not enabled retval = kenwood_get_func(rig, vfo, RIG_FUNC_RIT, &rit_enabled); @@ -770,7 +776,15 @@ static int ts480_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit) } } - RETURNFUNC(kenwood_set_rit(rig, vfo, rit)); + if (rit == 0) + { + RETURNFUNC(RIG_OK); + } + + snprintf(buf, sizeof(buf), "R%c%05ld", (rit > 0) ? 'U' : 'D', rit); + retval = kenwood_transaction(rig, buf, NULL, 0); + + RETURNFUNC(retval); } static int ts480_get_rit(RIG *rig, vfo_t vfo, shortfreq_t *rit) commit 6fd5371b12e0befff156e80f6e2de94e79ed2cd1 Merge: 38e6cf1c ec68495b Author: Mikael Nousiainen <mik...@ik...> Date: Sun Apr 25 16:50:48 2021 +0300 Merge branch 'master' into ts480-fixes commit 38e6cf1cd8b5251d1a604945b81a0924647e7a5b Author: Mikael Nousiainen <mik...@ik...> Date: Sun Apr 25 16:50:16 2021 +0300 Fix TS-480 narrow filter widths. Add NR2 and CW IF filter support. diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 37fa3136..21cd7775 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -73,27 +73,37 @@ { 20, 10.0f } \ } } -#define TOK_FUNC_TX_AUDIO_FROM_DATA_INPUT TOKEN_BACKEND(102) -#define TOK_LEVEL_DSP_RX_EQUALIZER TOKEN_BACKEND(103) -#define TOK_LEVEL_DSP_TX_EQUALIZER TOKEN_BACKEND(104) -#define TOK_LEVEL_DSP_TX_BANDWIDTH TOKEN_BACKEND(105) -#define TOK_LEVEL_BEEP_VOLUME TOKEN_BACKEND(106) -#define TOK_LEVEL_TX_SIDETONE_VOLUME TOKEN_BACKEND(107) -#define TOK_LEVEL_AF_INPUT_LEVEL TOKEN_BACKEND(108) -#define TOK_LEVEL_AF_OUTPUT_LEVEL TOKEN_BACKEND(109) -#define TOK_LEVEL_DIGITAL_NOISE_LIMITER TOKEN_BACKEND(110) +#define TOK_FUNC_NOISE_REDUCTION_2 TOKEN_BACKEND(102) +#define TOK_FUNC_TX_AUDIO_FROM_DATA_INPUT TOKEN_BACKEND(103) +#define TOK_LEVEL_DSP_RX_EQUALIZER TOKEN_BACKEND(104) +#define TOK_LEVEL_DSP_TX_EQUALIZER TOKEN_BACKEND(105) +#define TOK_LEVEL_DSP_TX_BANDWIDTH TOKEN_BACKEND(106) +#define TOK_LEVEL_BEEP_VOLUME TOKEN_BACKEND(107) +#define TOK_LEVEL_TX_SIDETONE_VOLUME TOKEN_BACKEND(108) +#define TOK_LEVEL_AF_INPUT_LEVEL TOKEN_BACKEND(109) +#define TOK_LEVEL_AF_OUTPUT_LEVEL TOKEN_BACKEND(110) +#define TOK_LEVEL_DIGITAL_NOISE_LIMITER TOKEN_BACKEND(111) +#define TOK_FUNC_CW_IF_FOR_SSB_RX TOKEN_BACKEND(112) int ts480_ext_tokens[] = { - TOK_FUNC_FILTER_WIDTH_DATA, TOK_FUNC_TX_AUDIO_FROM_DATA_INPUT, + TOK_FUNC_NOISE_REDUCTION_2, TOK_FUNC_FILTER_WIDTH_DATA, TOK_FUNC_TX_AUDIO_FROM_DATA_INPUT, TOK_LEVEL_DSP_RX_EQUALIZER, TOK_LEVEL_DSP_TX_EQUALIZER, TOK_LEVEL_DSP_TX_BANDWIDTH, TOK_LEVEL_BEEP_VOLUME, TOK_LEVEL_TX_SIDETONE_VOLUME, TOK_LEVEL_AF_INPUT_LEVEL, TOK_LEVEL_AF_OUTPUT_LEVEL, - TOK_LEVEL_DIGITAL_NOISE_LIMITER, + TOK_LEVEL_DIGITAL_NOISE_LIMITER, TOK_FUNC_CW_IF_FOR_SSB_RX, TOK_BACKEND_NONE, }; const struct confparams ts480_ext_funcs[] = { + { + TOK_FUNC_NOISE_REDUCTION_2, "NR2", "Noise reduction 2", "Noise reduction 2", + NULL, RIG_CONF_CHECKBUTTON, + }, + { + TOK_FUNC_CW_IF_FOR_SSB_RX, "CW_IF_FOR_SSB_RX", "CW IF filter for SSB", "Use CW IF filter for SSB reception", + NULL, RIG_CONF_CHECKBUTTON, + }, { TOK_FUNC_FILTER_WIDTH_DATA, "FILTER_WIDTH_DATA", "Filter bandwidth for data", "Filter bandwidth for data communications", NULL, RIG_CONF_CHECKBUTTON, @@ -793,12 +803,28 @@ static int ts480_get_rit(RIG *rig, vfo_t vfo, shortfreq_t *rit) static int ts480_set_ext_func(RIG *rig, vfo_t vfo, token_t token, int status) { + char cmdbuf[20]; int retval; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); switch (token) { + case TOK_FUNC_NOISE_REDUCTION_2: + if (status < 0 || status > 1) + { + RETURNFUNC(-RIG_EINVAL); + } + snprintf(cmdbuf, sizeof(cmdbuf), "NR%d", status ? 2 : 0); + retval = kenwood_transaction(rig, cmdbuf, NULL, 0); + break; + case TOK_FUNC_CW_IF_FOR_SSB_RX: + if (status < 0 || status > 1) + { + RETURNFUNC(-RIG_EINVAL); + } + retval = ts480_set_ex_menu(rig, 17, 1, status); + break; case TOK_FUNC_FILTER_WIDTH_DATA: if (status < 0 || status > 1) { @@ -822,12 +848,30 @@ static int ts480_set_ext_func(RIG *rig, vfo_t vfo, token_t token, int status) static int ts480_get_ext_func(RIG *rig, vfo_t vfo, token_t token, int *status) { + char ackbuf[20]; int retval; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); switch (token) { + case TOK_FUNC_NOISE_REDUCTION_2: { + int value; + + retval = kenwood_safe_transaction(rig, "NR", ackbuf, sizeof(ackbuf), 3); + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } + + sscanf(ackbuf, "NR%d", &value); + + *status = (value == 2) ? 1 : 0; + break; + } + case TOK_FUNC_CW_IF_FOR_SSB_RX: + retval = ts480_get_ex_menu(rig, 17, 1, status); + break; case TOK_FUNC_FILTER_WIDTH_DATA: retval = ts480_get_ex_menu(rig, 45, 1, status); break; @@ -855,7 +899,7 @@ static int ts480_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val) { RETURNFUNC(-RIG_EINVAL); } - sprintf(cmdbuf, "DL%d%02d", val.i != 0 ? 1 : 0, val.i > 0 ? val.i - 1 : 0); + snprintf(cmdbuf, sizeof(cmdbuf), "DL%d%02d", val.i != 0 ? 1 : 0, val.i > 0 ? val.i - 1 : 0); retval = kenwood_transaction(rig, cmdbuf, NULL, 0); break; case TOK_LEVEL_DSP_RX_EQUALIZER: @@ -991,14 +1035,11 @@ 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, 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_SSB, 1, 500 }, // NAR1 optional filter + { RIG_MODE_SSB, 2, 270 }, // NAR2 optional filter + { RIG_MODE_FM, 0, 12000 }, + { RIG_MODE_AM, 0, 6000 }, + { RIG_MODE_AM, 1, 2400 }, // NAR1 optional filter (?) { RIG_MODE_NONE, -1, -1 }, }; @@ -1194,8 +1235,8 @@ const struct rig_caps ts480_caps = /* mode/filter list, remember: order matters! */ .filters = { {RIG_MODE_SSB, kHz(2.4)}, - {RIG_MODE_SSB, kHz(1.2)}, - {RIG_MODE_SSB, kHz(1.8)}, + {RIG_MODE_SSB, Hz(270)}, + {RIG_MODE_SSB, Hz(500)}, {RIG_MODE_CW | RIG_MODE_CWR, Hz(200)}, {RIG_MODE_CW | RIG_MODE_CWR, Hz(50)}, {RIG_MODE_CW | RIG_MODE_CWR, Hz(1000)}, @@ -1211,12 +1252,9 @@ const struct rig_caps ts480_caps = {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_MODE_AM, kHz(2.4)}, + {RIG_MODE_FM, kHz(12)}, RIG_FLT_END, }, .vfo_ops = TS480_VFO_OPS, commit 08a7515e911bea6a1ece4f66a96f7a45e151c467 Author: Mikael Nousiainen <mik...@ik...> Date: Sat Apr 24 19:13:12 2021 +0300 Add support for FW filter width command on TS-480 diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 6ee1f58e..50f83084 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 bbdf016e..ff43580d 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 8f653b8f..37fa3136 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, commit e4657a5d16087a88f17fb47ee30b61cca207c8a9 Author: Mikael Nousiainen <mik...@ik...> Date: Fri Apr 23 23:32:42 2021 +0300 TS-480: Add Digital Noise Limiter. Start implementation for filter width command. Fix bugs. diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index c70b1dcd..6ee1f58e 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -2410,6 +2410,7 @@ static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct k int cache_ms_mode; pbwidth_t width; int cache_ms_width; + int data_mode_filter_active; if (filter == NULL) { @@ -2422,10 +2423,16 @@ static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct k return -RIG_EINVAL; } + retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, &data_mode_filter_active); + if (retval != RIG_OK) + { + // Ignore errors, e.g. if the command is not supported + data_mode_filter_active = 0; + } + for (i = 0; filter[i].value >= 0; i++) { - // TODO: check data mode status - if (filter[i].modes & mode) + if (filter[i].modes & mode && filter[i].data_mode_filter == data_mode_filter_active) { if (filter[i].frequency_hz >= frequency_hz) { @@ -2455,6 +2462,7 @@ static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, struct kenwo int cache_ms_mode; pbwidth_t width; int cache_ms_width; + int data_mode_filter_active; if (filter == NULL) { @@ -2467,10 +2475,16 @@ static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, struct kenwo return -RIG_EINVAL; } + retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, &data_mode_filter_active); + if (retval != RIG_OK) + { + // Ignore errors, e.g. if the command is not supported + data_mode_filter_active = 0; + } + for (i = 0; filter[i].value >= 0; i++) { - // TODO: check data mode status - if (filter[i].modes & mode) + if (filter[i].modes & mode && filter[i].data_mode_filter == data_mode_filter_active) { if (filter[i].value == value) { @@ -3095,8 +3109,15 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_low, value, &val->i); if (retval != RIG_OK) { - // Fall back to using raw values - val->i = value; + if (retval == -RIG_ENAVAIL) + { + // Fall back to using raw values + val->i = value; + } + else + { + RETURNFUNC(retval); + } } break; @@ -3113,8 +3134,15 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_high, value, &val->i); if (retval != RIG_OK) { - // Fall back to using raw values - val->i = value; + if (retval == -RIG_ENAVAIL) + { + // Fall back to using raw values + val->i = value; + } + else + { + RETURNFUNC(retval); + } } break; diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index 7e674b36..bbdf016e 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -47,6 +47,8 @@ #define TOK_RIT TOKEN_BACKEND(4) #define TOK_NO_ID TOKEN_BACKEND(5) +#define TOK_FUNC_FILTER_WIDTH_DATA TOKEN_BACKEND(6) // Data communications mode that affects SL/SH/FW commands + /* Token structure assigned to .cfgparams in rig_caps */ extern const struct confparams kenwood_cfg_params[]; @@ -106,7 +108,12 @@ extern const struct confparams kenwood_cfg_params[]; #define RIG_IS_POWERSDR (rig->caps->rig_model == RIG_MODEL_POWERSDR) #define RIG_IS_MALACHITE (rig->caps->rig_model == RIG_MODEL_MALACHITE) -#define KENWOOD_SLOPE_FILTER_COUNT_MAX 64 +struct kenwood_filter_width +{ + rmode_t modes; + int value; + int width_hz; +}; struct kenwood_slope_filter { @@ -121,8 +128,9 @@ struct kenwood_priv_caps char cmdtrm; /* Command termination chars (ken=';' or th='\r') */ int if_len; /* length of IF; answer excluding ';' terminator */ rmode_t *mode_table; - struct kenwood_slope_filter *slope_filter_high; /* Last entry should have value == -1 and frequency_hz == -1*/ - struct kenwood_slope_filter *slope_filter_low; /* Last entry should have value == -1 and frequency_hz == -1*/ + struct kenwood_filter_width *filter_width; /* Last entry should have value == -1 and width_hz == -1 */ + struct kenwood_slope_filter *slope_filter_high; /* Last entry should have value == -1 and frequency_hz == -1 */ + struct kenwood_slope_filter *slope_filter_low; /* Last entry should have value == -1 and frequency_hz == -1 */ }; struct kenwood_priv_data diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 6bd4cd79..8f653b8f 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -73,7 +73,6 @@ { 20, 10.0f } \ } } -#define TOK_FUNC_FILTER_WIDTH_DATA TOKEN_BACKEND(101) #define TOK_FUNC_TX_AUDIO_FROM_DATA_INPUT TOKEN_BACKEND(102) #define TOK_LEVEL_DSP_RX_EQUALIZER TOKEN_BACKEND(103) #define TOK_LEVEL_DSP_TX_EQUALIZER TOKEN_BACKEND(104) @@ -82,12 +81,14 @@ #define TOK_LEVEL_TX_SIDETONE_VOLUME TOKEN_BACKEND(107) #define TOK_LEVEL_AF_INPUT_LEVEL TOKEN_BACKEND(108) #define TOK_LEVEL_AF_OUTPUT_LEVEL TOKEN_BACKEND(109) +#define TOK_LEVEL_DIGITAL_NOISE_LIMITER TOKEN_BACKEND(110) int ts480_ext_tokens[] = { TOK_FUNC_FILTER_WIDTH_DATA, TOK_FUNC_TX_AUDIO_FROM_DATA_INPUT, TOK_LEVEL_DSP_RX_EQUALIZER, TOK_LEVEL_DSP_TX_EQUALIZER, TOK_LEVEL_DSP_TX_BANDWIDTH, TOK_LEVEL_BEEP_VOLUME, TOK_LEVEL_TX_SIDETONE_VOLUME, TOK_LEVEL_AF_INPUT_LEVEL, TOK_LEVEL_AF_OUTPUT_LEVEL, + TOK_LEVEL_DIGITAL_NOISE_LIMITER, TOK_BACKEND_NONE, }; @@ -106,6 +107,10 @@ const struct confparams ts480_ext_funcs[] = const struct confparams ts480_ext_levels[] = { + { + TOK_LEVEL_DIGITAL_NOISE_LIMITER, "DIGITAL_NOISE_LIMITER", "Digital Noise Limiter", "Digital Noise Limiter", + NULL, RIG_CONF_COMBO, { .c = { .combostr = { "OFF", "DNL Level 1", "DNL Level 2", "DNL Level 3", NULL } } } + }, { TOK_LEVEL_DSP_RX_EQUALIZER, "DSP_RX_EQUALIZER", "DSP RX equalizer", "DSP RX equalizer type", NULL, RIG_CONF_COMBO, { .c = { .combostr = { "OFF", "Hb1", "Hb2", "FP", "bb1", "bb2", "c", "U", NULL } } } @@ -839,11 +844,20 @@ static int ts480_get_ext_func(RIG *rig, vfo_t vfo, token_t token, int *status) static int ts480_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val) { int retval; + char cmdbuf[20]; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); switch (token) { + case TOK_LEVEL_DIGITAL_NOISE_LIMITER: + if (val.i < 0 || val.i > 3) + { + RETURNFUNC(-RIG_EINVAL); + } + sprintf(cmdbuf, "DL%d%02d", val.i != 0 ? 1 : 0, val.i > 0 ? val.i - 1 : 0); + retval = kenwood_transaction(rig, cmdbuf, NULL, 0); + break; case TOK_LEVEL_DSP_RX_EQUALIZER: if (val.i < 0 || val.i > 7) { @@ -866,32 +880,32 @@ static int ts480_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val) retval = ts480_set_ex_menu(rig, 20, 1, val.i); break; case TOK_LEVEL_BEEP_VOLUME: - if (val.i < 0 || val.i > 9) + if (val.f < 0 || val.f > 9) { RETURNFUNC(-RIG_EINVAL); } - retval = ts480_set_ex_menu(rig, 12, 1, val.i); + retval = ts480_set_ex_menu(rig, 12, 1, (int) val.f); break; case TOK_LEVEL_TX_SIDETONE_VOLUME: - if (val.i < 0 || val.i > 9) + if (val.f < 0 || val.f > 9) { RETURNFUNC(-RIG_EINVAL); } - retval = ts480_set_ex_menu(rig, 13, 1, val.i); + retval ... [truncated message content] |