]> sigrok.org Git - libsigrok.git/blobdiff - src/scpi/scpi.c
Add a configurable read timeout to blocking SCPI reads, default 1s.
[libsigrok.git] / src / scpi / scpi.c
index fbb57472b3301bb4510a622e6295d04bc0438b58..645062152622682d77c095de1d90da496caa3be3 100644 (file)
@@ -183,6 +183,7 @@ SR_PRIV struct sr_scpi_dev_inst *scpi_dev_inst_new(struct drv_context *drvc,
                        scpi = g_malloc(sizeof(*scpi));
                        *scpi = *scpi_dev;
                        scpi->priv = g_malloc0(scpi->priv_size);
+                       scpi->read_timeout_ms = 1000;
                        params = g_strsplit(resource, "/", 0);
                        if (scpi->dev_inst_new(scpi->priv, drvc, resource,
                                               params, serialcomm) != SR_OK) {
@@ -380,6 +381,8 @@ SR_PRIV int sr_scpi_get_string(struct sr_scpi_dev_inst *scpi,
        char buf[256];
        int len;
        GString *response;
+       gint64 start;
+       unsigned int elapsed_ms;
 
        if (command)
                if (sr_scpi_send(scpi, command) != SR_OK)
@@ -388,6 +391,8 @@ SR_PRIV int sr_scpi_get_string(struct sr_scpi_dev_inst *scpi,
        if (sr_scpi_read_begin(scpi) != SR_OK)
                return SR_ERR;
 
+       start = g_get_monotonic_time();
+
        response = g_string_new("");
 
        *scpi_response = NULL;
@@ -399,6 +404,13 @@ SR_PRIV int sr_scpi_get_string(struct sr_scpi_dev_inst *scpi,
                        return SR_ERR;
                }
                g_string_append_len(response, buf, len);
+               elapsed_ms = (g_get_monotonic_time() - start) / 1000;
+               if (elapsed_ms >= scpi->read_timeout_ms)
+               {
+                       sr_err("Timed out waiting for SCPI response.");
+                       g_string_free(response, TRUE);
+                       return SR_ERR;
+               }
        }
 
        /* Get rid of trailing linefeed if present */