X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fpopups%2Fchannels.cpp;h=fdb97728f59fe080506c81ecd9acbae0039f3d6d;hp=3fb90ae760bac81287b6850353d06809dea01c5e;hb=d13d95b3eaee713cc4eabbc0682ca545b4c31800;hpb=b5d20c6d003d853ad0828d15b365988519e73e88 diff --git a/pv/popups/channels.cpp b/pv/popups/channels.cpp index 3fb90ae7..fdb97728 100644 --- a/pv/popups/channels.cpp +++ b/pv/popups/channels.cpp @@ -19,7 +19,9 @@ #include +#include #include +#include #include #include #include @@ -28,6 +30,8 @@ #include #include +#include +#include #include #include @@ -39,6 +43,8 @@ using std::unordered_set; using std::vector; using pv::data::SignalBase; +using pv::data::Logic; +using pv::data::LogicSegment; using sigrok::Channel; using sigrok::ChannelGroup; @@ -53,6 +59,10 @@ Channels::Channels(Session &session, QWidget *parent) : updating_channels_(false), enable_all_channels_(tr("Enable All"), this), disable_all_channels_(tr("Disable All"), this), + enable_all_logic_channels_(tr("Enable only logic"), this), + enable_all_analog_channels_(tr("Enable only analog"), this), + enable_all_named_channels_(tr("Enable only named"), this), + enable_all_changing_channels_(tr("Enable only changing"), this), check_box_mapper_(this) { // Create the layout @@ -102,17 +112,21 @@ Channels::Channels(Session &session, QWidget *parent) : populate_group(nullptr, global_sigs); // Create the enable/disable all buttons - connect(&enable_all_channels_, SIGNAL(clicked()), - this, SLOT(enable_all_channels())); - connect(&disable_all_channels_, SIGNAL(clicked()), - this, SLOT(disable_all_channels())); - - enable_all_channels_.setFlat(true); - disable_all_channels_.setFlat(true); - - buttons_bar_.addWidget(&enable_all_channels_); - buttons_bar_.addWidget(&disable_all_channels_); - buttons_bar_.addStretch(1); + connect(&enable_all_channels_, SIGNAL(clicked()), this, SLOT(enable_all_channels())); + connect(&disable_all_channels_, SIGNAL(clicked()), this, SLOT(disable_all_channels())); + connect(&enable_all_logic_channels_, SIGNAL(clicked()), this, SLOT(enable_all_logic_channels())); + connect(&enable_all_analog_channels_, SIGNAL(clicked()), this, SLOT(enable_all_analog_channels())); + connect(&enable_all_named_channels_, SIGNAL(clicked()), this, SLOT(enable_all_named_channels())); + connect(&enable_all_changing_channels_, SIGNAL(clicked()), + this, SLOT(enable_all_changing_channels())); + + buttons_bar_.setRowMinimumHeight(0, 2 * QFontMetrics(QApplication::font()).height()); + buttons_bar_.addWidget(&enable_all_channels_, 1, 0); + buttons_bar_.addWidget(&disable_all_channels_, 1, 1); + buttons_bar_.addWidget(&enable_all_logic_channels_, 2, 0); + buttons_bar_.addWidget(&enable_all_analog_channels_, 2, 1); + buttons_bar_.addWidget(&enable_all_named_channels_, 2, 2); + buttons_bar_.addWidget(&enable_all_changing_channels_, 2, 3); layout_.addRow(&buttons_bar_); @@ -137,6 +151,24 @@ void Channels::set_all_channels(bool set) updating_channels_ = false; } +void Channels::set_all_channels_conditionally( + function)> cond_func) +{ + updating_channels_ = true; + + for (auto entry : check_box_signal_map_) { + QCheckBox *cb = entry.first; + const shared_ptr sig = entry.second; + assert(sig); + + const bool state = cond_func(sig); + sig->set_enabled(state); + cb->setChecked(state); + } + + updating_channels_ = false; +} + void Channels::populate_group(shared_ptr group, const vector< shared_ptr > sigs) { @@ -208,7 +240,7 @@ void Channels::showEvent(QShowEvent *event) try { QLabel* label = group_label_map_.at(group); label->setText(QString("

%1

").arg(group->name().c_str())); - } catch (out_of_range) { + } catch (out_of_range&) { // Do nothing } } @@ -257,5 +289,56 @@ void Channels::disable_all_channels() set_all_channels(false); } +void Channels::enable_all_logic_channels() +{ + set_all_channels_conditionally([](const shared_ptr signal) + { return signal->type() == SignalBase::LogicChannel; }); +} + +void Channels::enable_all_analog_channels() +{ + set_all_channels_conditionally([](const shared_ptr signal) + { return signal->type() == SignalBase::AnalogChannel; }); +} + +void Channels::enable_all_named_channels() +{ + set_all_channels_conditionally([](const shared_ptr signal) + { return signal->name() != signal->internal_name(); }); +} + +void Channels::enable_all_changing_channels() +{ + set_all_channels_conditionally([](const shared_ptr signal) + { + // Never enable channels without sample data + if (!signal->has_samples()) + return false; + + // Non-logic channels are considered to always have a signal + if (signal->type() != SignalBase::LogicChannel) + return true; + + const shared_ptr logic = signal->logic_data(); + assert(logic); + + // If any of the segments has edges, enable this channel + for (shared_ptr segment : logic->logic_segments()) { + vector edges; + + segment->get_subsampled_edges(edges, + 0, segment->get_sample_count() - 1, + LogicSegment::MipMapScaleFactor, + signal->index()); + + if (edges.size() > 2) + return true; + } + + // No edges detected in any of the segments + return false; + }); +} + } // namespace popups } // namespace pv