21 #include <libsigrokdecode/libsigrokdecode.h>
25 #include <boost/none_t.hpp>
38 using std::shared_ptr;
52 shared_ptr<pv::data::DecoderStack> decoder_stack,
53 shared_ptr<data::decode::Decoder> decoder) :
54 decoder_stack_(decoder_stack),
59 const srd_decoder *
const dec = decoder_->decoder();
62 for (GSList *l = dec->options; l; l = l->next) {
63 const srd_decoder_option *
const opt =
64 (srd_decoder_option*)l->data;
66 const QString name = QString::fromUtf8(opt->desc);
68 const Property::Getter
get = [&, opt]() {
69 return getter(opt->id); };
70 const Property::Setter set = [&, opt](Glib::VariantBase value) {
71 setter(opt->id, value); };
73 shared_ptr<Property> prop;
76 prop = bind_enum(name, opt,
get, set);
77 else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE(
"d")))
78 prop = shared_ptr<Property>(
new Double(name, 2,
"",
79 none, none,
get, set));
80 else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE(
"x")))
81 prop = shared_ptr<Property>(
82 new Int(name,
"", none,
get, set));
83 else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE(
"s")))
84 prop = shared_ptr<Property>(
85 new String(name,
get, set));
94 const QString &name,
const srd_decoder_option *option,
95 Property::Getter getter, Property::Setter setter)
97 vector< pair<Glib::VariantBase, QString> > values;
98 for (GSList *l = option->values; l; l = l->next) {
99 Glib::VariantBase var = Glib::VariantBase((GVariant*)l->data,
true);
103 return shared_ptr<Property>(
new Enum(name, values, getter, setter));
108 GVariant *val =
nullptr;
113 const map<string, GVariant*>& options =
decoder_->options();
114 const auto iter = options.find(
id);
116 if (iter != options.end())
117 val = (*iter).second;
122 for (GSList *l =
decoder_->decoder()->options; l; l = l->next) {
123 const srd_decoder_option *
const opt =
124 (srd_decoder_option*)l->data;
125 if (strcmp(opt->id,
id) == 0) {
133 return Glib::VariantBase(val,
true);
135 return Glib::VariantBase();
138 void Decoder::setter(
const char *
id, Glib::VariantBase value)
141 decoder_->set_option(
id, value.gobj());
143 assert(decoder_stack_);
144 decoder_stack_->begin_decode();
Glib::VariantBase getter(const char *id)
Decoder(std::shared_ptr< pv::data::DecoderStack > decoder_stack, std::shared_ptr< pv::data::decode::Decoder > decoder)
static std::shared_ptr< prop::Property > bind_enum(const QString &name, const srd_decoder_option *option, prop::Property::Getter getter, prop::Property::Setter setter)
std::shared_ptr< pv::data::decode::Decoder > decoder_
std::vector< std::shared_ptr< prop::Property > > properties_
static QString print_gvariant(Glib::VariantBase gvar)