From: Joel Holdsworth Date: Sat, 17 Jan 2015 21:45:04 +0000 (+0000) Subject: Moved pv::prop:bindings classes into pv::bindings namespace X-Git-Tag: pulseview-0.3.0~246 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=61703a0124c7ace84caf415f7d491a3ad6f42599;p=pulseview.git Moved pv::prop:bindings classes into pv::bindings namespace --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 78acee61..c7785928 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -146,6 +146,8 @@ set(pulseview_SOURCES pv/session.cpp pv/storesession.cpp pv/util.cpp + pv/binding/binding.cpp + pv/binding/deviceoptions.cpp pv/data/analog.cpp pv/data/analogsegment.cpp pv/data/logic.cpp @@ -163,8 +165,6 @@ set(pulseview_SOURCES pv/prop/int.cpp pv/prop/property.cpp pv/prop/string.cpp - pv/prop/binding/binding.cpp - pv/prop/binding/deviceoptions.cpp pv/toolbars/mainbar.cpp pv/view/analogsignal.cpp pv/view/cursor.cpp @@ -203,6 +203,7 @@ set(pulseview_HEADERS pv/mainwindow.hpp pv/session.hpp pv/storesession.hpp + pv/binding/deviceoptions.hpp pv/dialogs/about.hpp pv/dialogs/connect.hpp pv/dialogs/storeprogress.hpp @@ -214,7 +215,6 @@ set(pulseview_HEADERS pv/prop/int.hpp pv/prop/property.hpp pv/prop/string.hpp - pv/prop/binding/deviceoptions.hpp pv/toolbars/mainbar.hpp pv/view/cursor.hpp pv/view/flag.hpp @@ -258,12 +258,12 @@ endif() if(ENABLE_DECODE) list(APPEND pulseview_SOURCES + pv/binding/decoderoptions.cpp pv/data/decoderstack.cpp pv/data/decode/annotation.cpp pv/data/decode/decoder.cpp pv/data/decode/row.cpp pv/data/decode/rowdata.cpp - pv/prop/binding/decoderoptions.cpp pv/view/decodetrace.cpp pv/widgets/decodergroupbox.cpp pv/widgets/decodermenu.cpp diff --git a/pv/binding/binding.cpp b/pv/binding/binding.cpp new file mode 100644 index 00000000..fccb96be --- /dev/null +++ b/pv/binding/binding.cpp @@ -0,0 +1,92 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2012 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 + */ + +#include + +#include + +#include + +#include "binding.hpp" + +using std::shared_ptr; + +namespace pv { +namespace binding { + +const std::vector< std::shared_ptr >& Binding::properties() +{ + return properties_; +} + +void Binding::commit() +{ + for (shared_ptr p : properties_) { + assert(p); + p->commit(); + } +} + +void Binding::add_properties_to_form(QFormLayout *layout, + bool auto_commit) const +{ + assert(layout); + + for (shared_ptr p : properties_) + { + assert(p); + + QWidget *const widget = p->get_widget(layout->parentWidget(), + auto_commit); + if (p->labeled_widget()) + layout->addRow(widget); + else + layout->addRow(p->name(), widget); + } +} + +QWidget* Binding::get_property_form(QWidget *parent, + bool auto_commit) const +{ + QWidget *const form = new QWidget(parent); + QFormLayout *const layout = new QFormLayout(form); + form->setLayout(layout); + add_properties_to_form(layout, auto_commit); + return form; +} + +QString Binding::print_gvariant(Glib::VariantBase gvar) +{ + QString s; + + if (!gvar.gobj()) + s = QString::fromStdString("(null)"); + else if (gvar.is_of_type(Glib::VariantType("s"))) + s = QString::fromStdString( + Glib::VariantBase::cast_dynamic>( + gvar).get()); + else + s = QString::fromStdString(gvar.print()); + + return s; +} + +} // binding +} // pv diff --git a/pv/binding/binding.hpp b/pv/binding/binding.hpp new file mode 100644 index 00000000..ae0afb7d --- /dev/null +++ b/pv/binding/binding.hpp @@ -0,0 +1,64 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2012 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 + */ + +#ifndef PULSEVIEW_PV_BINDING_BINDING_H +#define PULSEVIEW_PV_BINDING_BINDING_H + +#include + +#include +#include + +#include + +class QFormLayout; +class QWidget; + +namespace pv { + +namespace prop { +class Property; +} + +namespace binding { + +class Binding +{ +public: + const std::vector< std::shared_ptr >& properties(); + + void commit(); + + void add_properties_to_form(QFormLayout *layout, + bool auto_commit = false) const; + + QWidget* get_property_form(QWidget *parent, + bool auto_commit = false) const; + + static QString print_gvariant(Glib::VariantBase gvar); + +protected: + std::vector< std::shared_ptr > properties_; +}; + +} // binding +} // pv + +#endif // PULSEVIEW_PV_BINDING_BINDING_H diff --git a/pv/binding/decoderoptions.cpp b/pv/binding/decoderoptions.cpp new file mode 100644 index 00000000..fd7d918c --- /dev/null +++ b/pv/binding/decoderoptions.cpp @@ -0,0 +1,151 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2013 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 + */ + +#include + +#include "decoderoptions.hpp" + +#include + +#include +#include +#include +#include +#include +#include + +using boost::none; +using std::make_pair; +using std::map; +using std::pair; +using std::shared_ptr; +using std::string; +using std::vector; + +using pv::prop::Double; +using pv::prop::Enum; +using pv::prop::Int; +using pv::prop::Property; +using pv::prop::String; + +namespace pv { +namespace binding { + +DecoderOptions::DecoderOptions( + shared_ptr decoder_stack, + shared_ptr decoder) : + decoder_stack_(decoder_stack), + decoder_(decoder) +{ + assert(decoder_); + + const srd_decoder *const dec = decoder_->decoder(); + assert(dec); + + for (GSList *l = dec->options; l; l = l->next) + { + const srd_decoder_option *const opt = + (srd_decoder_option*)l->data; + + const QString name = QString::fromUtf8(opt->desc); + + const Property::Getter get = [&, opt]() { + return getter(opt->id); }; + const Property::Setter set = [&, opt](Glib::VariantBase value) { + setter(opt->id, value); }; + + shared_ptr prop; + + if (opt->values) + prop = bind_enum(name, opt, get, set); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("d"))) + prop = shared_ptr(new Double(name, 2, "", + none, none, get, set)); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("x"))) + prop = shared_ptr( + new Int(name, "", none, get, set)); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("s"))) + prop = shared_ptr( + new String(name, get, set)); + else + continue; + + properties_.push_back(prop); + } +} + +shared_ptr DecoderOptions::bind_enum( + const QString &name, const srd_decoder_option *option, + Property::Getter getter, Property::Setter setter) +{ + vector< pair > values; + for (GSList *l = option->values; l; l = l->next) { + Glib::VariantBase var = Glib::VariantBase((GVariant*)l->data, true); + values.push_back(make_pair(var, print_gvariant(var))); + } + + return shared_ptr(new Enum(name, values, getter, setter)); +} + +Glib::VariantBase DecoderOptions::getter(const char *id) +{ + GVariant *val = NULL; + + assert(decoder_); + + // Get the value from the hash table if it is already present + const map& options = decoder_->options(); + const auto iter = options.find(id); + + if (iter != options.end()) + val = (*iter).second; + else + { + assert(decoder_->decoder()); + + // Get the default value if not + for (GSList *l = decoder_->decoder()->options; l; l = l->next) + { + const srd_decoder_option *const opt = + (srd_decoder_option*)l->data; + if (strcmp(opt->id, id) == 0) { + val = opt->def; + break; + } + } + } + + if (val) + return Glib::VariantBase(val, true); + else + return Glib::VariantBase(); +} + +void DecoderOptions::setter(const char *id, Glib::VariantBase value) +{ + assert(decoder_); + decoder_->set_option(id, value.gobj()); + + assert(decoder_stack_); + decoder_stack_->begin_decode(); +} + +} // binding +} // pv diff --git a/pv/binding/decoderoptions.hpp b/pv/binding/decoderoptions.hpp new file mode 100644 index 00000000..a2f7706d --- /dev/null +++ b/pv/binding/decoderoptions.hpp @@ -0,0 +1,64 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2013 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 + */ + +#ifndef PULSEVIEW_PV_BINDING_DECODEROPTIONS_H +#define PULSEVIEW_PV_BINDING_DECODEROPTIONS_H + +#include "binding.hpp" + +#include + +struct srd_decoder_option; + +namespace pv { + +namespace data { +class DecoderStack; +namespace decode { +class Decoder; +} +} + +namespace binding { + +class DecoderOptions : public Binding +{ +public: + DecoderOptions(std::shared_ptr decoder_stack, + std::shared_ptr decoder); + +private: + static std::shared_ptr bind_enum(const QString &name, + const srd_decoder_option *option, + prop::Property::Getter getter, prop::Property::Setter setter); + + Glib::VariantBase getter(const char *id); + + void setter(const char *id, Glib::VariantBase value); + +private: + std::shared_ptr decoder_stack_; + std::shared_ptr decoder_; +}; + +} // binding +} // pv + +#endif // PULSEVIEW_PV_BINDING_DECODEROPTIONS_H diff --git a/pv/binding/deviceoptions.cpp b/pv/binding/deviceoptions.cpp new file mode 100644 index 00000000..8609e211 --- /dev/null +++ b/pv/binding/deviceoptions.cpp @@ -0,0 +1,192 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2012 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 + */ + +#include + +#include + +#include "deviceoptions.hpp" + +#include +#include +#include +#include + +#include + +using boost::optional; +using std::function; +using std::make_pair; +using std::pair; +using std::shared_ptr; +using std::string; +using std::vector; + +using sigrok::Capability; +using sigrok::Configurable; +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; + +namespace pv { +namespace binding { + +DeviceOptions::DeviceOptions(shared_ptr configurable) : + configurable_(configurable) +{ + assert(configurable); + + for (auto entry : configurable->config_keys(ConfigKey::DEVICE_OPTIONS)) { + auto key = entry.first; + auto capabilities = entry.second; + + Glib::VariantContainerBase gvar_list; + + if (!capabilities.count(Capability::GET) || + !capabilities.count(Capability::SET)) + continue; + + if (capabilities.count(Capability::LIST)) + gvar_list = configurable->config_list(key); + + 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 configurable_->config_get(key); }; + const Property::Setter set = [&, key](Glib::VariantBase value) { + configurable_->config_set(key, value); + config_changed(); + }; + + 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); + 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, gvar_list, get, set); + break; + + case SR_CONF_EXTERNAL_CLOCK: + case SR_CONF_RLE: + bind_bool(name, get, set); + break; + + case SR_CONF_TIMEBASE: + bind_enum(name, gvar_list, get, set, print_timebase); + break; + + case SR_CONF_VDIV: + bind_enum(name, gvar_list, get, set, print_vdiv); + break; + + case SR_CONF_VOLTAGE_THRESHOLD: + bind_enum(name, gvar_list, get, set, print_voltage_threshold); + break; + + default: + break; + } + } +} + +void DeviceOptions::bind_bool(const QString &name, + Property::Getter getter, Property::Setter setter) +{ + assert(configurable_); + properties_.push_back(shared_ptr(new Bool( + name, getter, setter))); +} + +void DeviceOptions::bind_enum(const QString &name, + Glib::VariantContainerBase gvar_list, Property::Getter getter, + Property::Setter setter, function printer) +{ + Glib::VariantBase gvar; + vector< pair > values; + + 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, + getter, setter))); +} + +void DeviceOptions::bind_int(const QString &name, QString suffix, + optional< std::pair > range, + Property::Getter getter, Property::Setter setter) +{ + assert(configurable_); + + properties_.push_back(shared_ptr(new Int(name, suffix, range, + getter, setter))); +} + +QString DeviceOptions::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)); +} + +QString DeviceOptions::print_vdiv(Glib::VariantBase gvar) +{ + uint64_t p, q; + g_variant_get(gvar.gobj(), "(tt)", &p, &q); + return QString::fromUtf8(sr_voltage_string(p, q)); +} + +QString DeviceOptions::print_voltage_threshold(Glib::VariantBase gvar) +{ + gdouble 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 +} // pv diff --git a/pv/binding/deviceoptions.hpp b/pv/binding/deviceoptions.hpp new file mode 100644 index 00000000..9e913b06 --- /dev/null +++ b/pv/binding/deviceoptions.hpp @@ -0,0 +1,72 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2012 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 + */ + +#ifndef PULSEVIEW_PV_BINDING_DEVICEOPTIONS_H +#define PULSEVIEW_PV_BINDING_DEVICEOPTIONS_H + +#include + +#include +#include + +#include "binding.hpp" + +#include + +namespace sigrok { + class Configurable; +} + +namespace pv { + +namespace binding { + +class DeviceOptions : public QObject, public Binding +{ + Q_OBJECT + +public: + DeviceOptions(std::shared_ptr configurable); + +Q_SIGNALS: + void config_changed(); + +private: + void bind_bool(const QString &name, + prop::Property::Getter getter, prop::Property::Setter setter); + void bind_enum(const QString &name, Glib::VariantContainerBase gvar_list, + prop::Property::Getter getter, prop::Property::Setter setter, + std::function printer = print_gvariant); + void bind_int(const QString &name, QString suffix, + boost::optional< std::pair > range, + prop::Property::Getter getter, prop::Property::Setter setter); + + static QString print_timebase(Glib::VariantBase gvar); + static QString print_vdiv(Glib::VariantBase gvar); + static QString print_voltage_threshold(Glib::VariantBase gvar); + +protected: + std::shared_ptr configurable_; +}; + +} // binding +} // pv + +#endif // PULSEVIEW_PV_BINDING_DEVICEOPTIONS_H diff --git a/pv/popups/channels.cpp b/pv/popups/channels.cpp index 7dedb317..c00863b0 100644 --- a/pv/popups/channels.cpp +++ b/pv/popups/channels.cpp @@ -27,7 +27,7 @@ #include "channels.hpp" -#include +#include #include #include @@ -151,7 +151,7 @@ void Channels::set_all_channels(bool set) void Channels::populate_group(shared_ptr group, const vector< shared_ptr > sigs) { - using pv::prop::binding::DeviceOptions; + using pv::binding::DeviceOptions; // Only bind options if this is a group. We don't do it for general // options, because these properties are shown in the device config diff --git a/pv/popups/channels.hpp b/pv/popups/channels.hpp index 0ebe333f..61dc9e15 100644 --- a/pv/popups/channels.hpp +++ b/pv/popups/channels.hpp @@ -43,11 +43,9 @@ namespace pv { class Session; -namespace prop { namespace binding { class DeviceOptions; } -} namespace view { class Signal; @@ -87,7 +85,7 @@ private: bool updating_channels_; - std::vector< std::shared_ptr > + std::vector< std::shared_ptr > group_bindings_; std::map< QCheckBox*, std::shared_ptr > check_box_signal_map_; diff --git a/pv/popups/deviceoptions.cpp b/pv/popups/deviceoptions.cpp index 47bb6ca2..06c9705f 100644 --- a/pv/popups/deviceoptions.cpp +++ b/pv/popups/deviceoptions.cpp @@ -45,7 +45,7 @@ DeviceOptions::DeviceOptions(shared_ptr device, QWidget *parent) : layout_.addWidget(binding_.get_property_form(this, true)); } -pv::prop::binding::DeviceOptions& DeviceOptions::binding() +pv::binding::DeviceOptions& DeviceOptions::binding() { return binding_; } diff --git a/pv/popups/deviceoptions.hpp b/pv/popups/deviceoptions.hpp index d43ab607..94ce7afd 100644 --- a/pv/popups/deviceoptions.hpp +++ b/pv/popups/deviceoptions.hpp @@ -24,7 +24,7 @@ #include #include -#include +#include #include namespace sigrok { @@ -42,14 +42,14 @@ public: DeviceOptions(std::shared_ptr device, QWidget *parent); - pv::prop::binding::DeviceOptions& binding(); + pv::binding::DeviceOptions& binding(); private: std::shared_ptr device_; QVBoxLayout layout_; - pv::prop::binding::DeviceOptions binding_; + pv::binding::DeviceOptions binding_; }; } // namespace popups diff --git a/pv/prop/binding/binding.cpp b/pv/prop/binding/binding.cpp deleted file mode 100644 index 062ce667..00000000 --- a/pv/prop/binding/binding.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - * This file is part of the PulseView project. - * - * Copyright (C) 2012 Joel Holdsworth - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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 - */ - -#include - -#include - -#include - -#include "binding.hpp" - -using std::shared_ptr; - -namespace pv { -namespace prop { -namespace binding { - -const std::vector< std::shared_ptr >& Binding::properties() -{ - return properties_; -} - -void Binding::commit() -{ - for (shared_ptr p : properties_) { - assert(p); - p->commit(); - } -} - -void Binding::add_properties_to_form(QFormLayout *layout, - bool auto_commit) const -{ - assert(layout); - - for (shared_ptr p : properties_) - { - assert(p); - - QWidget *const widget = p->get_widget(layout->parentWidget(), - auto_commit); - if (p->labeled_widget()) - layout->addRow(widget); - else - layout->addRow(p->name(), widget); - } -} - -QWidget* Binding::get_property_form(QWidget *parent, - bool auto_commit) const -{ - QWidget *const form = new QWidget(parent); - QFormLayout *const layout = new QFormLayout(form); - form->setLayout(layout); - add_properties_to_form(layout, auto_commit); - return form; -} - -QString Binding::print_gvariant(Glib::VariantBase gvar) -{ - QString s; - - if (!gvar.gobj()) - s = QString::fromStdString("(null)"); - else if (gvar.is_of_type(Glib::VariantType("s"))) - s = QString::fromStdString( - Glib::VariantBase::cast_dynamic>( - gvar).get()); - else - s = QString::fromStdString(gvar.print()); - - return s; -} - -} // binding -} // prop -} // pv diff --git a/pv/prop/binding/binding.hpp b/pv/prop/binding/binding.hpp deleted file mode 100644 index 5e9604f2..00000000 --- a/pv/prop/binding/binding.hpp +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is part of the PulseView project. - * - * Copyright (C) 2012 Joel Holdsworth - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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 - */ - -#ifndef PULSEVIEW_PV_PROP_BINDING_BINDING_H -#define PULSEVIEW_PV_PROP_BINDING_BINDING_H - -#include - -#include -#include - -#include - -class QFormLayout; -class QWidget; - -namespace pv { -namespace prop { - -class Property; - -namespace binding { - -class Binding -{ -public: - const std::vector< std::shared_ptr >& properties(); - - void commit(); - - void add_properties_to_form(QFormLayout *layout, - bool auto_commit = false) const; - - QWidget* get_property_form(QWidget *parent, - bool auto_commit = false) const; - - static QString print_gvariant(Glib::VariantBase gvar); - -protected: - std::vector< std::shared_ptr > properties_; -}; - -} // binding -} // prop -} // pv - -#endif // PULSEVIEW_PV_PROP_BINDING_BINDING_H diff --git a/pv/prop/binding/decoderoptions.cpp b/pv/prop/binding/decoderoptions.cpp deleted file mode 100644 index d9b4b88d..00000000 --- a/pv/prop/binding/decoderoptions.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - * This file is part of the PulseView project. - * - * Copyright (C) 2013 Joel Holdsworth - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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 - */ - -#include - -#include "decoderoptions.hpp" - -#include - -#include -#include -#include -#include -#include -#include - -using boost::none; -using std::make_pair; -using std::map; -using std::pair; -using std::shared_ptr; -using std::string; -using std::vector; - -namespace pv { -namespace prop { -namespace binding { - -DecoderOptions::DecoderOptions( - shared_ptr decoder_stack, - shared_ptr decoder) : - decoder_stack_(decoder_stack), - decoder_(decoder) -{ - assert(decoder_); - - const srd_decoder *const dec = decoder_->decoder(); - assert(dec); - - for (GSList *l = dec->options; l; l = l->next) - { - const srd_decoder_option *const opt = - (srd_decoder_option*)l->data; - - const QString name = QString::fromUtf8(opt->desc); - - const Property::Getter get = [&, opt]() { - return getter(opt->id); }; - const Property::Setter set = [&, opt](Glib::VariantBase value) { - setter(opt->id, value); }; - - shared_ptr prop; - - if (opt->values) - prop = bind_enum(name, opt, get, set); - else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("d"))) - prop = shared_ptr(new Double(name, 2, "", - none, none, get, set)); - else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("x"))) - prop = shared_ptr( - new Int(name, "", none, get, set)); - else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("s"))) - prop = shared_ptr( - new String(name, get, set)); - else - continue; - - properties_.push_back(prop); - } -} - -shared_ptr DecoderOptions::bind_enum( - const QString &name, const srd_decoder_option *option, - Property::Getter getter, Property::Setter setter) -{ - vector< pair > values; - for (GSList *l = option->values; l; l = l->next) { - Glib::VariantBase var = Glib::VariantBase((GVariant*)l->data, true); - values.push_back(make_pair(var, print_gvariant(var))); - } - - return shared_ptr(new Enum(name, values, getter, setter)); -} - -Glib::VariantBase DecoderOptions::getter(const char *id) -{ - GVariant *val = NULL; - - assert(decoder_); - - // Get the value from the hash table if it is already present - const map& options = decoder_->options(); - const auto iter = options.find(id); - - if (iter != options.end()) - val = (*iter).second; - else - { - assert(decoder_->decoder()); - - // Get the default value if not - for (GSList *l = decoder_->decoder()->options; l; l = l->next) - { - const srd_decoder_option *const opt = - (srd_decoder_option*)l->data; - if (strcmp(opt->id, id) == 0) { - val = opt->def; - break; - } - } - } - - if (val) - return Glib::VariantBase(val, true); - else - return Glib::VariantBase(); -} - -void DecoderOptions::setter(const char *id, Glib::VariantBase value) -{ - assert(decoder_); - decoder_->set_option(id, value.gobj()); - - assert(decoder_stack_); - decoder_stack_->begin_decode(); -} - -} // binding -} // prop -} // pv diff --git a/pv/prop/binding/decoderoptions.hpp b/pv/prop/binding/decoderoptions.hpp deleted file mode 100644 index 680bc42f..00000000 --- a/pv/prop/binding/decoderoptions.hpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of the PulseView project. - * - * Copyright (C) 2013 Joel Holdsworth - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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 - */ - -#ifndef PULSEVIEW_PV_PROP_BINDING_DECODEROPTIONS_H -#define PULSEVIEW_PV_PROP_BINDING_DECODEROPTIONS_H - -#include "binding.hpp" - -#include - -struct srd_decoder_option; - -namespace pv { - -namespace data { -class DecoderStack; -namespace decode { -class Decoder; -} -} - -namespace prop { -namespace binding { - -class DecoderOptions : public Binding -{ -public: - DecoderOptions(std::shared_ptr decoder_stack, - std::shared_ptr decoder); - -private: - static std::shared_ptr bind_enum(const QString &name, - const srd_decoder_option *option, - Property::Getter getter, Property::Setter setter); - - Glib::VariantBase getter(const char *id); - - void setter(const char *id, Glib::VariantBase value); - -private: - std::shared_ptr decoder_stack_; - std::shared_ptr decoder_; -}; - -} // binding -} // prop -} // pv - -#endif // PULSEVIEW_PV_PROP_BINDING_DECODEROPTIONS_H diff --git a/pv/prop/binding/deviceoptions.cpp b/pv/prop/binding/deviceoptions.cpp deleted file mode 100644 index 8b38505c..00000000 --- a/pv/prop/binding/deviceoptions.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* - * This file is part of the PulseView project. - * - * Copyright (C) 2012 Joel Holdsworth - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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 - */ - -#include - -#include - -#include "deviceoptions.hpp" - -#include -#include -#include -#include - -#include - -using boost::optional; -using std::function; -using std::make_pair; -using std::pair; -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 configurable) : - configurable_(configurable) -{ - assert(configurable); - - for (auto entry : configurable->config_keys(ConfigKey::DEVICE_OPTIONS)) { - auto key = entry.first; - auto capabilities = entry.second; - - Glib::VariantContainerBase gvar_list; - - if (!capabilities.count(Capability::GET) || - !capabilities.count(Capability::SET)) - continue; - - if (capabilities.count(Capability::LIST)) - gvar_list = configurable->config_list(key); - - 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 configurable_->config_get(key); }; - const Property::Setter set = [&, key](Glib::VariantBase value) { - configurable_->config_set(key, value); - config_changed(); - }; - - 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); - 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, gvar_list, get, set); - break; - - case SR_CONF_EXTERNAL_CLOCK: - case SR_CONF_RLE: - bind_bool(name, get, set); - break; - - case SR_CONF_TIMEBASE: - bind_enum(name, gvar_list, get, set, print_timebase); - break; - - case SR_CONF_VDIV: - bind_enum(name, gvar_list, get, set, print_vdiv); - break; - - case SR_CONF_VOLTAGE_THRESHOLD: - bind_enum(name, gvar_list, get, set, print_voltage_threshold); - break; - - default: - break; - } - } -} - -void DeviceOptions::bind_bool(const QString &name, - Property::Getter getter, Property::Setter setter) -{ - assert(configurable_); - properties_.push_back(shared_ptr(new Bool( - name, getter, setter))); -} - -void DeviceOptions::bind_enum(const QString &name, - Glib::VariantContainerBase gvar_list, Property::Getter getter, - Property::Setter setter, function printer) -{ - Glib::VariantBase gvar; - vector< pair > values; - - 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, - getter, setter))); -} - -void DeviceOptions::bind_int(const QString &name, QString suffix, - optional< std::pair > range, - Property::Getter getter, Property::Setter setter) -{ - assert(configurable_); - - properties_.push_back(shared_ptr(new Int(name, suffix, range, - getter, setter))); -} - -QString DeviceOptions::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)); -} - -QString DeviceOptions::print_vdiv(Glib::VariantBase gvar) -{ - uint64_t p, q; - g_variant_get(gvar.gobj(), "(tt)", &p, &q); - return QString::fromUtf8(sr_voltage_string(p, q)); -} - -QString DeviceOptions::print_voltage_threshold(Glib::VariantBase gvar) -{ - gdouble 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 diff --git a/pv/prop/binding/deviceoptions.hpp b/pv/prop/binding/deviceoptions.hpp deleted file mode 100644 index d027cccb..00000000 --- a/pv/prop/binding/deviceoptions.hpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This file is part of the PulseView project. - * - * Copyright (C) 2012 Joel Holdsworth - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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 - */ - -#ifndef PULSEVIEW_PV_PROP_BINDING_DEVICEOPTIONS_H -#define PULSEVIEW_PV_PROP_BINDING_DEVICEOPTIONS_H - -#include - -#include -#include - -#include "binding.hpp" - -#include - -namespace sigrok { - class Configurable; -} - -namespace pv { - -namespace prop { -namespace binding { - -class DeviceOptions : public QObject, public Binding -{ - Q_OBJECT - -public: - DeviceOptions(std::shared_ptr configurable); - -Q_SIGNALS: - void config_changed(); - -private: - void bind_bool(const QString &name, - Property::Getter getter, Property::Setter setter); - void bind_enum(const QString &name, Glib::VariantContainerBase gvar_list, - Property::Getter getter, Property::Setter setter, - std::function printer = print_gvariant); - void bind_int(const QString &name, QString suffix, - boost::optional< std::pair > range, - Property::Getter getter, Property::Setter setter); - - static QString print_timebase(Glib::VariantBase gvar); - static QString print_vdiv(Glib::VariantBase gvar); - static QString print_voltage_threshold(Glib::VariantBase gvar); - -protected: - std::shared_ptr configurable_; -}; - -} // binding -} // prop -} // pv - -#endif // PULSEVIEW_PV_PROP_BINDING_DEVICEOPTIONS_H diff --git a/pv/view/decodetrace.cpp b/pv/view/decodetrace.cpp index be2dadf1..91ffebe4 100644 --- a/pv/view/decodetrace.cpp +++ b/pv/view/decodetrace.cpp @@ -687,8 +687,8 @@ void DecodeTrace::create_decoder_form(int index, } // Add the options - shared_ptr binding( - new prop::binding::DecoderOptions(decoder_stack_, dec)); + shared_ptr binding( + new binding::DecoderOptions(decoder_stack_, dec)); binding->add_properties_to_form(decoder_form, true); bindings_.push_back(binding); diff --git a/pv/view/decodetrace.hpp b/pv/view/decodetrace.hpp index 968ebf95..863fb35e 100644 --- a/pv/view/decodetrace.hpp +++ b/pv/view/decodetrace.hpp @@ -29,7 +29,7 @@ #include -#include +#include #include struct srd_channel; @@ -191,7 +191,7 @@ private: uint64_t decode_start_, decode_end_; - std::list< std::shared_ptr > + std::list< std::shared_ptr > bindings_; std::list channel_selectors_; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4041d293..61b9c4d5 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -23,6 +23,8 @@ set(pulseview_TEST_SOURCES ${PROJECT_SOURCE_DIR}/pv/session.cpp ${PROJECT_SOURCE_DIR}/pv/storesession.cpp ${PROJECT_SOURCE_DIR}/pv/util.cpp + ${PROJECT_SOURCE_DIR}/pv/binding/binding.cpp + ${PROJECT_SOURCE_DIR}/pv/binding/deviceoptions.cpp ${PROJECT_SOURCE_DIR}/pv/data/analog.cpp ${PROJECT_SOURCE_DIR}/pv/data/analogsegment.cpp ${PROJECT_SOURCE_DIR}/pv/data/logic.cpp @@ -35,8 +37,6 @@ set(pulseview_TEST_SOURCES ${PROJECT_SOURCE_DIR}/pv/prop/int.cpp ${PROJECT_SOURCE_DIR}/pv/prop/property.cpp ${PROJECT_SOURCE_DIR}/pv/prop/string.cpp - ${PROJECT_SOURCE_DIR}/pv/prop/binding/binding.cpp - ${PROJECT_SOURCE_DIR}/pv/prop/binding/deviceoptions.cpp ${PROJECT_SOURCE_DIR}/pv/popups/channels.cpp ${PROJECT_SOURCE_DIR}/pv/view/analogsignal.cpp ${PROJECT_SOURCE_DIR}/pv/view/cursor.cpp @@ -74,6 +74,7 @@ set(pulseview_TEST_SOURCES set(pulseview_TEST_HEADERS ${PROJECT_SOURCE_DIR}/pv/session.hpp ${PROJECT_SOURCE_DIR}/pv/storesession.hpp + ${PROJECT_SOURCE_DIR}/pv/binding/deviceoptions.hpp ${PROJECT_SOURCE_DIR}/pv/popups/channels.hpp ${PROJECT_SOURCE_DIR}/pv/popups/deviceoptions.hpp ${PROJECT_SOURCE_DIR}/pv/prop/bool.hpp @@ -82,7 +83,6 @@ set(pulseview_TEST_HEADERS ${PROJECT_SOURCE_DIR}/pv/prop/int.hpp ${PROJECT_SOURCE_DIR}/pv/prop/property.hpp ${PROJECT_SOURCE_DIR}/pv/prop/string.hpp - ${PROJECT_SOURCE_DIR}/pv/prop/binding/deviceoptions.hpp ${PROJECT_SOURCE_DIR}/pv/view/cursor.hpp ${PROJECT_SOURCE_DIR}/pv/view/flag.hpp ${PROJECT_SOURCE_DIR}/pv/view/header.hpp @@ -109,12 +109,12 @@ set(pulseview_TEST_HEADERS if(ENABLE_DECODE) list(APPEND pulseview_TEST_SOURCES + ${PROJECT_SOURCE_DIR}/pv/binding/decoderoptions.cpp ${PROJECT_SOURCE_DIR}/pv/data/decoderstack.cpp ${PROJECT_SOURCE_DIR}/pv/data/decode/annotation.cpp ${PROJECT_SOURCE_DIR}/pv/data/decode/decoder.cpp ${PROJECT_SOURCE_DIR}/pv/data/decode/row.cpp ${PROJECT_SOURCE_DIR}/pv/data/decode/rowdata.cpp - ${PROJECT_SOURCE_DIR}/pv/prop/binding/decoderoptions.cpp ${PROJECT_SOURCE_DIR}/pv/view/decodetrace.cpp ${PROJECT_SOURCE_DIR}/pv/widgets/decodergroupbox.cpp ${PROJECT_SOURCE_DIR}/pv/widgets/decodermenu.cpp