]> sigrok.org Git - pulseview.git/blobdiff - pv/session.cpp
Minor update related to the libsigrok analog format changes.
[pulseview.git] / pv / session.cpp
index bbfb7d2437b1c3380d955e8ef3ce3301797a2882..4130096830a80944c7ab8d27a583289ab3cfefb8 100644 (file)
@@ -18,6 +18,9 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
+#include <boost/thread/locks.hpp>
+#include <boost/thread/shared_mutex.hpp>
+
 #ifdef ENABLE_DECODE
 #include <libsigrokdecode/libsigrokdecode.h>
 #endif
@@ -127,8 +130,11 @@ void Session::set_device(shared_ptr<devices::Device> device)
        // Ensure we are not capturing before setting the device
        stop_capture();
 
+       if (device_)
+               device_->close();
+
        device_ = std::move(device);
-       device_->create();
+       device_->open();
        device_->session()->add_datafeed_callback([=]
                (shared_ptr<sigrok::Device> device, shared_ptr<Packet> packet) {
                        data_feed_in(device, packet);
@@ -180,8 +186,7 @@ void Session::start_capture(function<void (const QString)> error_handler)
        }
 
        // Clear signal data
-       const set< shared_ptr<data::SignalData> > signal_data = get_data();
-       for (const shared_ptr<data::SignalData> d : signal_data)
+       for (const shared_ptr<data::SignalData> d : get_data())
                d->clear();
 
        // Begin the session
@@ -212,13 +217,9 @@ set< shared_ptr<data::SignalData> > Session::get_data() const
        return data;
 }
 
-boost::shared_mutex& Session::signals_mutex() const
-{
-       return signals_mutex_;
-}
-
-const unordered_set< shared_ptr<view::Signal> >& Session::signals() const
+const unordered_set< shared_ptr<view::Signal> > Session::signals() const
 {
+       shared_lock<shared_mutex> lock(signals_mutex_);
        return signals_;
 }
 
@@ -420,6 +421,8 @@ void Session::sample_thread_proc(shared_ptr<devices::Device> device,
 
        cur_samplerate_ = device_->read_config<uint64_t>(ConfigKey::SAMPLERATE);
 
+       out_of_memory_ = false;
+
        try {
                device_->start();
        } catch(Error e) {
@@ -439,6 +442,9 @@ void Session::sample_thread_proc(shared_ptr<devices::Device> device,
                qDebug("SR_DF_END was not received.");
                assert(0);
        }
+
+       if (out_of_memory_)
+               error_handler(tr("Out of memory, acquisition stopped."));
 }
 
 void Session::feed_in_header()
@@ -472,6 +478,8 @@ void Session::feed_in_logic(shared_ptr<Logic> logic)
 {
        lock_guard<recursive_mutex> lock(data_mutex_);
 
+       const size_t sample_count = logic->data_length() / logic->unit_size();
+
        if (!logic_data_)
        {
                // The only reason logic_data_ would not have been created is
@@ -485,14 +493,10 @@ void Session::feed_in_logic(shared_ptr<Logic> logic)
                // This could be the first packet after a trigger
                set_capture_state(Running);
 
-               // Get sample limit.
-               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>(
                        new data::LogicSegment(
-                               logic, cur_samplerate_, sample_limit));
+                               logic, cur_samplerate_, sample_count));
                logic_data_->push_segment(cur_logic_segment_);
 
                // @todo Putting this here means that only listeners querying
@@ -517,7 +521,7 @@ void Session::feed_in_analog(shared_ptr<Analog> analog)
        const vector<shared_ptr<Channel>> channels = analog->channels();
        const unsigned int channel_count = channels.size();
        const size_t sample_count = analog->num_samples() / channel_count;
-       const float *data = analog->data_pointer();
+       const float *data = static_cast<const float *>(analog->data_pointer());
        bool sweep_beginning = false;
 
        for (auto channel : channels)
@@ -536,26 +540,13 @@ void Session::feed_in_analog(shared_ptr<Analog> analog)
                        // in the sweep containing this segment.
                        sweep_beginning = true;
 
-                       // Get sample limit.
-                       uint64_t sample_limit;
-                       try {
-                               assert(device_);
-                               const std::shared_ptr<sigrok::Device> device =
-                                       device_->device();
-                               assert(device);
-                               sample_limit = VariantBase::cast_dynamic<Variant<guint64>>(
-                                       device->config_get(ConfigKey::LIMIT_SAMPLES)).get();
-                       } catch (Error) {
-                               sample_limit = 0;
-                       }
-
                        // Create a segment, keep it in the maps of channels
                        segment = shared_ptr<data::AnalogSegment>(
                                new data::AnalogSegment(
-                                       cur_samplerate_, sample_limit));
+                                       cur_samplerate_, sample_count));
                        cur_analog_segments_[channel] = segment;
 
-                       // Find the annalog data associated with the channel
+                       // Find the analog data associated with the channel
                        shared_ptr<view::AnalogSignal> sig =
                                dynamic_pointer_cast<view::AnalogSignal>(
                                        signal_from_channel(channel));
@@ -606,11 +597,21 @@ void Session::data_feed_in(shared_ptr<sigrok::Device> device,
                break;
 
        case SR_DF_LOGIC:
-               feed_in_logic(dynamic_pointer_cast<Logic>(packet->payload()));
+               try {
+                       feed_in_logic(dynamic_pointer_cast<Logic>(packet->payload()));
+               } catch (std::bad_alloc) {
+                       out_of_memory_ = true;
+                       device_->stop();
+               }
                break;
 
        case SR_DF_ANALOG:
-               feed_in_analog(dynamic_pointer_cast<Analog>(packet->payload()));
+               try {
+                       feed_in_analog(dynamic_pointer_cast<Analog>(packet->payload()));
+               } catch (std::bad_alloc) {
+                       out_of_memory_ = true;
+                       device_->stop();
+               }
                break;
 
        case SR_DF_END: