X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=device.c;h=3f0b60d0d20b5574477a29475297b9c917c6c614;hb=de4d3f99d9e76c5a51916d3bcfef89423055d43f;hp=9cc3b6800691b4debd76555b8b572bb1d20486b7;hpb=5097b0d0912165429aceddb5febbf68467b623f5;p=libsigrok.git diff --git a/device.c b/device.c index 9cc3b680..3f0b60d0 100644 --- a/device.c +++ b/device.c @@ -19,8 +19,8 @@ #include #include -#include "sigrok.h" -#include "sigrok-internal.h" +#include "libsigrok.h" +#include "libsigrok-internal.h" static GSList *devs = NULL; @@ -55,28 +55,26 @@ static GSList *devs = NULL; * TODO: Error checks? * TODO: Option to only scan for specific devices or device classes. * - * @return SR_OK upon success, SR_ERR upon errors. + * @return SR_OK upon success, SR_ERR_BUG upon internal errors. */ SR_API int sr_dev_scan(void) { - GSList *plugins, *l; - struct sr_dev_plugin *plugin; + int i; + struct sr_dev_driver **drivers; - if (!(plugins = sr_hw_list())) { - sr_err("dev: %s: no supported devices/hwplugins", __func__); - return SR_ERR; /* TODO: More specific error? */ + drivers = sr_driver_list(); + if (!drivers[0]) { + sr_err("dev: %s: no supported hardware drivers", __func__); + return SR_ERR_BUG; } /* - * Initialize all plugins first. Since the init() call may involve + * Initialize all drivers first. Since the init() call may involve * a firmware upload and associated delay, we may as well get all * of these out of the way first. */ - for (l = plugins; l; l = l->next) { - plugin = l->data; - /* TODO: Handle 'plugin' being NULL. */ - sr_hw_init(plugin); - } + for (i = 0; drivers[i]; i++) + sr_driver_init(drivers[i]); return SR_OK; } @@ -113,26 +111,26 @@ SR_API GSList *sr_dev_list(void) * It is the caller's responsibility to g_free() the allocated memory when * no longer needed. TODO: Using which API function? * - * @param plugin TODO. - * If 'plugin' is NULL, the created device is a "virtual" one. - * @param plugin_index TODO + * @param driver TODO. + * If 'driver' is NULL, the created device is a "virtual" one. + * @param driver_index TODO * * @return Pointer to the newly allocated device, or NULL upon errors. */ -SR_API struct sr_dev *sr_dev_new(const struct sr_dev_plugin *plugin, - int plugin_index) +SR_API struct sr_dev *sr_dev_new(const struct sr_dev_driver *driver, + int driver_index) { struct sr_dev *dev; - /* TODO: Check if plugin_index valid? */ + /* TODO: Check if driver_index valid? */ if (!(dev = g_try_malloc0(sizeof(struct sr_dev)))) { sr_err("dev: %s: dev malloc failed", __func__); return NULL; } - dev->plugin = (struct sr_dev_plugin *)plugin; - dev->plugin_index = plugin_index; + dev->driver = (struct sr_dev_driver *)driver; + dev->driver_index = driver_index; devs = g_slist_append(devs, dev); return dev; @@ -240,8 +238,6 @@ SR_API struct sr_probe *sr_dev_probe_find(const struct sr_dev *dev, * If the probe already has a different name assigned to it, it will be * removed, and the new name will be saved instead. * - * TODO: Rename to sr_dev_probe_name_set(). - * * @param dev TODO * @param probenum The number of the probe whose name to set. * Note that the probe numbers start at 1 (not 0!). @@ -251,8 +247,8 @@ SR_API struct sr_probe *sr_dev_probe_find(const struct sr_dev *dev, * upon other errors. * If something other than SR_OK is returned, 'dev' is unchanged. */ -SR_API int sr_dev_probe_name(struct sr_dev *dev, int probenum, - const char *name) +SR_API int sr_dev_probe_name_set(struct sr_dev *dev, int probenum, + const char *name) { struct sr_probe *p; @@ -277,6 +273,38 @@ SR_API int sr_dev_probe_name(struct sr_dev *dev, int probenum, return SR_OK; } +/** + * Enable or disable a probe on the specified device. + * + * @param sdi The device instance the probe is connected to. + * @param probenum The probe number, starting from 0. + * @param state TRUE to enable the probe, FALSE to disable. + * + * @return SR_OK on success, or SR_ERR_ARG on invalid arguments. + */ +SR_API int sr_dev_probe_enable(const struct sr_dev_inst *sdi, int probenum, + gboolean state) +{ + GSList *l; + struct sr_probe *probe; + int ret; + + if (!sdi) + return SR_ERR_ARG; + + ret = SR_ERR_ARG; + for (l = sdi->probes; l; l = l->next) { + probe = l->data; + if (probe->index == probenum) { + probe->enabled = state; + ret = SR_OK; + break; + } + } + + return ret; +} + /** * Remove all triggers set up for the specified device. * @@ -287,7 +315,7 @@ SR_API int sr_dev_probe_name(struct sr_dev *dev, int probenum, * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments. * If something other than SR_OK is returned, 'dev' is unchanged. */ -SR_API int sr_dev_trigger_clear(struct sr_dev *dev) +SR_API int sr_dev_trigger_remove_all(struct sr_dev *dev) { struct sr_probe *p; unsigned int pnum; /* TODO: uint16_t? */ @@ -315,56 +343,50 @@ SR_API int sr_dev_trigger_clear(struct sr_dev *dev) } /** - * Add a trigger to the specified device. + * Add a trigger to the specified device (and the specified probe). * - * TODO: Better description. - * TODO: Describe valid format of the 'trigger' string. + * If the specified probe of this device already has a trigger, it will + * be silently replaced. * - * @param dev TODO. Must not be NULL. - * @param probenum The number of the probe. TODO. + * @param sdi Must not be NULL. + * @param probenum The number of the probe. * Note that the probe numbers start at 1 (not 0!). - * @param trigger TODO. - * TODO: Is NULL allowed? + * @param trigger trigger string, in the format used by sigrok-cli * - * @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, 'dev' is unchanged. + * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments. */ -SR_API int sr_dev_trigger_set(struct sr_dev *dev, int probenum, - const char *trigger) +SR_API int sr_dev_trigger_set(const struct sr_dev_inst *sdi, int probenum, + const char *trigger) { - struct sr_probe *p; + GSList *l; + struct sr_probe *probe; + int ret; - if (!dev) { - sr_err("dev: %s: dev was NULL", __func__); + if (!sdi) return SR_ERR_ARG; - } - /* TODO: Sanity check on 'probenum'. */ - - /* TODO: Sanity check on 'trigger'. */ - - p = sr_dev_probe_find(dev, probenum); - if (!p) { - sr_err("dev: %s: probe %d not found", __func__, probenum); - return SR_ERR; /* TODO: More specific error? */ + ret = SR_ERR_ARG; + for (l = sdi->probes; l; l = l->next) { + probe = l->data; + if (probe->index == probenum) { + /* If the probe already has a trigger, kill it first. */ + g_free(probe->trigger); + probe->trigger = g_strdup(trigger); + ret = SR_OK; + break; + } } - /* If the probe already has a trigger, kill it first. */ - g_free(p->trigger); - - p->trigger = g_strdup(trigger); - - return SR_OK; + return ret; } /** * Determine whether the specified device has the specified capability. * - * TODO: Should return int? - * - * @param dev Pointer to the device to be checked. Must not be NULL. - * The device's 'plugin' field must not be NULL either. + * @param dev Pointer to the device instance to be checked. Must not be NULL. + * If the device's 'driver' field is NULL (virtual device), this + * function will always return FALSE (virtual devices don't have + * a hardware capabilities list). * @param hwcap The capability that should be checked (whether it's supported * by the specified device). * @@ -372,36 +394,23 @@ SR_API int sr_dev_trigger_set(struct sr_dev *dev, int probenum, * FALSE is also returned upon invalid input parameters or other * error conditions. */ -SR_API gboolean sr_dev_has_hwcap(const struct sr_dev *dev, int hwcap) +SR_API gboolean sr_dev_has_hwcap(const struct sr_dev_inst *sdi, int hwcap) { - int *hwcaps, i; - - if (!dev) { - sr_err("dev: %s: dev was NULL", __func__); - return FALSE; /* TODO: SR_ERR_ARG. */ - } - - if (!dev->plugin) { - sr_err("dev: %s: dev->plugin was NULL", __func__); - return FALSE; /* TODO: SR_ERR_ARG. */ - } + const int *hwcaps; + int i; - /* TODO: Sanity check on 'hwcap'. */ + if (!sdi || !sdi->driver) + return FALSE; - if (!(hwcaps = dev->plugin->hwcap_get_all())) { - sr_err("dev: %s: dev has no capabilities", __func__); - return FALSE; /* TODO: SR_ERR*. */ - } + if (sdi->driver->info_get(SR_DI_HWCAPS, + (const void **)&hwcaps, NULL) != SR_OK) + return FALSE; for (i = 0; hwcaps[i]; i++) { - if (hwcaps[i] != hwcap) - continue; - sr_spew("dev: %s: found hwcap %d", __func__, hwcap); - return TRUE; + if (hwcaps[i] == hwcap) + return TRUE; } - sr_spew("dev: %s: hwcap %d not found", __func__, hwcap); - return FALSE; } @@ -409,7 +418,7 @@ SR_API gboolean sr_dev_has_hwcap(const struct sr_dev *dev, int hwcap) * Returns information about the given device. * * @param dev Pointer to the device to be checked. Must not be NULL. - * The device's 'plugin' field must not be NULL either. + * The device's 'driver' field must not be NULL either. * @param id The type of information. * @param data The return value. Must not be NULL. * @@ -418,13 +427,13 @@ SR_API gboolean sr_dev_has_hwcap(const struct sr_dev *dev, int hwcap) */ SR_API int sr_dev_info_get(const struct sr_dev *dev, int id, const void **data) { - if ((dev == NULL) || (dev->plugin == NULL)) + if ((dev == NULL) || (dev->driver == NULL)) return SR_ERR_ARG; if (data == NULL) return SR_ERR_ARG; - *data = dev->plugin->dev_info_get(dev->plugin_index, id); + *data = dev->driver->dev_info_get(dev->driver_index, id); if (*data == NULL) return SR_ERR;