X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fsession.cpp;h=9ec8bd07264036e85c052c05695749f4bccf797b;hp=fb8ee5fe9a3456dc2533078cdcbdad59b040e36a;hb=554af71bf515d2763ca13c3829dbeb2064cc4c83;hpb=578d073553fa13c8f6939ad4bd7bd774950a33eb diff --git a/pv/session.cpp b/pv/session.cpp index fb8ee5fe..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; @@ -115,6 +116,7 @@ namespace pv { shared_ptr Session::sr_context; Session::Session(DeviceManager &device_manager, QString name) : + shutting_down_(false), device_manager_(device_manager), default_name_(name), name_(name), @@ -126,8 +128,15 @@ Session::Session(DeviceManager &device_manager, QString name) : Session::~Session() { + shutting_down_ = true; + // Stop and join to the thread stop_capture(); + + for (SignalGroup* group : signal_groups_) { + group->clear(); + delete group; + } } DeviceManager& Session::device_manager() @@ -506,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(); @@ -857,15 +874,29 @@ const vector< shared_ptr > Session::signalbases() const return signalbases_; } -bool Session::all_segments_complete(uint32_t segment_id) const +void Session::add_generated_signal(shared_ptr signal) { - bool all_complete = true; + signalbases_.push_back(signal); - for (const shared_ptr& base : signalbases_) - if (!base->segment_is_complete(segment_id)) - all_complete = false; + for (shared_ptr& view : views_) + view->add_signalbase(signal); - return all_complete; + update_signals(); +} + +void Session::remove_generated_signal(shared_ptr signal) +{ + if (shutting_down_) + return; + + signalbases_.erase(std::remove_if(signalbases_.begin(), signalbases_.end(), + [&](shared_ptr s) { return s == signal; }), + signalbases_.end()); + + for (shared_ptr& view : views_) + view->remove_signalbase(signal); + + update_signals(); } #ifdef ENABLE_DECODE @@ -894,6 +925,9 @@ shared_ptr Session::add_decode_signal() void Session::remove_decode_signal(shared_ptr signal) { + if (shutting_down_) + return; + signalbases_.erase(std::remove_if(signalbases_.begin(), signalbases_.end(), [&](shared_ptr s) { return s == signal; }), signalbases_.end()); @@ -905,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_; @@ -997,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: @@ -1009,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(); @@ -1106,6 +1173,8 @@ void Session::sample_thread_proc(function error_handler) lock_guard lock(data_mutex_); cur_logic_segment_.reset(); cur_analog_segments_.clear(); + for (shared_ptr sb : signalbases_) + sb->clear_sample_data(); } highest_segment_id_ = -1; frame_began_ = false; @@ -1348,7 +1417,7 @@ void Session::feed_in_frame_end() signal_segment_completed(); } -void Session::feed_in_logic(shared_ptr logic) +void Session::feed_in_logic(shared_ptr logic) { if (logic->data_length() == 0) { qDebug() << "WARNING: Received logic packet with 0 samples."; @@ -1392,7 +1461,7 @@ void Session::feed_in_logic(shared_ptr logic) data_received(); } -void Session::feed_in_analog(shared_ptr analog) +void Session::feed_in_analog(shared_ptr analog) { if (analog->num_samples() == 0) { qDebug() << "WARNING: Received analog packet with 0 samples.";