X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fdecodetrace.cpp;h=164c7e5a6075fc719a9cc3e9c117e309ecf37ff8;hp=b4201dd9c022005ce50d673c9ebc6747ee6c6d0a;hb=067bb62415847791709f4c3cad8bb252a63f45f8;hpb=04394ded8776d2163c1e815ccc8170b81d76b028 diff --git a/pv/view/decodetrace.cpp b/pv/view/decodetrace.cpp index b4201dd9..164c7e5a 100644 --- a/pv/view/decodetrace.cpp +++ b/pv/view/decodetrace.cpp @@ -14,8 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * along with this program; if not, see . */ extern "C" { @@ -50,7 +49,6 @@ extern "C" { #include #include #include -#include #include #include #include @@ -68,12 +66,14 @@ using std::map; using std::min; using std::pair; using std::shared_ptr; +using std::make_shared; using std::tie; using std::unordered_set; using std::vector; namespace pv { -namespace view { +namespace views { +namespace TraceView { const QColor DecodeTrace::DecodeColours[4] = { QColor(0xEF, 0x29, 0x29), // Red @@ -129,27 +129,25 @@ const QColor DecodeTrace::OutlineColours[16] = { }; DecodeTrace::DecodeTrace(pv::Session &session, - shared_ptr signalbase, - std::shared_ptr decoder_stack, int index) : + shared_ptr signalbase, int index) : Trace(signalbase), session_(session), - signalbase_(signalbase), - decoder_stack_(decoder_stack), row_height_(0), max_visible_rows_(0), delete_mapper_(this), show_hide_mapper_(this) { - assert(decoder_stack_); + std::shared_ptr decoder_stack = + base_->decoder_stack(); // Determine shortest string we want to see displayed in full QFontMetrics m(QApplication::font()); min_useful_label_width_ = m.width("XX"); // e.g. two hex characters - signalbase_->set_name(QString::fromUtf8(decoder_stack->stack().front()->decoder()->name)); - signalbase_->set_colour(DecodeColours[index % countof(DecodeColours)]); + base_->set_name(QString::fromUtf8(decoder_stack->stack().front()->decoder()->name)); + base_->set_colour(DecodeColours[index % countof(DecodeColours)]); - connect(decoder_stack_.get(), SIGNAL(new_decode_data()), + connect(decoder_stack.get(), SIGNAL(new_decode_data()), this, SLOT(on_new_decode_data())); connect(&delete_mapper_, SIGNAL(mapped(int)), this, SLOT(on_delete_decoder(int))); @@ -162,9 +160,9 @@ bool DecodeTrace::enabled() const return true; } -const std::shared_ptr& DecodeTrace::decoder() const +std::shared_ptr DecodeTrace::base() const { - return decoder_stack_; + return base_; } pair DecodeTrace::v_extents() const @@ -187,12 +185,15 @@ void DecodeTrace::paint_mid(QPainter &p, const ViewItemPaintParams &pp) { using namespace pv::data::decode; + std::shared_ptr decoder_stack = + base_->decoder_stack(); + const int text_height = ViewItemPaintParams::text_height(); row_height_ = (text_height * 6) / 4; const int annotation_height = (text_height * 5) / 4; - assert(decoder_stack_); - const QString err = decoder_stack_->error_message(); + assert(decoder_stack); + const QString err = decoder_stack->error_message(); if (!err.isEmpty()) { draw_unresolved_period( p, annotation_height, pp.left(), pp.right()); @@ -208,8 +209,7 @@ void DecodeTrace::paint_mid(QPainter &p, const ViewItemPaintParams &pp) pair sample_range = get_sample_range( pp.left(), pp.right()); - assert(decoder_stack_); - const vector rows(decoder_stack_->get_visible_rows()); + const vector rows(decoder_stack->get_visible_rows()); visible_rows_.clear(); for (const Row& row : rows) { @@ -232,7 +232,7 @@ void DecodeTrace::paint_mid(QPainter &p, const ViewItemPaintParams &pp) base_colour >>= 16; vector annotations; - decoder_stack_->get_annotation_subset(annotations, row, + decoder_stack->get_annotation_subset(annotations, row, sample_range.first, sample_range.second); if (!annotations.empty()) { draw_annotations(annotations, p, annotation_height, pp, y, @@ -298,9 +298,12 @@ void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) { using pv::data::decode::Decoder; + std::shared_ptr decoder_stack = + base_->decoder_stack(); + assert(form); assert(parent); - assert(decoder_stack_); + assert(decoder_stack); // Add the standard options Trace::populate_popup_form(parent, form); @@ -310,7 +313,7 @@ void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) channel_selectors_.clear(); decoder_forms_.clear(); - const list< shared_ptr >& stack = decoder_stack_->stack(); + const list< shared_ptr >& stack = decoder_stack->stack(); if (stack.empty()) { QLabel *const l = new QLabel( @@ -601,12 +604,15 @@ void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left, double samples_per_pixel, pixels_offset; - assert(decoder_stack_); + std::shared_ptr decoder_stack = + base_->decoder_stack(); + + assert(decoder_stack); shared_ptr data; shared_ptr signalbase; - const list< shared_ptr > &stack = decoder_stack_->stack(); + 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 @@ -627,7 +633,7 @@ void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left, if (sample_count == 0) return; - const int64_t samples_decoded = decoder_stack_->samples_decoded(); + const int64_t samples_decoded = decoder_stack->samples_decoded(); if (sample_count == samples_decoded) return; @@ -653,8 +659,11 @@ void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left, pair DecodeTrace::get_pixels_offset_samples_per_pixel() const { + std::shared_ptr decoder_stack = + base_->decoder_stack(); + assert(owner_); - assert(decoder_stack_); + assert(decoder_stack); const View *view = owner_->view(); assert(view); @@ -663,9 +672,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() - decoder_stack->start_time()) / scale).convert_to(); - double samplerate = decoder_stack_->samplerate(); + double samplerate = decoder_stack->samplerate(); // Show sample rate as 1Hz when it is unknown if (samplerate == 0.0) @@ -723,8 +732,11 @@ const QString DecodeTrace::get_annotation_at_point(const QPoint &point) vector annotations; - assert(decoder_stack_); - decoder_stack_->get_annotation_subset(annotations, visible_rows_[row], + std::shared_ptr decoder_stack = + base_->decoder_stack(); + + assert(decoder_stack); + decoder_stack->get_annotation_subset(annotations, visible_rows_[row], sample_range.first, sample_range.second); return (annotations.empty()) ? @@ -829,9 +841,12 @@ void DecodeTrace::create_decoder_form(int index, channel_selectors_.push_back(s); } + std::shared_ptr decoder_stack = + base_->decoder_stack(); + // Add the options shared_ptr binding( - new binding::Decoder(decoder_stack_, dec)); + new binding::Decoder(decoder_stack, dec)); binding->add_properties_to_form(decoder_form, true); bindings_.push_back(binding); @@ -846,15 +861,15 @@ QComboBox* DecodeTrace::create_channel_selector( { assert(dec); - const auto sigs(session_.signals()); + const auto sigs(session_.signalbases()); - vector< shared_ptr > sig_list(sigs.begin(), sigs.end()); + vector< shared_ptr > sig_list(sigs.begin(), sigs.end()); std::sort(sig_list.begin(), sig_list.end(), - [](const shared_ptr &a, const shared_ptr b) { - return strnatcasecmp(a->base()->name().toStdString(), - b->base()->name().toStdString()) < 0; }); + [](const shared_ptr &a, + const shared_ptr &b) { + return strnatcasecmp(a->name().toStdString(), + b->name().toStdString()) < 0; }); - assert(decoder_stack_); const auto channel_iter = dec->channels().find(pdch); QComboBox *selector = new QComboBox(parent); @@ -864,14 +879,14 @@ QComboBox* DecodeTrace::create_channel_selector( if (channel_iter == dec->channels().end()) selector->setCurrentIndex(0); - for (const shared_ptr &s : sig_list) { - assert(s); - if (s->base()->type() == sigrok::ChannelType::LOGIC && s->enabled()) { - selector->addItem(s->base()->name(), - qVariantFromValue((void*)s->base().get())); + for (const shared_ptr &b : sig_list) { + assert(b); + if (b->type() == sigrok::ChannelType::LOGIC && b->enabled()) { + selector->addItem(b->name(), + qVariantFromValue((void*)b.get())); if (channel_iter != dec->channels().end() && - (*channel_iter).second == s->base()) + (*channel_iter).second == b) selector->setCurrentIndex( selector->count() - 1); } @@ -886,7 +901,8 @@ void DecodeTrace::commit_decoder_channels(shared_ptr &dec map > channel_map; - const unordered_set< shared_ptr > sigs(session_.signals()); + const unordered_set< shared_ptr > + sigs(session_.signalbases()); for (const ChannelSelector &s : channel_selectors_) { if (s.decoder_ != dec) @@ -896,9 +912,9 @@ void DecodeTrace::commit_decoder_channels(shared_ptr &dec (data::SignalBase*)s.combo_->itemData( s.combo_->currentIndex()).value(); - for (shared_ptr sig : sigs) - if (sig->base().get() == selection) { - channel_map[s.pdch_] = sig->base(); + for (shared_ptr sig : sigs) + if (sig.get() == selection) { + channel_map[s.pdch_] = sig; break; } } @@ -908,11 +924,14 @@ void DecodeTrace::commit_decoder_channels(shared_ptr &dec void DecodeTrace::commit_channels() { - assert(decoder_stack_); - for (shared_ptr dec : decoder_stack_->stack()) + std::shared_ptr decoder_stack = + base_->decoder_stack(); + + assert(decoder_stack); + for (shared_ptr dec : decoder_stack->stack()) commit_decoder_channels(dec); - decoder_stack_->begin_decode(); + decoder_stack->begin_decode(); } void DecodeTrace::on_new_decode_data() @@ -928,7 +947,7 @@ void DecodeTrace::delete_pressed() void DecodeTrace::on_delete() { - session_.remove_decode_signal(this); + session_.remove_decode_signal(base_); } void DecodeTrace::on_channel_selected(int) @@ -938,30 +957,38 @@ void DecodeTrace::on_channel_selected(int) void DecodeTrace::on_stack_decoder(srd_decoder *decoder) { + std::shared_ptr decoder_stack = + base_->decoder_stack(); + assert(decoder); - assert(decoder_stack_); - decoder_stack_->push(shared_ptr( - new data::decode::Decoder(decoder))); - decoder_stack_->begin_decode(); + assert(decoder_stack); + decoder_stack->push(make_shared(decoder)); + decoder_stack->begin_decode(); create_popup_form(); } void DecodeTrace::on_delete_decoder(int index) { - decoder_stack_->remove(index); + std::shared_ptr decoder_stack = + base_->decoder_stack(); + + decoder_stack->remove(index); // Update the popup create_popup_form(); - decoder_stack_->begin_decode(); + decoder_stack->begin_decode(); } void DecodeTrace::on_show_hide_decoder(int index) { using pv::data::decode::Decoder; - const list< shared_ptr > stack(decoder_stack_->stack()); + std::shared_ptr decoder_stack = + base_->decoder_stack(); + + const list< shared_ptr > stack(decoder_stack->stack()); // Find the decoder in the stack auto iter = stack.cbegin(); @@ -981,5 +1008,6 @@ void DecodeTrace::on_show_hide_decoder(int index) owner_->row_item_appearance_changed(false, true); } -} // namespace view +} // namespace TraceView +} // namespace views } // namespace pv