X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Flogicsignal.cpp;h=717360b852fa65b9aedf5a513f578d47a45e1e40;hp=18ca52007b89a5b92186a6446d1d5f614d80c59b;hb=303d6ea697468ee79f4c3f73afc57db0ce6319a8;hpb=ffd905668e3268cc834a7b8ae48d778d2b5be365 diff --git a/pv/view/logicsignal.cpp b/pv/view/logicsignal.cpp index 18ca5200..717360b8 100644 --- a/pv/view/logicsignal.cpp +++ b/pv/view/logicsignal.cpp @@ -25,6 +25,7 @@ #include +#include #include #include @@ -33,6 +34,7 @@ #include #include +#include #include #include #include @@ -49,7 +51,6 @@ using std::vector; using sigrok::Channel; using sigrok::ConfigKey; -using sigrok::Device; using sigrok::Error; using sigrok::Trigger; using sigrok::TriggerStage; @@ -59,9 +60,6 @@ using sigrok::TriggerMatchType; namespace pv { namespace view { -const int LogicSignal::SignalHeight = 30; -const int LogicSignal::SignalMargin = 10; - const float LogicSignal::Oversampling = 2.0f; const QColor LogicSignal::EdgeColour(0x80, 0x80, 0x80); @@ -99,18 +97,19 @@ QCache LogicSignal::pixmap_cache_; LogicSignal::LogicSignal( pv::Session &session, - shared_ptr device, + shared_ptr device, shared_ptr channel, shared_ptr data) : Signal(session, channel), + signal_height_(QFontMetrics(QApplication::font()).height() * 2), device_(device), data_(data), - trigger_none_(NULL), - trigger_rising_(NULL), - trigger_high_(NULL), - trigger_falling_(NULL), - trigger_low_(NULL), - trigger_change_(NULL) + trigger_none_(nullptr), + trigger_rising_(nullptr), + trigger_high_(nullptr), + trigger_falling_(nullptr), + trigger_low_(nullptr), + trigger_change_(nullptr) { shared_ptr trigger; @@ -140,9 +139,28 @@ shared_ptr LogicSignal::logic_data() const return data_; } +void LogicSignal::set_logic_data(std::shared_ptr data) +{ + data_ = data; +} + std::pair LogicSignal::v_extents() const { - return make_pair(-SignalHeight - SignalMargin, SignalMargin); + const int signal_margin = + QFontMetrics(QApplication::font()).height() / 2; + return make_pair(-signal_height_ - signal_margin, signal_margin); +} + +int LogicSignal::scale_handle_offset() const +{ + return -signal_height_; +} + +void LogicSignal::scale_handle_dragged(int offset) +{ + const int font_height = QFontMetrics(QApplication::font()).height(); + const int units = (-offset / font_height); + signal_height_ = ((units < 1) ? 1 : units) * font_height; } void LogicSignal::paint_back(QPainter &p, const ViewItemPaintParams &pp) @@ -166,7 +184,7 @@ void LogicSignal::paint_mid(QPainter &p, const ViewItemPaintParams &pp) if (!channel_->enabled()) return; - const float high_offset = y - SignalHeight + 0.5f; + const float high_offset = y - signal_height_ + 0.5f; const float low_offset = y + 0.5f; const deque< shared_ptr > &segments = @@ -184,15 +202,18 @@ void LogicSignal::paint_mid(QPainter &p, const ViewItemPaintParams &pp) samplerate = 1.0; const double pixels_offset = pp.pixels_offset(); - const double start_time = segment->start_time(); + const pv::util::Timestamp& start_time = segment->start_time(); const int64_t last_sample = segment->get_sample_count() - 1; const double samples_per_pixel = samplerate * pp.scale(); - const double start = samplerate * (pp.offset() - start_time); - const double end = start + samples_per_pixel * pp.width(); + const pv::util::Timestamp start = samplerate * (pp.offset() - start_time); + const pv::util::Timestamp end = start + samples_per_pixel * pp.width(); + + const int64_t start_sample = min(max(floor(start).convert_to(), + (int64_t)0), last_sample); + const uint64_t end_sample = min(max(ceil(end).convert_to(), + (int64_t)0), last_sample); - segment->get_subsampled_edges(edges, - min(max((int64_t)floor(start), (int64_t)0), last_sample), - min(max((int64_t)ceil(end), (int64_t)0), last_sample), + segment->get_subsampled_edges(edges, start_sample, end_sample, samples_per_pixel / Oversampling, channel_->index()); assert(edges.size() >= 2); @@ -250,7 +271,7 @@ void LogicSignal::paint_fore(QPainter &p, const ViewItemPaintParams &pp) const QSize size = pixmap->size(); const QPoint point( pp.right() - size.width() - pad * 2, - y - (SignalHeight + size.height()) / 2); + y - (signal_height_ + size.height()) / 2); p.setPen(QPen(TriggerMarkerBackgroundColour.darker())); p.setBrush(TriggerMarkerBackgroundColour); @@ -316,13 +337,14 @@ void LogicSignal::init_trigger_actions(QWidget *parent) const vector LogicSignal::get_trigger_types() const { - const auto keys = device_->config_keys(ConfigKey::DEVICE_OPTIONS); + const auto sr_dev = device_->device(); + const auto keys = sr_dev->config_keys(ConfigKey::DEVICE_OPTIONS); const auto iter = keys.find(ConfigKey::TRIGGER_MATCH); if (iter != keys.end() && (*iter).second.find(sigrok::LIST) != (*iter).second.end()) { try { const Glib::VariantContainerBase gvar = - device_->config_list(ConfigKey::TRIGGER_MATCH); + sr_dev->config_list(ConfigKey::TRIGGER_MATCH); return Glib::VariantBase::cast_dynamic< Glib::Variant>>(gvar).get(); } catch (Error e) { @@ -411,7 +433,7 @@ void LogicSignal::modify_trigger() if (trigger) { for (auto stage : trigger->stages()) { const auto &matches = stage->matches(); - if (std::none_of(begin(matches), end(matches), + if (std::none_of(matches.begin(), matches.end(), [&](shared_ptr match) { return match->channel() != channel_; })) continue;