]> sigrok.org Git - pulseview.git/blobdiff - pv/session.cpp
Session: Use Device::read_config to read sample limit
[pulseview.git] / pv / session.cpp
index d5126660f56b140d2337d64b1df625a4ea44b148..2a4814f807e2be19fe0c4aeef93d5abfb982e13f 100644 (file)
@@ -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<devices::Device> device)
                (shared_ptr<sigrok::Device> device, shared_ptr<Packet> packet) {
                        data_feed_in(device, packet);
                });
-       update_signals(device_);
+       update_signals();
 
        decode_traces_.clear();
 
@@ -301,13 +302,20 @@ void Session::set_capture_state(capture_state state)
                capture_state_changed(state);
 }
 
-void Session::update_signals(shared_ptr<devices::Device> device)
+void Session::update_signals()
 {
-       assert(device);
+       assert(device_);
        assert(capture_state_ == Stopped);
 
+       const shared_ptr<sigrok::Device> 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> channel) {
@@ -315,7 +323,7 @@ void Session::update_signals(shared_ptr<devices::Device> device)
 
        // Create data containers for the logic data segments
        {
-               lock_guard<mutex> data_lock(data_mutex_);
+               lock_guard<recursive_mutex> data_lock(data_mutex_);
 
                if (logic_channel_count == 0) {
                        logic_data_.reset();
@@ -334,7 +342,7 @@ void Session::update_signals(shared_ptr<devices::Device> device)
                unordered_set< shared_ptr<view::Signal> > prev_sigs(signals_);
                signals_.clear();
 
-               for (auto channel : device->device()->channels()) {
+               for (auto channel : sr_dev->channels()) {
                        shared_ptr<view::Signal> signal;
 
                        // Find the channel in the old signals
@@ -357,7 +365,7 @@ void Session::update_signals(shared_ptr<devices::Device> device)
                                case SR_CHANNEL_LOGIC:
                                        signal = shared_ptr<view::Signal>(
                                                new view::LogicSignal(*this,
-                                                       device, channel,
+                                                       device_, channel,
                                                        logic_data_));
                                        break;
 
@@ -397,26 +405,13 @@ shared_ptr<view::Signal> Session::signal_from_channel(
        return shared_ptr<view::Signal>();
 }
 
-void Session::read_sample_rate(shared_ptr<sigrok::Device> device)
-{
-       assert(device);
-       const auto keys = device->config_keys(ConfigKey::DEVICE_OPTIONS);
-       const auto iter = keys.find(ConfigKey::SAMPLERATE);
-       cur_samplerate_ = (iter != keys.end() &&
-               (*iter).second.find(sigrok::GET) != (*iter).second.end()) ?
-               VariantBase::cast_dynamic<Variant<guint64>>(
-                       device->config_get(ConfigKey::SAMPLERATE)).get() : 0;
-}
-
 void Session::sample_thread_proc(shared_ptr<devices::Device> device,
        function<void (const QString)> error_handler)
 {
        assert(device);
        assert(error_handler);
 
-       const std::shared_ptr<sigrok::Device> sr_dev = device->device();
-       assert(sr_dev);
-       read_sample_rate(sr_dev);
+       cur_samplerate_ = device_->read_config<uint64_t>(ConfigKey::SAMPLERATE);
 
        try {
                device_->session()->start();
@@ -441,7 +436,7 @@ void Session::sample_thread_proc(shared_ptr<devices::Device> device,
 
 void Session::feed_in_header()
 {
-       read_sample_rate(device_->device());
+       cur_samplerate_ = device_->read_config<uint64_t>(ConfigKey::SAMPLERATE);
 }
 
 void Session::feed_in_meta(shared_ptr<Meta> meta)
@@ -468,7 +463,7 @@ void Session::feed_in_frame_begin()
 
 void Session::feed_in_logic(shared_ptr<Logic> logic)
 {
-       lock_guard<mutex> lock(data_mutex_);
+       lock_guard<recursive_mutex> lock(data_mutex_);
 
        if (!logic_data_)
        {
@@ -482,18 +477,8 @@ void Session::feed_in_logic(shared_ptr<Logic> logic)
                set_capture_state(Running);
 
                // Get sample limit.
-               assert(device_);
-               const std::shared_ptr<sigrok::Device> 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<Variant<guint64>>(
-                       device->config_get(ConfigKey::LIMIT_SAMPLES)).get() : 0;
+               const uint64_t sample_limit = device_->read_config<uint64_t>(
+                       ConfigKey::LIMIT_SAMPLES);
 
                // Create a new data segment
                cur_logic_segment_ = shared_ptr<data::LogicSegment>(
@@ -518,7 +503,7 @@ void Session::feed_in_logic(shared_ptr<Logic> logic)
 
 void Session::feed_in_analog(shared_ptr<Analog> analog)
 {
-       lock_guard<mutex> lock(data_mutex_);
+       lock_guard<recursive_mutex> lock(data_mutex_);
 
        const vector<shared_ptr<Channel>> channels = analog->channels();
        const unsigned int channel_count = channels.size();
@@ -622,7 +607,7 @@ void Session::data_feed_in(shared_ptr<sigrok::Device> device,
        case SR_DF_END:
        {
                {
-                       lock_guard<mutex> lock(data_mutex_);
+                       lock_guard<recursive_mutex> lock(data_mutex_);
                        cur_logic_segment_.reset();
                        cur_analog_segments_.clear();
                }