X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fdecodetrace.cpp;h=21d88923ef1c5732f3a0f3ef1394219c2ead7907;hp=4ea297555260ddd3a2491d554d176b4440c8e72b;hb=1b56c646e7dd253775b4d6cfceaf327fd8ffd297;hpb=9f97b3576f527239594ea0accb82a4087147c746 diff --git a/pv/views/trace/decodetrace.cpp b/pv/views/trace/decodetrace.cpp index 4ea29755..21d88923 100644 --- a/pv/views/trace/decodetrace.cpp +++ b/pv/views/trace/decodetrace.cpp @@ -48,17 +48,14 @@ extern "C" { #include #include #include -#include #include #include #include #include using std::all_of; -using std::list; using std::make_pair; using std::max; -using std::make_pair; using std::map; using std::min; using std::out_of_range; @@ -93,6 +90,8 @@ const double DecodeTrace::EndCapWidth = 5; const int DecodeTrace::RowTitleMargin = 10; const int DecodeTrace::DrawPadding = 100; +const int DecodeTrace::MaxTraceUpdateRate = 1; // No more than 1 Hz + const QColor DecodeTrace::Colours[16] = { QColor(0xEF, 0x29, 0x29), QColor(0xF6, 0x6A, 0x32), @@ -150,6 +149,8 @@ DecodeTrace::DecodeTrace(pv::Session &session, connect(decode_signal_.get(), SIGNAL(new_annotations()), this, SLOT(on_new_annotations())); + connect(decode_signal_.get(), SIGNAL(decode_finished()), + this, SLOT(on_decode_finished())); connect(decode_signal_.get(), SIGNAL(channels_updated()), this, SLOT(on_channels_updated())); @@ -157,6 +158,11 @@ DecodeTrace::DecodeTrace(pv::Session &session, this, SLOT(on_delete_decoder(int))); connect(&show_hide_mapper_, SIGNAL(mapped(int)), this, SLOT(on_show_hide_decoder(int))); + + connect(&delayed_trace_updater_, SIGNAL(timeout()), + this, SLOT(on_delayed_trace_update())); + delayed_trace_updater_.setSingleShot(true); + delayed_trace_updater_.setInterval(1000 / MaxTraceUpdateRate); } bool DecodeTrace::enabled() const @@ -305,8 +311,7 @@ void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) init_state_map_.clear(); decoder_forms_.clear(); - const list< shared_ptr >& stack = - decode_signal_->decoder_stack_list(); + const vector< shared_ptr > &stack = decode_signal_->decoder_stack(); if (stack.empty()) { QLabel *const l = new QLabel( @@ -594,49 +599,24 @@ void DecodeTrace::draw_error(QPainter &p, const QString &message, p.drawText(text_rect, message); } -void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left, - int right) const +void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left, int right) const { using namespace pv::data; using pv::data::decode::Decoder; double samples_per_pixel, pixels_offset; - shared_ptr decoder_stack = base_->decoder_stack(); - - assert(decoder_stack); - - shared_ptr data; - shared_ptr signalbase; - - const list< shared_ptr > &stack = decoder_stack->stack(); - - // We get the logic data of the first channel in the list. - // This works because we are currently assuming all - // LogicSignals have the same data/segment - for (const shared_ptr &dec : stack) - if (dec && !dec->channels().empty() && - ((signalbase = (*dec->channels().begin()).second)) && - ((data = signalbase->logic_data()))) - break; - - if (!data || data->logic_segments().empty()) - return; - - const shared_ptr segment = data->logic_segments().front(); - assert(segment); - const int64_t sample_count = (int64_t)segment->get_sample_count(); + const int64_t sample_count = decode_signal_->get_working_sample_count(); if (sample_count == 0) return; - const int64_t samples_decoded = decoder_stack->samples_decoded(); + const int64_t samples_decoded = decode_signal_->get_decoded_sample_count(); if (sample_count == samples_decoded) return; const int y = get_visual_y(); - tie(pixels_offset, samples_per_pixel) = - get_pixels_offset_samples_per_pixel(); + tie(pixels_offset, samples_per_pixel) = get_pixels_offset_samples_per_pixel(); const double start = max(samples_decoded / samples_per_pixel - pixels_offset, left - 1.0); @@ -655,10 +635,7 @@ void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left, pair DecodeTrace::get_pixels_offset_samples_per_pixel() const { - shared_ptr decoder_stack = base_->decoder_stack(); - assert(owner_); - assert(decoder_stack); const View *view = owner_->view(); assert(view); @@ -667,9 +644,9 @@ pair DecodeTrace::get_pixels_offset_samples_per_pixel() const assert(scale > 0); const double pixels_offset = - ((view->offset() - decoder_stack->start_time()) / scale).convert_to(); + ((view->offset() - decode_signal_->start_time()) / scale).convert_to(); - double samplerate = decoder_stack->samplerate(); + double samplerate = decode_signal_->samplerate(); // Show sample rate as 1Hz when it is unknown if (samplerate == 0.0) @@ -727,10 +704,7 @@ const QString DecodeTrace::get_annotation_at_point(const QPoint &point) vector annotations; - shared_ptr decoder_stack = base_->decoder_stack(); - - assert(decoder_stack); - decoder_stack->get_annotation_subset(annotations, visible_rows_[row], + decode_signal_->get_annotation_subset(annotations, visible_rows_[row], sample_range.first, sample_range.second); return (annotations.empty()) ? @@ -808,7 +782,7 @@ void DecodeTrace::create_decoder_form(int index, QFormLayout *const decoder_form = new QFormLayout; group->add_layout(decoder_form); - const list channels = decode_signal_->get_channels(); + const vector channels = decode_signal_->get_channels(); // Add the channels for (DecodeChannel ch : channels) { @@ -839,11 +813,9 @@ void DecodeTrace::create_decoder_form(int index, .arg(ch.name, ch.desc, required_flag), hlayout); } - shared_ptr decoder_stack = base_->decoder_stack(); - // Add the options shared_ptr binding( - new binding::Decoder(decoder_stack, dec)); + new binding::Decoder(decode_signal_, dec)); binding->add_properties_to_form(decoder_form, true); bindings_.push_back(binding); @@ -902,6 +874,18 @@ QComboBox* DecodeTrace::create_channel_selector_init_state(QWidget *parent, } void DecodeTrace::on_new_annotations() +{ + if (!delayed_trace_updater_.isActive()) + delayed_trace_updater_.start(); +} + +void DecodeTrace::on_delayed_trace_update() +{ + if (owner_) + owner_->row_item_appearance_changed(false, true); +} + +void DecodeTrace::on_decode_finished() { if (owner_) owner_->row_item_appearance_changed(false, true);