From 60215785e1bba67c04d4e05ec8d214d0dc9e9b26 Mon Sep 17 00:00:00 2001 From: Michael Black Date: Thu, 30 Jan 2020 12:12:13 -0600 Subject: [PATCH] Changes to get antenna calls working in rigctld Change to ic785x.c to get antenna calls working Added automatic detection of # of antennas for Icom rigs Note that rig_get_ant returns a zero-based antenna# and not RIG_ANT1/2/3/4.... rig_set_ant on the other hand takes RIG_ANT1/2/3/4 as the argument for antenna These RIG_ANT settings are a bit mask This may have to be converted in the rig back end to whatever the rig expects --- dummy/netrigctl.c | 14 ++++++++++++-- rigs/icom/ic785x.c | 1 + rigs/icom/icom.c | 42 +++++++++++++++++++++++++++++++++++------- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/dummy/netrigctl.c b/dummy/netrigctl.c index 4f0e6faa0..90494b108 100644 --- a/dummy/netrigctl.c +++ b/dummy/netrigctl.c @@ -1736,14 +1736,24 @@ static int netrigctl_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option) char cmd[CMD_MAX]; char buf[BUF_MAX]; char vfostr[6] = ""; + int i_ant = 0; - rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); + rig_debug(RIG_DEBUG_VERBOSE, "%s called, ant=0x%02x, option=%d\n", __func__, ant, option.i); + + switch(ant) { + case RIG_ANT_1: i_ant = 0; break; + case RIG_ANT_2: i_ant = 1; break; + case RIG_ANT_3: i_ant = 2; break; + case RIG_ANT_4: i_ant = 3; break; + default: + rig_debug(RIG_DEBUG_ERR,"%s: more than 4 antennas? ant=0x%02x\n", __func__, ant); + } ret = netrigctl_vfostr(rig, vfostr, sizeof(vfostr), vfo); if (ret != RIG_OK) { return ret; } - len = sprintf(cmd, "Y%s %d %d\n", vfostr, ant, option.i); + len = sprintf(cmd, "Y%s %d %d\n", vfostr, i_ant, option.i); ret = netrigctl_transaction(rig, cmd, len, buf); diff --git a/rigs/icom/ic785x.c b/rigs/icom/ic785x.c index 3e46218cf..79c3a762b 100644 --- a/rigs/icom/ic785x.c +++ b/rigs/icom/ic785x.c @@ -124,6 +124,7 @@ static struct icom_priv_caps ic785x_priv_caps = .civ_731_mode = 0, /* 731 mode */ .no_xchg = 0, /* no XCHG */ .antack_len = 3, +// .ant_count = 4, // disabled for test automatic detection .ts_sc_list = ic756pro_ts_sc_list, .agc_levels_present = 1, .agc_levels = { diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index cccb3acc0..468e7eb01 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -673,7 +673,7 @@ int icom_get_usb_echo_off(RIG *rig) // Check for echo on first priv->serial_USB_echo_off = 0; retval = icom_transaction(rig, C_RD_FREQ, -1, NULL, 0, ackbuf, &ack_len); - +return RIG_OK; if (retval == RIG_OK) { rig_debug(RIG_DEBUG_VERBOSE, "%s: USB echo on detected\n", @@ -5295,6 +5295,28 @@ int icom_set_bank(RIG *rig, vfo_t vfo, int bank) return RIG_OK; } +/* gets the number of antennas detected by querying them until it fails */ +static int icom_get_ant_count(RIG *rig) +{ + struct icom_priv_caps *priv_caps = (struct icom_priv_caps *) + rig->caps->priv; + // we only need to do this once if we haven't done it yet + if (priv_caps->ant_count == 0) { + ant_t tmp_ant; + value_t tmp_option; + int retval; + do { + retval = rig_get_ant(rig, RIG_VFO_CURR, &tmp_ant, &tmp_option); + if (retval == RIG_OK) { + ++priv_caps->ant_count; + rig_debug(RIG_DEBUG_TRACE,"%s: found ant#%d\n", __func__, priv_caps->ant_count); + } + } while(retval == RIG_OK); + } + rig_debug(RIG_DEBUG_TRACE,"%s: ant_count=%d\n", __func__, priv_caps->ant_count); + return priv_caps->ant_count; +} + /* * icom_set_ant * Assumes rig!=NULL, rig->state.priv!=NULL @@ -5308,11 +5330,15 @@ int icom_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option) const struct icom_priv_caps *priv_caps = (const struct icom_priv_caps *) rig->caps->priv; - rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - - /* - * TODO: IC-756* and [RX ANT] - */ + rig_debug(RIG_DEBUG_VERBOSE, "%s called, ant=0x%02x, option=%d\n", __func__, ant, option.i); + // query the antennas once and find out how many we have + icom_get_ant_count(rig); + if (ant >= rig_idx2setting(priv_caps->ant_count)) { + return -RIG_EINVAL; + } + if (ant > RIG_ANT_4) { + return -RIG_EDOM; + } switch (ant) { case RIG_ANT_1: @@ -5336,6 +5362,7 @@ int icom_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option) return -RIG_EINVAL; } + if (priv_caps->antack_len == 0) { // we need to find out the antack_len ant_t tmp_ant; value_t tmp_option; @@ -5345,6 +5372,7 @@ int icom_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option) return retval; } } + // Some rigs have 3-byte ant cmd so there is an option to be set if (priv_caps->antack_len == 3) { @@ -5429,7 +5457,7 @@ int icom_get_ant(RIG *rig, vfo_t vfo, ant_t *ant, value_t *option) return -RIG_ERJCTED; } - *ant = RIG_ANT_N(ackbuf[1]); + *ant = ackbuf[1]; // Note: with IC756/IC-756Pro/IC-7800 and more, ackbuf[2] deals with [RX ANT] // Hopefully any ack_len=3 can fit in the option field