X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fbinding%2Fdevice.cpp;h=7bbc1bbf52839618a3e5905a82bf29fb1794689c;hp=6f9788932c8dd0d4377d98771cee69ad6b6760e3;hb=d1b479f74c9d1eb61b56cc4980d7328ec50216df;hpb=1e1b3a668e6f3462d45c2047484dc1b86f41da51 diff --git a/pv/binding/device.cpp b/pv/binding/device.cpp index 6f978893..7bbc1bbf 100644 --- a/pv/binding/device.cpp +++ b/pv/binding/device.cpp @@ -14,27 +14,26 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * along with this program; if not, see . */ -#include +#include #include #include "device.hpp" #include -#include #include #include #include using boost::optional; + using std::function; -using std::make_pair; using std::pair; +using std::set; using std::shared_ptr; using std::string; using std::vector; @@ -45,7 +44,6 @@ using sigrok::ConfigKey; using sigrok::Error; using pv::prop::Bool; -using pv::prop::Double; using pv::prop::Enum; using pv::prop::Int; using pv::prop::Property; @@ -56,30 +54,33 @@ namespace binding { Device::Device(shared_ptr configurable) : configurable_(configurable) { - std::map< const ConfigKey*, std::set > keys; - - try { - keys = configurable->config_keys(ConfigKey::DEVICE_OPTIONS); - } catch (const Error) { - return; - } - for (auto entry : keys) { - auto key = entry.first; - auto capabilities = entry.second; + auto keys = configurable->config_keys(); - if (!capabilities.count(Capability::GET) || - !capabilities.count(Capability::SET)) - continue; + for (auto key : keys) { - string name_str; + string descr_str; try { - name_str = key->description(); - } catch (Error e) { - name_str = key->name(); + descr_str = key->description(); + } catch (Error& e) { + descr_str = key->name(); } + const QString descr = QString::fromStdString(descr_str); + + auto capabilities = configurable->config_capabilities(key); - const QString name = QString::fromStdString(name_str); + if (!capabilities.count(Capability::GET) || + !capabilities.count(Capability::SET)) { + + // Ignore common read-only keys + if ((key->id() == SR_CONF_CONTINUOUS) || (key->id() == SR_CONF_TRIGGER_MATCH) || + (key->id() == SR_CONF_CONN) || (key->id() == SR_CONF_SERIALCOMM)) + continue; + + qDebug() << QString(tr("Note for device developers: Ignoring device configuration capability '%1' " \ + "as it is missing GET and/or SET")).arg(descr); + continue; + } const Property::Getter get = [&, key]() { return configurable_->config_get(key); }; @@ -88,48 +89,65 @@ Device::Device(shared_ptr configurable) : config_changed(); }; - switch (key->id()) - { + switch (key->id()) { case SR_CONF_SAMPLERATE: // Sample rate values are not bound because they are shown // in the MainBar break; case SR_CONF_CAPTURE_RATIO: - bind_int(name, "%", pair(0, 100), - get, set); + bind_int(descr, "", "%", pair(0, 100), get, set); + break; + + case SR_CONF_LIMIT_FRAMES: + // Value 0 means that there is no limit + bind_int(descr, "", "", pair(0, 1000000), get, set, + tr("No Limit")); break; case SR_CONF_PATTERN_MODE: case SR_CONF_BUFFERSIZE: 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, capabilities, get, set); + case SR_CONF_DATA_SOURCE: + case SR_CONF_EXTERNAL_CLOCK_SOURCE: + bind_enum(descr, "", key, capabilities, get, set); break; + case SR_CONF_FILTER: case SR_CONF_EXTERNAL_CLOCK: case SR_CONF_RLE: case SR_CONF_POWER_OFF: - bind_bool(name, get, set); + case SR_CONF_AVERAGING: + bind_bool(descr, "", get, set); break; case SR_CONF_TIMEBASE: - bind_enum(name, key, capabilities, get, set, print_timebase); + bind_enum(descr, "", key, capabilities, get, set, print_timebase); break; case SR_CONF_VDIV: - bind_enum(name, key, capabilities, get, set, print_vdiv); + bind_enum(descr, "", key, capabilities, get, set, print_vdiv); break; case SR_CONF_VOLTAGE_THRESHOLD: - bind_enum(name, key, capabilities, get, set, print_voltage_threshold); + bind_enum(descr, "", key, capabilities, get, set, print_voltage_threshold); break; case SR_CONF_PROBE_FACTOR: - bind_int(name, "", pair(1, 500), get, set); + if (capabilities.count(Capability::LIST)) + bind_enum(descr, "", key, capabilities, get, set, print_probe_factor); + else + bind_int(descr, "", "", pair(1, 500), get, set); + break; + + case SR_CONF_AVG_SAMPLES: + if (capabilities.count(Capability::LIST)) + bind_enum(descr, "", key, capabilities, get, set, print_averages); + else + bind_int(descr, "", "", pair(0, INT32_MAX), get, set); break; default: @@ -138,50 +156,56 @@ Device::Device(shared_ptr configurable) : } } -void Device::bind_bool(const QString &name, +void Device::bind_bool(const QString &name, const QString &desc, Property::Getter getter, Property::Setter setter) { assert(configurable_); properties_.push_back(shared_ptr(new Bool( - name, getter, setter))); + name, desc, getter, setter))); } -void Device::bind_enum(const QString &name, - const ConfigKey *key, std::set capabilities, +void Device::bind_enum(const QString &name, const QString &desc, + const ConfigKey *key, set capabilities, Property::Getter getter, Property::Setter setter, function printer) { - Glib::VariantBase gvar; - vector< pair > values; - assert(configurable_); if (!capabilities.count(Capability::LIST)) return; - Glib::VariantIter iter(configurable_->config_list(key)); - while ((iter.next_value(gvar))) - values.push_back(make_pair(gvar, printer(gvar))); + try { + Glib::VariantContainerBase gvar = configurable_->config_list(key); + Glib::VariantIter iter(gvar); + + vector< pair > values; + while ((iter.next_value(gvar))) + values.emplace_back(gvar, printer(gvar)); - properties_.push_back(shared_ptr(new Enum(name, values, - getter, setter))); + properties_.push_back(shared_ptr(new Enum(name, desc, values, + getter, setter))); + + } catch (sigrok::Error& e) { + qDebug() << "Error: Listing device key" << name << "failed!"; + return; + } } -void Device::bind_int(const QString &name, QString suffix, - optional< std::pair > range, - Property::Getter getter, Property::Setter setter) +void Device::bind_int(const QString &name, const QString &desc, QString suffix, + optional< pair > range, Property::Getter getter, + Property::Setter setter, QString special_value_text) { assert(configurable_); - properties_.push_back(shared_ptr(new Int(name, suffix, range, - getter, setter))); + properties_.push_back(shared_ptr(new Int(name, desc, suffix, + range, getter, setter, special_value_text))); } QString Device::print_timebase(Glib::VariantBase gvar) { uint64_t p, q; g_variant_get(gvar.gobj(), "(tt)", &p, &q); - return QString::fromUtf8(sr_period_string(p * q)); + return QString::fromUtf8(sr_period_string(p, q)); } QString Device::print_vdiv(Glib::VariantBase gvar) @@ -198,5 +222,19 @@ QString Device::print_voltage_threshold(Glib::VariantBase gvar) return QString("L<%1V H>%2V").arg(lo, 0, 'f', 1).arg(hi, 0, 'f', 1); } -} // binding -} // pv +QString Device::print_probe_factor(Glib::VariantBase gvar) +{ + uint64_t factor; + factor = g_variant_get_uint64(gvar.gobj()); + return QString("%1x").arg(factor); +} + +QString Device::print_averages(Glib::VariantBase gvar) +{ + uint64_t avg; + avg = g_variant_get_uint64(gvar.gobj()); + return QString("%1").arg(avg); +} + +} // namespace binding +} // namespace pv