X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fdevice.c;h=27508a45f4b6c94a77796a0430e40a2a21fd55e1;hb=71e9c54dab31384224b566c705d6084253f08bdd;hp=dd34f79600dd4fe81797fad4b4b9a8cc3db46196;hpb=9c24d16a1d01a01f88f254fbd5f5e413e796f3cf;p=libsigrok.git diff --git a/src/device.c b/src/device.c index dd34f796..27508a45 100644 --- a/src/device.c +++ b/src/device.c @@ -17,9 +17,9 @@ * along with this program. If not, see . */ +#include #include #include -#include "config.h" /* Needed for HAVE_LIBUSB_1_0 and others. */ #include #include "libsigrok-internal.h" @@ -196,6 +196,52 @@ SR_API gboolean sr_dev_has_option(const struct sr_dev_inst *sdi, int key) return ret; } +/** + * Enumerate the configuration capabilities supported by a device instance + * for a given configuration key. + * + * @param sdi 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 cg Pointer to a channel group, if a specific channel group is to + * be checked. Must be NULL to check device-wide options. + * @param[in] key The option that should be checked for is supported by the + * specified device. + * + * @retval A bitmask of enum sr_configcap values, which will be zero for + * invalid inputs or if the key is unsupported. + * + * @since 0.4.0 + */ +SR_API int sr_dev_config_capabilities(const struct sr_dev_inst *sdi, + const struct sr_channel_group *cg, const int key) +{ + GVariant *gvar; + const int *devopts; + gsize num_opts, i; + int ret; + + if (!sdi || !sdi->driver || !sdi->driver->config_list) + return 0; + + if (sdi->driver->config_list(SR_CONF_DEVICE_OPTIONS, + &gvar, sdi, cg) != SR_OK) + return 0; + + ret = 0; + devopts = g_variant_get_fixed_array(gvar, &num_opts, sizeof(int32_t)); + for (i = 0; i < num_opts; i++) { + if ((devopts[i] & SR_CONF_MASK) == key) { + ret = devopts[i] & ~SR_CONF_MASK; + break; + } + } + g_variant_unref(gvar); + + return ret; +} + /** * Allocate and init a new user-generated device instance. * @@ -261,6 +307,9 @@ SR_PRIV void sr_dev_inst_free(struct sr_dev_inst *sdi) } g_slist_free(sdi->channel_groups); + if (sdi->session) + sr_session_dev_remove(sdi->session, sdi); + g_free(sdi->vendor); g_free(sdi->model); g_free(sdi->version); @@ -541,11 +590,10 @@ SR_API const char *sr_dev_inst_connid_get(const struct sr_dev_inst *sdi) { #ifdef HAVE_LIBUSB_1_0 struct drv_context *drvc; - int r, cnt, i, a, b; + int cnt, i, a, b; char connection_id[64]; struct sr_usb_dev_inst *usb; struct libusb_device **devlist; - struct libusb_device_descriptor des; #endif if (!sdi) @@ -576,12 +624,6 @@ SR_API const char *sr_dev_inst_connid_get(const struct sr_dev_inst *sdi) } for (i = 0; i < cnt; i++) { - if ((r = libusb_get_device_descriptor(devlist[i], &des)) < 0) { - sr_err("Failed to get device descriptor: %s.", - libusb_error_name(r)); - continue; - } - /* Find the USB device by the logical address we know. */ b = libusb_get_bus_number(devlist[i]); a = libusb_get_device_address(devlist[i]);