Refactoring: move samplerate algo from View to Session
[pulseview.git] / pv / view / view.cpp
index d21b75ab3f432422977b77d1d79056cdec1dc547..7de1c792c06fa9880eee2d295e4cc8fc9672ef19 100644 (file)
@@ -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<SignalData> d : visible_data) {
-               assert(d);
-               const vector< shared_ptr<Segment> > segments =
-                       d->segments();
-               for (const shared_ptr<Segment> &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)
@@ -868,6 +859,8 @@ void View::v_scroll_value_changed()
 
 void View::signals_changed()
 {
+       using sigrok::Channel;
+
        vector< shared_ptr<TraceTreeItem> > new_top_level_items;
 
        const auto device = session_.device();
@@ -877,6 +870,9 @@ void View::signals_changed()
        shared_ptr<sigrok::Device> sr_dev = device->device();
        assert(sr_dev);
 
+       const vector< shared_ptr<Channel> > channels(
+               sr_dev->channels());
+
        // Make a list of traces that are being added, and a list of traces
        // that are being removed
        const vector<shared_ptr<Trace>> prev_trace_list = list_by_type<Trace>();
@@ -955,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<Channel> > logic_channels;
+       copy_if(channels.begin(), channels.end(), back_inserter(logic_channels),
+               [](const shared_ptr<Channel>& c) {
+                       return c->type() == sigrok::ChannelType::LOGIC; });
+       const vector< shared_ptr<Trace> > non_grouped_logic_signals =
+               extract_new_traces_for_channels(logic_channels,
+                       signal_map, add_traces);
+       const shared_ptr<TraceGroup> non_grouped_trace_group(
+               make_shared<TraceGroup>());
+       for (shared_ptr<Trace> 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<Trace> > 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());