X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fprop%2Fbinding%2Fdeviceoptions.cpp;h=c8da5a05f47b392d7d7577dfaf41da3b785d2239;hb=f27ee56d9c2b18158f2a9451b295123288134611;hp=6da16652f2cc0dca814491b46c30e384fa29bc30;hpb=19adbc2c342b190161ec1223377a3619974b91f7;p=pulseview.git diff --git a/pv/prop/binding/deviceoptions.cpp b/pv/prop/binding/deviceoptions.cpp index 6da1665..c8da5a0 100644 --- a/pv/prop/binding/deviceoptions.cpp +++ b/pv/prop/binding/deviceoptions.cpp @@ -18,16 +18,13 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include #include -#include - -#include #include "deviceoptions.h" -#include +#include #include #include #include @@ -35,12 +32,11 @@ #include -using boost::bind; -using boost::function; using boost::optional; -using boost::shared_ptr; +using std::function; using std::make_pair; using std::pair; +using std::shared_ptr; using std::string; using std::vector; @@ -48,20 +44,17 @@ namespace pv { namespace prop { namespace binding { -DeviceOptions::DeviceOptions(shared_ptr dev_inst, - const sr_probe_group *group) : +DeviceOptions::DeviceOptions(shared_ptr dev_inst, + const sr_channel_group *group) : _dev_inst(dev_inst), _group(group) { assert(dev_inst); - sr_dev_inst *const sdi = dev_inst->dev_inst(); - assert(sdi); - GVariant *gvar_opts, *gvar_list; + GVariant *gvar_opts; gsize num_opts; - if ((sr_config_list(sdi->driver, sdi, group, SR_CONF_DEVICE_OPTIONS, - &gvar_opts) != SR_OK)) + if (!(gvar_opts = dev_inst->list_config(group, SR_CONF_DEVICE_OPTIONS))) /* Driver supports no device instance options. */ return; @@ -69,19 +62,21 @@ DeviceOptions::DeviceOptions(shared_ptr dev_inst, 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]); + sr_config_info_get(options[i] & SR_CONF_MASK); if (!info) continue; const int key = info->key; - - if (sr_config_list(sdi->driver, sdi, group, - key, &gvar_list) != SR_OK) - gvar_list = NULL; + GVariant *const gvar_list = dev_inst->list_config(group, key); const QString name = QString::fromUtf8(info->name); + 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); }; + switch(key) { case SR_CONF_SAMPLERATE: @@ -90,7 +85,8 @@ DeviceOptions::DeviceOptions(shared_ptr dev_inst, break; case SR_CONF_CAPTURE_RATIO: - bind_int(name, key, "%", pair(0, 100)); + bind_int(name, "%", pair(0, 100), + get, set); break; case SR_CONF_PATTERN_MODE: @@ -100,24 +96,26 @@ 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); + bind_enum(name, key, gvar_list, get, set); break; case SR_CONF_EXTERNAL_CLOCK: case SR_CONF_RLE: - bind_bool(name, key); + bind_bool(name, get, set); break; case SR_CONF_TIMEBASE: - bind_enum(name, key, gvar_list, print_timebase); + bind_enum(name, key, gvar_list, + get, set, print_timebase); break; case SR_CONF_VDIV: - bind_enum(name, key, gvar_list, print_vdiv); + bind_enum(name, key, gvar_list, get, set, print_vdiv); break; case SR_CONF_VOLTAGE_THRESHOLD: - bind_enum(name, key, gvar_list, print_voltage_threshold); + bind_enum(name, key, gvar_list, + get, set, print_voltage_threshold); break; } @@ -127,84 +125,45 @@ DeviceOptions::DeviceOptions(shared_ptr dev_inst, g_variant_unref(gvar_opts); } -GVariant* DeviceOptions::config_getter( - const sr_dev_inst *sdi, const sr_probe_group *group, int key) +void DeviceOptions::bind_bool(const QString &name, + Property::Getter getter, Property::Setter setter) { - GVariant *data = NULL; - if (sr_config_get(sdi->driver, sdi, group, key, &data) != SR_OK) { - qDebug() << - "WARNING: Failed to get value of config id" << key; - return NULL; - } - return data; -} - -void DeviceOptions::config_setter( - const struct sr_dev_inst *sdi, const sr_probe_group *group, int key, - GVariant* value) -{ - if (sr_config_set(sdi, group, key, value) != SR_OK) - qDebug() << "WARNING: Failed to set value of sample rate"; -} - -void DeviceOptions::bind_bool(const QString &name, int key) -{ - sr_dev_inst *const sdi = _dev_inst->dev_inst(); - assert(sdi); - - _properties.push_back(shared_ptr( - new Bool(name, bind(config_getter, sdi, _group, key), - bind(config_setter, sdi, _group, key, _1)))); + assert(_dev_inst); + _properties.push_back(shared_ptr(new Bool( + name, getter, setter))); } void DeviceOptions::bind_enum(const QString &name, int key, - GVariant *const gvar_list, function printer) + GVariant *const gvar_list, Property::Getter getter, + Property::Setter setter, function printer) { GVariant *gvar; GVariantIter iter; vector< pair > values; - assert(gvar_list); - - sr_dev_inst *const sdi = _dev_inst->dev_inst(); - assert(sdi); + assert(_dev_inst); + if (!gvar_list) { + qDebug() << "Config key " << key << " was listed, but no " + "options were given"; + return; + } g_variant_iter_init (&iter, gvar_list); while ((gvar = g_variant_iter_next_value (&iter))) values.push_back(make_pair(gvar, printer(gvar))); - _properties.push_back(shared_ptr( - new Enum(name, values, - bind(config_getter, sdi, _group, key), - bind(config_setter, sdi, _group, key, _1)))); + _properties.push_back(shared_ptr(new Enum(name, values, + getter, setter))); } -void DeviceOptions::bind_int(const QString &name, int key, QString suffix, - optional< std::pair > range) +void DeviceOptions::bind_int(const QString &name, QString suffix, + optional< std::pair > range, + Property::Getter getter, Property::Setter setter) { - sr_dev_inst *const sdi = _dev_inst->dev_inst(); - assert(sdi); - - _properties.push_back(shared_ptr( - new Int(name, suffix, range, - bind(config_getter, sdi, _group, key), - bind(config_setter, sdi, _group, key, _1)))); -} - -QString DeviceOptions::print_gvariant(GVariant *const gvar) -{ - QString s; - - if (g_variant_is_of_type(gvar, G_VARIANT_TYPE("s"))) - s = QString::fromUtf8(g_variant_get_string(gvar, NULL)); - else - { - gchar *const text = g_variant_print(gvar, FALSE); - s = QString::fromUtf8(text); - g_free(text); - } + assert(_dev_inst); - return s; + _properties.push_back(shared_ptr(new Int(name, suffix, range, + getter, setter))); } QString DeviceOptions::print_timebase(GVariant *const gvar) @@ -224,10 +183,8 @@ QString DeviceOptions::print_vdiv(GVariant *const gvar) QString DeviceOptions::print_voltage_threshold(GVariant *const gvar) { gdouble lo, hi; - char buf[64]; g_variant_get(gvar, "(dd)", &lo, &hi); - snprintf(buf, sizeof(buf), "L<%.1fV H>%.1fV", lo, hi); - return QString::fromUtf8(buf); + return QString("L<%1V H>%2V").arg(lo, 0, 'f', 1).arg(hi, 0, 'f', 1); } } // binding