]> sigrok.org Git - libsigrok.git/blobdiff - device.c
Make more variables/functions static and non-global.
[libsigrok.git] / device.c
index 815e8066d549dc19b829aab78892b03a53150202..5596c173b99c7b5d8356698fc549b627c761b875 100644 (file)
--- a/device.c
+++ b/device.c
@@ -22,9 +22,7 @@
 #include <sigrok.h>
 #include <sigrok-internal.h>
 
-extern struct sr_global *global;
-
-GSList *devices = NULL;
+static GSList *devices = NULL;
 
 /**
  * Scan the system for attached logic analyzers / devices.
@@ -54,18 +52,19 @@ GSList *devices = NULL;
  * After the system has been scanned for devices, the list of detected (and
  * supported) devices can be acquired via sr_device_list().
  *
- * TODO: Should return int.
  * TODO: Error checks?
  * TODO: Option to only scan for specific devices or device classes.
+ *
+ * @return SR_OK upon success, SR_ERR upon errors.
  */
-void sr_device_scan(void)
+int sr_device_scan(void)
 {
        GSList *plugins, *l;
        struct sr_device_plugin *plugin;
 
        if (!(plugins = sr_list_hwplugins())) {
                sr_err("dev: %s: no supported devices/hwplugins", __func__);
-               return; /* TODO? */
+               return SR_ERR; /* TODO: More specific error? */
        }
 
        /*
@@ -78,6 +77,8 @@ void sr_device_scan(void)
                /* TODO: Handle 'plugin' being NULL. */
                sr_init_hwplugins(plugin);
        }
+
+       return SR_OK;
 }
 
 /**
@@ -101,7 +102,6 @@ GSList *sr_device_list(void)
 /**
  * Create a new device.
  *
- * TODO: 'plugin' can be const.
  * TODO: num_probes should be uint16_t.
  * TODO: Should return int, so that we can return SR_OK, SR_ERR_* etc.
  *
@@ -116,8 +116,8 @@ GSList *sr_device_list(void)
  *
  * @return Pointer to the newly allocated device, or NULL upon errors.
  */
-struct sr_device *sr_device_new(struct sr_device_plugin *plugin, int plugin_index,
-                               int num_probes)
+struct sr_device *sr_device_new(const struct sr_device_plugin *plugin,
+                               int plugin_index, int num_probes)
 {
        struct sr_device *device;
        int i;
@@ -136,7 +136,7 @@ struct sr_device *sr_device_new(struct sr_device_plugin *plugin, int plugin_inde
                return NULL;
        }
 
-       device->plugin = plugin;
+       device->plugin = (struct sr_device_plugin *)plugin;
        device->plugin_index = plugin_index;
        devices = g_slist_append(devices, device);
 
@@ -155,20 +155,22 @@ struct sr_device *sr_device_new(struct sr_device_plugin *plugin, int plugin_inde
  * The order in which the probes are cleared is not specified. The caller
  * should not assume or rely on a specific order.
  *
- * TODO: Should return int.
  * TODO: Rename to sr_device_clear_probes() or sr_device_probe_clear_all().
  *
  * @param device The device whose probes to clear. Must not be NULL.
  *               Note: device->probes is allowed to be NULL (in that case,
  *               there are no probes, thus none have to be cleared).
+ *
+ * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments.
+ *         If something other than SR_OK is returned, 'device' is unchanged.
  */
-void sr_device_clear(struct sr_device *device)
+int sr_device_clear(struct sr_device *device)
 {
        unsigned int pnum;
 
        if (!device) {
                sr_err("dev: %s: device was NULL", __func__);
-               return; /* TODO: SR_ERR_ARG. */
+               return SR_ERR_ARG;
        }
 
        /* Note: device->probes can be NULL, this is handled correctly. */
@@ -176,7 +178,7 @@ void sr_device_clear(struct sr_device *device)
        for (pnum = 1; pnum <= g_slist_length(device->probes); pnum++)
                sr_device_probe_clear(device, pnum);
 
-       /* TODO: return SR_OK; */
+       return SR_OK;
 }
 
 /**
@@ -185,27 +187,29 @@ void sr_device_clear(struct sr_device *device)
  * The probe itself still exists afterwards, but its 'name' and 'trigger'
  * fields are g_free()'d and set to NULL.
  *
- * TODO: Should return int.
- *
  * @param device The device in which the specified (to be cleared) probe
  *               resides. Must not be NULL.
  * @param probenum The number of the probe to clear.
  *                 Note that the probe numbers start at 1 (not 0!).
+ *
+ * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments, or SR_ERR
+ *         upon other errors.
+ *         If something other than SR_OK is returned, 'device' is unchanged.
  */
-void sr_device_probe_clear(struct sr_device *device, int probenum)
+int sr_device_probe_clear(struct sr_device *device, int probenum)
 {
        struct sr_probe *p;
 
        if (!device) {
                sr_err("dev: %s: device was NULL", __func__);
-               return; /* TODO: SR_ERR_ARG. */
+               return SR_ERR_ARG;
        }
 
        /* TODO: Sanity check on 'probenum'. */
 
        if (!(p = sr_device_probe_find(device, probenum))) {
                sr_err("dev: %s: probe %d not found", __func__, probenum);
-               return; /* TODO: SR_ERR*. */
+               return SR_ERR; /* TODO: More specific error? */
        }
 
        /* If the probe has a name, remove it. */
@@ -220,7 +224,7 @@ void sr_device_probe_clear(struct sr_device *device, int probenum)
                p->trigger = NULL;
        }
 
-       /* TODO: return SR_OK; */
+       return SR_OK;
 }
 
 /**
@@ -231,7 +235,6 @@ void sr_device_probe_clear(struct sr_device *device, int probenum)
  * The 'trigger' field of the added probe is set to NULL. A trigger can be
  * added via sr_device_trigger_set().
  *
- * TODO: Should return int.
  * TODO: Are duplicate names allowed?
  * TODO: Do we enforce a maximum probe number for a device?
  * TODO: Error if the max. probe number for the specific LA is reached, e.g.
@@ -246,7 +249,7 @@ void sr_device_probe_clear(struct sr_device *device, int probenum)
  *         or SR_ERR_ARG upon invalid arguments.
  *         If something other than SR_OK is returned, 'device' is unchanged.
  */
-void sr_device_probe_add(struct sr_device *device, const char *name)
+int sr_device_probe_add(struct sr_device *device, const char *name)
 {
        struct sr_probe *p;
        char probename[16]; /* FIXME: Don't hardcode 16? #define? */
@@ -254,12 +257,12 @@ void sr_device_probe_add(struct sr_device *device, const char *name)
 
        if (!device) {
                sr_err("dev: %s: device was NULL", __func__);
-               return; /* SR_ERR_ARG; */
+               return SR_ERR_ARG;
        }
 
        if (!name) {
                sr_err("dev: %s: name was NULL", __func__);
-               return; /* SR_ERR_ARG; */
+               return SR_ERR_ARG;
        }
 
        /* TODO: Further checks to ensure name is valid. */
@@ -268,7 +271,7 @@ void sr_device_probe_add(struct sr_device *device, const char *name)
 
        if (!(p = g_try_malloc0(sizeof(struct sr_probe)))) {
                sr_err("dev: %s: p malloc failed", __func__);
-               return; /* SR_ERR_MALLOC; */
+               return SR_ERR_MALLOC;
        }
 
        p->index = probenum;
@@ -295,13 +298,13 @@ void sr_device_probe_add(struct sr_device *device, const char *name)
  *                 Note that the probe numbers start at 1 (not 0!).
  *
  * TODO: Should return int.
- * TODO: device can be const.
  * TODO: probenum should be unsigned.
  *
  * @return A pointer to the requested probe's 'struct sr_probe', or NULL
  *         if the probe could not be found.
  */
-struct sr_probe *sr_device_probe_find(struct sr_device *device, int probenum)
+struct sr_probe *sr_device_probe_find(const struct sr_device *device,
+                                     int probenum)
 {
        GSList *l;
        struct sr_probe *p, *found_probe;
@@ -332,29 +335,31 @@ struct sr_probe *sr_device_probe_find(struct sr_device *device, int probenum)
  * If the probe already has a different name assigned to it, it will be
  * removed, and the new name will be saved instead.
  *
- * TODO: Should return int.
- * TODO: device can be const?
  * TODO: Rename to sr_device_set_probe_name().
  *
  * @param device TODO
  * @param probenum The number of the probe whose name to set.
  *                 Note that the probe numbers start at 1 (not 0!).
  * @param name The new name that the specified probe should get.
+ *
+ * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments, or SR_ERR
+ *         upon other errors.
+ *         If something other than SR_OK is returned, 'device' is unchanged.
  */
-void sr_device_probe_name(struct sr_device *device, int probenum,
-                         const char *name)
+int sr_device_probe_name(struct sr_device *device, int probenum,
+                        const char *name)
 {
        struct sr_probe *p;
 
        if (!device) {
                sr_err("dev: %s: device was NULL", __func__);
-               return; /* TODO: SR_ERR_ARG */
+               return SR_ERR_ARG;
        }
 
        p = sr_device_probe_find(device, probenum);
        if (!p) {
                sr_err("dev: %s: probe %d not found", __func__, probenum);
-               return; /* TODO: SR_ERR*. */
+               return SR_ERR; /* TODO: More specific error? */
        }
 
        /* TODO: Sanity check on 'name'. */
@@ -364,6 +369,8 @@ void sr_device_probe_name(struct sr_device *device, int probenum,
                g_free(p->name);
 
        p->name = g_strdup(name);
+
+       return SR_OK;
 }
 
 /**
@@ -371,24 +378,24 @@ void sr_device_probe_name(struct sr_device *device, int probenum,
  *
  * TODO: Better description.
  *
- * TODO: Should return int.
- * TODO: device can be const?
- *
  * @param device TODO
+ *
+ * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments.
+ *         If something other than SR_OK is returned, 'device' is unchanged.
  */
-void sr_device_trigger_clear(struct sr_device *device)
+int sr_device_trigger_clear(struct sr_device *device)
 {
        struct sr_probe *p;
-       unsigned int pnum; /* TODO: uint6_t? */
+       unsigned int pnum; /* TODO: uint16_t? */
 
        if (!device) {
                sr_err("dev: %s: device was NULL", __func__);
-               return; /* TODO: SR_ERR_ARG */
+               return SR_ERR_ARG;
        }
 
        if (!device->probes) {
                sr_err("dev: %s: device->probes was NULL", __func__);
-               return; /* TODO: SR_ERR*. */
+               return SR_ERR_ARG;
        }
 
        for (pnum = 1; pnum <= g_slist_length(device->probes); pnum++) {
@@ -399,6 +406,8 @@ void sr_device_trigger_clear(struct sr_device *device)
                        p->trigger = NULL;
                }
        }
+
+       return SR_OK;
 }
 
 /**
@@ -407,23 +416,24 @@ void sr_device_trigger_clear(struct sr_device *device)
  * TODO: Better description.
  * TODO: Describe valid format of the 'trigger' string.
  *
- * TODO: Should return int.
- * TODO: device can be const?
- *
  * @param device TODO. Must not be NULL.
  * @param probenum The number of the probe. TODO.
  *                 Note that the probe numbers start at 1 (not 0!).
  * @param trigger TODO.
  *                TODO: Is NULL allowed?
+ *
+ * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments, or SR_ERR
+ *         upon other errors.
+ *         If something other than SR_OK is returned, 'device' is unchanged.
  */
-void sr_device_trigger_set(struct sr_device *device, int probenum,
-                          const char *trigger)
+int sr_device_trigger_set(struct sr_device *device, int probenum,
+                         const char *trigger)
 {
        struct sr_probe *p;
 
        if (!device) {
                sr_err("dev: %s: device was NULL", __func__);
-               return; /* TODO: SR_ERR_ARG */
+               return SR_ERR_ARG;
        }
 
        /* TODO: Sanity check on 'probenum'. */
@@ -433,7 +443,7 @@ void sr_device_trigger_set(struct sr_device *device, int probenum,
        p = sr_device_probe_find(device, probenum);
        if (!p) {
                sr_err("dev: %s: probe %d not found", __func__, probenum);
-               return; /* TODO: SR_ERR*. */
+               return SR_ERR; /* TODO: More specific error? */
        }
 
        /* If the probe already has a trigger, kill it first. */
@@ -441,13 +451,14 @@ void sr_device_trigger_set(struct sr_device *device, int probenum,
                g_free(p->trigger);
 
        p->trigger = g_strdup(trigger);
+
+       return SR_OK;
 }
 
 /**
  * Determine whether the specified device has the specified capability.
  *
  * TODO: Should return int?
- * TODO: device can be const.
  *
  * @param device Pointer to the device to be checked. Must not be NULL.
  *               The device's 'plugin' field must not be NULL either.
@@ -458,7 +469,7 @@ void sr_device_trigger_set(struct sr_device *device, int probenum,
  *         FALSE is also returned upon invalid input parameters or other
  *         error conditions.
  */
-gboolean sr_device_has_hwcap(struct sr_device *device, int hwcap)
+gboolean sr_device_has_hwcap(const struct sr_device *device, int hwcap)
 {
        int *capabilities, i;