scpi: Add connenction_id() function to all scpi drivers.
This commit is contained in:
parent
9618fde422
commit
8107a9a650
29
src/device.c
29
src/device.c
|
@ -23,6 +23,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <libsigrok/libsigrok.h>
|
#include <libsigrok/libsigrok.h>
|
||||||
#include "libsigrok-internal.h"
|
#include "libsigrok-internal.h"
|
||||||
|
#include "scpi.h"
|
||||||
|
|
||||||
/** @cond PRIVATE */
|
/** @cond PRIVATE */
|
||||||
#define LOG_PREFIX "device"
|
#define LOG_PREFIX "device"
|
||||||
|
@ -808,19 +809,24 @@ SR_API const char *sr_dev_inst_connid_get(const struct sr_dev_inst *sdi)
|
||||||
#ifdef HAVE_LIBUSB_1_0
|
#ifdef HAVE_LIBUSB_1_0
|
||||||
struct drv_context *drvc;
|
struct drv_context *drvc;
|
||||||
int cnt, i, a, b;
|
int cnt, i, a, b;
|
||||||
char connection_id[64];
|
char conn_id_usb[64];
|
||||||
struct sr_usb_dev_inst *usb;
|
struct sr_usb_dev_inst *usb;
|
||||||
struct libusb_device **devlist;
|
struct libusb_device **devlist;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSERIALPORT
|
||||||
|
struct sr_serial_dev_inst *serial;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct sr_scpi_dev_inst *scpi;
|
||||||
|
char *conn_id_scpi;
|
||||||
|
|
||||||
if (!sdi)
|
if (!sdi)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
#ifdef HAVE_LIBSERIALPORT
|
#ifdef HAVE_LIBSERIALPORT
|
||||||
struct sr_serial_dev_inst *serial;
|
|
||||||
|
|
||||||
if ((!sdi->connection_id) && (sdi->inst_type == SR_INST_SERIAL)) {
|
if ((!sdi->connection_id) && (sdi->inst_type == SR_INST_SERIAL)) {
|
||||||
/* connection_id isn't populated, let's do that here. */
|
/* connection_id isn't populated, let's do that for serial devices. */
|
||||||
|
|
||||||
serial = sdi->conn;
|
serial = sdi->conn;
|
||||||
((struct sr_dev_inst *)sdi)->connection_id = g_strdup(serial->port);
|
((struct sr_dev_inst *)sdi)->connection_id = g_strdup(serial->port);
|
||||||
|
@ -829,7 +835,7 @@ SR_API const char *sr_dev_inst_connid_get(const struct sr_dev_inst *sdi)
|
||||||
|
|
||||||
#ifdef HAVE_LIBUSB_1_0
|
#ifdef HAVE_LIBUSB_1_0
|
||||||
if ((!sdi->connection_id) && (sdi->inst_type == SR_INST_USB)) {
|
if ((!sdi->connection_id) && (sdi->inst_type == SR_INST_USB)) {
|
||||||
/* connection_id isn't populated, let's do that here. */
|
/* connection_id isn't populated, let's do that for USB devices. */
|
||||||
|
|
||||||
drvc = sdi->driver->context;
|
drvc = sdi->driver->context;
|
||||||
usb = sdi->conn;
|
usb = sdi->conn;
|
||||||
|
@ -847,10 +853,10 @@ SR_API const char *sr_dev_inst_connid_get(const struct sr_dev_inst *sdi)
|
||||||
if (b != usb->bus || a != usb->address)
|
if (b != usb->bus || a != usb->address)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (usb_get_port_path(devlist[i], connection_id, sizeof(connection_id)) < 0)
|
if (usb_get_port_path(devlist[i], conn_id_usb, sizeof(conn_id_usb)) < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
((struct sr_dev_inst *)sdi)->connection_id = g_strdup(connection_id);
|
((struct sr_dev_inst *)sdi)->connection_id = g_strdup(conn_id_usb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -858,6 +864,15 @@ SR_API const char *sr_dev_inst_connid_get(const struct sr_dev_inst *sdi)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if ((!sdi->connection_id) && (sdi->inst_type == SR_INST_SCPI)) {
|
||||||
|
/* connection_id isn't populated, let's do that for SCPI devices. */
|
||||||
|
|
||||||
|
scpi = sdi->conn;
|
||||||
|
sr_scpi_connection_id(scpi, &conn_id_scpi);
|
||||||
|
((struct sr_dev_inst *)sdi)->connection_id = g_strdup(conn_id_scpi);
|
||||||
|
g_free(conn_id_scpi);
|
||||||
|
}
|
||||||
|
|
||||||
return sdi->connection_id;
|
return sdi->connection_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,7 @@ struct sr_scpi_dev_inst {
|
||||||
int (*dev_inst_new)(void *priv, struct drv_context *drvc,
|
int (*dev_inst_new)(void *priv, struct drv_context *drvc,
|
||||||
const char *resource, char **params, const char *serialcomm);
|
const char *resource, char **params, const char *serialcomm);
|
||||||
int (*open)(struct sr_scpi_dev_inst *scpi);
|
int (*open)(struct sr_scpi_dev_inst *scpi);
|
||||||
|
int (*connection_id)(struct sr_scpi_dev_inst *scpi, char **connection_id);
|
||||||
int (*source_add)(struct sr_session *session, void *priv, int events,
|
int (*source_add)(struct sr_session *session, void *priv, int events,
|
||||||
int timeout, sr_receive_data_callback cb, void *cb_data);
|
int timeout, sr_receive_data_callback cb, void *cb_data);
|
||||||
int (*source_remove)(struct sr_session *session, void *priv);
|
int (*source_remove)(struct sr_session *session, void *priv);
|
||||||
|
@ -108,6 +109,8 @@ SR_PRIV GSList *sr_scpi_scan(struct drv_context *drvc, GSList *options,
|
||||||
SR_PRIV struct sr_scpi_dev_inst *scpi_dev_inst_new(struct drv_context *drvc,
|
SR_PRIV struct sr_scpi_dev_inst *scpi_dev_inst_new(struct drv_context *drvc,
|
||||||
const char *resource, const char *serialcomm);
|
const char *resource, const char *serialcomm);
|
||||||
SR_PRIV int sr_scpi_open(struct sr_scpi_dev_inst *scpi);
|
SR_PRIV int sr_scpi_open(struct sr_scpi_dev_inst *scpi);
|
||||||
|
SR_PRIV int sr_scpi_connection_id(struct sr_scpi_dev_inst *scpi,
|
||||||
|
char **connection_id);
|
||||||
SR_PRIV int sr_scpi_source_add(struct sr_session *session,
|
SR_PRIV int sr_scpi_source_add(struct sr_session *session,
|
||||||
struct sr_scpi_dev_inst *scpi, int events, int timeout,
|
struct sr_scpi_dev_inst *scpi, int events, int timeout,
|
||||||
sr_receive_data_callback cb, void *cb_data);
|
sr_receive_data_callback cb, void *cb_data);
|
||||||
|
|
|
@ -407,6 +407,21 @@ SR_PRIV int sr_scpi_open(struct sr_scpi_dev_inst *scpi)
|
||||||
return scpi->open(scpi);
|
return scpi->open(scpi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the connection ID of the SCPI device.
|
||||||
|
*
|
||||||
|
* @param scpi Previously initialized SCPI device structure.
|
||||||
|
* @param connection_id Pointer where to store the connection ID. The caller
|
||||||
|
* is responsible for g_free()ing the string when it is no longer needed.
|
||||||
|
*
|
||||||
|
* @return SR_OK on success, SR_ERR on failure.
|
||||||
|
*/
|
||||||
|
SR_PRIV int sr_scpi_connection_id(struct sr_scpi_dev_inst *scpi,
|
||||||
|
char **connection_id)
|
||||||
|
{
|
||||||
|
return scpi->connection_id(scpi, connection_id);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an event source for an SCPI device.
|
* Add an event source for an SCPI device.
|
||||||
*
|
*
|
||||||
|
|
|
@ -59,6 +59,16 @@ static int scpi_gpib_open(struct sr_scpi_dev_inst *scpi)
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int scpi_gpib_connection_id(struct sr_scpi_dev_inst *scpi,
|
||||||
|
char **connection_id)
|
||||||
|
{
|
||||||
|
struct scpi_gpib *gscpi = scpi->priv;
|
||||||
|
|
||||||
|
*connection_id = g_strdup_printf("%s/%s", scpi->prefix, gscpi->name);
|
||||||
|
|
||||||
|
return SR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int scpi_gpib_source_add(struct sr_session *session, void *priv,
|
static int scpi_gpib_source_add(struct sr_session *session, void *priv,
|
||||||
int events, int timeout, sr_receive_data_callback cb, void *cb_data)
|
int events, int timeout, sr_receive_data_callback cb, void *cb_data)
|
||||||
{
|
{
|
||||||
|
@ -172,17 +182,18 @@ SR_PRIV int sr_scpi_gpib_spoll(struct sr_scpi_dev_inst *scpi, char *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
SR_PRIV const struct sr_scpi_dev_inst scpi_libgpib_dev = {
|
SR_PRIV const struct sr_scpi_dev_inst scpi_libgpib_dev = {
|
||||||
.name = "GPIB",
|
.name = "GPIB",
|
||||||
.prefix = "libgpib",
|
.prefix = "libgpib",
|
||||||
.priv_size = sizeof(struct scpi_gpib),
|
.priv_size = sizeof(struct scpi_gpib),
|
||||||
.dev_inst_new = scpi_gpib_dev_inst_new,
|
.dev_inst_new = scpi_gpib_dev_inst_new,
|
||||||
.open = scpi_gpib_open,
|
.open = scpi_gpib_open,
|
||||||
.source_add = scpi_gpib_source_add,
|
.connection_id = scpi_gpib_connection_id,
|
||||||
|
.source_add = scpi_gpib_source_add,
|
||||||
.source_remove = scpi_gpib_source_remove,
|
.source_remove = scpi_gpib_source_remove,
|
||||||
.send = scpi_gpib_send,
|
.send = scpi_gpib_send,
|
||||||
.read_begin = scpi_gpib_read_begin,
|
.read_begin = scpi_gpib_read_begin,
|
||||||
.read_data = scpi_gpib_read_data,
|
.read_data = scpi_gpib_read_data,
|
||||||
.read_complete = scpi_gpib_read_complete,
|
.read_complete = scpi_gpib_read_complete,
|
||||||
.close = scpi_gpib_close,
|
.close = scpi_gpib_close,
|
||||||
.free = scpi_gpib_free,
|
.free = scpi_gpib_free,
|
||||||
};
|
};
|
||||||
|
|
|
@ -98,6 +98,17 @@ static int scpi_serial_open(struct sr_scpi_dev_inst *scpi)
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int scpi_serial_connection_id(struct sr_scpi_dev_inst *scpi,
|
||||||
|
char **connection_id)
|
||||||
|
{
|
||||||
|
struct scpi_serial *sscpi = scpi->priv;
|
||||||
|
struct sr_serial_dev_inst *serial = sscpi->serial;
|
||||||
|
|
||||||
|
*connection_id = g_strdup(serial->port);
|
||||||
|
|
||||||
|
return SR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int scpi_serial_source_add(struct sr_session *session, void *priv,
|
static int scpi_serial_source_add(struct sr_session *session, void *priv,
|
||||||
int events, int timeout, sr_receive_data_callback cb, void *cb_data)
|
int events, int timeout, sr_receive_data_callback cb, void *cb_data)
|
||||||
{
|
{
|
||||||
|
@ -192,6 +203,7 @@ SR_PRIV const struct sr_scpi_dev_inst scpi_serial_dev = {
|
||||||
.scan = scpi_serial_scan,
|
.scan = scpi_serial_scan,
|
||||||
.dev_inst_new = scpi_serial_dev_inst_new,
|
.dev_inst_new = scpi_serial_dev_inst_new,
|
||||||
.open = scpi_serial_open,
|
.open = scpi_serial_open,
|
||||||
|
.connection_id = scpi_serial_connection_id,
|
||||||
.source_add = scpi_serial_source_add,
|
.source_add = scpi_serial_source_add,
|
||||||
.source_remove = scpi_serial_source_remove,
|
.source_remove = scpi_serial_source_remove,
|
||||||
.send = scpi_serial_send,
|
.send = scpi_serial_send,
|
||||||
|
|
|
@ -115,6 +115,17 @@ static int scpi_tcp_open(struct sr_scpi_dev_inst *scpi)
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int scpi_tcp_connection_id(struct sr_scpi_dev_inst *scpi,
|
||||||
|
char **connection_id)
|
||||||
|
{
|
||||||
|
struct scpi_tcp *tcp = scpi->priv;
|
||||||
|
|
||||||
|
*connection_id = g_strdup_printf("%s/%s:%s",
|
||||||
|
scpi->prefix, tcp->address, tcp->port);
|
||||||
|
|
||||||
|
return SR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int scpi_tcp_source_add(struct sr_session *session, void *priv,
|
static int scpi_tcp_source_add(struct sr_session *session, void *priv,
|
||||||
int events, int timeout, sr_receive_data_callback cb, void *cb_data)
|
int events, int timeout, sr_receive_data_callback cb, void *cb_data)
|
||||||
{
|
{
|
||||||
|
@ -266,6 +277,7 @@ SR_PRIV const struct sr_scpi_dev_inst scpi_tcp_raw_dev = {
|
||||||
.priv_size = sizeof(struct scpi_tcp),
|
.priv_size = sizeof(struct scpi_tcp),
|
||||||
.dev_inst_new = scpi_tcp_dev_inst_new,
|
.dev_inst_new = scpi_tcp_dev_inst_new,
|
||||||
.open = scpi_tcp_open,
|
.open = scpi_tcp_open,
|
||||||
|
.connection_id = scpi_tcp_connection_id,
|
||||||
.source_add = scpi_tcp_source_add,
|
.source_add = scpi_tcp_source_add,
|
||||||
.source_remove = scpi_tcp_source_remove,
|
.source_remove = scpi_tcp_source_remove,
|
||||||
.send = scpi_tcp_send,
|
.send = scpi_tcp_send,
|
||||||
|
@ -283,6 +295,7 @@ SR_PRIV const struct sr_scpi_dev_inst scpi_tcp_rigol_dev = {
|
||||||
.priv_size = sizeof(struct scpi_tcp),
|
.priv_size = sizeof(struct scpi_tcp),
|
||||||
.dev_inst_new = scpi_tcp_dev_inst_new,
|
.dev_inst_new = scpi_tcp_dev_inst_new,
|
||||||
.open = scpi_tcp_open,
|
.open = scpi_tcp_open,
|
||||||
|
.connection_id = scpi_tcp_connection_id,
|
||||||
.source_add = scpi_tcp_source_add,
|
.source_add = scpi_tcp_source_add,
|
||||||
.source_remove = scpi_tcp_source_remove,
|
.source_remove = scpi_tcp_source_remove,
|
||||||
.send = scpi_tcp_send,
|
.send = scpi_tcp_send,
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
#include <inttypes.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <libsigrok/libsigrok.h>
|
#include <libsigrok/libsigrok.h>
|
||||||
#include "libsigrok-internal.h"
|
#include "libsigrok-internal.h"
|
||||||
|
@ -413,6 +414,18 @@ static int scpi_usbtmc_libusb_open(struct sr_scpi_dev_inst *scpi)
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int scpi_usbtmc_libusb_connection_id(struct sr_scpi_dev_inst *scpi,
|
||||||
|
char **connection_id)
|
||||||
|
{
|
||||||
|
struct scpi_usbtmc_libusb *uscpi = scpi->priv;
|
||||||
|
struct sr_usb_dev_inst *usb = uscpi->usb;
|
||||||
|
|
||||||
|
*connection_id = g_strdup_printf("%s/%" PRIu8 ".%" PRIu8 "",
|
||||||
|
scpi->prefix, usb->bus, usb->address);
|
||||||
|
|
||||||
|
return SR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int scpi_usbtmc_libusb_source_add(struct sr_session *session,
|
static int scpi_usbtmc_libusb_source_add(struct sr_session *session,
|
||||||
void *priv, int events, int timeout, sr_receive_data_callback cb,
|
void *priv, int events, int timeout, sr_receive_data_callback cb,
|
||||||
void *cb_data)
|
void *cb_data)
|
||||||
|
@ -661,6 +674,7 @@ SR_PRIV const struct sr_scpi_dev_inst scpi_usbtmc_libusb_dev = {
|
||||||
.scan = scpi_usbtmc_libusb_scan,
|
.scan = scpi_usbtmc_libusb_scan,
|
||||||
.dev_inst_new = scpi_usbtmc_libusb_dev_inst_new,
|
.dev_inst_new = scpi_usbtmc_libusb_dev_inst_new,
|
||||||
.open = scpi_usbtmc_libusb_open,
|
.open = scpi_usbtmc_libusb_open,
|
||||||
|
.connection_id = scpi_usbtmc_libusb_connection_id,
|
||||||
.source_add = scpi_usbtmc_libusb_source_add,
|
.source_add = scpi_usbtmc_libusb_source_add,
|
||||||
.source_remove = scpi_usbtmc_libusb_source_remove,
|
.source_remove = scpi_usbtmc_libusb_source_remove,
|
||||||
.send = scpi_usbtmc_libusb_send,
|
.send = scpi_usbtmc_libusb_send,
|
||||||
|
|
|
@ -68,6 +68,16 @@ static int scpi_visa_open(struct sr_scpi_dev_inst *scpi)
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int scpi_visa_connection_id(struct sr_scpi_dev_inst *scpi,
|
||||||
|
char **connection_id)
|
||||||
|
{
|
||||||
|
struct scpi_visa *vscpi = scpi->priv;
|
||||||
|
|
||||||
|
*connection_id = g_strdup_printf("%s/%s", scpi->prefix, vscpi->resource);
|
||||||
|
|
||||||
|
return SR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int scpi_visa_source_add(struct sr_session *session, void *priv,
|
static int scpi_visa_source_add(struct sr_session *session, void *priv,
|
||||||
int events, int timeout, sr_receive_data_callback cb, void *cb_data)
|
int events, int timeout, sr_receive_data_callback cb, void *cb_data)
|
||||||
{
|
{
|
||||||
|
@ -154,17 +164,18 @@ static void scpi_visa_free(void *priv)
|
||||||
}
|
}
|
||||||
|
|
||||||
SR_PRIV const struct sr_scpi_dev_inst scpi_visa_dev = {
|
SR_PRIV const struct sr_scpi_dev_inst scpi_visa_dev = {
|
||||||
.name = "VISA",
|
.name = "VISA",
|
||||||
.prefix = "visa",
|
.prefix = "visa",
|
||||||
.priv_size = sizeof(struct scpi_visa),
|
.priv_size = sizeof(struct scpi_visa),
|
||||||
.dev_inst_new = scpi_visa_dev_inst_new,
|
.dev_inst_new = scpi_visa_dev_inst_new,
|
||||||
.open = scpi_visa_open,
|
.open = scpi_visa_open,
|
||||||
.source_add = scpi_visa_source_add,
|
.connection_id = scpi_visa_connection_id,
|
||||||
|
.source_add = scpi_visa_source_add,
|
||||||
.source_remove = scpi_visa_source_remove,
|
.source_remove = scpi_visa_source_remove,
|
||||||
.send = scpi_visa_send,
|
.send = scpi_visa_send,
|
||||||
.read_begin = scpi_visa_read_begin,
|
.read_begin = scpi_visa_read_begin,
|
||||||
.read_data = scpi_visa_read_data,
|
.read_data = scpi_visa_read_data,
|
||||||
.read_complete = scpi_visa_read_complete,
|
.read_complete = scpi_visa_read_complete,
|
||||||
.close = scpi_visa_close,
|
.close = scpi_visa_close,
|
||||||
.free = scpi_visa_free,
|
.free = scpi_visa_free,
|
||||||
};
|
};
|
||||||
|
|
|
@ -92,6 +92,16 @@ static int scpi_vxi_open(struct sr_scpi_dev_inst *scpi)
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int scpi_vxi_connection_id(struct sr_scpi_dev_inst *scpi,
|
||||||
|
char **connection_id)
|
||||||
|
{
|
||||||
|
struct scpi_vxi *vxi = scpi->priv;
|
||||||
|
|
||||||
|
*connection_id = g_strdup_printf("%s/%s", scpi->prefix, vxi->address);
|
||||||
|
|
||||||
|
return SR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int scpi_vxi_source_add(struct sr_session *session, void *priv,
|
static int scpi_vxi_source_add(struct sr_session *session, void *priv,
|
||||||
int events, int timeout, sr_receive_data_callback cb, void *cb_data)
|
int events, int timeout, sr_receive_data_callback cb, void *cb_data)
|
||||||
{
|
{
|
||||||
|
@ -224,6 +234,7 @@ SR_PRIV const struct sr_scpi_dev_inst scpi_vxi_dev = {
|
||||||
.priv_size = sizeof(struct scpi_vxi),
|
.priv_size = sizeof(struct scpi_vxi),
|
||||||
.dev_inst_new = scpi_vxi_dev_inst_new,
|
.dev_inst_new = scpi_vxi_dev_inst_new,
|
||||||
.open = scpi_vxi_open,
|
.open = scpi_vxi_open,
|
||||||
|
.connection_id = scpi_vxi_connection_id,
|
||||||
.source_add = scpi_vxi_source_add,
|
.source_add = scpi_vxi_source_add,
|
||||||
.source_remove = scpi_vxi_source_remove,
|
.source_remove = scpi_vxi_source_remove,
|
||||||
.send = scpi_vxi_send,
|
.send = scpi_vxi_send,
|
||||||
|
|
Loading…
Reference in New Issue