X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fview%2Fdecodetrace.cpp;h=1a629f2c182dbc0bee782ddbbb3feb6acc8726e0;hb=f3f98f8fade1cffb28161da2710dfc9def5e6d74;hp=bad849c04665b2c53680836f610fdd329bc8ccd8;hpb=613d097c5af2d12ffd68e2dfab309b518edca1a6;p=pulseview.git diff --git a/pv/view/decodetrace.cpp b/pv/view/decodetrace.cpp index bad849c0..1a629f2c 100644 --- a/pv/view/decodetrace.cpp +++ b/pv/view/decodetrace.cpp @@ -38,6 +38,8 @@ extern "C" { #include #include #include +#include +#include #include #include #include @@ -58,6 +60,7 @@ const QColor DecodeTrace::DecodeColours[4] = { }; const QColor DecodeTrace::ErrorBgColour = QColor(0xEF, 0x29, 0x29); +const QColor DecodeTrace::NoDecodeColour = QColor(0x88, 0x8A, 0x85); DecodeTrace::DecodeTrace(pv::SigSession &session, boost::shared_ptr decoder_stack, int index) : @@ -93,6 +96,7 @@ void DecodeTrace::set_view(pv::view::View *view) void DecodeTrace::paint_back(QPainter &p, int left, int right) { + Trace::paint_back(p, left, right); paint_axis(p, get_y(), left, right); } @@ -100,20 +104,10 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) { using namespace pv::view::decode; - assert(_decoder_stack); - const QString err = _decoder_stack->error_message(); - if (!err.isEmpty()) { - draw_error(p, err, left, right); - return; - } - - assert(_view); - const int y = get_y(); - const double scale = _view->scale(); assert(scale > 0); - double samplerate = _decoder_stack->get_samplerate(); + double samplerate = _decoder_stack->samplerate(); // Show sample rate as 1Hz when it is unknown if (samplerate == 0.0) @@ -123,13 +117,31 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) _decoder_stack->get_start_time()) / scale; const double samples_per_pixel = samplerate * scale; + const int h = (_text_size.height() * 5) / 4; + + assert(_decoder_stack); + const QString err = _decoder_stack->error_message(); + if (!err.isEmpty()) + { + draw_error(p, err, left, right); + draw_unresolved_period(p, h, left, right, samples_per_pixel, + pixels_offset); + return; + } + + assert(_view); + const int y = get_y(); + assert(_decoder_stack); vector< shared_ptr > annotations(_decoder_stack->annotations()); BOOST_FOREACH(shared_ptr a, annotations) { assert(a); - a->paint(p, get_text_colour(), _text_size.height(), - left, right, samples_per_pixel, pixels_offset, y); + a->paint(p, get_text_colour(), h, left, right, + samples_per_pixel, pixels_offset, y); } + + draw_unresolved_period(p, h, left, right, + samples_per_pixel, pixels_offset); } void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) @@ -148,14 +160,26 @@ void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) _probe_selectors.clear(); const list< shared_ptr >& stack = _decoder_stack->stack(); - list< shared_ptr >::const_iterator iter = stack.begin(); - for (int i = 0; i < (int)stack.size(); i++, iter++) { - shared_ptr dec(*iter); - create_decoder_form(i, dec, parent, form); + + if (stack.empty()) + { + QLabel *const l = new QLabel( + tr("

No decoders in the stack

")); + l->setAlignment(Qt::AlignCenter); + form->addRow(l); } + else + { + list< shared_ptr >::const_iterator iter = + stack.begin(); + for (int i = 0; i < (int)stack.size(); i++, iter++) { + shared_ptr dec(*iter); + create_decoder_form(i, dec, parent, form); + } - form->addRow(new QLabel( - tr("* Required Probes"), parent)); + form->addRow(new QLabel( + tr("* Required Probes"), parent)); + } // Add stacking button pv::widgets::DecoderMenu *const decoder_menu = @@ -207,6 +231,58 @@ 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, double samples_per_pixel, double pixels_offset) +{ + using namespace pv::data; + using pv::data::decode::Decoder; + + assert(_decoder_stack); + + shared_ptr data; + shared_ptr logic_signal; + + const list< shared_ptr > &stack = _decoder_stack->stack(); + + // We get the logic data of the first probe in the list. + // This works because we are currently assuming all + // LogicSignals have the same data/snapshot + BOOST_FOREACH (const shared_ptr &dec, stack) + if (dec && !dec->probes().empty() && + ((logic_signal = (*dec->probes().begin()).second)) && + ((data = logic_signal->logic_data()))) + break; + + if (!data || data->get_snapshots().empty()) + return; + + const shared_ptr snapshot = + data->get_snapshots().front(); + assert(snapshot); + const int64_t sample_count = (int64_t)snapshot->get_sample_count(); + if (sample_count == 0) + return; + + const int64_t samples_decoded = _decoder_stack->samples_decoded(); + if (sample_count == samples_decoded) + return; + + const int y = get_y(); + const double start = max(samples_decoded / + samples_per_pixel - pixels_offset, left - 1.0); + const double end = min(sample_count / samples_per_pixel - + pixels_offset, right + 1.0); + const QRectF no_decode_rect(start, y - h/2 + 0.5, end - start, h); + + p.setPen(QPen(Qt::NoPen)); + p.setBrush(Qt::white); + p.drawRect(no_decode_rect); + + p.setPen(NoDecodeColour); + p.setBrush(QBrush(NoDecodeColour, Qt::Dense6Pattern)); + p.drawRect(no_decode_rect); +} + void DecodeTrace::create_decoder_form(int index, shared_ptr &dec, QWidget *parent, QFormLayout *form)