kopia lustrzana https://github.com/Hamlib/Hamlib
Allow enabling of async data mode via conf option. Ignore multicast data publishing if the publisher routine is not enabled.
rodzic
8ee0383464
commit
2857a54ea6
|
@ -2218,6 +2218,7 @@ typedef struct hamlib_port {
|
||||||
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 */
|
||||||
|
|
||||||
|
#ifdef ASYNC_BUG
|
||||||
int async; /*!< enable asynchronous data handling if true */
|
int async; /*!< enable asynchronous data handling if true */
|
||||||
#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 */
|
||||||
|
@ -2228,6 +2229,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
|
||||||
|
#endif
|
||||||
} hamlib_port_t;
|
} hamlib_port_t;
|
||||||
//! @endcond
|
//! @endcond
|
||||||
|
|
||||||
|
@ -2239,7 +2241,7 @@ typedef hamlib_port_t port_t;
|
||||||
#define HAMLIB_ELAPSED_SET 1
|
#define HAMLIB_ELAPSED_SET 1
|
||||||
#define HAMLIB_ELAPSED_INVALIDATE 2
|
#define HAMLIB_ELAPSED_INVALIDATE 2
|
||||||
|
|
||||||
#define HAMLIB_CACHE_ALWAYS -1 /*< value to set cache timeout to always use cache */
|
#define HAMLIB_CACHE_ALWAYS (-1) /*< value to set cache timeout to always use cache */
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
HAMLIB_CACHE_ALL, // to set all cache timeouts at once
|
HAMLIB_CACHE_ALL, // to set all cache timeouts at once
|
||||||
|
@ -2399,7 +2401,7 @@ struct rig_state {
|
||||||
rig_ptr_t priv; /*!< Pointer to private rig state data. */
|
rig_ptr_t priv; /*!< Pointer to private rig state data. */
|
||||||
rig_ptr_t obj; /*!< Internal use by hamlib++ for event handling. */
|
rig_ptr_t obj; /*!< Internal use by hamlib++ for event handling. */
|
||||||
|
|
||||||
int async_data; /*!< Whether async data mode is on */
|
int async_data_enabled; /*!< Whether async data mode is enabled */
|
||||||
int poll_interval; /*!< Rig state polling period in milliseconds */
|
int poll_interval; /*!< Rig state polling period in milliseconds */
|
||||||
freq_t current_freq; /*!< Frequency currently set */
|
freq_t current_freq; /*!< Frequency currently set */
|
||||||
rmode_t current_mode; /*!< Mode currently set */
|
rmode_t current_mode; /*!< Mode currently set */
|
||||||
|
|
17
src/conf.c
17
src/conf.c
|
@ -168,6 +168,11 @@ static const struct confparams frontend_cfg_params[] =
|
||||||
"Suppress get_freq on VFOB for RIT tuning satellites",
|
"Suppress get_freq on VFOB for RIT tuning satellites",
|
||||||
"Unset", RIG_CONF_COMBO, { .c = {{ "Unset", "ON", "OFF", NULL }} }
|
"Unset", RIG_CONF_COMBO, { .c = {{ "Unset", "ON", "OFF", NULL }} }
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
TOK_ASYNC, "async", "Asynchronous data transfer support",
|
||||||
|
"True enables asynchronous data transfer for backends that support it. This enabled handling of transceive and spectrum data, for example.",
|
||||||
|
"0", RIG_CONF_CHECKBUTTON, { }
|
||||||
|
},
|
||||||
|
|
||||||
{ RIG_CONF_END, NULL, }
|
{ RIG_CONF_END, NULL, }
|
||||||
};
|
};
|
||||||
|
@ -666,6 +671,15 @@ static int frontend_set_conf(RIG *rig, token_t token, const char *val)
|
||||||
rs->twiddle_rit = val_i ? 1 : 0;
|
rs->twiddle_rit = val_i ? 1 : 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TOK_ASYNC:
|
||||||
|
if (1 != sscanf(val, "%d", &val_i))
|
||||||
|
{
|
||||||
|
return -RIG_EINVAL; //value format error
|
||||||
|
}
|
||||||
|
|
||||||
|
rs->async_data_enabled = val_i ? 1 : 0;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -RIG_EINVAL;
|
return -RIG_EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -1010,6 +1024,9 @@ static int frontend_get_conf(RIG *rig, token_t token, char *val)
|
||||||
sprintf(val, "%d", rs->twiddle_rit);
|
sprintf(val, "%d", rs->twiddle_rit);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TOK_ASYNC:
|
||||||
|
sprintf(val, "%d", rs->async_data_enabled);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -RIG_EINVAL;
|
return -RIG_EINVAL;
|
||||||
|
|
|
@ -692,21 +692,37 @@ static int multicast_publisher_write_packet_header(RIG *rig, multicast_publisher
|
||||||
|
|
||||||
int network_publish_rig_poll_data(RIG *rig)
|
int network_publish_rig_poll_data(RIG *rig)
|
||||||
{
|
{
|
||||||
|
struct rig_state *rs = &rig->state;
|
||||||
multicast_publisher_data_packet packet = {
|
multicast_publisher_data_packet packet = {
|
||||||
.type = MULTICAST_PUBLISHER_DATA_PACKET_TYPE_POLL,
|
.type = MULTICAST_PUBLISHER_DATA_PACKET_TYPE_POLL,
|
||||||
.padding = 0,
|
.padding = 0,
|
||||||
.data_length = 0,
|
.data_length = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (rs->multicast_publisher_priv_data == NULL)
|
||||||
|
{
|
||||||
|
// Silently ignore call if multicast publisher is not enabled
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
return multicast_publisher_write_packet_header(rig, &packet);
|
return multicast_publisher_write_packet_header(rig, &packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
int network_publish_rig_transceive_data(RIG *rig)
|
int network_publish_rig_transceive_data(RIG *rig)
|
||||||
{
|
{
|
||||||
|
struct rig_state *rs = &rig->state;
|
||||||
multicast_publisher_data_packet packet = {
|
multicast_publisher_data_packet packet = {
|
||||||
.type = MULTICAST_PUBLISHER_DATA_PACKET_TYPE_TRANSCEIVE,
|
.type = MULTICAST_PUBLISHER_DATA_PACKET_TYPE_TRANSCEIVE,
|
||||||
.padding = 0,
|
.padding = 0,
|
||||||
.data_length = 0,
|
.data_length = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (rs->multicast_publisher_priv_data == NULL)
|
||||||
|
{
|
||||||
|
// Silently ignore call if multicast publisher is not enabled
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
return multicast_publisher_write_packet_header(rig, &packet);
|
return multicast_publisher_write_packet_header(rig, &packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -724,8 +740,8 @@ int network_publish_rig_spectrum_data(RIG *rig, struct rig_spectrum_line *line)
|
||||||
|
|
||||||
if (rs->multicast_publisher_priv_data == NULL)
|
if (rs->multicast_publisher_priv_data == NULL)
|
||||||
{
|
{
|
||||||
// Silently ignore if multicast publisher is not enabled
|
// Silently ignore call if multicast publisher is not enabled
|
||||||
RETURNFUNC(RIG_OK);
|
return RIG_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = multicast_publisher_write_packet_header(rig, &packet);
|
result = multicast_publisher_write_packet_header(rig, &packet);
|
||||||
|
|
43
src/rig.c
43
src/rig.c
|
@ -452,18 +452,15 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model)
|
||||||
*/
|
*/
|
||||||
rs = &rig->state;
|
rs = &rig->state;
|
||||||
|
|
||||||
|
rs->async_data_enabled = 0;
|
||||||
rs->rigport.fd = -1;
|
rs->rigport.fd = -1;
|
||||||
rs->pttport.fd = -1;
|
rs->pttport.fd = -1;
|
||||||
rs->comm_state = 0;
|
rs->comm_state = 0;
|
||||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: rs->comm_state==0?=%d\n", __func__,
|
rig_debug(RIG_DEBUG_VERBOSE, "%s: rs->comm_state==0?=%d\n", __func__,
|
||||||
rs->comm_state);
|
rs->comm_state);
|
||||||
rs->rigport.type.rig = caps->port_type; /* default from caps */
|
rs->rigport.type.rig = caps->port_type; /* default from caps */
|
||||||
#ifdef ASYNC_BUG
|
#if defined(ASYNC_BUG) && defined(HAVE_PTHREAD)
|
||||||
#ifdef HAVE_PTHREAD
|
|
||||||
rs->rigport.async = caps->async_data_supported;
|
|
||||||
#else
|
|
||||||
rs->rigport.async = 0;
|
rs->rigport.async = 0;
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (caps->port_type)
|
switch (caps->port_type)
|
||||||
|
@ -513,11 +510,6 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model)
|
||||||
rs->vfo_comp = 0.0; /* override it with preferences */
|
rs->vfo_comp = 0.0; /* override it with preferences */
|
||||||
rs->current_vfo = RIG_VFO_CURR; /* we don't know yet! */
|
rs->current_vfo = RIG_VFO_CURR; /* we don't know yet! */
|
||||||
rs->tx_vfo = RIG_VFO_CURR; /* we don't know yet! */
|
rs->tx_vfo = RIG_VFO_CURR; /* we don't know yet! */
|
||||||
#ifdef HAVE_PTHREAD
|
|
||||||
rs->async_data = caps->async_data_supported;
|
|
||||||
#else
|
|
||||||
rs->async_data = 0;
|
|
||||||
#endif
|
|
||||||
rs->poll_interval = 0; // disable polling by default
|
rs->poll_interval = 0; // disable polling by default
|
||||||
rs->lo_freq = 0;
|
rs->lo_freq = 0;
|
||||||
rs->cache.timeout_ms = 500; // 500ms cache timeout by default
|
rs->cache.timeout_ms = 500; // 500ms cache timeout by default
|
||||||
|
@ -723,6 +715,12 @@ int HAMLIB_API rig_open(RIG *rig)
|
||||||
rs = &rig->state;
|
rs = &rig->state;
|
||||||
rs->rigport.rig = rig;
|
rs->rigport.rig = rig;
|
||||||
|
|
||||||
|
#if defined(ASYNC_BUG) && defined(HAVE_PTHREAD)
|
||||||
|
// Enable async data only if it's enabled through conf settings *and* supported by the backend
|
||||||
|
rs->async_data_enabled = rs->async_data_enabled && caps->async_data_supported;
|
||||||
|
rs->rigport.async = rs->async_data_enabled;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (strlen(rs->rigport.pathname) > 0)
|
if (strlen(rs->rigport.pathname) > 0)
|
||||||
{
|
{
|
||||||
char hoststr[256], portstr[6];
|
char hoststr[256], portstr[6];
|
||||||
|
@ -6880,17 +6878,20 @@ HAMLIB_EXPORT(void) sync_callback(int lock)
|
||||||
#ifdef ASYNC_BUG
|
#ifdef ASYNC_BUG
|
||||||
static int async_data_handler_start(RIG *rig)
|
static int async_data_handler_start(RIG *rig)
|
||||||
{
|
{
|
||||||
const struct rig_caps *caps = rig->caps;
|
|
||||||
struct rig_state *rs = &rig->state;
|
struct rig_state *rs = &rig->state;
|
||||||
async_data_handler_priv_data *async_data_handler_priv;
|
async_data_handler_priv_data *async_data_handler_priv;
|
||||||
|
|
||||||
ENTERFUNC;
|
ENTERFUNC;
|
||||||
|
|
||||||
|
if (!rs->async_data_enabled)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_TRACE, "%s: async data support disabled\n", __func__);
|
||||||
|
RETURNFUNC(RIG_OK);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ASYNC_BUG
|
#ifdef ASYNC_BUG
|
||||||
#ifdef HAVE_PTHREAD
|
#ifdef HAVE_PTHREAD
|
||||||
|
|
||||||
if (caps->async_data_supported)
|
|
||||||
{
|
|
||||||
rs->async_data_handler_thread_run = 1;
|
rs->async_data_handler_thread_run = 1;
|
||||||
rs->async_data_handler_priv_data = calloc(1,
|
rs->async_data_handler_priv_data = calloc(1,
|
||||||
sizeof(async_data_handler_priv_data));
|
sizeof(async_data_handler_priv_data));
|
||||||
|
@ -6908,12 +6909,9 @@ static int async_data_handler_start(RIG *rig)
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
rig_debug(RIG_DEBUG_ERR, "%s(%d) pthread_create error: %s\n", __FILE__,
|
rig_debug(RIG_DEBUG_ERR, "%s: pthread_create error: %s\n", __func__, strerror(errno));
|
||||||
__LINE__,
|
|
||||||
strerror(errno));
|
|
||||||
RETURNFUNC(-RIG_EINTERNAL);
|
RETURNFUNC(-RIG_EINTERNAL);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -6943,8 +6941,7 @@ static int async_data_handler_stop(RIG *rig)
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
rig_debug(RIG_DEBUG_ERR, "%s(%d): pthread_join error: %s\n", __FILE__, __LINE__,
|
rig_debug(RIG_DEBUG_ERR, "%s: pthread_join error: %s\n", __func__, strerror(errno));
|
||||||
strerror(errno));
|
|
||||||
// just ignore the error
|
// just ignore the error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6973,9 +6970,7 @@ void *async_data_handler(void *arg)
|
||||||
int result;
|
int result;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Starting async data handler thread\n",
|
rig_debug(RIG_DEBUG_VERBOSE, "%s: Starting async data handler thread\n", __func__);
|
||||||
__FILE__,
|
|
||||||
__LINE__);
|
|
||||||
|
|
||||||
// TODO: check how to enable "transceive" on recent Kenwood/Yaesu rigs
|
// TODO: check how to enable "transceive" on recent Kenwood/Yaesu rigs
|
||||||
// TODO: add initial support for async in Kenwood kenwood_transaction (+one) functions -> add transaction_active flag usage
|
// TODO: add initial support for async in Kenwood kenwood_transaction (+one) functions -> add transaction_active flag usage
|
||||||
|
@ -7045,9 +7040,7 @@ void *async_data_handler(void *arg)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Stopping async data handler thread\n",
|
rig_debug(RIG_DEBUG_VERBOSE, "%s: Stopping async data handler thread\n", __func__);
|
||||||
__FILE__,
|
|
||||||
__LINE__);
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,6 +91,9 @@
|
||||||
#define TOK_PTT_SHARE TOKEN_FRONTEND(35)
|
#define TOK_PTT_SHARE TOKEN_FRONTEND(35)
|
||||||
/** \brief PTT share with other applications */
|
/** \brief PTT share with other applications */
|
||||||
#define TOK_FLUSHX TOKEN_FRONTEND(36)
|
#define TOK_FLUSHX TOKEN_FRONTEND(36)
|
||||||
|
/** \brief Asynchronous data transfer support */
|
||||||
|
#define TOK_ASYNC TOKEN_FRONTEND(37)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rig specific tokens
|
* rig specific tokens
|
||||||
*/
|
*/
|
||||||
|
|
Ładowanie…
Reference in New Issue