X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fsession.cpp;h=08bec08e4a5f664b87c0c30f2333c603861ce9fd;hp=2cdc25f83ed0ee3c718896da9d8df98d13f34876;hb=5237f0c50352b523c6a0c3d7f931081ecdbdecaa;hpb=30d6f09f5eec0fb18d5c87347b5de6124a56a63c diff --git a/pv/session.cpp b/pv/session.cpp index 2cdc25f8..08bec08e 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -60,6 +60,7 @@ using std::lock_guard; using std::list; using std::map; using std::mutex; +using std::recursive_mutex; using std::set; using std::shared_ptr; using std::string; @@ -133,7 +134,7 @@ void Session::set_device(shared_ptr device) (shared_ptr device, shared_ptr packet) { data_feed_in(device, packet); }); - update_signals(device_); + update_signals(); decode_traces_.clear(); @@ -168,15 +169,15 @@ void Session::start_capture(function error_handler) // Check that at least one channel is enabled assert(device_); - const std::shared_ptr device = device_->device(); - assert(device); - auto channels = device->channels(); - bool enabled = std::any_of(channels.begin(), channels.end(), - [](shared_ptr channel) { return channel->enabled(); }); - - if (!enabled) { - error_handler(tr("No channels enabled.")); - return; + const shared_ptr sr_dev = device_->device(); + if (sr_dev) { + const auto channels = sr_dev->channels(); + if (!std::any_of(channels.begin(), channels.end(), + [](shared_ptr channel) { + return channel->enabled(); })) { + error_handler(tr("No channels enabled.")); + return; + } } // Begin the session @@ -301,13 +302,21 @@ void Session::set_capture_state(capture_state state) capture_state_changed(state); } -void Session::update_signals(shared_ptr device) +void Session::update_signals() { - assert(device); - assert(capture_state_ == Stopped); + assert(device_); + + lock_guard lock(data_mutex_); + + const shared_ptr sr_dev = device_->device(); + if (!sr_dev) { + signals_.clear(); + logic_data_.reset(); + return; + } // Detect what data types we will receive - auto channels = device->device()->channels(); + auto channels = sr_dev->channels(); unsigned int logic_channel_count = std::count_if( channels.begin(), channels.end(), [] (shared_ptr channel) { @@ -315,7 +324,7 @@ void Session::update_signals(shared_ptr device) // Create data containers for the logic data segments { - lock_guard data_lock(data_mutex_); + lock_guard data_lock(data_mutex_); if (logic_channel_count == 0) { logic_data_.reset(); @@ -334,7 +343,7 @@ void Session::update_signals(shared_ptr device) unordered_set< shared_ptr > prev_sigs(signals_); signals_.clear(); - for (auto channel : device->device()->channels()) { + for (auto channel : sr_dev->channels()) { shared_ptr signal; // Find the channel in the old signals @@ -357,7 +366,7 @@ void Session::update_signals(shared_ptr device) case SR_CHANNEL_LOGIC: signal = shared_ptr( new view::LogicSignal(*this, - device, channel, + device_, channel, logic_data_)); break; @@ -397,34 +406,16 @@ shared_ptr Session::signal_from_channel( return shared_ptr(); } -void Session::read_sample_rate(shared_ptr device) -{ - assert(device); - map< const ConfigKey*, set > keys; - - try { - keys = device->config_keys(ConfigKey::DEVICE_OPTIONS); - } catch (const Error) {} - - const auto iter = keys.find(ConfigKey::SAMPLERATE); - cur_samplerate_ = (iter != keys.end() && - (*iter).second.find(sigrok::GET) != (*iter).second.end()) ? - VariantBase::cast_dynamic>( - device->config_get(ConfigKey::SAMPLERATE)).get() : 0; -} - void Session::sample_thread_proc(shared_ptr device, function error_handler) { assert(device); assert(error_handler); - const std::shared_ptr sr_dev = device->device(); - assert(sr_dev); - read_sample_rate(sr_dev); + cur_samplerate_ = device_->read_config(ConfigKey::SAMPLERATE); try { - device_->session()->start(); + device_->start(); } catch(Error e) { error_handler(e.what()); return; @@ -446,7 +437,7 @@ void Session::sample_thread_proc(shared_ptr device, void Session::feed_in_header() { - read_sample_rate(device_->device()); + cur_samplerate_ = device_->read_config(ConfigKey::SAMPLERATE); } void Session::feed_in_meta(shared_ptr meta) @@ -473,12 +464,14 @@ void Session::feed_in_frame_begin() void Session::feed_in_logic(shared_ptr logic) { - lock_guard lock(data_mutex_); + lock_guard lock(data_mutex_); if (!logic_data_) { - qDebug() << "Unexpected logic packet"; - return; + // The only reason logic_data_ would not have been created is + // if it was not possible to determine the signals when the + // device was created. + update_signals(); } if (!cur_logic_segment_) @@ -487,18 +480,8 @@ void Session::feed_in_logic(shared_ptr logic) set_capture_state(Running); // Get sample limit. - assert(device_); - const std::shared_ptr device = - device_->device(); - assert(device); - 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; + const uint64_t sample_limit = device_->read_config( + ConfigKey::LIMIT_SAMPLES); // Create a new data segment cur_logic_segment_ = shared_ptr( @@ -523,7 +506,7 @@ void Session::feed_in_logic(shared_ptr logic) void Session::feed_in_analog(shared_ptr analog) { - lock_guard lock(data_mutex_); + lock_guard lock(data_mutex_); const vector> channels = analog->channels(); const unsigned int channel_count = channels.size(); @@ -627,7 +610,7 @@ void Session::data_feed_in(shared_ptr device, case SR_DF_END: { { - lock_guard lock(data_mutex_); + lock_guard lock(data_mutex_); cur_logic_segment_.reset(); cur_analog_segments_.clear(); }