]> sigrok.org Git - libsigrok.git/commitdiff
sr: Fix handling of virtual devices.
authorUwe Hermann <redacted>
Sun, 18 Mar 2012 11:57:34 +0000 (12:57 +0100)
committerUwe Hermann <redacted>
Sun, 18 Mar 2012 11:57:34 +0000 (12:57 +0100)
I.e., handling of sessions which use input from files (not from actual
logic analyzer hardware).

device.c
session.c

index 3166ea8e0c087d72431ab7269d80e0308109c2cf..ba29adb526c4e48caa1609c994fc60cee2abadab 100644 (file)
--- a/device.c
+++ b/device.c
@@ -372,13 +372,20 @@ SR_API gboolean sr_dev_has_hwcap(const struct sr_dev *dev, int hwcap)
 {
        int *hwcaps, i;
 
+       sr_spew("dev: %s: requesting hwcap %d", __func__, hwcap);
+
        if (!dev) {
                sr_err("dev: %s: dev was NULL", __func__);
                return FALSE; /* TODO: SR_ERR_ARG. */
        }
 
+       /*
+        * Virtual devices (which have dev->driver set to NULL) always say that
+        * they don't have the capability (they can't call hwcap_get_all()).
+        */
        if (!dev->driver) {
-               sr_err("dev: %s: dev->driver was NULL", __func__);
+               sr_dbg("dev: %s: dev->driver was NULL, this seems to be "
+                      "a virtual device without capabilities", __func__);
                return FALSE; /* TODO: SR_ERR_ARG. */
        }
 
index 8687f4329917846c1b9d155c01f71650ba66d5d1..ffa7e0721f2e726143a29a4dac801dd22bc44f4a 100644 (file)
--- a/session.c
+++ b/session.c
@@ -127,22 +127,27 @@ SR_API int sr_session_dev_add(struct sr_dev *dev)
                return SR_ERR_ARG;
        }
 
+       if (!session) {
+               sr_err("session: %s: session was NULL", __func__);
+               return SR_ERR_BUG;
+       }
+
+       /* If dev->driver is NULL, this is a virtual device. */
        if (!dev->driver) {
-               sr_err("session: %s: dev->driver was NULL", __func__);
-               return SR_ERR_ARG;
+               sr_dbg("session: %s: dev->driver was NULL, this seems to be "
+                      "a virtual device; continuing", __func__);
+               /* Just add the device, don't run dev_open(). */
+               session->devs = g_slist_append(session->devs, dev);
+               return SR_OK;
        }
 
+       /* dev->driver is non-NULL (i.e. we have a real device). */
        if (!dev->driver->dev_open) {
                sr_err("session: %s: dev->driver->dev_open was NULL",
                       __func__);
                return SR_ERR_ARG;
        }
 
-       if (!session) {
-               sr_err("session: %s: session was NULL", __func__);
-               return SR_ERR_BUG;
-       }
-
        if ((ret = dev->driver->dev_open(dev->driver_index)) != SR_OK) {
                sr_err("session: %s: dev_open failed (%d)", __func__, ret);
                return ret;
@@ -438,11 +443,6 @@ SR_PRIV int sr_session_send(struct sr_dev *dev,
                return SR_ERR_ARG;
        }
 
-       if (!dev->driver) {
-               sr_err("session: %s: dev->driver was NULL", __func__);
-               return SR_ERR_ARG;
-       }
-
        if (!packet) {
                sr_err("session: %s: packet was NULL", __func__);
                return SR_ERR_ARG;