X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fcommon%2Fscpi.c;h=beb33423934224df8287378a2dad942ccf783162;hb=e22aa87808624c86ec52ea8d57d0a6f35c9e018e;hp=7329b294683b12db4b792976689c0eb7316130e3;hpb=05c644ea081f5973fcbb2429318b808b931edfe3;p=libsigrok.git diff --git a/hardware/common/scpi.c b/hardware/common/scpi.c index 7329b294..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); } @@ -552,6 +600,7 @@ SR_PRIV int sr_scpi_get_hw_id(struct sr_scpi_dev_inst *scpi, { int num_tokens; char *response; + char *newline; gchar **tokens; struct sr_scpi_hw_info *hw_info; @@ -564,6 +613,10 @@ SR_PRIV int sr_scpi_get_hw_id(struct sr_scpi_dev_inst *scpi, sr_info("Got IDN string: '%s'", response); + /* Remove trailing newline if present. */ + if ((newline = g_strrstr(response, "\n"))) + newline[0] = '\0'; + /* * The response to a '*IDN?' is specified by the SCPI spec. It contains * a comma-separated list containing the manufacturer name, instrument