X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fview.cpp;h=f1de3b20e9faeab2c2ac10e3665b5b38d897d1ae;hb=c259400566cecf3b6ca959bc60c671a7195c0078;hp=43853359540baf83859d3abd69fffde9254e9b22;hpb=5a5d3b1de81417f64b58e80cc359dcfde0d3a10c;p=pulseview.git diff --git a/pv/views/trace/view.cpp b/pv/views/trace/view.cpp index 43853359..f1de3b20 100644 --- a/pv/views/trace/view.cpp +++ b/pv/views/trace/view.cpp @@ -41,27 +41,28 @@ #include -#include "analogsignal.hpp" -#include "header.hpp" -#include "logicsignal.hpp" -#include "ruler.hpp" -#include "signal.hpp" -#include "tracegroup.hpp" -#include "triggermarker.hpp" #include "view.hpp" -#include "viewport.hpp" +#include "pv/globalsettings.hpp" #include "pv/metadata_obj.hpp" +#include "pv/session.hpp" +#include "pv/util.hpp" #include "pv/data/logic.hpp" #include "pv/data/logicsegment.hpp" #include "pv/data/signalbase.hpp" #include "pv/devices/device.hpp" -#include "pv/globalsettings.hpp" -#include "pv/session.hpp" -#include "pv/util.hpp" +#include "pv/views/trace/mathsignal.hpp" +#include "pv/views/trace/analogsignal.hpp" +#include "pv/views/trace/header.hpp" +#include "pv/views/trace/logicsignal.hpp" +#include "pv/views/trace/ruler.hpp" +#include "pv/views/trace/signal.hpp" +#include "pv/views/trace/tracegroup.hpp" +#include "pv/views/trace/triggermarker.hpp" +#include "pv/views/trace/viewport.hpp" #ifdef ENABLE_DECODE -#include "decodetrace.hpp" +#include "pv/views/trace/decodetrace.hpp" #endif using pv::data::SignalBase; @@ -358,13 +359,17 @@ void View::add_signalbase(const shared_ptr signalbase) switch (signalbase->type()) { case SignalBase::LogicChannel: - signal = shared_ptr(new LogicSignal(session_, session_.device(), signalbase)); + signal = shared_ptr(new LogicSignal(session_, signalbase)); break; case SignalBase::AnalogChannel: signal = shared_ptr(new AnalogSignal(session_, signalbase)); break; + case SignalBase::MathChannel: + signal = shared_ptr(new MathSignal(session_, signalbase)); + break; + default: qDebug() << "Unknown signalbase type:" << signalbase->type(); assert(false); @@ -777,7 +782,7 @@ void View::set_segment_display_mode(Trace::SegmentDisplayMode mode) for (const shared_ptr& signal : signals_) signal->set_segment_display_mode(mode); - uint32_t last_segment = session_.get_segment_count() - 1; + uint32_t last_segment = session_.get_highest_segment_id(); switch (mode) { case Trace::ShowLastSegmentOnly: @@ -854,21 +859,31 @@ void View::zoom_fit(bool gui_state) void View::focus_on_range(uint64_t start_sample, uint64_t end_sample) { assert(viewport_); - const int w = viewport_->width(); + const uint64_t w = viewport_->width(); if (w <= 0) return; const double samplerate = session_.get_samplerate(); + const double samples_per_pixel = samplerate * scale_; + const uint64_t viewport_samples = w * samples_per_pixel; const uint64_t sample_delta = (end_sample - start_sample); // Note: We add 20% margin on the left and 5% on the right - const Timestamp delta = (sample_delta * 1.25) / samplerate; - - const Timestamp scale = max(min(delta / w, MaxScale), MinScale); - const Timestamp offset = (start_sample - sample_delta * 0.20) / samplerate; - - set_scale_offset(scale.convert_to(), offset); + const uint64_t ext_sample_delta = sample_delta * 1.25; + + // Check if we can keep the zoom level and just center the supplied range + if (viewport_samples >= ext_sample_delta) { + // Note: offset is the left edge of the view so to center, we subtract half the view width + const int64_t sample_offset = (start_sample + (sample_delta / 2) - (viewport_samples / 2)); + const Timestamp offset = sample_offset / samplerate; + set_scale_offset(scale_, offset); + } else { + const Timestamp offset = (start_sample - sample_delta * 0.20) / samplerate; + const Timestamp delta = ext_sample_delta / samplerate; + const Timestamp scale = max(min(delta / w, MaxScale), MinScale); + set_scale_offset(scale.convert_to(), offset); + } } void View::set_scale_offset(double scale, const Timestamp& offset) @@ -905,7 +920,7 @@ vector< shared_ptr > View::get_visible_data() const vector< shared_ptr > visible_data; for (const shared_ptr& sig : signals_) if (sig->enabled()) - visible_data.push_back(sig->data()); + visible_data.push_back(sig->base()->data()); return visible_data; } @@ -918,9 +933,9 @@ pair View::get_time_extents() const if (signals_.size() == 0) return make_pair(0, 0); - for (shared_ptr s : signals_) - if (s->data()->segments().size() > 0) - data.push_back(s->data()); + for (const shared_ptr& s : signals_) + if (s->base()->data() && (s->base()->data()->segments().size() > 0)) + data.push_back(s->base()->data()); for (const shared_ptr& d : data) { const vector< shared_ptr > segments = d->segments(); @@ -1487,7 +1502,7 @@ void View::determine_time_unit() if (time_unit_ == util::TimeUnit::Samples) { // Check all signals but... for (const shared_ptr& signal : signals_) { - const shared_ptr data = signal->data(); + const shared_ptr data = signal->base()->data(); // ...only check first segment of each const vector< shared_ptr > segments = data->segments();