X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Fclasses.cpp;h=15b94a19575d5274b5eb53baf641245dc82c8efb;hb=36bb818d6f10ac1187f160f4c2ab1169aeb4e86f;hp=49c7558073001e3c872559ced69f75ca8a3d21b7;hpb=8f3168b89bcd79b555d86601270d81e5c8e3bdfe;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index 49c75580..15b94a19 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -406,6 +406,16 @@ string Driver::long_name() const return valid_string(_structure->longname); } +set Driver::scan_options() const +{ + GArray *opts = sr_driver_scan_options(_structure); + set result; + for (guint i = 0; i < opts->len; i++) + result.insert(ConfigKey::get(g_array_index(opts, uint32_t, i))); + g_array_free(opts, TRUE); + return result; +} + vector> Driver::scan( map options) { @@ -466,6 +476,21 @@ Configurable::~Configurable() { } +set Configurable::config_keys() const +{ + GArray *opts; + set result; + + opts = sr_dev_options(config_driver, config_sdi, config_channel_group); + + for (guint i = 0; i < opts->len; i++) + result.insert(ConfigKey::get(g_array_index(opts, uint32_t, i))); + + g_array_free(opts, TRUE); + + return result; +} + Glib::VariantBase Configurable::config_get(const ConfigKey *key) const { GVariant *data; @@ -482,73 +507,36 @@ void Configurable::config_set(const ConfigKey *key, const Glib::VariantBase &val key->id(), const_cast(value.gobj()))); } -Glib::VariantContainerBase Configurable::config_list(const ConfigKey *key) const +set Configurable::config_capabilities(const ConfigKey *key) const { - GVariant *data; - check(sr_config_list( - config_driver, config_sdi, config_channel_group, - key->id(), &data)); - return Glib::VariantContainerBase(data); -} + int caps = sr_dev_config_capabilities(config_sdi, config_channel_group, + key->id()); -map> Configurable::config_keys(const ConfigKey *key) -{ - GVariant *gvar_opts; - gsize num_opts; - const uint32_t *opts; - map> result; + set result; - check(sr_config_list( - config_driver, config_sdi, config_channel_group, - key->id(), &gvar_opts)); - - opts = static_cast(g_variant_get_fixed_array( - gvar_opts, &num_opts, sizeof(uint32_t))); - - for (gsize i = 0; i < num_opts; i++) - { - auto key = ConfigKey::get(opts[i] & SR_CONF_MASK); - set capabilities; - if (opts[i] & SR_CONF_GET) - capabilities.insert(Capability::GET); - if (opts[i] & SR_CONF_SET) - capabilities.insert(Capability::SET); - if (opts[i] & SR_CONF_LIST) - capabilities.insert(Capability::LIST); - result[key] = capabilities; - } - - g_variant_unref(gvar_opts); + for (auto cap: Capability::values()) + if (caps & cap->id()) + result.insert(cap); return result; } bool Configurable::config_check(const ConfigKey *key, - const ConfigKey *index_key) const + const Capability *capability) const { - GVariant *gvar_opts; - gsize num_opts; - const uint32_t *opts; - - if (sr_config_list(config_driver, config_sdi, config_channel_group, - index_key->id(), &gvar_opts) != SR_OK) - return false; - - opts = static_cast(g_variant_get_fixed_array( - gvar_opts, &num_opts, sizeof(uint32_t))); - - for (gsize i = 0; i < num_opts; i++) - { - if ((opts[i] & SR_CONF_MASK) == unsigned(key->id())) - { - g_variant_unref(gvar_opts); - return true; - } - } + int caps = sr_dev_config_capabilities(config_sdi, config_channel_group, + key->id()); - g_variant_unref(gvar_opts); + return (caps & capability->id()); +} - return false; +Glib::VariantContainerBase Configurable::config_list(const ConfigKey *key) const +{ + GVariant *data; + check(sr_config_list( + config_driver, config_sdi, config_channel_group, + key->id(), &data)); + return Glib::VariantContainerBase(data); } Device::Device(struct sr_dev_inst *structure) :