X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fprop%2Fbinding%2Fdeviceoptions.cpp;h=8811b6f3a21f73976a09a207203bd4184ad50ee0;hp=b0feb717a191a7e81d2daa029f6f4687a3c7b0b6;hb=b47e449a777042854f75dc7609e137c52d3bf699;hpb=793f8096c486d0fba871227d9772a510f7496c08 diff --git a/pv/prop/binding/deviceoptions.cpp b/pv/prop/binding/deviceoptions.cpp index b0feb717..8811b6f3 100644 --- a/pv/prop/binding/deviceoptions.cpp +++ b/pv/prop/binding/deviceoptions.cpp @@ -18,249 +18,173 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include #include -#include #include "deviceoptions.h" +#include +#include #include #include +#include -using namespace boost; -using namespace std; +#include + +using boost::optional; +using std::function; +using std::make_pair; +using std::pair; +using std::shared_ptr; +using std::string; +using std::vector; namespace pv { namespace prop { namespace binding { -DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) : - _sdi(sdi) +DeviceOptions::DeviceOptions(shared_ptr dev_inst, + const sr_channel_group *group) : + _dev_inst(dev_inst), + _group(group) { - const int *options; + assert(dev_inst); + + GVariant *gvar_opts; + gsize num_opts; - if ((sr_config_list(sdi->driver, SR_CONF_DEVICE_OPTIONS, - (const void **)&options, sdi) != SR_OK) || !options) + if (!(gvar_opts = dev_inst->list_config(group, SR_CONF_DEVICE_OPTIONS))) /* 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; + 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: - bind_samplerate(info); + // Sample rate values are not bound because they are shown + // in the SamplingBar break; - case SR_CONF_PATTERN_MODE: - bind_stropt(info, SR_CONF_PATTERN_MODE); + case SR_CONF_CAPTURE_RATIO: + bind_int(name, "%", pair(0, 100), + get, set); break; + case SR_CONF_PATTERN_MODE: case SR_CONF_BUFFERSIZE: - bind_buffer_size(info); - break; - - case SR_CONF_TIMEBASE: - bind_time_base(info); + case SR_CONF_TRIGGER_SOURCE: + case SR_CONF_TRIGGER_SLOPE: + case SR_CONF_FILTER: + case SR_CONF_COUPLING: + case SR_CONF_CLOCK_EDGE: + bind_enum(name, key, gvar_list, get, set); break; - case SR_CONF_TRIGGER_SOURCE: - bind_stropt(info, SR_CONF_TRIGGER_SOURCE); + case SR_CONF_EXTERNAL_CLOCK: + case SR_CONF_RLE: + bind_bool(name, get, set); break; - case SR_CONF_FILTER: - bind_stropt(info, SR_CONF_FILTER); + case SR_CONF_TIMEBASE: + bind_enum(name, key, gvar_list, + get, set, print_timebase); break; case SR_CONF_VDIV: - bind_vdiv(info); + bind_enum(name, key, gvar_list, get, set, print_vdiv); break; - case SR_CONF_COUPLING: - bind_stropt(info, SR_CONF_FILTER); + case SR_CONF_VOLTAGE_THRESHOLD: + bind_enum(name, key, gvar_list, + get, set, print_voltage_threshold); break; } - } -} - -void DeviceOptions::expose_enum(const struct sr_config_info *info, - const vector< pair > &values, int key) -{ - _properties.push_back(shared_ptr( - new Enum(QString(info->name), values, - bind(enum_getter, _sdi, key), - bind(sr_config_set, _sdi, key, _1)))); -} - -void DeviceOptions::bind_stropt( - const struct sr_config_info *info, int key) -{ - 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])); - expose_enum(info, values, key); -} - -void DeviceOptions::bind_samplerate(const struct sr_config_info *info) -{ - const struct sr_samplerates *samplerates; - - if (sr_config_list(_sdi->driver, SR_CONF_SAMPLERATE, - (const void **)&samplerates, _sdi) != SR_OK) - return; - - if (samplerates->step) { - _properties.push_back(shared_ptr( - new Double(QString(info->name), - 0, QObject::tr("Hz"), - make_pair((double)samplerates->low, - (double)samplerates->high), - (double)samplerates->step, - bind(samplerate_value_getter, _sdi), - bind(samplerate_value_setter, _sdi, _1)))); - } else { - vector< pair > values; - for (const uint64_t *rate = samplerates->list; - *rate; rate++) - values.push_back(make_pair( - (const void*)rate, - QString(sr_samplerate_string(*rate)))); - - _properties.push_back(shared_ptr( - new Enum(QString(info->name), values, - bind(samplerate_list_getter, _sdi), - bind(samplerate_list_setter, _sdi, _1)))); + if (gvar_list) + g_variant_unref(gvar_list); } + g_variant_unref(gvar_opts); } -void DeviceOptions::bind_buffer_size(const struct sr_config_info *info) +void DeviceOptions::bind_bool(const QString &name, + Property::Getter getter, Property::Setter setter) { - const uint64_t *sizes; - if (sr_config_list(_sdi->driver, SR_CONF_BUFFERSIZE, - (const void **)&sizes, _sdi) != SR_OK) - return; - - vector< pair > values; - for (int i = 0; sizes[i]; i++) - values.push_back(make_pair(sizes + i, - QString("%1").arg(sizes[i]))); - - expose_enum(info, values, SR_CONF_BUFFERSIZE); + assert(_dev_inst); + _properties.push_back(shared_ptr(new Bool( + name, getter, setter))); } -void DeviceOptions::bind_time_base(const struct sr_config_info *info) +void DeviceOptions::bind_enum(const QString &name, int key, + GVariant *const gvar_list, Property::Getter getter, + Property::Setter setter, function printer) { - struct sr_rational *timebases; - if (sr_config_list(_sdi->driver, SR_CONF_TIMEBASE, - (const void **)&timebases, _sdi) != SR_OK) - return; - - 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)))); - - expose_enum(info, values, SR_CONF_TIMEBASE); -} - -void DeviceOptions::bind_vdiv(const struct sr_config_info *info) -{ - struct sr_rational *vdivs; - if (sr_config_list(_sdi->driver, SR_CONF_VDIV, - (const void **)&vdivs, _sdi) != SR_OK) + 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; + } - 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)))); + 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_VDIV); + _properties.push_back(shared_ptr(new Enum(name, values, + getter, setter))); } -const void* DeviceOptions::enum_getter( - const struct sr_dev_inst *sdi, int key) +void DeviceOptions::bind_int(const QString &name, QString suffix, + optional< std::pair > range, + Property::Getter getter, Property::Setter setter) { - 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; -} + assert(_dev_inst); -double DeviceOptions::samplerate_value_getter( - const struct sr_dev_inst *sdi) -{ - uint64_t *samplerate = NULL; - if (sr_config_get(sdi->driver, SR_CONF_SAMPLERATE, - (const void**)&samplerate, sdi) != SR_OK) { - qDebug() << - "WARNING: Failed to get value of sample rate"; - return 0.0; - } - return (double)*samplerate; + _properties.push_back(shared_ptr(new Int(name, suffix, range, + getter, setter))); } -void DeviceOptions::samplerate_value_setter( - struct sr_dev_inst *sdi, double value) +QString DeviceOptions::print_timebase(GVariant *const gvar) { - uint64_t samplerate = value; - if (sr_config_set(sdi, SR_CONF_SAMPLERATE, - &samplerate) != SR_OK) - qDebug() << - "WARNING: Failed to set value of sample rate"; + uint64_t p, q; + g_variant_get(gvar, "(tt)", &p, &q); + return QString::fromUtf8(sr_period_string(p * q)); } -const void* DeviceOptions::samplerate_list_getter( - const struct sr_dev_inst *sdi) +QString DeviceOptions::print_vdiv(GVariant *const gvar) { - const struct sr_samplerates *samplerates; - uint64_t *samplerate = NULL; - - if (sr_config_list(sdi->driver, SR_CONF_SAMPLERATE, - (const void **)&samplerates, sdi) != SR_OK) { - qDebug() << - "WARNING: Failed to get enumerate sample rates"; - return NULL; - } - - if (sr_config_get(sdi->driver, SR_CONF_SAMPLERATE, - (const void**)&samplerate, sdi) != SR_OK || - !samplerate) { - qDebug() << - "WARNING: Failed to get value of sample rate"; - return NULL; - } - - for (const uint64_t *rate = samplerates->list; *rate; rate++) - if (*rate == *samplerate) - return (const void*)rate; - - return NULL; + uint64_t p, q; + g_variant_get(gvar, "(tt)", &p, &q); + return QString::fromUtf8(sr_voltage_string(p, q)); } -void DeviceOptions::samplerate_list_setter( - struct sr_dev_inst *sdi, const void *value) +QString DeviceOptions::print_voltage_threshold(GVariant *const gvar) { - if (sr_config_set(sdi, SR_CONF_SAMPLERATE, - (uint64_t*)value) != SR_OK) - qDebug() << - "WARNING: Failed to set value of sample rate"; + gdouble lo, hi; + g_variant_get(gvar, "(dd)", &lo, &hi); + return QString("L<%1V H>%2V").arg(lo, 0, 'f', 1).arg(hi, 0, 'f', 1); } } // binding