]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/logicsignal.cpp
Implement LogicSegment::get_surrounding_edges() and use it
[pulseview.git] / pv / views / trace / logicsignal.cpp
index 870af9c5fce2caa04dc718afd66209ae7b1c23e9..438e4e21c1f6a6c639543897cb65f35362e9a746 100644 (file)
@@ -103,6 +103,7 @@ LogicSignal::LogicSignal(
        shared_ptr<data::SignalBase> 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<int, int> 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,42 +281,88 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp)
 
 void LogicSignal::paint_fore(QPainter &p, ViewItemPaintParams &pp)
 {
-       // Draw the trigger marker
-       if (base_->enabled() && trigger_match_) {
-               const int y = get_visual_y();
-               const vector<int32_t> 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;
+       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 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);
+                               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);
+                               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;
+                               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 (show_hover_marker_)
-               paint_hover_marker(p);
+       if ((!base_->enabled()) || (hp.x() == 0))
+               return;
+
+       // Ignore if mouse cursor is not hovering over this trace
+       const int y = get_visual_y();
+       const pair<int, int> extents = v_extents();
+       if ((hp.y() < (y + extents.first)) || ((hp.y() > (y + extents.second))))
+               return;
+
+       shared_ptr<pv::data::LogicSegment> 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<double>();
+       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<data::LogicSegment::EdgePair> 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,