X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fcommon%2Fscpi.c;h=beb33423934224df8287378a2dad942ccf783162;hb=e22aa87808624c86ec52ea8d57d0a6f35c9e018e;hp=b2eb4ced958e37fda5f475cd6557cafed4a962e3;hpb=bc7b7eb196b7e3f15bed857ee8b3533c0d899b3f;p=libsigrok.git diff --git a/hardware/common/scpi.c b/hardware/common/scpi.c index b2eb4ced..beb33423 100644 --- a/hardware/common/scpi.c +++ b/hardware/common/scpi.c @@ -65,6 +65,53 @@ static int parse_strict_bool(const char *str, gboolean *ret) return SR_ERR; } +SR_PRIV extern const struct sr_scpi_dev_inst scpi_serial_dev; +SR_PRIV extern const struct sr_scpi_dev_inst scpi_tcp_raw_dev; +SR_PRIV extern const struct sr_scpi_dev_inst scpi_tcp_rigol_dev; +SR_PRIV extern const struct sr_scpi_dev_inst scpi_usbtmc_dev; +SR_PRIV extern const struct sr_scpi_dev_inst scpi_vxi_dev; + +static const struct sr_scpi_dev_inst *scpi_devs[] = { + &scpi_tcp_raw_dev, + &scpi_tcp_rigol_dev, + &scpi_usbtmc_dev, +#ifdef HAVE_RPC + &scpi_vxi_dev, +#endif +#ifdef HAVE_LIBSERIALPORT + &scpi_serial_dev, /* must be last as it matches any resource */ +#endif +}; + +SR_PRIV struct sr_scpi_dev_inst *scpi_dev_inst_new(const char *resource, + const char *serialcomm) +{ + struct sr_scpi_dev_inst *scpi = NULL; + const struct sr_scpi_dev_inst *scpi_dev; + gchar **params; + unsigned i; + + for (i = 0; i < ARRAY_SIZE(scpi_devs); i++) { + scpi_dev = scpi_devs[i]; + if (!strncmp(resource, scpi_dev->prefix, strlen(scpi_dev->prefix))) { + sr_dbg("Opening %s device %s.", scpi_dev->name, resource); + scpi = g_malloc(sizeof(*scpi)); + *scpi = *scpi_dev; + scpi->priv = g_malloc0(scpi->priv_size); + params = g_strsplit(resource, "/", 0); + if (scpi->dev_inst_new(scpi->priv, resource, + params, serialcomm) != SR_OK) { + sr_scpi_free(scpi); + scpi = NULL; + } + g_strfreev(params); + break; + } + } + + return scpi; +} + /** * Open SCPI device. * @@ -225,6 +272,7 @@ SR_PRIV int sr_scpi_close(struct sr_scpi_dev_inst *scpi) SR_PRIV void sr_scpi_free(struct sr_scpi_dev_inst *scpi) { scpi->free(scpi->priv); + g_free(scpi->priv); g_free(scpi); }