]> sigrok.org Git - pulseview.git/blobdiff - pv/session.cpp
Fix #685 by adding a special T marker when SR_DT_TRIGGER arrives
[pulseview.git] / pv / session.cpp
index 4823543213de5b5a080be2ea732d1086aefa4bae..da9c0e9bb4af998abf3a3303eb525536245b3ba9 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
+#ifdef _WIN32
+// Windows: Avoid boost/thread namespace pollution (which includes windows.h).
+#define NOGDI
+#define NORESOURCE
+#endif
+#include <boost/thread/locks.hpp>
+#include <boost/thread/shared_mutex.hpp>
+
 #ifdef ENABLE_DECODE
 #include <libsigrokdecode/libsigrokdecode.h>
 #endif
@@ -214,13 +222,28 @@ set< shared_ptr<data::SignalData> > Session::get_data() const
        return data;
 }
 
-boost::shared_mutex& Session::signals_mutex() const
+double Session::get_samplerate() const
 {
-       return signals_mutex_;
+       double samplerate = 0.0;
+
+       for (const shared_ptr<pv::data::SignalData> d : get_data()) {
+               assert(d);
+               const vector< shared_ptr<pv::data::Segment> > segments =
+                       d->segments();
+               for (const shared_ptr<pv::data::Segment> &s : segments)
+                       samplerate = std::max(samplerate, s->samplerate());
+       }
+
+       // If there is no sample rate given we use samples as unit
+       if (samplerate == 0.0)
+               samplerate = 1.0;
+
+       return samplerate;
 }
 
-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_;
 }
 
@@ -469,6 +492,27 @@ void Session::feed_in_meta(shared_ptr<Meta> meta)
        signals_changed();
 }
 
+void Session::feed_in_trigger()
+{
+       // The channel containing most samples should be most accurate
+       uint64_t sample_count = 0;
+
+       for (const shared_ptr<pv::data::SignalData> d : get_data()) {
+               assert(d);
+               uint64_t temp_count = 0;
+
+               const vector< shared_ptr<pv::data::Segment> > segments =
+                       d->segments();
+               for (const shared_ptr<pv::data::Segment> &s : segments)
+                       temp_count += s->get_sample_count();
+
+               if (temp_count > sample_count)
+                       sample_count = temp_count;
+       }
+
+       trigger_event(sample_count / get_samplerate());
+}
+
 void Session::feed_in_frame_begin()
 {
        if (cur_logic_segment_ || !cur_analog_segments_.empty())
@@ -522,7 +566,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)
@@ -593,6 +637,10 @@ void Session::data_feed_in(shared_ptr<sigrok::Device> device,
                feed_in_meta(dynamic_pointer_cast<Meta>(packet->payload()));
                break;
 
+       case SR_DF_TRIGGER:
+               feed_in_trigger();
+               break;
+
        case SR_DF_FRAME_BEGIN:
                feed_in_frame_begin();
                break;