X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fview%2Fview.cpp;h=7de1c792c06fa9880eee2d295e4cc8fc9672ef19;hb=2220e94218298b208041c5e828595d9e1b842c88;hp=6d366e7311881b8736b80daf2709becd72d7c88b;hpb=cc88566ce77bed57358a82dec5da648feb66d10b;p=pulseview.git diff --git a/pv/view/view.cpp b/pv/view/view.cpp index 6d366e7..7de1c79 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -65,6 +65,8 @@ using pv::data::Segment; using pv::util::TimeUnit; using pv::util::Timestamp; +using std::back_inserter; +using std::copy_if; using std::deque; using std::dynamic_pointer_cast; using std::inserter; @@ -72,6 +74,7 @@ using std::list; using std::lock_guard; using std::max; using std::make_pair; +using std::make_shared; using std::min; using std::pair; using std::set; @@ -346,24 +349,12 @@ void View::zoom_one_to_one() if (visible_data.empty()) return; - double samplerate = 0.0; - for (const shared_ptr d : visible_data) { - assert(d); - const vector< shared_ptr > segments = - d->segments(); - for (const shared_ptr &s : segments) - samplerate = max(samplerate, s->samplerate()); - } - - if (samplerate == 0.0) - return; - assert(viewport_); const int w = viewport_->width(); if (w <= 0) return; - set_zoom(1.0 / samplerate, w / 2); + set_zoom(1.0 / session_.get_samplerate(), w / 2); } void View::set_scale_offset(double scale, const Timestamp& offset) @@ -396,8 +387,7 @@ void View::set_scale_offset(double scale, const Timestamp& offset) set< shared_ptr > View::get_visible_data() const { - shared_lock lock(session().signals_mutex()); - const unordered_set< shared_ptr > &sigs(session().signals()); + const unordered_set< shared_ptr > sigs(session().signals()); // Make a set of all the visible data objects set< shared_ptr > visible_data; @@ -745,8 +735,7 @@ void View::determine_time_unit() { // Check whether we know the sample rate and hence can use time as the unit if (time_unit_ == util::TimeUnit::Samples) { - shared_lock lock(session().signals_mutex()); - const unordered_set< shared_ptr > &sigs(session().signals()); + const unordered_set< shared_ptr > sigs(session().signals()); // Check all signals but... for (const shared_ptr signal : sigs) { @@ -870,6 +859,8 @@ void View::v_scroll_value_changed() void View::signals_changed() { + using sigrok::Channel; + vector< shared_ptr > new_top_level_items; const auto device = session_.device(); @@ -879,14 +870,16 @@ void View::signals_changed() shared_ptr sr_dev = device->device(); assert(sr_dev); + const vector< shared_ptr > channels( + sr_dev->channels()); + // Make a list of traces that are being added, and a list of traces // that are being removed const vector> prev_trace_list = list_by_type(); const set> prev_traces( prev_trace_list.begin(), prev_trace_list.end()); - shared_lock lock(session_.signals_mutex()); - const unordered_set< shared_ptr > &sigs(session_.signals()); + const unordered_set< shared_ptr > sigs(session_.signals()); set< shared_ptr > traces(sigs.begin(), sigs.end()); @@ -958,9 +951,23 @@ void View::signals_changed() new_top_level_items.push_back(new_trace_group); } + // Enqueue the remaining logic channels in a group + vector< shared_ptr > logic_channels; + copy_if(channels.begin(), channels.end(), back_inserter(logic_channels), + [](const shared_ptr& c) { + return c->type() == sigrok::ChannelType::LOGIC; }); + const vector< shared_ptr > non_grouped_logic_signals = + extract_new_traces_for_channels(logic_channels, + signal_map, add_traces); + const shared_ptr non_grouped_trace_group( + make_shared()); + for (shared_ptr trace : non_grouped_logic_signals) + non_grouped_trace_group->add_child_item(trace); + new_top_level_items.push_back(non_grouped_trace_group); + // Enqueue the remaining channels as free ungrouped traces const vector< shared_ptr > new_top_level_signals = - extract_new_traces_for_channels(sr_dev->channels(), + extract_new_traces_for_channels(channels, signal_map, add_traces); new_top_level_items.insert(new_top_level_items.end(), new_top_level_signals.begin(), new_top_level_signals.end());