X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fdecodesignal.cpp;h=9f81ab42567dd5e58f2cc59a741bb565e58044bd;hp=1cbce00d6be4843802132e961006603d89836061;hb=4e5a4405482a296ebb6014e627298ad156c78d55;hpb=ad50ac1af2b9e8bc0a8c520d80debfd8ad95c904 diff --git a/pv/view/decodesignal.cpp b/pv/view/decodesignal.cpp index 1cbce00d..9f81ab42 100644 --- a/pv/view/decodesignal.cpp +++ b/pv/view/decodesignal.cpp @@ -27,12 +27,16 @@ extern "C" { #include #include +#include +#include +#include #include #include "decodesignal.h" #include #include +#include #include #include @@ -53,8 +57,9 @@ const QColor DecodeSignal::ErrorBgColour = QColor(0xEF, 0x29, 0x29); DecodeSignal::DecodeSignal(pv::SigSession &session, boost::shared_ptr decoder, int index) : - Trace(session, QString(decoder->get_decoder()->name)), - _decoder(decoder) + Trace(session, QString(decoder->decoder()->name)), + _decoder(decoder), + _binding(decoder) { assert(_decoder); @@ -121,6 +126,61 @@ void DecodeSignal::paint_mid(QPainter &p, int left, int right) } } +void DecodeSignal::populate_popup_form(QWidget *parent, QFormLayout *form) +{ + const GSList *probe; + + assert(form); + assert(parent); + assert(_decoder); + + const srd_decoder *const decoder = _decoder->decoder(); + + assert(decoder); + + Trace::populate_popup_form(parent, form); + + form->addRow(new QLabel(tr("

Probes

"), parent)); + + _probe_selector_map.clear(); + + // Add the mandatory probes + for(probe = decoder->probes; probe; probe = probe->next) { + const struct srd_probe *const p = + (struct srd_probe *)probe->data; + QComboBox *const combo = create_probe_selector(parent, p); + connect(combo, SIGNAL(currentIndexChanged(int)), + this, SLOT(on_probe_selected(int))); + form->addRow(tr("%1 (%2) *") + .arg(p->name).arg(p->desc), combo); + + _probe_selector_map[p] = combo; + } + + // Add the optional probes + for(probe = decoder->opt_probes; probe; probe = probe->next) { + const struct srd_probe *const p = + (struct srd_probe *)probe->data; + QComboBox *const combo = create_probe_selector(parent, p); + connect(combo, SIGNAL(currentIndexChanged(int)), + this, SLOT(on_probe_selected(int))); + form->addRow(tr("%1 (%2)") + .arg(p->name).arg(p->desc), combo); + + _probe_selector_map[p] = combo; + } + + form->addRow(new QLabel( + tr("* Required Probes"), parent)); + + // Add the options + if (!_binding.properties().empty()) { + form->addRow(new QLabel(tr("

Options

"), + parent)); + _binding.add_properties_to_form(form, true); + } +} + QMenu* DecodeSignal::create_context_menu(QWidget *parent) { QMenu *const menu = Trace::create_context_menu(parent); @@ -156,6 +216,66 @@ void DecodeSignal::draw_error(QPainter &p, const QString &message, p.drawText(text_rect, message); } +QComboBox* DecodeSignal::create_probe_selector( + QWidget *parent, const srd_probe *const probe) +{ + const vector< shared_ptr > sigs = _session.get_signals(); + + assert(_decoder); + const map >::const_iterator probe_iter = + _decoder->probes().find(probe); + + QComboBox *selector = new QComboBox(parent); + + selector->addItem("-", qVariantFromValue((void*)NULL)); + + if (probe_iter == _decoder->probes().end()) + selector->setCurrentIndex(0); + + for(size_t i = 0; i < sigs.size(); i++) { + const shared_ptr s(sigs[i]); + assert(s); + + if (dynamic_pointer_cast(s) && s->enabled()) + { + selector->addItem(s->get_name(), + qVariantFromValue((void*)s.get())); + if ((*probe_iter).second == s) + selector->setCurrentIndex(i + 1); + } + } + + return selector; +} + +void DecodeSignal::commit_probes() +{ + assert(_decoder); + + map > probe_map; + const vector< shared_ptr > sigs = _session.get_signals(); + + for(map::const_iterator i = + _probe_selector_map.begin(); + i != _probe_selector_map.end(); i++) + { + const QComboBox *const combo = (*i).second; + const LogicSignal *const selection = + (LogicSignal*)combo->itemData(combo->currentIndex()). + value(); + + BOOST_FOREACH(shared_ptr s, sigs) + if(s.get() == selection) { + probe_map[(*i).first] = + dynamic_pointer_cast(s); + break; + } + } + + _decoder->set_probes(probe_map); +} + void DecodeSignal::on_new_decode_data() { if (_view) @@ -172,5 +292,10 @@ void DecodeSignal::on_delete() _session.remove_decode_signal(this); } +void DecodeSignal::on_probe_selected(int) +{ + commit_probes(); +} + } // namespace view } // namespace pv