X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fsession.cpp;h=6b7645bc7c7ef92e876e74076e062f7f532171c0;hb=cc9a7898ee7afc32e03dbcc991ed7ba722ed8f1b;hp=7545da3c15030a7090974f1ee65ee4f413c2e44a;hpb=2ad82c2e40b6865481733913a2c32735602f63c4;p=pulseview.git diff --git a/pv/session.cpp b/pv/session.cpp index 7545da3..6b7645b 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -138,16 +138,36 @@ 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([=] (shared_ptr device, shared_ptr packet) { data_feed_in(device, packet); }); - update_signals(); - - 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()); @@ -581,7 +603,7 @@ void Session::feed_in_analog(shared_ptr analog) if (iter != cur_analog_segments_.end()) segment = (*iter).second; else { - // If no segment was found, this means we havn't + // If no segment was found, this means we haven't // created one yet. i.e. this is the first packet // in the sweep containing this segment. sweep_beginning = true;