kopia lustrzana https://github.com/Hamlib/Hamlib
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-79ac388436b8Hamlib-1.2.11
rodzic
bd76b2c485
commit
1fd0d38ea2
|
@ -56,7 +56,7 @@ const struct rig_caps ra3702_caps = {
|
||||||
.mfg_name = "Racal",
|
.mfg_name = "Racal",
|
||||||
.version = "0.1",
|
.version = "0.1",
|
||||||
.copyright = "LGPL",
|
.copyright = "LGPL",
|
||||||
.status = RIG_STATUS_UNTESTED,
|
.status = RIG_STATUS_ALPHA,
|
||||||
.rig_type = RIG_TYPE_RECEIVER,
|
.rig_type = RIG_TYPE_RECEIVER,
|
||||||
.ptt_type = RIG_PTT_NONE,
|
.ptt_type = RIG_PTT_NONE,
|
||||||
.dcd_type = RIG_DCD_NONE,
|
.dcd_type = RIG_DCD_NONE,
|
||||||
|
@ -70,7 +70,7 @@ const struct rig_caps ra3702_caps = {
|
||||||
.write_delay = 0,
|
.write_delay = 0,
|
||||||
.post_write_delay = 0,
|
.post_write_delay = 0,
|
||||||
.timeout = RA37XX_TIMEOUT,
|
.timeout = RA37XX_TIMEOUT,
|
||||||
.retry = 0,
|
.retry = 2,
|
||||||
|
|
||||||
.has_get_func = RA3702_FUNC,
|
.has_get_func = RA3702_FUNC,
|
||||||
.has_set_func = RA3702_FUNC,
|
.has_set_func = RA3702_FUNC,
|
||||||
|
|
|
@ -70,11 +70,9 @@ const struct confparams ra37xx_cfg_params[] = {
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ra37xx_transaction
|
* retries are handled by ra37xx_transaction()
|
||||||
* We assume that rig!=NULL, rig->state!= NULL
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
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 ra37xx_priv_data *priv = (struct ra37xx_priv_data*)rig->state.priv;
|
||||||
struct rig_state *rs = &rig->state;
|
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 cmd_len;
|
||||||
int retval;
|
int retval;
|
||||||
int pkt_header_len;
|
int pkt_header_len;
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
|
||||||
/* Packet Framing:
|
/* Packet Framing:
|
||||||
- no Link Control Character
|
- no Link Control Character
|
||||||
|
@ -109,12 +110,27 @@ static int ra37xx_transaction(RIG *rig, const char *cmd, char *data, int *data_l
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
retval = read_string(&rs->rigport, respbuf, BUFSZ, EOM, strlen(EOM));
|
retval = read_string(&rs->rigport, respbuf, BUFSZ, EOM, strlen(EOM));
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
if (retval < pkt_header_len+1 || respbuf[0] != '\x0a')
|
/* 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;
|
return -RIG_EPROTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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+3 && !memcmp(respbuf+pkt_header_len, "ERR", 3))
|
if (retval >= pkt_header_len+3 && !memcmp(respbuf+pkt_header_len, "ERR", 3))
|
||||||
return -RIG_ERJCTED;
|
return -RIG_ERJCTED;
|
||||||
|
@ -124,10 +140,15 @@ static int ra37xx_transaction(RIG *rig, const char *cmd, char *data, int *data_l
|
||||||
|
|
||||||
if (cmd[0] == 'Q' && (retval+pkt_header_len+1 < strlen(cmd) ||
|
if (cmd[0] == 'Q' && (retval+pkt_header_len+1 < strlen(cmd) ||
|
||||||
cmd[1] != respbuf[pkt_header_len])) {
|
cmd[1] != respbuf[pkt_header_len])) {
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_WARN, "%s: unexpected revertive frame\n",
|
rig_debug(RIG_DEBUG_WARN, "%s: unexpected revertive frame\n",
|
||||||
__func__);
|
__func__);
|
||||||
return -RIG_EPROTO;
|
if (!rig_check_cache_timeout(&tv, rs->rigport.timeout))
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
return -RIG_ETIMEOUT;
|
||||||
}
|
}
|
||||||
|
} while (retval < 0);
|
||||||
|
|
||||||
/* Strip starting LF and ending CR */
|
/* Strip starting LF and ending CR */
|
||||||
memcpy(data, respbuf+pkt_header_len, retval-pkt_header_len-1);
|
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;
|
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)
|
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)
|
int ra37xx_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
|
||||||
{
|
{
|
||||||
char resbuf[BUFSZ];
|
char buf[BUFSZ], resbuf[BUFSZ];
|
||||||
int retval, len, ra_mode;
|
int retval, len, ra_mode, widthtype, widthnum;
|
||||||
|
|
||||||
retval = ra37xx_transaction (rig, "QM", resbuf, &len);
|
retval = ra37xx_transaction (rig, "QM", resbuf, &len);
|
||||||
if (retval != RIG_OK)
|
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);
|
sscanf(resbuf+1, "%d", &ra_mode);
|
||||||
switch (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_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_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_NAR:
|
||||||
case MD_FSK_MED:
|
case MD_FSK_MED:
|
||||||
case MD_FSK_WID:
|
case MD_FSK_WID:
|
||||||
case MD_FSK: *mode = RIG_MODE_RTTY; break;
|
case MD_FSK: widthtype = 3; *mode = RIG_MODE_RTTY; break;
|
||||||
case MD_FM: *mode = RIG_MODE_FM; break;
|
case MD_FM: widthtype = 3; *mode = RIG_MODE_FM; break;
|
||||||
case MD_AM: *mode = RIG_MODE_AM; break;
|
case MD_AM: widthtype = 3; *mode = RIG_MODE_AM; break;
|
||||||
default:
|
default:
|
||||||
rig_debug(RIG_DEBUG_ERR, "%s: unsupported mode %d\n",
|
rig_debug(RIG_DEBUG_ERR, "%s: unsupported mode %d\n",
|
||||||
__FUNCTION__, mode);
|
__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)
|
if (retval != RIG_OK)
|
||||||
return retval;
|
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 */
|
/* TODO: width */
|
||||||
*width = 0;
|
*width = 0;
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue