Fix TenTec Argonaut message lengths and timeout

The TT Argonaut back end was falling over if the rate of returned data
varied because  some commands were  coded to have shorter  than actual
responses,  this is  not necessary  as by  increasing the  timeout all
characters can be read as expected.

Also fix direct reading and setting of mode per VFO.
Hamlib-3.0
Bill Somerville 2015-03-15 00:16:44 +00:00
rodzic 4d6dacb92f
commit 9713e60b42
5 zmienionych plików z 81 dodań i 56 usunięć

Wyświetl plik

@ -71,7 +71,7 @@ const struct rig_caps tt516_caps = {
.serial_handshake = RIG_HANDSHAKE_NONE,
.write_delay = 0,
.post_write_delay = 0,
.timeout = 400,
.timeout = 2000,
.retry = 3,
.has_get_func = TT516_FUNCS,

Wyświetl plik

@ -630,6 +630,7 @@ int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break;
case RIG_LEVEL_RAWSTR:
lvl_len = 32;
retval = tt538_transaction (rig, "?S" EOM, 3, (char *) lvlbuf, &lvl_len);
if (retval != RIG_OK)
return retval;

Wyświetl plik

@ -78,7 +78,7 @@ int tentec_transaction(RIG *rig, const char *cmd, int cmd_len, char *data, int *
if (!data || !data_len)
return 0;
retval = read_string(&rs->rigport, data, *data_len, "", 0);
retval = read_string(&rs->rigport, data, *data_len, NULL, 0);
if (retval == -RIG_ETIMEOUT)
retval = 0;
if (retval < 0)

Wyświetl plik

@ -157,13 +157,13 @@ int tentec2_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
// "Z\r" meaning the command was rejected
ret_len = 9;
retval = tentec_transaction (rig, freqbuf, strlen(freqbuf), freqbuf, &ret_len);
retval = tentec_transaction (rig, freqbuf, 3, freqbuf, &ret_len);
if (retval != RIG_OK)
return retval;
if (ret_len == 2 && freqbuf[1] == 'Z')
if (ret_len == 2 && freqbuf[0] == 'Z')
return -RIG_ERJCTED;
if (ret_len < 6)
if (ret_len != 8)
return -RIG_EINVAL;
*freq = (unsigned int)((freqbuf[1] & 0x0FF) << 24) +
@ -209,7 +209,7 @@ int tentec2_set_vfo(RIG *rig, vfo_t vfo)
if (retval != RIG_OK)
return retval;
if (vfobuf[0] == 'G')
if (ret_len == 2 && vfobuf[0] == 'G')
return RIG_OK;
return -RIG_ERJCTED;
@ -237,7 +237,7 @@ int tentec2_get_vfo(RIG *rig, vfo_t *vfo)
if (ret_len == 2 && vfobuf[0] == 'Z')
return -RIG_ERJCTED;
if (ret_len != 6)
if (ret_len != 6)
return -RIG_EPROTO;
*vfo = vfobuf[2] == 'A' ? RIG_VFO_A : RIG_VFO_B;
@ -269,10 +269,10 @@ int tentec2_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo)
if (retval != RIG_OK)
return retval;
if (ret_len == 2 && retbuf[0] == 'Z')
return -RIG_ERJCTED;
if (ret_len == 2 && retbuf[0] == 'G')
return RIG_OK;
return RIG_OK;
return -RIG_ERJCTED;
}
/*
@ -287,7 +287,7 @@ int tentec2_get_split_vfo(RIG *rig, vfo_t vfo, split_t *split, vfo_t *tx_vfo)
/*
* TODO: handle tx_vfo
*/
ret_len = 5;
ret_len = 6;
retval = tentec_transaction (rig, splitbuf, 3, splitbuf, &ret_len);
// Argo V returns
// "On\rG\r" or
@ -299,7 +299,7 @@ int tentec2_get_split_vfo(RIG *rig, vfo_t vfo, split_t *split, vfo_t *tx_vfo)
if (ret_len == 2 && splitbuf[0] == 'Z')
return -RIG_ERJCTED;
if (ret_len != 4)
if (ret_len != 5)
return -RIG_EPROTO;
*split = splitbuf[1] == 0 ? RIG_SPLIT_OFF : RIG_SPLIT_ON;
@ -315,60 +315,78 @@ int tentec2_get_split_vfo(RIG *rig, vfo_t vfo, split_t *split, vfo_t *tx_vfo)
*/
int tentec2_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
{
char ttmode, ttmode_a, ttmode_b;
char ttmode;
int ttfilter, retval, ret_len;
unsigned char mdbuf[16];
char mdbuf[16];
switch (mode) {
case RIG_MODE_USB: ttmode = TT_USB; break;
case RIG_MODE_LSB: ttmode = TT_LSB; break;
case RIG_MODE_CW: ttmode = TT_CW; break;
case RIG_MODE_AM: ttmode = TT_AM; break;
case RIG_MODE_FM: ttmode = TT_FM; break;
default:
rig_debug(RIG_DEBUG_ERR, "%s: unsupported mode %d\n",
__FUNCTION__, mode);
return -RIG_EINVAL;
if (vfo == RIG_VFO_CURR) {
if ((retval = tentec2_get_vfo(rig, &vfo)) != RIG_OK)
return retval;
}
ttmode_a = ttmode_b = ttmode;
switch (mode) {
case RIG_MODE_USB: ttmode = TT_USB; break;
case RIG_MODE_LSB: ttmode = TT_LSB; break;
case RIG_MODE_CW: ttmode = TT_CW; break;
case RIG_MODE_AM: ttmode = TT_AM; break;
case RIG_MODE_FM: ttmode = TT_FM; break;
default:
rig_debug(RIG_DEBUG_ERR, "%s: unsupported mode %d\n",
__FUNCTION__, mode);
return -RIG_EINVAL;
}
strcpy((char *) mdbuf, "*M00\r" );
/* get the mode because we want to leave other VFO unchanged */
ret_len = 7;
retval = tentec_transaction (rig, "?M\r", 3, &mdbuf[1], &ret_len);
if (retval != RIG_OK)
return retval;
if (ret_len != 6)
return -RIG_EPROTO;
mdbuf[0] = '*';
switch (vfo)
{
case RIG_VFO_A: mdbuf[2] = ttmode; break;
case RIG_VFO_B: mdbuf[3] = ttmode; break;
default:
return -RIG_EINVAL;
}
ret_len = 3;
mdbuf[2] = ttmode_a; mdbuf[3] = ttmode_b;
retval = tentec_transaction (rig, (char *) mdbuf, 5, (char *) mdbuf, &ret_len);
retval = tentec_transaction (rig, mdbuf, 5, mdbuf, &ret_len);
if (retval != RIG_OK)
return retval;
if (ret_len == 2 && mdbuf[1] == 'Z')
return -RIG_ERJCTED;
if (width == RIG_PASSBAND_NORMAL)
width = rig_passband_normal(rig, mode);
if (ret_len == 2 && mdbuf[0] == 'G')
{
if (width == RIG_PASSBAND_NORMAL)
width = rig_passband_normal(rig, mode);
/*
* Filter 0: 200
* ..
* Filter 16: 1000
* ..
* Filter 36: 3000
*/
if (width < 1000)
ttfilter = (width / 50) - 4;
else
ttfilter = (width / 100) + 6;
/*
* Filter 0: 200
* ..
* Filter 16: 1000
* ..
* Filter 36: 3000
*/
if (width < 1000)
ttfilter = (width / 50) - 4;
else
ttfilter = (width / 100) + 6;
strcpy ((char *) mdbuf, "*Wn\r");
mdbuf[2] = ttfilter;
ret_len = 3;
retval = tentec_transaction (rig, (char *) mdbuf, 5, (char *) mdbuf, &ret_len);
strcpy (mdbuf, "*Wn\r");
mdbuf[2] = ttfilter;
ret_len = 3;
retval = tentec_transaction (rig, mdbuf, 4, mdbuf, &ret_len);
if (retval != RIG_OK)
return retval;
if (ret_len == 2 && mdbuf[0] == 'Z')
return -RIG_ERJCTED;
return RIG_OK;
if (retval != RIG_OK)
return retval;
if (ret_len == 2 && mdbuf[0] == 'G')
return RIG_OK;
}
return -RIG_ERJCTED;
}
@ -397,7 +415,10 @@ int tentec2_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
if (ret_len != 6)
return -RIG_EPROTO;
switch (mdbuf[1]) {
if (vfo != RIG_VFO_A && vfo != RIG_VFO_B)
return -RIG_EINVAL;
switch (mdbuf[vfo == RIG_VFO_A ? 1 : 2]) {
case TT_USB: *mode = RIG_MODE_USB; break;
case TT_LSB: *mode = RIG_MODE_LSB; break;
case TT_CW: *mode = RIG_MODE_CW; break;
@ -405,7 +426,7 @@ int tentec2_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
case TT_FM: *mode = RIG_MODE_FM; break;
default:
rig_debug(RIG_DEBUG_ERR, "%s: unsupported mode '%c'\n",
__FUNCTION__, mdbuf[1]);
__FUNCTION__, mdbuf[vfo == RIG_VFO_A ? 1 : 2]);
return -RIG_EPROTO;
}
@ -414,6 +435,9 @@ int tentec2_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
if (retval != RIG_OK)
return retval;
if (ret_len == 2 && mdbuf[0] == 'Z')
return -RIG_ERJCTED;
if (ret_len != 5)
return -RIG_EPROTO;

Wyświetl plik

@ -117,7 +117,7 @@ tt550_transaction (RIG * rig, const char *cmd, int cmd_len, char *data,
return 0;
}
retval = read_string (&rs->rigport, data, *data_len, "", 0);
retval = read_string (&rs->rigport, data, *data_len, NULL, 0);
if (retval == -RIG_ETIMEOUT)
retval = 0;
if (retval < 0)