From 1fd0d38ea27eb51a5891153c986cd8bfbf032701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Fillod=2C=20F8CFE?= Date: Mon, 31 May 2010 08:36:25 +0000 Subject: [PATCH] transaction retry and fixes, some more work on get_mode width git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2931 7ae35d74-ebe9-4afe-98af-79ac388436b8 --- racal/ra3702.c | 4 +-- racal/ra37xx.c | 97 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 72 insertions(+), 29 deletions(-) diff --git a/racal/ra3702.c b/racal/ra3702.c index f9af15d5c..c4d33e5f6 100644 --- a/racal/ra3702.c +++ b/racal/ra3702.c @@ -56,7 +56,7 @@ const struct rig_caps ra3702_caps = { .mfg_name = "Racal", .version = "0.1", .copyright = "LGPL", -.status = RIG_STATUS_UNTESTED, +.status = RIG_STATUS_ALPHA, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, @@ -70,7 +70,7 @@ const struct rig_caps ra3702_caps = { .write_delay = 0, .post_write_delay = 0, .timeout = RA37XX_TIMEOUT, -.retry = 0, +.retry = 2, .has_get_func = RA3702_FUNC, .has_set_func = RA3702_FUNC, diff --git a/racal/ra37xx.c b/racal/ra37xx.c index 2e251e2e1..b809fbf6a 100644 --- a/racal/ra37xx.c +++ b/racal/ra37xx.c @@ -70,11 +70,9 @@ const struct confparams ra37xx_cfg_params[] = { /* - * ra37xx_transaction - * We assume that rig!=NULL, rig->state!= NULL - * + * retries are handled by ra37xx_transaction() */ -static int ra37xx_transaction(RIG *rig, const char *cmd, char *data, int *data_len) +static int ra37xx_one_transaction(RIG *rig, const char *cmd, char *data, int *data_len) { struct ra37xx_priv_data *priv = (struct ra37xx_priv_data*)rig->state.priv; struct rig_state *rs = &rig->state; @@ -83,6 +81,9 @@ static int ra37xx_transaction(RIG *rig, const char *cmd, char *data, int *data_l int cmd_len; int retval; int pkt_header_len; + struct timeval tv; + + gettimeofday(&tv, NULL); /* Packet Framing: - no Link Control Character @@ -109,25 +110,45 @@ static int ra37xx_transaction(RIG *rig, const char *cmd, char *data, int *data_l return retval; } - retval = read_string(&rs->rigport, respbuf, BUFSZ, EOM, strlen(EOM)); - if (retval < 0) - return retval; + do { + retval = read_string(&rs->rigport, respbuf, BUFSZ, EOM, strlen(EOM)); + if (retval < 0) + return retval; - if (retval < pkt_header_len+1 || respbuf[0] != '\x0a') - return -RIG_EPROTO; + /* drop short/invalid packets */ + if (retval <= pkt_header_len+1 || respbuf[0] != '\x0a') { + if (!rig_check_cache_timeout(&tv, rs->rigport.timeout)) + continue; + else + return -RIG_EPROTO; + } - if (retval >= pkt_header_len+3 && !memcmp(respbuf+pkt_header_len, "ERR", 3)) - return -RIG_ERJCTED; + /* drop other receiver id, and "pause" (empty) packets */ + if ((priv->receiver_id != -1 && (respbuf[1]-'0') != priv->receiver_id) || + retval == pkt_header_len+1) { + if (!rig_check_cache_timeout(&tv, rs->rigport.timeout)) + continue; + else + return -RIG_ETIMEOUT; + } - if (retval >= pkt_header_len+5 && !memcmp(respbuf+pkt_header_len, "FAULT", 5)) - return -RIG_ERJCTED; + if (retval >= pkt_header_len+3 && !memcmp(respbuf+pkt_header_len, "ERR", 3)) + return -RIG_ERJCTED; - if (cmd[0] == 'Q' && (retval+pkt_header_len+1 < strlen(cmd) || - cmd[1] != respbuf[pkt_header_len])) { - rig_debug(RIG_DEBUG_WARN, "%s: unexpected revertive frame\n", - __func__); - return -RIG_EPROTO; - } + if (retval >= pkt_header_len+5 && !memcmp(respbuf+pkt_header_len, "FAULT", 5)) + return -RIG_ERJCTED; + + if (cmd[0] == 'Q' && (retval+pkt_header_len+1 < strlen(cmd) || + cmd[1] != respbuf[pkt_header_len])) { + + rig_debug(RIG_DEBUG_WARN, "%s: unexpected revertive frame\n", + __func__); + if (!rig_check_cache_timeout(&tv, rs->rigport.timeout)) + continue; + else + return -RIG_ETIMEOUT; + } + } while (retval < 0); /* Strip starting LF and ending CR */ memcpy(data, respbuf+pkt_header_len, retval-pkt_header_len-1); @@ -136,6 +157,21 @@ static int ra37xx_transaction(RIG *rig, const char *cmd, char *data, int *data_l return RIG_OK; } +static int ra37xx_transaction(RIG *rig, const char *cmd, char *data, int *data_len) +{ + int retval, retry; + + retry = rig->state.rigport.retry; + + do { + retval = ra37xx_one_transaction(rig, cmd, data, data_len); + if (retval == RIG_OK) + break; + } while (retry-- > 0); + + return retval; +} + int ra37xx_init(RIG *rig) { @@ -307,8 +343,8 @@ int ra37xx_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) int ra37xx_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) { - char resbuf[BUFSZ]; - int retval, len, ra_mode; + char buf[BUFSZ], resbuf[BUFSZ]; + int retval, len, ra_mode, widthtype, widthnum; retval = ra37xx_transaction (rig, "QM", resbuf, &len); if (retval != RIG_OK) @@ -316,17 +352,17 @@ int ra37xx_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) sscanf(resbuf+1, "%d", &ra_mode); switch (ra_mode) { - case MD_CW: *mode = RIG_MODE_CW; break; + case MD_CW: widthtype = 1; *mode = RIG_MODE_CW; break; case MD_ISB_LSB: - case MD_LSB: *mode = RIG_MODE_LSB; break; + case MD_LSB: widthtype = 2; *mode = RIG_MODE_LSB; break; case MD_ISB_USB: - case MD_USB: *mode = RIG_MODE_USB; break; + case MD_USB: widthtype = 1; *mode = RIG_MODE_USB; break; case MD_FSK_NAR: case MD_FSK_MED: case MD_FSK_WID: - case MD_FSK: *mode = RIG_MODE_RTTY; break; - case MD_FM: *mode = RIG_MODE_FM; break; - case MD_AM: *mode = RIG_MODE_AM; break; + case MD_FSK: widthtype = 3; *mode = RIG_MODE_RTTY; break; + case MD_FM: widthtype = 3; *mode = RIG_MODE_FM; break; + case MD_AM: widthtype = 3; *mode = RIG_MODE_AM; break; default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported mode %d\n", __FUNCTION__, mode); @@ -337,6 +373,13 @@ int ra37xx_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) if (retval != RIG_OK) return retval; + /* FIXME */ + widthnum = 0; + sprintf(buf, "QBCON%d,%d", widthtype, widthnum); + retval = ra37xx_transaction (rig, buf, resbuf, &len); + if (retval != RIG_OK) + return retval; + /* TODO: width */ *width = 0;