]> sigrok.org Git - libsigrok.git/blobdiff - src/scpi/scpi.c
SCPI: Ignore IDN header in *IDN? response
[libsigrok.git] / src / scpi / scpi.c
index 9ea68b57316db06ad8d324cef67c41016f867227..84335408a70ef77a4ddd09c1f96fa75bf736a6c3 100644 (file)
@@ -337,6 +337,21 @@ SR_PRIV int sr_scpi_read_data(struct sr_scpi_dev_inst *scpi,
        return scpi->read_data(scpi->priv, buf, maxlen);
 }
 
+/**
+ * Send data to SCPI device.
+ *
+ * @param scpi Previously initialised SCPI device structure.
+ * @param buf Buffer with data to send.
+ * @param len Number of bytes to send.
+ *
+ * @return Number of bytes read, or SR_ERR upon failure.
+ */
+SR_PRIV int sr_scpi_write_data(struct sr_scpi_dev_inst *scpi,
+                       char *buf, int maxlen)
+{
+       return scpi->write_data(scpi->priv, buf, maxlen);
+}
+
 /**
  * Check whether a complete SCPI response has been received.
  *
@@ -364,12 +379,14 @@ SR_PRIV int sr_scpi_close(struct sr_scpi_dev_inst *scpi)
 /**
  * Free SCPI device.
  *
- * @param scpi Previously initialized SCPI device structure.
- *
- * @return SR_OK on success, SR_ERR on failure.
+ * @param scpi Previously initialized SCPI device structure. If NULL,
+ *             this function does nothing.
  */
 SR_PRIV void sr_scpi_free(struct sr_scpi_dev_inst *scpi)
 {
+       if (!scpi)
+               return;
+
        scpi->free(scpi->priv);
        g_free(scpi->priv);
        g_free(scpi);
@@ -891,6 +908,7 @@ SR_PRIV int sr_scpi_get_hw_id(struct sr_scpi_dev_inst *scpi,
        char *response;
        gchar **tokens;
        struct sr_scpi_hw_info *hw_info;
+       gchar *idn_substr;
 
        response = NULL;
        tokens = NULL;
@@ -919,7 +937,13 @@ SR_PRIV int sr_scpi_get_hw_id(struct sr_scpi_dev_inst *scpi,
        g_free(response);
 
        hw_info = g_malloc0(sizeof(struct sr_scpi_hw_info));
-       hw_info->manufacturer = g_strstrip(g_strdup(tokens[0]));
+
+       idn_substr = g_strstr_len(tokens[0], -1, "IDN ");
+       if (idn_substr == NULL)
+               hw_info->manufacturer = g_strstrip(g_strdup(tokens[0]));
+       else
+               hw_info->manufacturer = g_strstrip(g_strdup(idn_substr + 4));
+
        hw_info->model = g_strstrip(g_strdup(tokens[1]));
        hw_info->serial_number = g_strstrip(g_strdup(tokens[2]));
        hw_info->firmware_version = g_strstrip(g_strdup(tokens[3]));