From 99ba5f2845a24f91901addb80c04d5bf0e0906f3 Mon Sep 17 00:00:00 2001 From: Soeren Apel Date: Fri, 10 Aug 2018 20:08:36 +0200 Subject: [PATCH] DecodeTrace: Implement annotation export for cursor range --- pv/views/trace/decodetrace.cpp | 90 +++++++++++++++++++++++++++++++--- pv/views/trace/decodetrace.hpp | 4 +- 2 files changed, 87 insertions(+), 7 deletions(-) diff --git a/pv/views/trace/decodetrace.cpp b/pv/views/trace/decodetrace.cpp index dd964b5..be7ac04 100644 --- a/pv/views/trace/decodetrace.cpp +++ b/pv/views/trace/decodetrace.cpp @@ -21,7 +21,7 @@ extern "C" { #include } -#include +#include #include #include @@ -60,6 +60,7 @@ using std::abs; using std::make_pair; using std::max; using std::min; +using std::numeric_limits; using std::out_of_range; using std::pair; using std::shared_ptr; @@ -333,9 +334,10 @@ QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos) selected_row_ = nullptr; } + // Default sample range is "from here" const pair sample_range = get_sample_range(click_pos.x(), click_pos.x() + 1); - selected_samplepos_ = sample_range.first; + selected_sample_range_ = make_pair(sample_range.first, numeric_limits::max()); QMenu *const menu = new QMenu(parent); @@ -369,6 +371,30 @@ QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos) connect(export_row_from_here, SIGNAL(triggered()), this, SLOT(on_export_row_from_here())); menu->addAction(export_row_from_here); + menu->addSeparator(); + + QAction *const export_all_rows_with_cursor = + new QAction(tr("Export all annotations within cursor range"), this); + export_all_rows_with_cursor->setIcon(QIcon::fromTheme("document-save-as", + QIcon(":/icons/document-save-as.png"))); + connect(export_all_rows_with_cursor, SIGNAL(triggered()), this, SLOT(on_export_all_rows_with_cursor())); + menu->addAction(export_all_rows_with_cursor); + + QAction *const export_row_with_cursor = + new QAction(tr("Export annotations for this row within cursor range"), this); + export_row_with_cursor->setIcon(QIcon::fromTheme("document-save-as", + QIcon(":/icons/document-save-as.png"))); + connect(export_row_with_cursor, SIGNAL(triggered()), this, SLOT(on_export_row_with_cursor())); + menu->addAction(export_row_with_cursor); + + const View *view = owner_->view(); + assert(view); + + if (!view->cursors()->enabled()) { + export_all_rows_with_cursor->setEnabled(false); + export_row_with_cursor->setEnabled(false); + } + return menu; } @@ -1092,13 +1118,65 @@ void DecodeTrace::on_show_hide_decoder(int index) void DecodeTrace::on_export_row() { - selected_samplepos_ = 0; + selected_sample_range_ = make_pair(0, numeric_limits::max()); on_export_row_from_here(); } void DecodeTrace::on_export_all_rows() { - selected_samplepos_ = 0; + selected_sample_range_ = make_pair(0, numeric_limits::max()); + on_export_all_rows_from_here(); +} + +void DecodeTrace::on_export_row_with_cursor() +{ + const View *view = owner_->view(); + assert(view); + + if (!view->cursors()->enabled()) + return; + + const double samplerate = session_.get_samplerate(); + + const pv::util::Timestamp& start_time = view->cursors()->first()->time(); + const pv::util::Timestamp& end_time = view->cursors()->second()->time(); + + const uint64_t start_sample = (uint64_t)max( + (double)0, start_time.convert_to() * samplerate); + const uint64_t end_sample = (uint64_t)max( + (double)0, end_time.convert_to() * samplerate); + + // Are both cursors negative and thus were clamped to 0? + if ((start_sample == 0) && (end_sample == 0)) + return; + + selected_sample_range_ = make_pair(start_sample, end_sample); + on_export_row_from_here(); +} + +void DecodeTrace::on_export_all_rows_with_cursor() +{ + const View *view = owner_->view(); + assert(view); + + if (!view->cursors()->enabled()) + return; + + const double samplerate = session_.get_samplerate(); + + const pv::util::Timestamp& start_time = view->cursors()->first()->time(); + const pv::util::Timestamp& end_time = view->cursors()->second()->time(); + + const uint64_t start_sample = (uint64_t)max( + (double)0, start_time.convert_to() * samplerate); + const uint64_t end_sample = (uint64_t)max( + (double)0, end_time.convert_to() * samplerate); + + // Are both cursors negative and thus were clamped to 0? + if ((start_sample == 0) && (end_sample == 0)) + return; + + selected_sample_range_ = make_pair(start_sample, end_sample); on_export_all_rows_from_here(); } @@ -1112,7 +1190,7 @@ void DecodeTrace::on_export_row_from_here() vector *annotations = new vector(); decode_signal_->get_annotation_subset(*annotations, *selected_row_, - current_segment_, selected_samplepos_, ULLONG_MAX); + current_segment_, selected_sample_range_.first, selected_sample_range_.second); if (annotations->empty()) return; @@ -1128,7 +1206,7 @@ void DecodeTrace::on_export_all_rows_from_here() vector *annotations = new vector(); decode_signal_->get_annotation_subset(*annotations, current_segment_, - selected_samplepos_, ULLONG_MAX); + selected_sample_range_.first, selected_sample_range_.second); if (!annotations->empty()) export_annotations(annotations); diff --git a/pv/views/trace/decodetrace.hpp b/pv/views/trace/decodetrace.hpp index b30fc43..9372f7a 100644 --- a/pv/views/trace/decodetrace.hpp +++ b/pv/views/trace/decodetrace.hpp @@ -204,6 +204,8 @@ private Q_SLOTS: void on_export_row(); void on_export_all_rows(); + void on_export_row_with_cursor(); + void on_export_all_rows_with_cursor(); void on_export_row_from_here(); void on_export_all_rows_from_here(); @@ -218,7 +220,7 @@ private: list< shared_ptr > bindings_; data::decode::Row *selected_row_; - uint64_t selected_samplepos_; + pair selected_sample_range_; vector decoder_forms_; -- 2.30.2