From 5b7cf66c34d7beeef055b06b95d72f9d7a3de680 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Sun, 2 Dec 2012 16:25:13 +0000 Subject: [PATCH] Added proof of concept start/stop support --- pv/mainwindow.cpp | 16 ++++++++++++---- pv/sigsession.cpp | 36 ++++++++++++++++++++++++++++++++---- pv/sigsession.h | 13 +++++++++++++ 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index c8c091d8..f1493667 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -184,10 +184,18 @@ void MainWindow::on_actionAbout_triggered() void MainWindow::run_stop() { - _session.start_capture( - _sampling_bar->get_selected_device(), - _sampling_bar->get_record_length(), - _sampling_bar->get_sample_rate()); + switch(_session.get_capture_state()) { + case SigSession::Stopped: + _session.start_capture( + _sampling_bar->get_selected_device(), + _sampling_bar->get_record_length(), + _sampling_bar->get_sample_rate()); + break; + + case SigSession::Running: + _session.stop_capture(); + break; + } } } // namespace pv diff --git a/pv/sigsession.cpp b/pv/sigsession.cpp index abe9b2da..580b6796 100644 --- a/pv/sigsession.cpp +++ b/pv/sigsession.cpp @@ -36,7 +36,8 @@ namespace pv { // TODO: This should not be necessary SigSession* SigSession::_session = NULL; -SigSession::SigSession() +SigSession::SigSession() : + _capture_state(Stopped) { // TODO: This should not be necessary _session = this; @@ -44,6 +45,8 @@ SigSession::SigSession() SigSession::~SigSession() { + stop_capture(); + if(_sampling_thread.get()) _sampling_thread->join(); _sampling_thread.reset(); @@ -63,18 +66,38 @@ void SigSession::load_file(const std::string &name) } } +SigSession::capture_state SigSession::get_capture_state() const +{ + lock_guard lock(_state_mutex); + return _capture_state; +} + void SigSession::start_capture(struct sr_dev_inst *sdi, uint64_t record_length, uint64_t sample_rate) { - // Check sampling isn't already active - if(_sampling_thread.get()) - _sampling_thread->join(); + stop_capture(); + _sampling_thread.reset(new boost::thread( &SigSession::sample_thread_proc, this, sdi, record_length, sample_rate)); } +void SigSession::stop_capture() +{ + if(get_capture_state() == Stopped) + return; + + sr_session_stop(); + + // Check that sampling stopped + if(_sampling_thread.get()) + _sampling_thread->join(); + _sampling_thread.reset(); + + _capture_state = Stopped; +} + vector< shared_ptr > SigSession::get_signals() { lock_guard lock(_signals_mutex); @@ -117,6 +140,11 @@ void SigSession::sample_thread_proc(struct sr_dev_inst *sdi, return; } + { + lock_guard lock(_state_mutex); + _capture_state = Running; + } + sr_session_run(); sr_session_destroy(); } diff --git a/pv/sigsession.h b/pv/sigsession.h index 307330ec..8da89d09 100644 --- a/pv/sigsession.h +++ b/pv/sigsession.h @@ -47,6 +47,12 @@ class SigSession : public QObject { Q_OBJECT +public: + enum capture_state { + Stopped, + Running + }; + public: SigSession(); @@ -54,9 +60,13 @@ public: void load_file(const std::string &name); + capture_state get_capture_state() const; + void start_capture(struct sr_dev_inst* sdi, uint64_t record_length, uint64_t sample_rate); + void stop_capture(); + std::vector< boost::shared_ptr > get_signals(); @@ -73,6 +83,9 @@ private: struct sr_datafeed_packet *packet); private: + mutable boost::mutex _state_mutex; + capture_state _capture_state; + mutable boost::mutex _signals_mutex; std::vector< boost::shared_ptr > _signals; -- 2.30.2