X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fprop%2Fbinding%2Fdeviceoptions.cpp;h=e8ae002bae8ba0c0339b2da1fb5f9861d71fb5c3;hp=bc367673ed44330e8b89e0e32ae7b495d95dd3bc;hb=117ef0090a0c285369ce48bcc7e01d92faa9f329;hpb=d71bca8b719331690455e3b3aa8aeeba350c9d3a diff --git a/pv/prop/binding/deviceoptions.cpp b/pv/prop/binding/deviceoptions.cpp index bc367673..e8ae002b 100644 --- a/pv/prop/binding/deviceoptions.cpp +++ b/pv/prop/binding/deviceoptions.cpp @@ -21,10 +21,16 @@ #include #include +#include + +#include #include "deviceoptions.h" +#include +#include #include +#include using namespace boost; using namespace std; @@ -36,133 +42,165 @@ namespace binding { DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) : _sdi(sdi) { - const int *options; + assert(sdi); + + GVariant *gvar_opts, *gvar_list; + gsize num_opts; - if ((sr_config_list(sdi->driver, SR_CONF_DEVICE_OPTIONS, - (const void **)&options, sdi) != SR_OK) || !options) + if ((sr_config_list(sdi->driver, sdi, NULL, SR_CONF_DEVICE_OPTIONS, + &gvar_opts) != SR_OK)) /* Driver supports no device instance options. */ return; - for (int cap = 0; options[cap]; cap++) { + 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[cap]); + sr_config_info_get(options[i]); if (!info) continue; - switch(info->key) + const int key = info->key; + + if (sr_config_list(_sdi->driver, _sdi, NULL, key, &gvar_list) != SR_OK) + gvar_list = NULL; + + const QString name(info->name); + + switch(key) { - case SR_CONF_PATTERN_MODE: - bind_stropt(info, SR_CONF_PATTERN_MODE); + case SR_CONF_SAMPLERATE: + // Sample rate values are not bound because they are shown + // in the SamplingBar break; - case SR_CONF_BUFFERSIZE: - bind_buffer_size(info); + case SR_CONF_CAPTURE_RATIO: + bind_int(name, key, "%", pair(0, 100)); break; - case SR_CONF_TIMEBASE: - bind_time_base(info); + case SR_CONF_PATTERN_MODE: + case SR_CONF_BUFFERSIZE: + case SR_CONF_TRIGGER_SOURCE: + case SR_CONF_FILTER: + case SR_CONF_COUPLING: + bind_enum(name, key, gvar_list); break; - case SR_CONF_TRIGGER_SOURCE: - bind_stropt(info, SR_CONF_TRIGGER_SOURCE); + case SR_CONF_RLE: + bind_bool(name, key); break; - case SR_CONF_FILTER: - bind_stropt(info, SR_CONF_FILTER); + case SR_CONF_TIMEBASE: + bind_enum(name, key, gvar_list, print_timebase); break; case SR_CONF_VDIV: - bind_vdiv(info); + bind_enum(name, key, gvar_list, print_vdiv); break; - case SR_CONF_COUPLING: - bind_stropt(info, SR_CONF_FILTER); + case SR_CONF_VOLTAGE_THRESHOLD: + bind_enum(name, key, gvar_list, print_voltage_threshold); break; } + + if (gvar_list) + g_variant_unref(gvar_list); } + g_variant_unref(gvar_opts); } -void DeviceOptions::expose_enum(const struct sr_config_info *info, - const vector< pair > &values, int key) +GVariant* DeviceOptions::config_getter( + const struct sr_dev_inst *sdi, int key) { - _properties.push_back(shared_ptr( - new Enum(QString(info->name), values, - bind(getter, _sdi, key), - bind(sr_config_set, _sdi, key, _1)))); + GVariant *data = NULL; + if (sr_config_get(sdi->driver, sdi, NULL, key, &data) != SR_OK) { + qDebug() << + "WARNING: Failed to get value of config id" << key; + return NULL; + } + return data; } -void DeviceOptions::bind_stropt( - const struct sr_config_info *info, int key) +void DeviceOptions::config_setter( + const struct sr_dev_inst *sdi, int key, GVariant* value) { - const char **stropts; - if (sr_config_list(_sdi->driver, key, - (const void **)&stropts, _sdi) != SR_OK) - return; - - vector< pair > values; - for (int i = 0; stropts[i]; i++) - values.push_back(make_pair(stropts[i], stropts[i])); + if (sr_config_set(sdi, NULL, key, value) != SR_OK) + qDebug() << "WARNING: Failed to set value of sample rate"; +} - expose_enum(info, values, key); +void DeviceOptions::bind_bool(const QString &name, int key) +{ + _properties.push_back(shared_ptr( + new Bool(name, bind(config_getter, _sdi, key), + bind(config_setter, _sdi, key, _1)))); } -void DeviceOptions::bind_buffer_size(const struct sr_config_info *info) +void DeviceOptions::bind_enum(const QString &name, int key, + GVariant *const gvar_list, function printer) { - const uint64_t *sizes; - if (sr_config_list(_sdi->driver, SR_CONF_BUFFERSIZE, - (const void **)&sizes, _sdi) != SR_OK) - return; + GVariant *gvar; + GVariantIter iter; + vector< pair > values; + + assert(gvar_list); - vector< pair > values; - for (int i = 0; sizes[i]; i++) - values.push_back(make_pair(sizes + i, - QString("%1").arg(sizes[i]))); + g_variant_iter_init (&iter, gvar_list); + while ((gvar = g_variant_iter_next_value (&iter))) + values.push_back(make_pair(gvar, printer(gvar))); - expose_enum(info, values, SR_CONF_BUFFERSIZE); + _properties.push_back(shared_ptr( + new Enum(name, values, + bind(config_getter, _sdi, key), + bind(config_setter, _sdi, key, _1)))); } -void DeviceOptions::bind_time_base(const struct sr_config_info *info) +void DeviceOptions::bind_int(const QString &name, int key, QString suffix, + optional< std::pair > range) { - struct sr_rational *timebases; - if (sr_config_list(_sdi->driver, SR_CONF_TIMEBASE, - (const void **)&timebases, _sdi) != SR_OK) - return; + _properties.push_back(shared_ptr( + new Int(name, suffix, range, + bind(config_getter, _sdi, key), + bind(config_setter, _sdi, key, _1)))); +} - vector< pair > values; - for (int i = 0; timebases[i].p && timebases[i].q; i++) - values.push_back(make_pair(timebases + i, - QString(sr_period_string( - timebases[i].p * timebases[i].q)))); +QString DeviceOptions::print_gvariant(GVariant *const gvar) +{ + QString s; + + if (g_variant_is_of_type(gvar, G_VARIANT_TYPE("s"))) + s = QString(g_variant_get_string(gvar, NULL)); + else + { + gchar *const text = g_variant_print(gvar, FALSE); + s = QString(text); + g_free(text); + } - expose_enum(info, values, SR_CONF_TIMEBASE); + return s; } -void DeviceOptions::bind_vdiv(const struct sr_config_info *info) +QString DeviceOptions::print_timebase(GVariant *const gvar) { - struct sr_rational *vdivs; - if (sr_config_list(_sdi->driver, SR_CONF_VDIV, - (const void **)&vdivs, _sdi) != SR_OK) - return; - - vector< pair > values; - for (int i = 0; vdivs[i].p && vdivs[i].q; i++) - values.push_back(make_pair(vdivs + i, - QString(sr_voltage_string(vdivs + i)))); + uint64_t p, q; + g_variant_get(gvar, "(tt)", &p, &q); + return QString(sr_period_string(p * q)); +} - expose_enum(info, values, SR_CONF_VDIV); +QString DeviceOptions::print_vdiv(GVariant *const gvar) +{ + uint64_t p, q; + g_variant_get(gvar, "(tt)", &p, &q); + return QString(sr_voltage_string(p, q)); } -const void* DeviceOptions::enum_getter( - const struct sr_dev_inst *sdi, int key) +QString DeviceOptions::print_voltage_threshold(GVariant *const gvar) { - const void *data = NULL; - if(sr_config_get(sdi->driver, key, &data, sdi) != SR_OK) { - qDebug() << - "WARNING: Failed to get value of config id" << key; - return NULL; - } - return data; + 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(buf); } } // binding