X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fsigsession.cpp;h=84c75896d42d01f60ee8e0cd1ef2e04b2d28d9f4;hb=a786bf88dfe79a47e75d8a7c04c0367a0f476f06;hp=fb457f6dcd7599003cf0d0b9981e3c07424fc507;hpb=20f81a58a9778fa7bc0dc4367f913437ed27c5e8;p=pulseview.git diff --git a/pv/sigsession.cpp b/pv/sigsession.cpp index fb457f6d..84c75896 100644 --- a/pv/sigsession.cpp +++ b/pv/sigsession.cpp @@ -82,7 +82,7 @@ using Glib::VariantBase; using Glib::Variant; namespace pv { -SigSession::SigSession(DeviceManager &device_manager) : +Session::Session(DeviceManager &device_manager) : device_manager_(device_manager), session_(device_manager.context()->create_session()), capture_state_(Stopped) @@ -90,33 +90,33 @@ SigSession::SigSession(DeviceManager &device_manager) : set_default_device(); } -SigSession::~SigSession() +Session::~Session() { // Stop and join to the thread stop_capture(); } -DeviceManager& SigSession::device_manager() +DeviceManager& Session::device_manager() { return device_manager_; } -const DeviceManager& SigSession::device_manager() const +const DeviceManager& Session::device_manager() const { return device_manager_; } -const shared_ptr& SigSession::session() const +const shared_ptr& Session::session() const { return session_; } -shared_ptr SigSession::device() const +shared_ptr Session::device() const { return device_; } -void SigSession::set_device(shared_ptr device) +void Session::set_device(shared_ptr device) { // Ensure we are not capturing before setting the device stop_capture(); @@ -137,27 +137,35 @@ void SigSession::set_device(shared_ptr device) if (session_device) session_ = session_device->parent(); - device_ = device; decode_traces_.clear(); if (device) { if (!session_device) { session_ = device_manager_.context()->create_session(); - device->open(); + + try { + device->open(); + } catch(const sigrok::Error &e) { + throw QString(e.what()); + } + session_->add_device(device); } + + device_ = device; session_->add_datafeed_callback([=] (shared_ptr device, shared_ptr packet) { data_feed_in(device, packet); }); update_signals(device); - } + } else + device_ = nullptr; device_selected(); } -void SigSession::set_file(const string &name) +void Session::set_file(const string &name) { session_ = device_manager_.context()->load_session(name); device_ = session_->devices()[0]; @@ -171,7 +179,7 @@ void SigSession::set_file(const string &name) device_selected(); } -void SigSession::set_default_device() +void Session::set_default_device() { shared_ptr default_device; const list< shared_ptr > &devices = @@ -192,13 +200,13 @@ void SigSession::set_default_device() } } -SigSession::capture_state SigSession::get_capture_state() const +Session::capture_state Session::get_capture_state() const { lock_guard lock(sampling_mutex_); return capture_state_; } -void SigSession::start_capture(function error_handler) +void Session::start_capture(function error_handler) { stop_capture(); @@ -220,11 +228,11 @@ void SigSession::start_capture(function error_handler) // Begin the session sampling_thread_ = std::thread( - &SigSession::sample_thread_proc, this, device_, + &Session::sample_thread_proc, this, device_, error_handler); } -void SigSession::stop_capture() +void Session::stop_capture() { if (get_capture_state() != Stopped) session_->stop(); @@ -234,7 +242,7 @@ void SigSession::stop_capture() sampling_thread_.join(); } -set< shared_ptr > SigSession::get_data() const +set< shared_ptr > Session::get_data() const { shared_lock lock(signals_mutex_); set< shared_ptr > data; @@ -246,18 +254,18 @@ set< shared_ptr > SigSession::get_data() const return data; } -boost::shared_mutex& SigSession::signals_mutex() const +boost::shared_mutex& Session::signals_mutex() const { return signals_mutex_; } -const vector< shared_ptr >& SigSession::signals() const +const vector< shared_ptr >& Session::signals() const { return signals_; } #ifdef ENABLE_DECODE -bool SigSession::add_decoder(srd_decoder *const dec) +bool Session::add_decoder(srd_decoder *const dec) { map > channels; shared_ptr decoder_stack; @@ -313,13 +321,13 @@ bool SigSession::add_decoder(srd_decoder *const dec) return true; } -vector< shared_ptr > SigSession::get_decode_signals() const +vector< shared_ptr > Session::get_decode_signals() const { shared_lock lock(signals_mutex_); return decode_traces_; } -void SigSession::remove_decode_signal(view::DecodeTrace *signal) +void Session::remove_decode_signal(view::DecodeTrace *signal) { for (auto i = decode_traces_.begin(); i != decode_traces_.end(); i++) if ((*i).get() == signal) @@ -331,7 +339,7 @@ void SigSession::remove_decode_signal(view::DecodeTrace *signal) } #endif -void SigSession::set_capture_state(capture_state state) +void Session::set_capture_state(capture_state state) { lock_guard lock(sampling_mutex_); const bool changed = capture_state_ != state; @@ -340,7 +348,7 @@ void SigSession::set_capture_state(capture_state state) capture_state_changed(state); } -void SigSession::update_signals(shared_ptr device) +void Session::update_signals(shared_ptr device) { assert(device); assert(capture_state_ == Stopped); @@ -407,7 +415,7 @@ void SigSession::update_signals(shared_ptr device) signals_changed(); } -shared_ptr SigSession::signal_from_channel( +shared_ptr Session::signal_from_channel( shared_ptr channel) const { lock_guard lock(signals_mutex_); @@ -419,10 +427,14 @@ shared_ptr SigSession::signal_from_channel( return shared_ptr(); } -void SigSession::read_sample_rate(shared_ptr device) +void Session::read_sample_rate(shared_ptr device) { - uint64_t sample_rate = VariantBase::cast_dynamic>( - device->config_get(ConfigKey::SAMPLERATE)).get(); + const auto keys = device_->config_keys(ConfigKey::DEVICE_OPTIONS); + const auto iter = keys.find(ConfigKey::SAMPLERATE); + const uint64_t sample_rate = (iter != keys.end() && + (*iter).second.find(sigrok::GET) != (*iter).second.end()) ? + VariantBase::cast_dynamic>( + device->config_get(ConfigKey::SAMPLERATE)).get() : 0; // Set the sample rate of all data const set< shared_ptr > data_set = get_data(); @@ -432,7 +444,7 @@ void SigSession::read_sample_rate(shared_ptr device) } } -void SigSession::sample_thread_proc(shared_ptr device, +void Session::sample_thread_proc(shared_ptr device, function error_handler) { assert(device); @@ -461,12 +473,12 @@ void SigSession::sample_thread_proc(shared_ptr device, } } -void SigSession::feed_in_header(shared_ptr device) +void Session::feed_in_header(shared_ptr device) { read_sample_rate(device); } -void SigSession::feed_in_meta(shared_ptr device, +void Session::feed_in_meta(shared_ptr device, shared_ptr meta) { (void)device; @@ -485,13 +497,13 @@ void SigSession::feed_in_meta(shared_ptr device, signals_changed(); } -void SigSession::feed_in_frame_begin() +void Session::feed_in_frame_begin() { if (cur_logic_snapshot_ || !cur_analog_snapshots_.empty()) frame_began(); } -void SigSession::feed_in_logic(shared_ptr logic) +void Session::feed_in_logic(shared_ptr logic) { lock_guard lock(data_mutex_); @@ -507,13 +519,14 @@ void SigSession::feed_in_logic(shared_ptr logic) set_capture_state(Running); // Get sample limit. - uint64_t sample_limit; - try { - sample_limit = VariantBase::cast_dynamic>( - device_->config_get(ConfigKey::LIMIT_SAMPLES)).get(); - } catch (Error) { - sample_limit = 0; - } + const auto keys = device_->config_keys( + ConfigKey::DEVICE_OPTIONS); + const auto iter = keys.find(ConfigKey::LIMIT_SAMPLES); + const uint64_t sample_limit = (iter != keys.end() && + (*iter).second.find(sigrok::GET) != + (*iter).second.end()) ? + VariantBase::cast_dynamic>( + device_->config_get(ConfigKey::LIMIT_SAMPLES)).get() : 0; // Create a new data snapshot cur_logic_snapshot_ = shared_ptr( @@ -535,7 +548,7 @@ void SigSession::feed_in_logic(shared_ptr logic) data_received(); } -void SigSession::feed_in_analog(shared_ptr analog) +void Session::feed_in_analog(shared_ptr analog) { lock_guard lock(data_mutex_); @@ -603,7 +616,7 @@ void SigSession::feed_in_analog(shared_ptr analog) data_received(); } -void SigSession::data_feed_in(shared_ptr device, shared_ptr packet) +void Session::data_feed_in(shared_ptr device, shared_ptr packet) { assert(device); assert(packet);