X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Flogicsignal.cpp;h=77e92c0cc2788f97eadedd8de04d560fcf571002;hp=407551843bfdcaeaa633345108b69647c22fbc37;hb=641574bcc118be0b6dc3a65039ab3497f9d7241a;hpb=a2b2b65ebcf315c39f1f7a811f71e1a4962d2c32 diff --git a/pv/views/trace/logicsignal.cpp b/pv/views/trace/logicsignal.cpp index 40755184..77e92c0c 100644 --- a/pv/views/trace/logicsignal.cpp +++ b/pv/views/trace/logicsignal.cpp @@ -46,6 +46,7 @@ using std::max; using std::make_pair; using std::min; using std::none_of; +using std::out_of_range; using std::pair; using std::shared_ptr; using std::vector; @@ -62,12 +63,12 @@ namespace trace { const float LogicSignal::Oversampling = 2.0f; -const QColor LogicSignal::EdgeColour(0x80, 0x80, 0x80); -const QColor LogicSignal::HighColour(0x00, 0xC0, 0x00); -const QColor LogicSignal::LowColour(0xC0, 0x00, 0x00); -const QColor LogicSignal::SamplingPointColour(0x77, 0x77, 0x77); +const QColor LogicSignal::EdgeColor(0x80, 0x80, 0x80); +const QColor LogicSignal::HighColor(0x00, 0xC0, 0x00); +const QColor LogicSignal::LowColor(0xC0, 0x00, 0x00); +const QColor LogicSignal::SamplingPointColor(0x77, 0x77, 0x77); -const QColor LogicSignal::SignalColours[10] = { +const QColor LogicSignal::SignalColors[10] = { QColor(0x16, 0x19, 0x1A), // Black QColor(0x8F, 0x52, 0x02), // Brown QColor(0xCC, 0x00, 0x00), // Red @@ -80,7 +81,7 @@ const QColor LogicSignal::SignalColours[10] = { QColor(0xEE, 0xEE, 0xEC), // White }; -QColor LogicSignal::TriggerMarkerBackgroundColour = QColor(0xED, 0xD4, 0x00); +QColor LogicSignal::TriggerMarkerBackgroundColor = QColor(0xED, 0xD4, 0x00); const int LogicSignal::TriggerMarkerPadding = 2; const char* LogicSignal::TriggerMarkerIcons[8] = { nullptr, @@ -111,7 +112,7 @@ LogicSignal::LogicSignal( { shared_ptr trigger; - base_->set_colour(SignalColours[base->index() % countof(SignalColours)]); + base_->set_color(SignalColors[base->index() % countof(SignalColors)]); GlobalSettings gs; signal_height_ = gs.value(GlobalSettings::Key_View_DefaultLogicHeight).toInt(); @@ -191,13 +192,10 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp) const float high_offset = y - signal_height_ + 0.5f; const float low_offset = y + 0.5f; - const deque< shared_ptr > &segments = - base_->logic_data()->logic_segments(); - if (segments.empty()) + shared_ptr segment = get_logic_segment_to_paint(); + if (!segment || (segment->get_sample_count() == 0)) return; - const shared_ptr &segment = segments.front(); - double samplerate = segment->samplerate(); // Show sample rate as 1Hz when it is unknown @@ -206,7 +204,7 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp) const double pixels_offset = pp.pixels_offset(); const pv::util::Timestamp& start_time = segment->start_time(); - const int64_t last_sample = segment->get_sample_count() - 1; + const int64_t last_sample = (int64_t)segment->get_sample_count() - 1; const double samples_per_pixel = samplerate * pp.scale(); const double pixels_per_sample = 1 / samples_per_pixel; const pv::util::Timestamp start = samplerate * (pp.offset() - start_time); @@ -268,7 +266,7 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp) sampling_point_x += pixels_per_sample; }; - p.setPen(EdgeColour); + p.setPen(EdgeColor); p.drawLines(edge_lines, edge_count); delete[] edge_lines; @@ -276,10 +274,10 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp) const unsigned int max_cap_line_count = edges.size(); QLineF *const cap_lines = new QLineF[max_cap_line_count]; - p.setPen(HighColour); + p.setPen(HighColor); paint_caps(p, cap_lines, edges, true, samples_per_pixel, pixels_offset, pp.left(), high_offset); - p.setPen(LowColour); + p.setPen(LowColor); paint_caps(p, cap_lines, edges, false, samples_per_pixel, pixels_offset, pp.left(), low_offset); @@ -287,7 +285,7 @@ void LogicSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp) // Paint the sampling points if (show_sampling_points) { - p.setPen(SamplingPointColour); + p.setPen(SamplingPointColor); p.drawRects(sampling_points.data(), sampling_points.size()); } } @@ -319,8 +317,8 @@ void LogicSignal::paint_fore(QPainter &p, ViewItemPaintParams &pp) pp.right() - size.width() - pad * 2, y - (signal_height_ + size.height()) / 2); - p.setPen(QPen(TriggerMarkerBackgroundColour.darker())); - p.setBrush(TriggerMarkerBackgroundColour); + p.setPen(QPen(TriggerMarkerBackgroundColor.darker())); + p.setBrush(TriggerMarkerBackgroundColor); p.drawRoundedRect(QRectF(point, size).adjusted( -pad, -pad, pad, pad), pad, pad); p.drawPixmap(point, *pixmap); @@ -348,6 +346,31 @@ void LogicSignal::paint_caps(QPainter &p, QLineF *const lines, p.drawLines(lines, line - lines); } +shared_ptr LogicSignal::get_logic_segment_to_paint() const +{ + shared_ptr segment; + + const deque< shared_ptr > &segments = + base_->logic_data()->logic_segments(); + + if (!segments.empty()) { + if (segment_display_mode_ == ShowLastSegmentOnly) { + segment = segments.back(); + } + + if ((segment_display_mode_ == ShowSingleSegmentOnly) || + (segment_display_mode_ == ShowLastCompleteSegmentOnly)) { + try { + segment = segments.at(current_segment_); + } catch (out_of_range&) { + qDebug() << "Current logic segment out of range for signal" << base_->name() << ":" << current_segment_; + } + } + } + + return segment; +} + void LogicSignal::init_trigger_actions(QWidget *parent) { trigger_none_ = new QAction(*get_icon(":/icons/trigger-none.svg"),