X-Git-Url: http://git.code-monkey.de/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Flogicsignal.cpp;h=438e4e21c1f6a6c639543897cb65f35362e9a746;hp=77e92c0cc2788f97eadedd8de04d560fcf571002;hb=b4bc9b55381ff22196785291d3862c8c8c131885;hpb=641574bcc118be0b6dc3a65039ab3497f9d7241a diff --git a/pv/views/trace/logicsignal.cpp b/pv/views/trace/logicsignal.cpp index 77e92c0..438e4e2 100644 --- a/pv/views/trace/logicsignal.cpp +++ b/pv/views/trace/logicsignal.cpp @@ -103,6 +103,7 @@ LogicSignal::LogicSignal( shared_ptr base) : Signal(session, base), device_(device), + trigger_types_(get_trigger_types()), trigger_none_(nullptr), trigger_rising_(nullptr), trigger_high_(nullptr), @@ -163,18 +164,6 @@ pair LogicSignal::v_extents() const 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_mid(QPainter &p, ViewItemPaintParams &pp) { QLineF *line; @@ -292,39 +281,88 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp) void LogicSignal::paint_fore(QPainter &p, ViewItemPaintParams &pp) { - // Draw the trigger marker - if (!trigger_match_ || !base_->enabled()) + if (base_->enabled()) { + if (trigger_match_) { + // Draw the trigger marker + const int y = get_visual_y(); + + for (int32_t type_id : trigger_types_) { + const TriggerMatchType *const type = + TriggerMatchType::get(type_id); + if (trigger_match_ != type || type_id < 0 || + (size_t)type_id >= countof(TriggerMarkerIcons) || + !TriggerMarkerIcons[type_id]) + continue; + + const QPixmap *const pixmap = get_pixmap( + TriggerMarkerIcons[type_id]); + if (!pixmap) + continue; + + const float pad = TriggerMarkerPadding - 0.5f; + const QSize size = pixmap->size(); + const QPoint point( + pp.right() - size.width() - pad * 2, + y - (signal_height_ + size.height()) / 2); + + p.setPen(QPen(TriggerMarkerBackgroundColor.darker())); + p.setBrush(TriggerMarkerBackgroundColor); + p.drawRoundedRect(QRectF(point, size).adjusted( + -pad, -pad, pad, pad), pad, pad); + p.drawPixmap(point, *pixmap); + + break; + } + } + + if (show_hover_marker_) + paint_hover_marker(p); + } +} + +void LogicSignal::hover_point_changed(const QPoint &hp) +{ + Signal::hover_point_changed(hp); + + assert(base_); + assert(owner_); + + if ((!base_->enabled()) || (hp.x() == 0)) return; + // Ignore if mouse cursor is not hovering over this trace const int y = get_visual_y(); - const vector trig_types = get_trigger_types(); - for (int32_t type_id : trig_types) { - const TriggerMatchType *const type = - TriggerMatchType::get(type_id); - if (trigger_match_ != type || type_id < 0 || - (size_t)type_id >= countof(TriggerMarkerIcons) || - !TriggerMarkerIcons[type_id]) - continue; - - const QPixmap *const pixmap = get_pixmap( - TriggerMarkerIcons[type_id]); - if (!pixmap) - continue; - - const float pad = TriggerMarkerPadding - 0.5f; - const QSize size = pixmap->size(); - const QPoint point( - pp.right() - size.width() - pad * 2, - y - (signal_height_ + size.height()) / 2); - - p.setPen(QPen(TriggerMarkerBackgroundColor.darker())); - p.setBrush(TriggerMarkerBackgroundColor); - p.drawRoundedRect(QRectF(point, size).adjusted( - -pad, -pad, pad, pad), pad, pad); - p.drawPixmap(point, *pixmap); - - break; - } + const pair extents = v_extents(); + if ((hp.y() < (y + extents.first)) || ((hp.y() > (y + extents.second)))) + return; + + shared_ptr segment = get_logic_segment_to_paint(); + if (!segment || (segment->get_sample_count() == 0)) + return; + + double samplerate = segment->samplerate(); + + // Show sample rate as 1Hz when it is unknown + if (samplerate == 0.0) + samplerate = 1.0; + + const View *view = owner_->view(); + assert(view); + const double scale = view->scale(); + const double pixels_offset = + ((view->offset() - segment->start_time()) / scale).convert_to(); + const double samples_per_pixel = samplerate * scale; + + const uint64_t sample_pos = (uint64_t)max( + (hp.x() + pixels_offset) * samples_per_pixel, 0.0); + + vector edges; + + segment->get_surrounding_edges(edges, sample_pos, + samples_per_pixel / Oversampling, base_->index()); + + if (edges.empty()) + return; } void LogicSignal::paint_caps(QPainter &p, QLineF *const lines, @@ -508,6 +546,12 @@ void LogicSignal::populate_popup_form(QWidget *parent, QFormLayout *form) trigger_bar_->addAction(action); action->setChecked(trigger_match_ == type); } + + // Only allow triggers to be changed when we're stopped + if (session_.get_capture_state() != Session::Stopped) + for (QAction* action : trigger_bar_->findChildren()) + action->setEnabled(false); + form->addRow(tr("Trigger"), trigger_bar_); } }