From dc07c20e96652c2d57e018abd6c615c015ab2e7a Mon Sep 17 00:00:00 2001 From: Michael Black W9MDB Date: Sun, 14 Jun 2020 12:58:29 -0500 Subject: [PATCH] Refactor flrig.c calls and provide retries for all transactions https://github.com/Hamlib/Hamlib/issues/244 --- dummy/flrig.c | 435 +++++++++++++++++++------------------------------- 1 file changed, 160 insertions(+), 275 deletions(-) diff --git a/dummy/flrig.c b/dummy/flrig.c index 0ca4738c6..174c83543 100644 --- a/dummy/flrig.c +++ b/dummy/flrig.c @@ -44,6 +44,7 @@ #define MAXCMDLEN 8192 #define MAXXMLLEN 8192 +#define MAXARGLEN 128 #define MAXBANDWIDTHLEN 4096 #define DEFAULTPATH "127.0.0.1:12345" @@ -398,15 +399,21 @@ static int read_transaction(RIG *rig, char *xml, int xml_len) rig_debug(RIG_DEBUG_TRACE, "%s\n", __func__); - rs->rigport.timeout = 1000; // 2 second read string timeout + rs->rigport.timeout = 1000; // 1 second read string timeout - retry = 5; + retry = 2; delims = "\n"; xml[0] = 0; do { char tmp_buf[MAXXMLLEN]; // plenty big for expected flrig responses hopefully + + if (retry < 2) + { + rig_debug(RIG_DEBUG_WARN, "%s: retry needed? retry=%d\n", __func__, retry); + } + int len = read_string(&rs->rigport, tmp_buf, sizeof(tmp_buf), delims, strlen(delims)); rig_debug(RIG_DEBUG_TRACE, "%s: string='%s'\n", __func__, tmp_buf); @@ -430,7 +437,7 @@ static int read_transaction(RIG *rig, char *xml, int xml_len) if (strlen(xml) + strlen(tmp_buf) < xml_len - 1) { - strncat(xml, tmp_buf, xml_len); + strncat(xml, tmp_buf, xml_len - 1); } else { @@ -478,7 +485,7 @@ static int write_transaction(RIG *rig, char *xml, int xml_len) struct rig_state *rs = &rig->state; // This shouldn't ever happen...but just in case - // We need to avoid and empty write as rigctld replies with blank line + // We need to avoid an empty write as rigctld replies with blank line if (xml_len == 0) { rig_debug(RIG_DEBUG_ERR, "%s: len==0??\n", __func__); @@ -502,6 +509,50 @@ static int write_transaction(RIG *rig, char *xml, int xml_len) return retval; } +static int flrig_transaction(RIG *rig, char *cmd, char *cmd_arg, char *value, + int value_len) +{ + int retry = 2; + + if (value) + { + value[0] = 0; + } + + do + { + char xml[MAXXMLLEN]; + char *pxml; + int retval; + + if (retry < 2) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: cmd=%s, retry=%d\n", __func__, cmd, retry); + } + + pxml = xml_build(cmd, cmd_arg, xml, sizeof(xml)); + retval = write_transaction(rig, pxml, strlen(pxml)); + + if (retval != RIG_OK) + { + rig_debug(RIG_DEBUG_ERR, "%s: write_transaction error=%d\n", __func__, retval); + hl_usleep(50 * 1000); // 50ms sleep if error + } + + read_transaction(rig, xml, sizeof(xml)); // this might time out -- that's OK + + if (value) + { + xml_parse(xml, value, value_len); + } + } + while (value && strlen(value) == 0 && retry--); // we'll do retries if needed + + if (value && strlen(value) == 0) { return RIG_EPROTO; } + + return RIG_OK; +} + /* * flrig_init * Assumes rig!=NULL @@ -527,7 +578,7 @@ static int flrig_init(RIG *rig) /* * set arbitrary initial status */ - priv->curr_vfo = RIG_VFO_A; + rig->state.current_vfo = RIG_VFO_A; priv->split = 0; priv->ptt = 0; priv->curr_modeA = -1; @@ -657,9 +708,8 @@ static void modeMapAdd(rmode_t *modes, rmode_t mode_hamlib, char *mode_flrig) static int flrig_open(RIG *rig) { int retval; - char xml[MAXXMLLEN]; - char *pxml; char value[MAXXMLLEN]; + char arg[MAXXMLLEN]; rmode_t modes; char *p; char *pr; @@ -667,28 +717,23 @@ static int flrig_open(RIG *rig) rig_debug(RIG_DEBUG_TRACE, "%s version %s\n", __func__, BACKEND_VER); - pxml = xml_build("rig.get_xcvr", NULL, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, "rig.get_xcvr", NULL, value, sizeof(value)); - if (retval < 0) + if (retval != RIG_OK) { + rig_debug(RIG_DEBUG_ERR, "%s: get_xcvr failed: %s\n", __func__, + rigerror(retval)); return retval; } - read_transaction(rig, xml, sizeof(xml)); - xml_parse(xml, value, sizeof(value)); strncpy(priv->info, value, sizeof(priv->info)); rig_debug(RIG_DEBUG_VERBOSE, "Transceiver=%s\n", value); /* see if get_modeA is available */ - pxml = xml_build("rig.get_modeA", NULL, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, "rig.get_modeA", NULL, value, sizeof(value)); if (retval != RIG_OK) { return retval; } - read_transaction(rig, xml, sizeof(xml)); - xml_parse(xml, value, sizeof(value)); - if (strlen(value) > 0) /* must have it since we got an answer */ { priv->has_get_modeA = 1; @@ -701,14 +746,10 @@ static int flrig_open(RIG *rig) } /* see if get_bwA is available */ - pxml = xml_build("rig.get_bwA", NULL, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, "rig.get_bwA", NULL, value, sizeof(value)); if (retval != RIG_OK) { return retval; } - read_transaction(rig, xml, sizeof(xml)); - xml_parse(xml, value, sizeof(value)); - if (strlen(value) > 0) /* must have it since we got an answer */ { priv->has_get_bwA = 1; @@ -720,40 +761,31 @@ static int flrig_open(RIG *rig) rig_debug(RIG_DEBUG_VERBOSE, "%s: get_bwA is not available\n", __func__); } - pxml = xml_build("rig.get_AB", value, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + strcpy(arg, value); + retval = flrig_transaction(rig, "rig.get_AB", arg, value, sizeof(value)); if (retval != RIG_OK) { return retval; } - read_transaction(rig, xml, sizeof(xml)); - xml_parse(xml, value, sizeof(value)); - if (streq(value, "A")) { - priv->curr_vfo = RIG_VFO_A; + rig->state.current_vfo = RIG_VFO_A; } else { - priv->curr_vfo = RIG_VFO_B; + rig->state.current_vfo = RIG_VFO_B; } rig_debug(RIG_DEBUG_TRACE, "%s: currvfo=%s value=%s\n", __func__, - rig_strvfo(priv->curr_vfo), value); + rig_strvfo(rig->state.current_vfo), value); //vfo_t vfo=RIG_VFO_A; //vfo_t vfo_tx=RIG_VFO_B; // split is always VFOB //flrig_get_split_vfo(rig, vfo, &priv->split, &vfo_tx); /* find out available widths and modes */ - pxml = xml_build("rig.get_modes", NULL, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, "rig.get_modes", NULL, value, sizeof(value)); - if (retval < 0) - { - return retval; - } + if (retval != RIG_OK) { return retval; } - read_transaction(rig, xml, sizeof(xml)); - xml_parse(xml, value, sizeof(value)); rig_debug(RIG_DEBUG_TRACE, "%s: modes=%s\n", __func__, value); modes = 0; pr = value; @@ -917,9 +949,7 @@ static int flrig_cleanup(RIG *rig) */ static int flrig_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) { - int retries = 2; - char xml[MAXXMLLEN]; - char value[MAXCMDLEN]; + char value[MAXARGLEN]; struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; rig_debug(RIG_DEBUG_TRACE, "%s: vfo=%s\n", __func__, @@ -935,52 +965,22 @@ static int flrig_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) if (vfo == RIG_VFO_CURR) { - vfo = priv->curr_vfo; + vfo = rig->state.current_vfo; rig_debug(RIG_DEBUG_TRACE, "%s: get_freq2 vfo=%s\n", __func__, rig_strvfo(vfo)); } - do + char *cmd = vfo == RIG_VFO_A ? "rig.get_vfoA" : "rig.get_vfoB"; + int retval; + + retval = flrig_transaction(rig, cmd, NULL, value, sizeof(value)); + + if (retval != RIG_OK) { - char *pxml; - int retval; - - if (vfo == RIG_VFO_A) - { - pxml = xml_build("rig.get_vfoA", NULL, xml, sizeof(xml)); - } - else - { - pxml = xml_build("rig.get_vfoB", NULL, xml, sizeof(xml)); - } - - retval = write_transaction(rig, pxml, strlen(pxml)); - - if (retval < 0) - { - return retval; - } - - if ((retval = read_transaction(rig, xml, sizeof(xml)))) - { - rig_debug(RIG_DEBUG_ERR, "%s: read_transation failed retval=%d\n", __func__, - retval); - return retval; - } - - if (strstr(xml, "methodResponse>")) - { - xml_parse(xml, value, sizeof(value)); - - if (strlen(value) == 0) - { - rig_debug(RIG_DEBUG_ERR, "%s: retries=%d\n", __func__, retries); - } - } + rig_debug(RIG_DEBUG_ERR, "%s: flrig_transaction failed retval=%s\n", __func__, + rigerror(retval)); + return retval; } - while (--retries && strlen(value) == 0); - - if (retries == 0) { return -RIG_EPROTO; } *freq = atof(value); @@ -1015,8 +1015,8 @@ static int flrig_set_freq(RIG *rig, vfo_t vfo, freq_t freq) { int retval; char value[MAXXMLLEN]; - char xml[MAXXMLLEN]; - char *pxml; + char cmd_arg[MAXARGLEN]; + char *cmd; struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; rig_debug(RIG_DEBUG_TRACE, "%s: vfo=%s freq=%.0f\n", __func__, @@ -1031,47 +1031,36 @@ static int flrig_set_freq(RIG *rig, vfo_t vfo, freq_t freq) if (vfo == RIG_VFO_CURR) { - vfo = priv->curr_vfo; + vfo = rig->state.current_vfo; } else if (vfo == RIG_VFO_TX && priv->split) { vfo = RIG_VFO_B; // if split always TX on VFOB } - sprintf(value, + sprintf(cmd_arg, "%.0f", freq); - if (vfo == RIG_VFO_B) + if (vfo == RIG_VFO_A) { - pxml = xml_build("rig.set_vfoB", value, xml, sizeof(xml)); - rig_debug(RIG_DEBUG_TRACE, "rig.set_vfoB %s", value); - priv->curr_freqB = freq; - } - else - { - pxml = xml_build("rig.set_vfoA", value, xml, sizeof(xml)); + cmd = "rig.set_vfoA"; rig_debug(RIG_DEBUG_TRACE, "rig.set_vfoA %s", value); priv->curr_freqA = freq; } + else + { + cmd = "rig.set_vfoB"; + rig_debug(RIG_DEBUG_TRACE, "rig.set_vfoA %s", value); + priv->curr_freqB = freq; + } - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, cmd, cmd_arg, NULL, 0); if (retval < 0) { return retval; } - if (vfo == RIG_VFO_B) - { - priv->curr_freqB = freq; - } - else - { - priv->curr_freqA = freq; - } - - read_transaction(rig, xml, sizeof(xml)); // get response but don't care - return RIG_OK; } @@ -1082,9 +1071,7 @@ static int flrig_set_freq(RIG *rig, vfo_t vfo, freq_t freq) static int flrig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) { int retval; - char xml[MAXXMLLEN]; - char *pxml; - char cmd_buf[MAXCMDLEN]; + char cmd_arg[MAXARGLEN]; struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; rig_debug(RIG_DEBUG_TRACE, "%s: ptt=%d\n", __func__, ptt); @@ -1097,19 +1084,16 @@ static int flrig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) return -RIG_EINVAL; } - sprintf(cmd_buf, + sprintf(cmd_arg, "%d", ptt); - pxml = xml_build("rig.set_ptt", cmd_buf, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, "rig.set_ptt", cmd_arg, NULL, 0); - if (retval < 0) + if (retval != RIG_OK) { return retval; } - read_transaction(rig, xml, sizeof(xml)); // get response but don't care - priv->ptt = ptt; return RIG_OK; @@ -1121,7 +1105,6 @@ static int flrig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) */ static int flrig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) { - int retries = 2; char value[MAXCMDLEN]; char xml[MAXXMLLEN]; struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; @@ -1130,37 +1113,18 @@ static int flrig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) rig_strvfo(vfo)); - do + int retval; + + retval = flrig_transaction(rig, "rig.get_ptt", NULL, value, sizeof(value)); + + if (retval != RIG_OK) { - int retval; - char *pxml; - value[0] = 0; - pxml = xml_build("rig.get_ptt", NULL, xml, sizeof(xml)); - - retval = write_transaction(rig, pxml, strlen(pxml)); - - if (retval < 0) - { - return retval; - } - - retval = read_transaction(rig, xml, sizeof(xml)); - - if (retval < 0) - { - return retval; - } - - if (strstr(xml, "methodResponse>")) - { - xml_parse(xml, value, sizeof(value)); - *ptt = atoi(value); - rig_debug(RIG_DEBUG_TRACE, "%s: '%s'\n", __func__, value); - } + return retval; } - while (--retries > 0 && strlen(value) == 0); - if (retries == 0) { return -RIG_EPROTO; } + xml_parse(xml, value, sizeof(value)); + *ptt = atoi(value); + rig_debug(RIG_DEBUG_TRACE, "%s: '%s'\n", __func__, value); priv->ptt = *ptt; @@ -1183,7 +1147,7 @@ static int flrig_set_split_mode(RIG *rig, vfo_t vfo, rmode_t mode, switch (vfo) { case RIG_VFO_CURR: - vfo = priv->curr_vfo; + vfo = rig->state.current_vfo; break; case RIG_VFO_TX: @@ -1218,9 +1182,7 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) int retval; int needBW; int vfoSwitched; - char xml[MAXXMLLEN]; - char *pxml = NULL; - char cmd_buf[MAXCMDLEN]; + char cmd_arg[MAXCMDLEN]; char *p; char *pttmode; char *ttmode; @@ -1240,7 +1202,7 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) if (vfo == RIG_VFO_CURR) { - vfo = priv->curr_vfo; + vfo = rig->state.current_vfo; } if (check_vfo(vfo) == FALSE) @@ -1260,10 +1222,11 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) // MDB vfoSwitched = 0; rig_debug(RIG_DEBUG_TRACE, "%s: curr_vfo = %s\n", __func__, - rig_strvfo(priv->curr_vfo)); + rig_strvfo(rig->state.current_vfo)); // If we don't have the get_bwA call we have to switch VFOs ourself - if (!priv->has_get_bwA && vfo == RIG_VFO_B && priv->curr_vfo != RIG_VFO_B) + if (!priv->has_get_bwA && vfo == RIG_VFO_B + && rig->state.current_vfo != RIG_VFO_B) { vfoSwitched = 1; rig_debug(RIG_DEBUG_TRACE, "%s: switch to VFOB = %d\n", __func__, @@ -1301,13 +1264,12 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) if (p) { *p = 0; } // remove any other pipe - sprintf(cmd_buf, "%s", pttmode); + sprintf(cmd_arg, "%s", pttmode); free(ttmode); - pxml = NULL; if (!priv->has_get_modeA) { - pxml = xml_build("rig.set_mode", cmd_buf, xml, sizeof(xml)); + retval = flrig_transaction(rig, "rig.set_mode", cmd_arg, NULL, 0); } else { @@ -1323,22 +1285,17 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) priv->curr_modeB = RIG_MODE_NONE; } - pxml = xml_build(cmd, cmd_buf, xml, sizeof(xml)); + retval = flrig_transaction(rig, cmd, cmd_arg, NULL, 0); } - rig_debug(RIG_DEBUG_TRACE, "%s: write_transaction\n", __func__); - retval = write_transaction(rig, pxml, strlen(pxml)); - if (retval < 0) + if (retval != RIG_OK) { + rig_debug(RIG_DEBUG_ERR, "%s: failed: %s\n", __func__, + rigerror(retval)); return retval; } - rig_debug(RIG_DEBUG_TRACE, "%s: read_transaction\n", __func__); - // Get the response - read_transaction(rig, xml, sizeof(xml)); - rig_debug(RIG_DEBUG_TRACE, "%s: response=%s\n", __func__, xml); - // Determine if we need to update the bandwidth needBW = 0; @@ -1363,7 +1320,7 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) // Need to update the bandwidth if (width > 0 && needBW) { - sprintf(cmd_buf, "%ld", + sprintf(cmd_arg, "%ld", width); // if we're not on VFOB but asking for VFOB still have to switch VFOS @@ -1371,15 +1328,14 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) if (!vfoSwitched && vfo == RIG_VFO_A) { flrig_set_vfo(rig, RIG_VFO_A); } - pxml = xml_build("rig.set_bandwidth", cmd_buf, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, "rig.set_bandwidth", cmd_arg, NULL, + 0); if (retval < 0) { return retval; } - read_transaction(rig, xml, sizeof(xml)); flrig_set_vfo(rig, vfo); // ensure reset to our initial vfo } @@ -1425,8 +1381,6 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) int retval; int vfoSwitched; char value[MAXCMDLEN]; - char xml[MAXXMLLEN]; - char *pxml; char *cmdp; vfo_t curr_vfo; struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; @@ -1441,11 +1395,11 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) return -RIG_EINVAL; } - curr_vfo = priv->curr_vfo; + curr_vfo = rig->state.current_vfo; if (vfo == RIG_VFO_CURR) { - vfo = priv->curr_vfo; + vfo = rig->state.current_vfo; } rig_debug(RIG_DEBUG_TRACE, "%s: using vfo=%s\n", __func__, @@ -1493,24 +1447,18 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) if (vfo == RIG_VFO_B) { cmdp = "rig.get_modeB"; } } - pxml = xml_build(cmdp, NULL, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, cmdp, NULL, value, sizeof(value)); - if (retval < 0) + if (retval != RIG_OK) { + rig_debug(RIG_DEBUG_ERR, "%s: %s failed: %s\n", __func__, cmdp, + rigerror(retval)); return retval; } - retval = read_transaction(rig, xml, sizeof(xml)); - - if (retval < 0) - { - } - - xml_parse(xml, value, sizeof(value)); retval = modeMapGetHamlib(value); - if (retval < 0) + if (retval != RIG_OK) { return retval; } @@ -1543,16 +1491,13 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) if (vfo == RIG_VFO_B) { cmdp = "rig.get_bwB"; } } - pxml = xml_build(cmdp, NULL, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, cmdp, NULL, value, sizeof(value)); - if (retval < 0) + if (retval != RIG_OK) { return retval; } - read_transaction(rig, xml, sizeof(xml)); - xml_parse(xml, value, sizeof(value)); rig_debug(RIG_DEBUG_TRACE, "%s: mode=%s width='%s'\n", __func__, rig_strrmode(*mode), value); @@ -1581,7 +1526,7 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) { retval = flrig_set_vfo(rig, RIG_VFO_A); - if (retval < 0) + if (retval != RIG_OK) { return retval; } @@ -1597,9 +1542,7 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) static int flrig_set_vfo(RIG *rig, vfo_t vfo) { int retval; - char value[MAXCMDLEN]; - char xml[MAXXMLLEN]; - char *pxml; + char cmd_arg[MAXXMLLEN]; struct rig_state *rs = &rig->state; struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; @@ -1622,38 +1565,35 @@ static int flrig_set_vfo(RIG *rig, vfo_t vfo) if (vfo == RIG_VFO_CURR) { - vfo = priv->curr_vfo; + vfo = rig->state.current_vfo; } - sprintf(value, "%s", + sprintf(cmd_arg, "%s", vfo == RIG_VFO_A ? "A" : "B"); - pxml = xml_build("rig.set_AB", value, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, "rig.set_AB", cmd_arg, NULL, 0); - if (retval < 0) + if (retval != RIG_OK) { + rig_debug(RIG_DEBUG_ERR, "%s: rig.set_AB failed: %s\n", __func__, + rigerror(retval)); return retval; } - priv->curr_vfo = vfo; + rig->state.current_vfo = vfo; rs->tx_vfo = RIG_VFO_B; // always VFOB - read_transaction(rig, xml, sizeof(xml)); /* for some rigs FLRig turns off split when VFOA is selected */ /* so if we are in split and asked for A we have to turn split back on */ if (priv->split && vfo == RIG_VFO_A) { - sprintf(value, "%d", + sprintf(cmd_arg, "%d", priv->split); - pxml = xml_build("rig.set_split", value, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, "rig.set_split", cmd_arg, NULL, 0); if (retval < 0) { return retval; } - - read_transaction(rig, xml, sizeof(xml)); // get response but don't care } return RIG_OK; @@ -1665,43 +1605,20 @@ static int flrig_set_vfo(RIG *rig, vfo_t vfo) */ static int flrig_get_vfo(RIG *rig, vfo_t *vfo) { - int retries = 2; char value[MAXCMDLEN]; - char xml[MAXXMLLEN]; - struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; rig_debug(RIG_DEBUG_TRACE, "%s\n", __func__); - do + int retval; + retval = flrig_transaction(rig, "rig.get_AB", NULL, value, sizeof(value)); + + if (retval < 0) { - int retval; - char *pxml; - value[0] = 0; - pxml = xml_build("rig.get_AB", NULL, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); - - if (retval < 0) - { - return retval; - } - - retval = read_transaction(rig, xml, sizeof(xml)); - - if (retval < 0) - { - return retval; - } - - if (strstr(xml, "methodResponse>")) - { - xml_parse(xml, value, sizeof(value)); - rig_debug(RIG_DEBUG_TRACE, "%s: vfo value=%s\n", __func__, value); - } + return retval; } - while (--retries > 0 && strlen(value) == 0); - if (retries == 0) { return -RIG_EPROTO; } + rig_debug(RIG_DEBUG_TRACE, "%s: vfo value=%s\n", __func__, value); switch (value[0]) { @@ -1725,7 +1642,7 @@ static int flrig_get_vfo(RIG *rig, vfo_t *vfo) return -RIG_EINVAL; } - priv->curr_vfo = *vfo; + rig->state.current_vfo = *vfo; rig_debug(RIG_DEBUG_TRACE, "%s: vfo=%s\n", __func__, rig_strvfo(*vfo)); @@ -1740,9 +1657,7 @@ static int flrig_get_vfo(RIG *rig, vfo_t *vfo) static int flrig_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) { int retval; - char xml[MAXXMLLEN]; - char *pxml; - char value[MAXCMDLEN]; + char cmd_arg[MAXXMLLEN]; freq_t qtx_freq; struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; @@ -1763,11 +1678,10 @@ static int flrig_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) if (tx_freq == qtx_freq) { return RIG_OK; } - sprintf(value, + sprintf(cmd_arg, "%.6f", tx_freq); - pxml = xml_build("rig.set_vfoB", value, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, "rig.set_vfoB", cmd_arg, NULL, 0); if (retval < 0) { @@ -1776,8 +1690,6 @@ static int flrig_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) priv->curr_freqB = tx_freq; - read_transaction(rig, xml, sizeof(xml)); // get response but don't care - return RIG_OK; } @@ -1807,10 +1719,8 @@ static int flrig_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) int retval; vfo_t qtx_vfo; split_t qsplit; - char xml[MAXXMLLEN]; - char value[MAXCMDLEN]; struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; - char *pxml; + char cmd_arg[MAXXMLLEN]; rig_debug(RIG_DEBUG_TRACE, "%s: tx_vfo=%s\n", __func__, rig_strvfo(tx_vfo)); @@ -1827,10 +1737,9 @@ static int flrig_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) return RIG_OK; // just return OK and ignore this } - sprintf(value, "%d", + sprintf(cmd_arg, "%d", split); - pxml = xml_build("rig.set_split", value, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); + retval = flrig_transaction(rig, "rig.set_split", cmd_arg, NULL, 0); if (retval < 0) { @@ -1839,8 +1748,6 @@ static int flrig_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) priv->split = split; - read_transaction(rig, xml, sizeof(xml)); // get response but don't care - return RIG_OK; } @@ -1851,40 +1758,18 @@ static int flrig_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) static int flrig_get_split_vfo(RIG *rig, vfo_t vfo, split_t *split, vfo_t *tx_vfo) { - int retries = 2; char value[MAXCMDLEN]; - char xml[MAXXMLLEN]; struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; rig_debug(RIG_DEBUG_TRACE, "%s\n", __func__); - do + int retval; + retval = flrig_transaction(rig, "rig.get_split", NULL, value, sizeof(value)); + + if (retval < 0) { - char *pxml; - int retval; - pxml = xml_build("rig.get_split", NULL, xml, sizeof(xml)); - retval = write_transaction(rig, pxml, strlen(pxml)); - - if (retval < 0) - { - return retval; - } - - retval = read_transaction(rig, xml, sizeof(xml)); - - if (retval < 0) - { - return retval; - } - - if (strstr(xml, "methodResponse>")) - { - xml_parse(xml, value, sizeof(value)); - } + return retval; } - while (--retries > 0 && strlen(value) == 0); - - if (retries == 0) { return -RIG_EPROTO; } *tx_vfo = RIG_VFO_B; *split = atoi(value);