kopia lustrzana https://github.com/Hamlib/Hamlib
Make retries in case of read timeout optional and configurable via set-conf option. When not absolutely necessary, they will significantly slow down flushing and normal serial communications with a rig
rodzic
e89687668d
commit
c75fdeb3e4
|
@ -2292,8 +2292,8 @@ typedef struct hamlib_port {
|
||||||
int value; /*!< Toggle PTT ON or OFF */
|
int value; /*!< Toggle PTT ON or OFF */
|
||||||
} gpio; /*!< GPIO attributes */
|
} gpio; /*!< GPIO attributes */
|
||||||
} parm; /*!< Port parameter union */
|
} parm; /*!< Port parameter union */
|
||||||
int client_port; /*!< client socket port for tcp connection */
|
int client_port; /*!< client socket port for tcp connection */
|
||||||
RIG *rig; /*!< our parent RIG device */
|
RIG *rig; /*!< our parent RIG device */
|
||||||
int asyncio; /*!< enable asynchronous data handling if true -- async collides with python keyword so _async is used */
|
int asyncio; /*!< enable asynchronous data handling if true -- async collides with python keyword so _async is used */
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
hamlib_async_pipe_t *sync_data_pipe; /*!< pipe data structure for synchronous data */
|
hamlib_async_pipe_t *sync_data_pipe; /*!< pipe data structure for synchronous data */
|
||||||
|
@ -2304,6 +2304,7 @@ typedef struct hamlib_port {
|
||||||
int fd_sync_error_write; /*!< file descriptor for writing synchronous data error codes */
|
int fd_sync_error_write; /*!< file descriptor for writing synchronous data error codes */
|
||||||
int fd_sync_error_read; /*!< file descriptor for reading synchronous data error codes */
|
int fd_sync_error_read; /*!< file descriptor for reading synchronous data error codes */
|
||||||
#endif
|
#endif
|
||||||
|
short timeout_retry; /*!< number of retries to make in case of read timeout errors, some serial interfaces may require this, 0 to disable */
|
||||||
} hamlib_port_t;
|
} hamlib_port_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
18
src/conf.c
18
src/conf.c
|
@ -69,6 +69,11 @@ static const struct confparams frontend_cfg_params[] =
|
||||||
TOK_RETRY, "retry", "Retry", "Max number of retry",
|
TOK_RETRY, "retry", "Retry", "Max number of retry",
|
||||||
"0", RIG_CONF_NUMERIC, { .n = { 0, 10, 1 } }
|
"0", RIG_CONF_NUMERIC, { .n = { 0, 10, 1 } }
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
TOK_TIMEOUT_RETRY, "timeout_retry", "Number of retries for read timeouts",
|
||||||
|
"Set the number of retries for data read timeouts that may occur especially with some serial interfaces",
|
||||||
|
"0", RIG_CONF_NUMERIC, { .n = { 0, 100, 1 } }
|
||||||
|
},
|
||||||
{
|
{
|
||||||
TOK_RANGE_SELECTED, "Selected range list", "Range list#",
|
TOK_RANGE_SELECTED, "Selected range list", "Range list#",
|
||||||
"The tx/rx range list in use",
|
"The tx/rx range list in use",
|
||||||
|
@ -738,6 +743,15 @@ static int frontend_set_conf(RIG *rig, token_t token, const char *val)
|
||||||
rs->tuner_control_pathname = strdup(val); // yeah -- need to free it
|
rs->tuner_control_pathname = strdup(val); // yeah -- need to free it
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TOK_TIMEOUT_RETRY:
|
||||||
|
if (1 != sscanf(val, "%ld", &val_i))
|
||||||
|
{
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rs->rigport.timeout_retry = val_i;
|
||||||
|
break;
|
||||||
|
|
||||||
case TOK_OFFSET_VFOA:
|
case TOK_OFFSET_VFOA:
|
||||||
if (1 != sscanf(val, "%ld", &val_i))
|
if (1 != sscanf(val, "%ld", &val_i))
|
||||||
{
|
{
|
||||||
|
@ -1111,6 +1125,10 @@ static int frontend_get_conf2(RIG *rig, token_t token, char *val, int val_len)
|
||||||
SNPRINTF(val, val_len, "%d", rs->async_data_enabled);
|
SNPRINTF(val, val_len, "%d", rs->async_data_enabled);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TOK_TIMEOUT_RETRY:
|
||||||
|
SNPRINTF(val, val_len, "%d", rs->rigport.timeout_retry);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -RIG_EINVAL;
|
return -RIG_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
11
src/iofunc.c
11
src/iofunc.c
|
@ -1321,7 +1321,7 @@ static int read_string_generic(hamlib_port_t *p,
|
||||||
|
|
||||||
memset(rxbuffer, 0, rxmax);
|
memset(rxbuffer, 0, rxmax);
|
||||||
|
|
||||||
int flag = 0; // we will allow one timeout
|
short timeout_retries = p->timeout_retry;
|
||||||
|
|
||||||
while (total_count < rxmax - 1) // allow 1 byte for end-of-string
|
while (total_count < rxmax - 1) // allow 1 byte for end-of-string
|
||||||
{
|
{
|
||||||
|
@ -1332,12 +1332,11 @@ static int read_string_generic(hamlib_port_t *p,
|
||||||
|
|
||||||
if (result == -RIG_ETIMEOUT)
|
if (result == -RIG_ETIMEOUT)
|
||||||
{
|
{
|
||||||
rig_debug(RIG_DEBUG_CACHE, "%s: flag=%d\n", __func__, flag);
|
if (timeout_retries > 0)
|
||||||
|
|
||||||
if (flag == 0)
|
|
||||||
{
|
{
|
||||||
flag = 1;
|
rig_debug(RIG_DEBUG_CACHE, "%s: retrying read timeout %d/%d\n", __func__,
|
||||||
hl_usleep(50 * 1000);
|
timeout_retries + 1, p->timeout_retry);
|
||||||
|
hl_usleep(10 * 1000);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -95,6 +95,8 @@
|
||||||
#define TOK_ASYNC TOKEN_FRONTEND(37)
|
#define TOK_ASYNC TOKEN_FRONTEND(37)
|
||||||
/** \brief Tuner external control pathname */
|
/** \brief Tuner external control pathname */
|
||||||
#define TOK_TUNER_CONTROL_PATHNAME TOKEN_FRONTEND(38)
|
#define TOK_TUNER_CONTROL_PATHNAME TOKEN_FRONTEND(38)
|
||||||
|
/** \brief Number of retries permitted in case of read timeouts */
|
||||||
|
#define TOK_TIMEOUT_RETRY TOKEN_FRONTEND(39)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rig specific tokens
|
* rig specific tokens
|
||||||
|
|
Ładowanie…
Reference in New Issue