base_->set_color(SignalColors[base->index() % countof(SignalColors)]);
- GlobalSettings gs;
- signal_height_ = gs.value(GlobalSettings::Key_View_DefaultLogicHeight).toInt();
+ GlobalSettings settings;
+ signal_height_ = settings.value(GlobalSettings::Key_View_DefaultLogicHeight).toInt();
+ show_sampling_points_ =
+ settings.value(GlobalSettings::Key_View_ShowSamplingPoints).toBool();
+ fill_high_areas_ =
+ settings.value(GlobalSettings::Key_View_FillSignalHighAreas).toBool();
+ high_fill_color_ = QColor::fromRgba(settings.value(
+ GlobalSettings::Key_View_FillSignalHighAreaColor).value<uint32_t>());
/* Populate this channel's trigger setting with whatever we
* find in the current session trigger, if anything. */
pp.left() + (edges.back().first / samples_per_pixel - pixels_offset);
// Check whether we need to paint the sampling points
- GlobalSettings settings;
- const bool show_sampling_points =
- settings.value(GlobalSettings::Key_View_ShowSamplingPoints).toBool() &&
- (samples_per_pixel < 0.25);
-
+ const bool show_sampling_points = show_sampling_points_ && (samples_per_pixel < 0.25);
vector<QRectF> sampling_points;
float sampling_point_x = first_sample_x;
int64_t sampling_point_sample = start_sample;
if (show_sampling_points)
sampling_points.reserve(end_sample - start_sample + 1);
- // Check whether we need to fill the high areas
- const bool fill_high_areas =
- settings.value(GlobalSettings::Key_View_FillSignalHighAreas).toBool();
- float high_start_x;
vector<QRectF> high_rects;
+ float rising_edge_x;
+ bool rising_edge_seen = false;
// Paint the edges
const unsigned int edge_count = edges.size() - 2;
QLineF *const edge_lines = new QLineF[edge_count];
line = edge_lines;
- if (edges.front().second)
- high_start_x = first_sample_x; // Beginning of signal is high
+ if (edges.front().second) {
+ // Beginning of trace is high
+ rising_edge_x = first_sample_x;
+ rising_edge_seen = true;
+ }
for (auto i = edges.cbegin() + 1; i != edges.cend() - 1; i++) {
- const float x = ((*i).first / samples_per_pixel -
- pixels_offset) + pp.left();
+ // Note: multiple edges occupying a single pixel are represented by an edge
+ // with undefined logic level. This means that only the first falling edge
+ // after a rising edge corresponds to said rising edge - and vice versa. If
+ // more edges with the same logic level follow, they denote multiple edges.
+
+ const float x = pp.left() + ((*i).first / samples_per_pixel - pixels_offset);
*line++ = QLineF(x, high_offset, x, low_offset);
- if (fill_high_areas) {
- if ((*i).second)
- high_start_x = x;
- else
- high_rects.emplace_back(high_start_x, high_offset,
- x - high_start_x, signal_height_);
+ if (fill_high_areas_) {
+ // Any edge terminates a high area
+ if (rising_edge_seen) {
+ const int width = x - rising_edge_x;
+ if (width > 0)
+ high_rects.emplace_back(rising_edge_x, high_offset,
+ width, signal_height_);
+ rising_edge_seen = false;
+ }
+
+ // Only rising edges start high areas
+ if ((*i).second) {
+ rising_edge_x = x;
+ rising_edge_seen = true;
+ }
}
if (show_sampling_points)
sampling_point_x += pixels_per_sample;
};
- if (fill_high_areas) {
- // Add last high rectangle if the signal is still high at the end of the view
- if ((edges.cend() - 1)->second)
- high_rects.emplace_back(high_start_x, high_offset,
- last_sample_x - high_start_x, signal_height_);
+ if (fill_high_areas_) {
+ // Add last high rectangle if the signal is still high at the end of the trace
+ if (rising_edge_seen && (edges.cend() - 1)->second)
+ high_rects.emplace_back(rising_edge_x, high_offset,
+ last_sample_x - rising_edge_x, signal_height_);
- const QColor fill_color = QColor::fromRgba(settings.value(
- GlobalSettings::Key_View_FillSignalHighAreaColor).value<uint32_t>());
- p.setPen(fill_color);
- p.setBrush(fill_color);
+ p.setPen(high_fill_color_);
+ p.setBrush(high_fill_color_);
p.drawRects((const QRectF*)(high_rects.data()), high_rects.size());
}
// Only allow triggers to be changed when we're stopped
if (session_.get_capture_state() != Session::Stopped)
- for (QAction* action : trigger_bar_->findChildren<QAction*>())
+ for (QAction* action : trigger_bar_->findChildren<QAction*>()) // clazy:exclude=range-loop
action->setEnabled(false);
form->addRow(tr("Trigger"), trigger_bar_);
return pixmap_cache_.take(path);
}
+void LogicSignal::on_setting_changed(const QString &key, const QVariant &value)
+{
+ Signal::on_setting_changed(key, value);
+
+ if (key == GlobalSettings::Key_View_ShowSamplingPoints)
+ show_sampling_points_ = value.toBool();
+
+ if (key == GlobalSettings::Key_View_FillSignalHighAreas)
+ fill_high_areas_ = value.toBool();
+
+ if (key == GlobalSettings::Key_View_FillSignalHighAreaColor)
+ high_fill_color_ = QColor::fromRgba(value.value<uint32_t>());
+}
+
void LogicSignal::on_trigger()
{
QAction *action;