kopia lustrzana https://github.com/Hamlib/Hamlib
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
rodzic
4d6dacb92f
commit
9713e60b42
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
130
tentec/tentec2.c
130
tentec/tentec2.c
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Ładowanie…
Reference in New Issue