X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fsession.cpp;h=9ec8bd07264036e85c052c05695749f4bccf797b;hp=85b6c0b4968795666cb422e2919afb892eb58fe8;hb=554af71bf515d2763ca13c3829dbeb2064cc4c83;hpb=f9a0fd83226d97af7458d8c9dac0b88c83a54d29 diff --git a/pv/session.cpp b/pv/session.cpp index 85b6c0b4..9ec8bd07 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -105,6 +105,7 @@ using Gst::ElementFactory; using Gst::Pipeline; #endif +using pv::data::SignalGroup; using pv::util::Timestamp; using pv::views::trace::Signal; using pv::views::trace::AnalogSignal; @@ -131,6 +132,11 @@ Session::~Session() // Stop and join to the thread stop_capture(); + + for (SignalGroup* group : signal_groups_) { + group->clear(); + delete group; + } } DeviceManager& Session::device_manager() @@ -509,8 +515,16 @@ void Session::set_device(shared_ptr device) #endif view->reset_view_state(); } + + for (SignalGroup* group : signal_groups_) { + group->clear(); + delete group; + } + signal_groups_.clear(); + for (const shared_ptr& d : all_signal_data_) d->clear(); + all_signal_data_.clear(); signalbases_.clear(); cur_logic_segment_.reset(); @@ -885,17 +899,6 @@ void Session::remove_generated_signal(shared_ptr signal) update_signals(); } -bool Session::all_segments_complete(uint32_t segment_id) const -{ - bool all_complete = true; - - for (const shared_ptr& base : signalbases_) - if (!base->segment_is_complete(segment_id)) - all_complete = false; - - return all_complete; -} - #ifdef ENABLE_DECODE shared_ptr Session::add_decode_signal() { @@ -936,6 +939,17 @@ void Session::remove_decode_signal(shared_ptr signal) } #endif +bool Session::all_segments_complete(uint32_t segment_id) const +{ + bool all_complete = true; + + for (const shared_ptr& base : signalbases_) + if (!base->segment_is_complete(segment_id)) + all_complete = false; + + return all_complete; +} + MetadataObjManager* Session::metadata_obj_manager() { return &metadata_obj_manager_; @@ -1028,7 +1042,7 @@ void Session::update_signals() signalbase->set_data(logic_data_); connect(this, SIGNAL(capture_state_changed(int)), - signalbase.get(), SLOT(on_capture_state_changed(int))); + signalbase.get(), SLOT(on_capture_state_changed(int))); break; case SR_CHANNEL_ANALOG: @@ -1040,12 +1054,34 @@ void Session::update_signals() signalbase->set_data(data); connect(this, SIGNAL(capture_state_changed(int)), - signalbase.get(), SLOT(on_capture_state_changed(int))); + signalbase.get(), SLOT(on_capture_state_changed(int))); break; } } } + // Create and assign default signal groups if needed + if (signal_groups_.empty()) { + for (auto& entry : sr_dev->channel_groups()) { + const shared_ptr& group = entry.second; + + if (group->channels().size() <= 1) + continue; + + SignalGroup* sg = new SignalGroup(QString::fromStdString(entry.first)); + for (const shared_ptr& channel : group->channels()) { + for (shared_ptr s : signalbases_) { + if (s->channel() == channel) { + sg->append_signal(s); + break; + } + } + } + signal_groups_.emplace_back(sg); + } + } + + // Update all views for (shared_ptr& viewbase : views_) { vector< shared_ptr > view_signalbases = viewbase->signalbases();