X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fprop%2Fbinding%2Fdeviceoptions.cpp;h=c995ea697c01e6980adaefd9c0efa0676b36d35d;hp=8811b6f3a21f73976a09a207203bd4184ad50ee0;hb=7c65709437184b09753d1bcacc02467b8f6171f1;hpb=b47e449a777042854f75dc7609e137c52d3bf699 diff --git a/pv/prop/binding/deviceoptions.cpp b/pv/prop/binding/deviceoptions.cpp index 8811b6f3..c995ea69 100644 --- a/pv/prop/binding/deviceoptions.cpp +++ b/pv/prop/binding/deviceoptions.cpp @@ -22,15 +22,14 @@ #include -#include "deviceoptions.h" +#include "deviceoptions.hpp" -#include -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include using boost::optional; using std::function; @@ -40,48 +39,54 @@ using std::shared_ptr; using std::string; using std::vector; +using sigrok::Capability; +using sigrok::Configurable; +using sigrok::ConfigKey; +using sigrok::Error; + namespace pv { namespace prop { namespace binding { -DeviceOptions::DeviceOptions(shared_ptr dev_inst, - const sr_channel_group *group) : - _dev_inst(dev_inst), - _group(group) +DeviceOptions::DeviceOptions(shared_ptr configurable) : + configurable_(configurable) { - assert(dev_inst); - - GVariant *gvar_opts; - gsize num_opts; + assert(configurable); - if (!(gvar_opts = dev_inst->list_config(group, SR_CONF_DEVICE_OPTIONS))) - /* Driver supports no device instance options. */ - return; + for (auto entry : configurable->config_keys(ConfigKey::DEVICE_OPTIONS)) { + auto key = entry.first; + auto capabilities = entry.second; - const int *const options = (const int32_t *)g_variant_get_fixed_array( - gvar_opts, &num_opts, sizeof(int32_t)); - for (unsigned int i = 0; i < num_opts; i++) { - const struct sr_config_info *const info = - sr_config_info_get(options[i]); + Glib::VariantContainerBase gvar_list; - if (!info) + if (!capabilities.count(Capability::GET) || + !capabilities.count(Capability::SET)) continue; - const int key = info->key; - GVariant *const gvar_list = dev_inst->list_config(group, key); + if (capabilities.count(Capability::LIST)) + gvar_list = configurable->config_list(key); - const QString name = QString::fromUtf8(info->name); + string name_str; + try { + name_str = key->description(); + } catch (Error e) { + name_str = key->name(); + } + + const QString name = QString::fromStdString(name_str); const Property::Getter get = [&, key]() { - return _dev_inst->get_config(_group, key); }; - const Property::Setter set = [&, key](GVariant *value) { - _dev_inst->set_config(_group, key, value); }; + return configurable_->config_get(key); }; + const Property::Setter set = [&, key](Glib::VariantBase value) { + configurable_->config_set(key, value); + config_changed(); + }; - switch(key) + switch (key->id()) { case SR_CONF_SAMPLERATE: // Sample rate values are not bound because they are shown - // in the SamplingBar + // in the MainBar break; case SR_CONF_CAPTURE_RATIO: @@ -96,7 +101,7 @@ DeviceOptions::DeviceOptions(shared_ptr dev_inst, case SR_CONF_FILTER: case SR_CONF_COUPLING: case SR_CONF_CLOCK_EDGE: - bind_enum(name, key, gvar_list, get, set); + bind_enum(name, gvar_list, get, set); break; case SR_CONF_EXTERNAL_CLOCK: @@ -105,54 +110,45 @@ DeviceOptions::DeviceOptions(shared_ptr dev_inst, break; case SR_CONF_TIMEBASE: - bind_enum(name, key, gvar_list, - get, set, print_timebase); + bind_enum(name, gvar_list, get, set, print_timebase); break; case SR_CONF_VDIV: - bind_enum(name, key, gvar_list, get, set, print_vdiv); + bind_enum(name, gvar_list, get, set, print_vdiv); break; case SR_CONF_VOLTAGE_THRESHOLD: - bind_enum(name, key, gvar_list, - get, set, print_voltage_threshold); + bind_enum(name, gvar_list, get, set, print_voltage_threshold); break; - } - if (gvar_list) - g_variant_unref(gvar_list); + default: + break; + } } - g_variant_unref(gvar_opts); } void DeviceOptions::bind_bool(const QString &name, Property::Getter getter, Property::Setter setter) { - assert(_dev_inst); - _properties.push_back(shared_ptr(new Bool( + assert(configurable_); + properties_.push_back(shared_ptr(new Bool( name, getter, setter))); } -void DeviceOptions::bind_enum(const QString &name, int key, - GVariant *const gvar_list, Property::Getter getter, - Property::Setter setter, function printer) +void DeviceOptions::bind_enum(const QString &name, + Glib::VariantContainerBase gvar_list, Property::Getter getter, + Property::Setter setter, function printer) { - GVariant *gvar; - GVariantIter iter; - vector< pair > values; - - assert(_dev_inst); - if (!gvar_list) { - qDebug() << "Config key " << key << " was listed, but no " - "options were given"; - return; - } + Glib::VariantBase gvar; + vector< pair > values; - g_variant_iter_init (&iter, gvar_list); - while ((gvar = g_variant_iter_next_value (&iter))) + assert(configurable_); + + Glib::VariantIter iter(gvar_list); + while ((iter.next_value(gvar))) values.push_back(make_pair(gvar, printer(gvar))); - _properties.push_back(shared_ptr(new Enum(name, values, + properties_.push_back(shared_ptr(new Enum(name, values, getter, setter))); } @@ -160,34 +156,33 @@ void DeviceOptions::bind_int(const QString &name, QString suffix, optional< std::pair > range, Property::Getter getter, Property::Setter setter) { - assert(_dev_inst); + assert(configurable_); - _properties.push_back(shared_ptr(new Int(name, suffix, range, + properties_.push_back(shared_ptr(new Int(name, suffix, range, getter, setter))); } -QString DeviceOptions::print_timebase(GVariant *const gvar) +QString DeviceOptions::print_timebase(Glib::VariantBase gvar) { uint64_t p, q; - g_variant_get(gvar, "(tt)", &p, &q); + g_variant_get(gvar.gobj(), "(tt)", &p, &q); return QString::fromUtf8(sr_period_string(p * q)); } -QString DeviceOptions::print_vdiv(GVariant *const gvar) +QString DeviceOptions::print_vdiv(Glib::VariantBase gvar) { uint64_t p, q; - g_variant_get(gvar, "(tt)", &p, &q); + g_variant_get(gvar.gobj(), "(tt)", &p, &q); return QString::fromUtf8(sr_voltage_string(p, q)); } -QString DeviceOptions::print_voltage_threshold(GVariant *const gvar) +QString DeviceOptions::print_voltage_threshold(Glib::VariantBase gvar) { gdouble lo, hi; - g_variant_get(gvar, "(dd)", &lo, &hi); + g_variant_get(gvar.gobj(), "(dd)", &lo, &hi); return QString("L<%1V H>%2V").arg(lo, 0, 'f', 1).arg(hi, 0, 'f', 1); } } // binding } // prop } // pv -