From 4b3bbabc5da31df483ff1c70f1102ef5435e57bf Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Fri, 19 Nov 2021 16:19:18 -0600 Subject: [PATCH] Fix rig_set_split problem on Kenwood rigs https://github.com/Hamlib/Hamlib/issues/872 --- rigs/dummy/netrigctl.c | 13 +++++++++++-- src/rig.c | 17 +++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/rigs/dummy/netrigctl.c b/rigs/dummy/netrigctl.c index 9f7727b5c..e94a907a7 100644 --- a/rigs/dummy/netrigctl.c +++ b/rigs/dummy/netrigctl.c @@ -49,6 +49,8 @@ struct netrigctl_priv_data { vfo_t vfo_curr; int rigctld_vfo_mode; + vfo_t rx_vfo; + vfo_t tx_vfo; }; int netrigctl_get_vfo_mode(RIG *rig) @@ -120,6 +122,8 @@ static int netrigctl_vfostr(RIG *rig, char *vfostr, int len, vfo_t vfo) if (vfo == RIG_VFO_NONE) { vfo = RIG_VFO_A; } } + else if (vfo == RIG_VFO_RX) vfo = priv->rx_vfo; + else if (vfo == RIG_VFO_TX) vfo = priv->tx_vfo; rig_debug(RIG_DEBUG_TRACE, "%s: vfo_opt=%d\n", __func__, rig->state.vfo_opt); @@ -262,6 +266,8 @@ static int netrigctl_open(RIG *rig) rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); priv = (struct netrigctl_priv_data *)rig->state.priv; + priv->rx_vfo = RIG_VFO_A; + priv->tx_vfo = RIG_VFO_B; len = sprintf(cmd, "\\chk_vfo\n"); ret = netrigctl_transaction(rig, cmd, len, buf); @@ -621,7 +627,10 @@ static int netrigctl_open(RIG *rig) rs->mode_list |= rs->tx_range_list[i].modes; rs->vfo_list |= rs->tx_range_list[i].vfo; } - if (rs->vfo_list == 0) rs->vfo_list = RIG_VFO_A|RIG_VFO_B; + if (rs->vfo_list == 0) { + rig_debug(RIG_DEBUG_VERBOSE, "%s: vfo_list empty, defaulting to A/B\n", __func__); + rs->vfo_list = RIG_VFO_A|RIG_VFO_B; + } if (prot_ver == 0) { return RIG_OK; } @@ -2570,7 +2579,7 @@ struct rig_caps netrigctl_caps = RIG_MODEL(RIG_MODEL_NETRIGCTL), .model_name = "NET rigctl", .mfg_name = "Hamlib", - .version = "20211107.0", + .version = "20211118.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_OTHER, diff --git a/src/rig.c b/src/rig.c index 7cdda73dd..b8c90e20e 100644 --- a/src/rig.c +++ b/src/rig.c @@ -4266,7 +4266,7 @@ int HAMLIB_API rig_set_split_mode(RIG *rig, { const struct rig_caps *caps; int retcode, rc2; - vfo_t curr_vfo, tx_vfo; + vfo_t curr_vfo, tx_vfo, rx_vfo; ELAPSED1; ENTERFUNC; @@ -4303,12 +4303,15 @@ int HAMLIB_API rig_set_split_mode(RIG *rig, /* Use previously setup TxVFO */ if (vfo == RIG_VFO_CURR || vfo == RIG_VFO_TX) { + TRACE; tx_vfo = rig->state.tx_vfo; } else { + TRACE; tx_vfo = vfo; } + rig_debug(RIG_DEBUG_VERBOSE, "%s: curr_vfo=%s, tx_vfo=%s\n", __func__, rig_strvfo(curr_vfo), rig_strvfo(tx_vfo)); if (caps->set_mode && (caps->targetable_vfo & RIG_TARGETABLE_MODE)) { @@ -4320,7 +4323,13 @@ int HAMLIB_API rig_set_split_mode(RIG *rig, // some rigs exhibit undesirable flashing when swapping vfos in split // so we turn it off, do our thing, and turn split back on - rig_set_split_vfo(rig,RIG_VFO_CURR, RIG_SPLIT_OFF, RIG_VFO_CURR); + rx_vfo = RIG_VFO_A; + if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_B) rx_vfo = RIG_VFO_A; + else if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_A) rx_vfo = RIG_VFO_B; + else if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_MAIN) rx_vfo = RIG_VFO_SUB; + else if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_SUB) rx_vfo = RIG_VFO_MAIN; + rig_debug(RIG_DEBUG_VERBOSE, "%s: rx_vfo=%s, tx_vfo=%s\n", __func__, rig_strvfo(rx_vfo), rig_strvfo(tx_vfo)); + rig_set_split_vfo(rig,rx_vfo, RIG_SPLIT_OFF, rx_vfo); if (caps->set_vfo) { TRACE; @@ -4360,7 +4369,7 @@ int HAMLIB_API rig_set_split_mode(RIG *rig, if (caps->set_vfo) { TRACE; - rc2 = caps->set_vfo(rig, curr_vfo); + rc2 = caps->set_vfo(rig, rx_vfo); } else { @@ -4372,7 +4381,7 @@ int HAMLIB_API rig_set_split_mode(RIG *rig, /* return the first error code */ retcode = rc2; } - rig_set_split_vfo(rig,RIG_VFO_CURR, RIG_SPLIT_ON, RIG_VFO_CURR); + rig_set_split_vfo(rig,rx_vfo, RIG_SPLIT_ON, tx_vfo); ELAPSED2; RETURNFUNC(retcode);