X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fsession.cpp;h=6b7645bc7c7ef92e876e74076e062f7f532171c0;hp=9fd8fb3eb9b5bdf6a1c03cf5f457e9b5113de493;hb=cc9a7898ee7afc32e03dbcc991ed7ba722ed8f1b;hpb=39ccf9c39ec5c1ddeb5ba62f77cc811a2598bf72 diff --git a/pv/session.cpp b/pv/session.cpp index 9fd8fb3e..6b7645bc 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -138,6 +138,28 @@ void Session::set_device(shared_ptr device) if (device_) device_->close(); + device_.reset(); + + // Remove all stored data + signals_.clear(); + { + shared_lock lock(signals_mutex_); + for (const shared_ptr d : all_signal_data_) + d->clear(); + } + all_signal_data_.clear(); + cur_logic_segment_.reset(); + + for (auto entry : cur_analog_segments_) { + shared_ptr(entry.first).reset(); + shared_ptr(entry.second).reset(); + } + + logic_data_.reset(); + decode_traces_.clear(); + + signals_changed(); + device_ = std::move(device); device_->open(); device_->session()->add_datafeed_callback([=] @@ -145,8 +167,6 @@ void Session::set_device(shared_ptr device) data_feed_in(device, packet); }); - decode_traces_.clear(); - update_signals(); device_selected(); } @@ -191,8 +211,11 @@ void Session::start_capture(function error_handler) } // Clear signal data - for (const shared_ptr d : get_data()) - d->clear(); + { + shared_lock lock(signals_mutex_); + for (const shared_ptr d : all_signal_data_) + d->clear(); + } // Begin the session sampling_thread_ = std::thread( @@ -210,30 +233,20 @@ void Session::stop_capture() sampling_thread_.join(); } -set< shared_ptr > Session::get_data() const -{ - shared_lock lock(signals_mutex_); - set< shared_ptr > data; - for (const shared_ptr sig : signals_) { - assert(sig); - data.insert(sig->data()); - } - - return data; -} - double Session::get_samplerate() const { double samplerate = 0.0; - for (const shared_ptr d : get_data()) { - assert(d); - const vector< shared_ptr > segments = - d->segments(); - for (const shared_ptr &s : segments) - samplerate = std::max(samplerate, s->samplerate()); + { + shared_lock lock(signals_mutex_); + for (const shared_ptr d : all_signal_data_) { + assert(d); + const vector< shared_ptr > segments = + d->segments(); + for (const shared_ptr &s : segments) + samplerate = std::max(samplerate, s->samplerate()); + } } - // If there is no sample rate given we use samples as unit if (samplerate == 0.0) samplerate = 1.0; @@ -333,7 +346,11 @@ void Session::set_capture_state(capture_state state) void Session::update_signals() { - assert(device_); + if (!device_) { + signals_.clear(); + logic_data_.reset(); + return; + } lock_guard lock(data_mutex_); @@ -397,6 +414,7 @@ void Session::update_signals() new view::LogicSignal(*this, device_, channel, logic_data_)); + all_signal_data_.insert(logic_data_); break; case SR_CHANNEL_ANALOG: @@ -406,6 +424,7 @@ void Session::update_signals() signal = shared_ptr( new view::AnalogSignal( *this, channel, data)); + all_signal_data_.insert(data); break; } @@ -501,17 +520,20 @@ void Session::feed_in_trigger() // The channel containing most samples should be most accurate uint64_t sample_count = 0; - for (const shared_ptr d : get_data()) { - assert(d); - uint64_t temp_count = 0; - - const vector< shared_ptr > segments = - d->segments(); - for (const shared_ptr &s : segments) - temp_count += s->get_sample_count(); - - if (temp_count > sample_count) - sample_count = temp_count; + { + shared_lock lock(signals_mutex_); + for (const shared_ptr d : all_signal_data_) { + assert(d); + uint64_t temp_count = 0; + + const vector< shared_ptr > segments = + d->segments(); + for (const shared_ptr &s : segments) + temp_count += s->get_sample_count(); + + if (temp_count > sample_count) + sample_count = temp_count; + } } trigger_event(sample_count / get_samplerate());