]> sigrok.org Git - libsigrok.git/commitdiff
Add a configurable read timeout to blocking SCPI reads, default 1s.
authorMartin Ling <redacted>
Sun, 28 Sep 2014 13:30:20 +0000 (14:30 +0100)
committerBert Vermeulen <redacted>
Fri, 3 Oct 2014 11:40:41 +0000 (13:40 +0200)
src/libsigrok-internal.h
src/scpi/scpi.c

index d5b6504aea40478d2102d75ade4ca68a0bb0c209..ccf75598299c55d11b6a3956f33ae1ff27283b06 100644 (file)
@@ -734,6 +734,7 @@ struct sr_scpi_dev_inst {
        int (*read_complete)(void *priv);
        int (*close)(void *priv);
        void (*free)(void *priv);
+       unsigned int read_timeout_ms;
        void *priv;
 };
 
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 */