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
Hamlib-1.2.11
Stéphane Fillod, F8CFE 2010-05-31 08:36:25 +00:00
rodzic bd76b2c485
commit 1fd0d38ea2
2 zmienionych plików z 72 dodań i 29 usunięć

Wyświetl plik

@ -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,

Wyświetl plik

@ -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;