From 556259d2d0a212c20db9b18311b9524b52401a56 Mon Sep 17 00:00:00 2001 From: Soeren Apel Date: Wed, 22 Aug 2018 09:33:48 +0200 Subject: [PATCH] Implement decode pausing/resuming --- icons/media-playback-pause.png | Bin 0 -> 655 bytes icons/media-playback-start.png | Bin 0 -> 961 bytes pv/data/decodesignal.cpp | 27 +++++++++++++++++++++++++++ pv/data/decodesignal.hpp | 10 ++++++++-- pv/views/trace/decodetrace.cpp | 30 ++++++++++++++++++++++++++++-- pv/views/trace/decodetrace.hpp | 1 + 6 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 icons/media-playback-pause.png create mode 100644 icons/media-playback-start.png diff --git a/icons/media-playback-pause.png b/icons/media-playback-pause.png new file mode 100644 index 0000000000000000000000000000000000000000..ee40fc266ff1e5baef490110ed2aa7b7f6493197 GIT binary patch literal 655 zcmV;A0&x9_P)bm~*&FkqMX5J;%TC)&hcsf0U zl+q==eDy-5X-dWzXstO2g5-31R+0Mb`O~J>n&W*h8$HUAq!h~wD$f1KhZNnC)4DrxbCFilgtzwbaC$Gn#~ z%Q7Y+5Mk{xZ&S;nX_~UvR4{Kreyn0emStQjkurdg(kYLVgaIJWbEkN*T;SLI2WZ3W z$121{QMka>qD|mYPDLt z!FX0E1m!^@!eB7iKNZ8_&;|0WSsA5vyKMnrG#c5hr$q(h=U0d)lZh2V%pN^?kof?m zl)ZU$bOiw8@tCc(KOa86U%4ytyty2Y$9C`S#>|b?Y84q{Dw7|EAxBYUh-l8t4P#8S pTCFOWD2g}?!zB?dt{;q@^#^0ynjy&$AqM~e002ovPDHLkV1hVYBZL3| literal 0 HcmV?d00001 diff --git a/icons/media-playback-start.png b/icons/media-playback-start.png new file mode 100644 index 0000000000000000000000000000000000000000..10102d829cd4a82c14aa3bd7d3a56a2f5c35dff0 GIT binary patch literal 961 zcmV;y13vtTP)b z)!%CrR}=^E@41uN*~~861ncT5ZIj(it&JE<-zq{O)DUb7hFW9Pg7u~9i}(vc1O>s` zE*NWDY8zr&v;FZ8l-efo7otg4Z9yyOQz@BEvYTXflkDuwj&pp7yX@u{snr7q?tPfg z+!me;?&YUSCk-@7}AC<$Pc7upnNE+l|g zH@9rcGBaB_i__z2KJ#U((XzEUzV7X{I{^d%_==yIE9ZmgsCO19%01`qc2?u*O4)I8RKDvu)da=dU}?j*maeG<~o!8VCg51h5Q%Yc{x~ z#%{NJX8jnL%uK+@8hCBR3Oe^qTlvMV-!>_3<-L@yM|yAc|LpVm#)J@~x~@Mew5qrl zwY9aO)oWJW`ziX1k{nHdo;0(h+mZ}b^}sSsw0E={y?r+mW69KEP19})Ax4QP9gD@d zWW}LS$jOf-NdkdNU}lE>D2Fk91TI;@u1|KCH*IWs`OFusZHr#4?9WVQ_Y=_ofI(3V z2ZKQ;59MrYDsxk5nps$u3EQ^eI1aLA2Bw)sU}*pwHoWW3+16V=pSm;{3^Fk7I}U|H z&Tujg01yx$As~oAL;z8K*^p%y%H1loxP~Ks0@u{k z6lyGpAfCXIBtb5d0RY`S-PR8mzBfD`@9}+m4|b}mnhJ-*7N$iBTvb(7fE~vH5kZzE zxMUX|Jbd6pBA=O(Bwg6nvi;MBhK3;knd#uHu%al1u@C|t)eAk9LTl@3BOV{ lock(output_mutex_); @@ -981,6 +1003,11 @@ void DecodeSignal::decode_data( // Notify the frontend that we processed some data and // possibly have new annotations as well new_annotations(); + + if (decode_paused_) { + unique_lock pause_wait_lock(decode_pause_mutex_); + decode_pause_cond_.wait(pause_wait_lock); + } } } diff --git a/pv/data/decodesignal.hpp b/pv/data/decodesignal.hpp index f00a9f1c..ba9c9b5e 100644 --- a/pv/data/decodesignal.hpp +++ b/pv/data/decodesignal.hpp @@ -101,6 +101,9 @@ public: void reset_decode(bool shutting_down = false); void begin_decode(); + void pause_decode(); + void resume_decode(); + bool is_paused() const; QString error_message() const; const vector get_channels() const; @@ -215,12 +218,15 @@ private: vector segments_; uint32_t current_segment_id_; - mutable mutex input_mutex_, output_mutex_, logic_mux_mutex_; - mutable condition_variable decode_input_cond_, logic_mux_cond_; + mutable mutex input_mutex_, output_mutex_, decode_pause_mutex_, logic_mux_mutex_; + mutable condition_variable decode_input_cond_, decode_pause_cond_, + logic_mux_cond_; std::thread decode_thread_, logic_mux_thread_; atomic decode_interrupt_, logic_mux_interrupt_; + bool decode_paused_; + QString error_message_; }; diff --git a/pv/views/trace/decodetrace.cpp b/pv/views/trace/decodetrace.cpp index 651b8c3d..574e9d1a 100644 --- a/pv/views/trace/decodetrace.cpp +++ b/pv/views/trace/decodetrace.cpp @@ -341,15 +341,33 @@ QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos) QMenu *const menu = new QMenu(parent); + if (decode_signal_->is_paused()) { + QAction *const resume = + new QAction(tr("Resume decoding"), this); + resume->setIcon(QIcon::fromTheme("media-playback-start", + QIcon(":/icons/media-playback-start.png"))); + connect(resume, SIGNAL(triggered()), this, SLOT(on_pause_decode())); + menu->addAction(resume); + } else { + QAction *const pause = + new QAction(tr("Pause decoding"), this); + pause->setIcon(QIcon::fromTheme("media-playback-pause", + QIcon(":/icons/media-playback-pause.png"))); + connect(pause, SIGNAL(triggered()), this, SLOT(on_pause_decode())); + menu->addAction(pause); + } + + menu->addSeparator(); + QAction *const export_all_rows = - new QAction(tr("Export all annotations"), this); + new QAction(tr("Export all annotations"), this); export_all_rows->setIcon(QIcon::fromTheme("document-save-as", QIcon(":/icons/document-save-as.png"))); connect(export_all_rows, SIGNAL(triggered()), this, SLOT(on_export_all_rows())); menu->addAction(export_all_rows); QAction *const export_row = - new QAction(tr("Export all annotations for this row"), this); + new QAction(tr("Export all annotations for this row"), this); export_row->setIcon(QIcon::fromTheme("document-save-as", QIcon(":/icons/document-save-as.png"))); connect(export_row, SIGNAL(triggered()), this, SLOT(on_export_row())); @@ -1037,6 +1055,14 @@ void DecodeTrace::on_decode_finished() owner_->row_item_appearance_changed(false, true); } +void DecodeTrace::on_pause_decode() +{ + if (decode_signal_->is_paused()) + decode_signal_->resume_decode(); + else + decode_signal_->pause_decode(); +} + void DecodeTrace::delete_pressed() { on_delete(); diff --git a/pv/views/trace/decodetrace.hpp b/pv/views/trace/decodetrace.hpp index 9372f7af..57e46220 100644 --- a/pv/views/trace/decodetrace.hpp +++ b/pv/views/trace/decodetrace.hpp @@ -187,6 +187,7 @@ private Q_SLOTS: void on_delayed_trace_update(); void on_decode_reset(); void on_decode_finished(); + void on_pause_decode(); void on_delete(); -- 2.30.2