X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=pv%2Fsession.cpp;h=fb8ee5fe9a3456dc2533078cdcbdad59b040e36a;hb=578d073553fa13c8f6939ad4bd7bd774950a33eb;hp=bc644ab908a77a02615af1910e80c85b56ee25b8;hpb=49fee853b3f56ba78810260c71c3c402067f09fe;p=pulseview.git diff --git a/pv/session.cpp b/pv/session.cpp index bc644ab9..fb8ee5fe 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -84,7 +84,6 @@ using std::string; using std::unique_lock; #endif using std::unique_ptr; -using std::unordered_set; using std::vector; using sigrok::Analog; @@ -501,7 +500,7 @@ void Session::set_device(shared_ptr device) // Remove all stored data and reset all views for (shared_ptr view : views_) { - view->clear_signals(); + view->clear_signalbases(); #ifdef ENABLE_DECODE view->clear_decode_signals(); #endif @@ -906,6 +905,11 @@ void Session::remove_decode_signal(shared_ptr signal) } #endif +MetadataObjManager* Session::metadata_obj_manager() +{ + return &metadata_obj_manager_; +} + void Session::set_capture_state(capture_state state) { bool changed; @@ -931,7 +935,7 @@ void Session::update_signals() signalbases_.clear(); logic_data_.reset(); for (shared_ptr& view : views_) { - view->clear_signals(); + view->clear_signalbases(); #ifdef ENABLE_DECODE view->clear_decode_signals(); #endif @@ -946,7 +950,7 @@ void Session::update_signals() signalbases_.clear(); logic_data_.reset(); for (shared_ptr& view : views_) { - view->clear_signals(); + view->clear_signalbases(); #ifdef ENABLE_DECODE view->clear_decode_signals(); #endif @@ -961,7 +965,7 @@ void Session::update_signals() [] (shared_ptr channel) { return channel->type() == sigrok::ChannelType::LOGIC; }); - // Create data containers for the logic data segments + // Create a common data container for the logic signalbases { lock_guard data_lock(data_mutex_); @@ -969,100 +973,77 @@ void Session::update_signals() logic_data_.reset(); } else if (!logic_data_ || logic_data_->num_channels() != logic_channel_count) { - logic_data_.reset(new data::Logic( - logic_channel_count)); + logic_data_.reset(new data::Logic(logic_channel_count)); assert(logic_data_); } } - // Make the signals list - for (shared_ptr& viewbase : views_) { - views::trace::View *trace_view = - qobject_cast(viewbase.get()); - - if (trace_view) { - vector< shared_ptr > prev_sigs(trace_view->signals()); - trace_view->clear_signals(); - - for (auto channel : sr_dev->channels()) { - shared_ptr signalbase; - shared_ptr signal; - - // Find the channel in the old signals - const auto iter = find_if( - prev_sigs.cbegin(), prev_sigs.cend(), - [&](const shared_ptr &s) { - return s->base()->channel() == channel; - }); - if (iter != prev_sigs.end()) { - // Copy the signal from the old set to the new - signal = *iter; - trace_view->add_signal(signal); - } else { - // Find the signalbase for this channel if possible - signalbase.reset(); - for (const shared_ptr& b : signalbases_) - if (b->channel() == channel) - signalbase = b; - - shared_ptr signal; - - switch(channel->type()->id()) { - case SR_CHANNEL_LOGIC: - if (!signalbase) { - signalbase = make_shared(channel, - data::SignalBase::LogicChannel); - signalbases_.push_back(signalbase); - - all_signal_data_.insert(logic_data_); - signalbase->set_data(logic_data_); - - connect(this, SIGNAL(capture_state_changed(int)), - signalbase.get(), SLOT(on_capture_state_changed(int))); - } - - signal = shared_ptr(new LogicSignal(*this, device_, signalbase)); - break; - - case SR_CHANNEL_ANALOG: - { - if (!signalbase) { - signalbase = make_shared(channel, - data::SignalBase::AnalogChannel); - signalbases_.push_back(signalbase); - - shared_ptr data(new data::Analog()); - all_signal_data_.insert(data); - signalbase->set_data(data); - - connect(this, SIGNAL(capture_state_changed(int)), - signalbase.get(), SLOT(on_capture_state_changed(int))); - } - - signal = shared_ptr(new AnalogSignal(*this, signalbase)); - break; - } - - default: - assert(false); - break; - } - - // New views take their signal settings from the main view - if (!viewbase->is_main_view()) { - shared_ptr main_tv = - dynamic_pointer_cast(main_view_); - shared_ptr main_signal = - main_tv->get_signal_by_signalbase(signalbase); - signal->restore_settings(main_signal->save_settings()); - } - - trace_view->add_signal(signal); - } + // Create signalbases if necessary + for (auto channel : sr_dev->channels()) { + + // Try to find the channel in the list of existing signalbases + const auto iter = find_if(signalbases_.cbegin(), signalbases_.cend(), + [&](const shared_ptr &sb) { return sb->channel() == channel; }); + + // Not found, let's make a signalbase for it + if (iter == signalbases_.cend()) { + shared_ptr signalbase; + switch(channel->type()->id()) { + case SR_CHANNEL_LOGIC: + signalbase = make_shared(channel, data::SignalBase::LogicChannel); + signalbases_.push_back(signalbase); + + all_signal_data_.insert(logic_data_); + signalbase->set_data(logic_data_); + + connect(this, SIGNAL(capture_state_changed(int)), + signalbase.get(), SLOT(on_capture_state_changed(int))); + break; + + case SR_CHANNEL_ANALOG: + signalbase = make_shared(channel, data::SignalBase::AnalogChannel); + signalbases_.push_back(signalbase); + + shared_ptr data(new data::Analog()); + all_signal_data_.insert(data); + signalbase->set_data(data); + + connect(this, SIGNAL(capture_state_changed(int)), + signalbase.get(), SLOT(on_capture_state_changed(int))); + break; } } } + for (shared_ptr& viewbase : views_) { + vector< shared_ptr > view_signalbases = + viewbase->signalbases(); + + // Add all non-decode signalbases that don't yet exist in the view + for (shared_ptr& session_sb : signalbases_) { + if (session_sb->type() == SignalBase::DecodeChannel) + continue; + + const auto iter = find_if(view_signalbases.cbegin(), view_signalbases.cend(), + [&](const shared_ptr &sb) { return sb == session_sb; }); + + if (iter == view_signalbases.cend()) + viewbase->add_signalbase(session_sb); + } + + // Remove all non-decode signalbases that no longer exist + for (shared_ptr& view_sb : view_signalbases) { + if (view_sb->type() == SignalBase::DecodeChannel) + continue; + + const auto iter = find_if(signalbases_.cbegin(), signalbases_.cend(), + [&](const shared_ptr &sb) { return sb == view_sb; }); + + if (iter == signalbases_.cend()) + viewbase->remove_signalbase(view_sb); + } + } + signals_changed(); }