X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fsession.cpp;h=b1ce14680bbec848f6ae92fd3ec4010094d8320c;hb=a66e286e0276186c41b7ce07cfcbd0c4da2ca1cb;hp=c18575ad415559a8e66fa0fae7a6b65774a53c59;hpb=89914a8657612761ff962ee973721a4872cda8d7;p=pulseview.git diff --git a/pv/session.cpp b/pv/session.cpp index c18575a..b1ce146 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -352,8 +352,7 @@ void Session::select_device(shared_ptr device) else set_default_device(); } catch (const QString &e) { - main_bar_->session_error(tr("Failed to Select Device"), - tr("Failed to Select Device")); + main_bar_->session_error(tr("Failed to select device"), e); } } @@ -401,6 +400,7 @@ void Session::set_device(shared_ptr device) device_->open(); } catch (const QString &e) { device_.reset(); + main_bar_->session_error(tr("Failed to open device"), e); } if (device_) { @@ -426,7 +426,7 @@ void Session::set_default_device() // Try and find the demo device and select that by default const auto iter = find_if(devices.begin(), devices.end(), [] (const shared_ptr &d) { - return d->hardware_device()->driver()->name() == "demo"; }); + return d->hardware_device()->driver()->name() == "demo"; }); set_device((iter == devices.end()) ? devices.front() : *iter); } @@ -567,6 +567,8 @@ void Session::start_capture(function error_handler) for (const shared_ptr d : all_signal_data_) d->clear(); + trigger_list_.clear(); + // Revert name back to default name (e.g. "Session 1") for real devices // as the (possibly saved) data is gone. File devices keep their name. shared_ptr hw_device = @@ -689,6 +691,17 @@ uint32_t Session::get_segment_count() const return value; } +vector Session::get_triggers(uint32_t segment_id) const +{ + vector result; + + for (pair entry : trigger_list_) + if (entry.first == segment_id) + result.push_back(entry.second); + + return result; +} + const unordered_set< shared_ptr > Session::signalbases() const { return signalbases_; @@ -917,6 +930,7 @@ void Session::sample_thread_proc(function error_handler) cur_analog_segments_.clear(); } highest_segment_id_ = -1; + frame_began_ = false; try { device_->start(); @@ -1066,7 +1080,24 @@ void Session::feed_in_trigger() } } - trigger_event(sample_count / get_samplerate()); + uint32_t segment_id = 0; // Default segment when no frames are used + + // If a frame began, we'd ideally be able to use the highest segment ID for + // the trigger. However, as new segments are only created when logic or + // analog data comes in, this doesn't work if the trigger appears right + // after the beginning of the frame, before any sample data. + // For this reason, we use highest segment ID + 1 if no sample data came in + // yet and the highest segment ID otherwise. + if (frame_began_) { + segment_id = highest_segment_id_; + if (!cur_logic_segment_ && (cur_analog_segments_.size() == 0)) + segment_id++; + } + + // TODO Create timestamp from segment start time + segment's current sample count + util::Timestamp timestamp = sample_count / get_samplerate(); + trigger_list_.emplace_back(segment_id, timestamp); + trigger_event(segment_id, timestamp); } void Session::feed_in_frame_begin() @@ -1094,8 +1125,7 @@ void Session::feed_in_frame_end() cur_analog_segments_.clear(); } - if (frame_began_) - frame_began_ = false; + frame_began_ = false; signal_segment_completed(); }