kopia lustrzana https://github.com/Hamlib/Hamlib
Fix response lengths for the TT Jupiter 538
Rather than use an oversize buffer and let the reads time out I have set the expected length to what should come back. This means that lengthy timeouts are not required every time a response is read. Also added undocumented split set/get and PTT on/off.Hamlib-3.0
rodzic
a1e39e11f0
commit
e7dc01827b
108
tentec/jupiter.c
108
tentec/jupiter.c
|
@ -109,9 +109,12 @@ static int tt538_get_freq(RIG *rig, vfo_t vfo, freq_t *freq);
|
|||
static int tt538_set_freq(RIG *rig, vfo_t vfo, freq_t freq);
|
||||
static int tt538_set_vfo(RIG *rig, vfo_t vfo);
|
||||
static int tt538_get_vfo(RIG *rig, vfo_t *vfo);
|
||||
static int tt538_set_split_vfo(RIG *rig, vfo_t vfo, split_t, vfo_t tx_vfo);
|
||||
static int tt538_get_split_vfo(RIG *rig, vfo_t vfo, split_t *, vfo_t *tx_vfo);
|
||||
static int tt538_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width);
|
||||
static int tt538_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width);
|
||||
static char which_vfo(const RIG *rig, vfo_t vfo);
|
||||
static int tt538_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt);
|
||||
static int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val);
|
||||
static int tt538_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val);
|
||||
static int tt538_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status);
|
||||
|
@ -219,9 +222,9 @@ const struct rig_caps tt538_caps = {
|
|||
.set_level = tt538_set_level,
|
||||
.get_func = tt538_get_func,
|
||||
.set_func = tt538_set_func,
|
||||
.set_split_vfo = tentec2_set_split_vfo,
|
||||
.get_split_vfo = tentec2_get_split_vfo,
|
||||
.set_ptt = tentec2_set_ptt,
|
||||
.set_split_vfo = tt538_set_split_vfo,
|
||||
.get_split_vfo = tt538_get_split_vfo,
|
||||
.set_ptt = tt538_set_ptt,
|
||||
.reset = tt538_reset,
|
||||
.get_info = tentec2_get_info,
|
||||
.str_cal = TT538_STR_CAL, // This signals front-end support of level STRENGTH
|
||||
|
@ -368,7 +371,7 @@ int tt538_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) {
|
|||
unsigned char cmdbuf[16], respbuf[32];
|
||||
|
||||
cmd_len = sprintf((char *) cmdbuf, "?%c" EOM, which_vfo(rig, vfo));
|
||||
resp_len = 32;
|
||||
resp_len = 7;
|
||||
retval = tt538_transaction (rig, (char *) cmdbuf, cmd_len, (char *) respbuf, &resp_len);
|
||||
|
||||
if (retval != RIG_OK)
|
||||
|
@ -419,6 +422,40 @@ int tt538_set_freq(RIG *rig, vfo_t vfo, freq_t freq)
|
|||
return tt538_transaction(rig, (char *) cmdbuf, cmd_len, NULL, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* tt538_set_split_vfo
|
||||
* assumes rig!=NULL
|
||||
*/
|
||||
|
||||
int tt538_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo)
|
||||
{
|
||||
return tentec_transaction( rig, RIG_SPLIT_ON == split ? "*O1\r" : "*O0\r", 4, NULL, NULL );
|
||||
}
|
||||
|
||||
/*
|
||||
* tt538_get_split_vfo
|
||||
* assumes rig!=NULL
|
||||
*/
|
||||
|
||||
int tt538_get_split_vfo(RIG *rig, vfo_t vfo, split_t *split, vfo_t *tx_vfo)
|
||||
{
|
||||
int retval, ret_len;
|
||||
char buf[4] = "?O\r";
|
||||
|
||||
ret_len = 4;
|
||||
retval = tentec_transaction (rig, buf, 3, buf, &ret_len);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
||||
if (ret_len != 3)
|
||||
return -RIG_EPROTO;
|
||||
|
||||
*split = buf[1] == '0' ? RIG_SPLIT_OFF : RIG_SPLIT_ON;
|
||||
*tx_vfo = RIG_VFO_A;
|
||||
|
||||
return RIG_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* tt538_get_mode
|
||||
* Assumes rig!=NULL, mode!=NULL
|
||||
|
@ -431,7 +468,7 @@ int tt538_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
|
|||
|
||||
/* Query mode */
|
||||
cmd_len = sprintf((char *) cmdbuf, "?M" EOM);
|
||||
resp_len = 32;
|
||||
resp_len = 5;
|
||||
retval = tt538_transaction (rig, (char *) cmdbuf, cmd_len, (char *) respbuf, &resp_len);
|
||||
|
||||
if (retval != RIG_OK)
|
||||
|
@ -471,7 +508,7 @@ int tt538_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
|
|||
|
||||
/* Query passband width (filter) */
|
||||
cmd_len = sprintf((char *) cmdbuf, "?W" EOM);
|
||||
resp_len = 32;
|
||||
resp_len = 4;
|
||||
retval = tt538_transaction (rig, (char *) cmdbuf, cmd_len, (char *) respbuf, &resp_len);
|
||||
|
||||
if (retval != RIG_OK)
|
||||
|
@ -528,7 +565,7 @@ int tt538_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
|||
|
||||
/* Query mode for both VFOs. */
|
||||
cmd_len = sprintf((char *) cmdbuf, "?M" EOM);
|
||||
resp_len = 32;
|
||||
resp_len = 5;
|
||||
retval = tt538_transaction (rig, (char *) cmdbuf, cmd_len, (char *) respbuf, &resp_len);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -571,16 +608,29 @@ int tt538_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
|||
return retval;
|
||||
|
||||
/* Set rx filter bandwidth. */
|
||||
if (width != RIG_PASSBAND_NORMAL) /* leave untouched if normal */
|
||||
{
|
||||
width = tt538_filter_number((int) width);
|
||||
|
||||
if (width == RIG_PASSBAND_NORMAL)
|
||||
width = tt538_filter_number(rig_passband_normal(rig, mode));
|
||||
else
|
||||
width = tt538_filter_number((int) width);
|
||||
|
||||
cmd_len = sprintf((char *) cmdbuf, "*W%c" EOM, (unsigned char) width);
|
||||
return tt538_transaction (rig, (char *) cmdbuf, cmd_len, NULL, NULL);
|
||||
cmd_len = sprintf((char *) cmdbuf, "*W%c" EOM, (unsigned char) width);
|
||||
return tt538_transaction (rig, (char *) cmdbuf, cmd_len, NULL, NULL);
|
||||
}
|
||||
return RIG_OK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* tt538_set_ptt
|
||||
* Assumes rig!=NULL
|
||||
*/
|
||||
int tt538_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt)
|
||||
{
|
||||
return tentec_transaction ( rig,
|
||||
ptt == RIG_PTT_ON? "Q1\r" : "Q0\r", 3,
|
||||
NULL, NULL );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* tt538_get_level
|
||||
* Assumes rig!=NULL, val!=NULL
|
||||
|
@ -599,7 +649,7 @@ int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
switch (level) {
|
||||
case RIG_LEVEL_SWR:
|
||||
/* Get forward power. */
|
||||
lvl_len = 32;
|
||||
lvl_len = 4;
|
||||
retval = tt538_transaction (rig, "?F" EOM, 3, (char *) lvlbuf, &lvl_len);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -611,7 +661,7 @@ int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
fwd = (float) lvlbuf[1];
|
||||
|
||||
/* Get reflected power. */
|
||||
lvl_len = 32;
|
||||
lvl_len = 4;
|
||||
retval = tt538_transaction (rig, "?R" EOM, 3, (char *) lvlbuf, &lvl_len);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -630,7 +680,7 @@ int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
break;
|
||||
|
||||
case RIG_LEVEL_RAWSTR:
|
||||
lvl_len = 32;
|
||||
lvl_len = 7;
|
||||
retval = tt538_transaction (rig, "?S" EOM, 3, (char *) lvlbuf, &lvl_len);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -656,7 +706,7 @@ int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
|
||||
/* Read rig's AGC level setting. */
|
||||
cmd_len = sprintf((char *) cmdbuf, "?G" EOM);
|
||||
lvl_len = 32;
|
||||
lvl_len = 4;
|
||||
retval = tt538_transaction (rig, (char *) cmdbuf, cmd_len, (char *) lvlbuf, &lvl_len);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -681,7 +731,7 @@ int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
|
||||
/* Volume returned as single byte. */
|
||||
cmd_len = sprintf((char *) cmdbuf, "?U" EOM);
|
||||
lvl_len = 32;
|
||||
lvl_len = 4;
|
||||
retval = tt538_transaction (rig, (char *) cmdbuf, cmd_len, (char *) lvlbuf, &lvl_len);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -698,7 +748,7 @@ int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
case RIG_LEVEL_RF:
|
||||
|
||||
cmd_len = sprintf((char *) cmdbuf, "?I" EOM);
|
||||
lvl_len = 32;
|
||||
lvl_len = 4;
|
||||
retval = tt538_transaction (rig, (char *) cmdbuf, cmd_len, (char *) lvlbuf, &lvl_len);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -717,7 +767,7 @@ int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
case RIG_LEVEL_IF: /* IF passband tuning, Hz */
|
||||
|
||||
cmd_len = sprintf((char *) cmdbuf, "?P" EOM);
|
||||
lvl_len = 32;
|
||||
lvl_len = 5;
|
||||
retval = tt538_transaction (rig, (char *) cmdbuf, cmd_len, (char *) lvlbuf,
|
||||
& lvl_len);
|
||||
if (retval != RIG_OK)
|
||||
|
@ -733,7 +783,7 @@ int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
case RIG_LEVEL_ATT:
|
||||
|
||||
cmd_len = sprintf((char *) cmdbuf, "?J" EOM);
|
||||
lvl_len = 32;
|
||||
lvl_len = 4;
|
||||
retval = tt538_transaction (rig, (char *) cmdbuf, cmd_len, (char *) lvlbuf, &lvl_len);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -748,7 +798,7 @@ int tt538_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
case RIG_LEVEL_SQL:
|
||||
|
||||
cmd_len = sprintf((char *) cmdbuf, "?H" EOM);
|
||||
lvl_len = 32;
|
||||
lvl_len = 4;
|
||||
retval = tt538_transaction (rig, (char *) cmdbuf, cmd_len, (char *) lvlbuf, &lvl_len);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -837,7 +887,7 @@ int tt538_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
|
|||
case RIG_FUNC_NR:
|
||||
/* ?K gets nb(0-7), an, nr according to prog ref guide,
|
||||
but it's really nb, nr, an */
|
||||
fresplen = sizeof(frespbuf);
|
||||
fresplen = 6;
|
||||
retval = tt538_transaction(rig, "?K" EOM, 3, frespbuf, &fresplen);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -845,7 +895,7 @@ int tt538_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
|
|||
return RIG_OK;
|
||||
|
||||
case RIG_FUNC_ANF:
|
||||
fresplen = sizeof(frespbuf);
|
||||
fresplen = 6;
|
||||
retval = tt538_transaction(rig, "?K" EOM, 3, frespbuf, &fresplen);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -864,7 +914,7 @@ int tt538_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
|
|||
* state is visible in the Jupiter's menu. Hamlib does not support a "level" for
|
||||
* NB. We only recognize zero (off) or non-zero (on) for this function on read.
|
||||
*/
|
||||
fresplen = sizeof(frespbuf);
|
||||
fresplen = 6;
|
||||
retval = tt538_transaction(rig, "?K" EOM, 3, frespbuf, &fresplen);
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
|
@ -887,7 +937,7 @@ int tt538_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
|
|||
case RIG_FUNC_NB:
|
||||
/* Jupiter combines, nb, nr, and anf in one command, so we need to
|
||||
retrieve them all before changing one of them */
|
||||
fresplen = sizeof(frespbuf);
|
||||
fresplen = 6;
|
||||
retval = tt538_transaction(rig, "?K" EOM, 3, frespbuf, &fresplen);
|
||||
for (i=0; i < 5; i++)
|
||||
fcmdbuf[i+1] = frespbuf[i];
|
||||
|
@ -917,7 +967,7 @@ int tt538_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
|
|||
break;
|
||||
|
||||
case RIG_FUNC_NR:
|
||||
fresplen = sizeof(frespbuf);
|
||||
fresplen = 6;
|
||||
retval = tt538_transaction(rig, "?K" EOM, 3, frespbuf, &fresplen);
|
||||
for (i=0; i < 5; i++)
|
||||
fcmdbuf[i+1] = frespbuf[i];
|
||||
|
@ -931,7 +981,7 @@ int tt538_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
|
|||
break;
|
||||
|
||||
case RIG_FUNC_ANF:
|
||||
fresplen = sizeof(frespbuf);
|
||||
fresplen = 6;
|
||||
retval = tt538_transaction(rig, "?K" EOM, 3, frespbuf, &fresplen);
|
||||
for (i=0; i < 5; i++)
|
||||
fcmdbuf[i+1] = frespbuf[i];
|
||||
|
|
Ładowanie…
Reference in New Issue