X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fdata%2Fsignalbase.cpp;h=7746ab40156fb3e88c2f02ac101ac628a42574f4;hb=7f894d958eb5221161f0c6f2abbb57d43bb6aae7;hp=9f47a9755eee6fc6ec085e3a831fb51062971183;hpb=63253d727162257aa0a3765bfb897c6826ebf611;p=pulseview.git diff --git a/pv/data/signalbase.cpp b/pv/data/signalbase.cpp index 9f47a97..7746ab4 100644 --- a/pv/data/signalbase.cpp +++ b/pv/data/signalbase.cpp @@ -81,6 +81,14 @@ QString SignalBase::internal_name() const return internal_name_; } +QString SignalBase::display_name() const +{ + if (name() != internal_name_) + return name() + " (" + internal_name_ + ")"; + else + return name(); +} + void SignalBase::set_name(QString name) { if (channel_) @@ -201,6 +209,35 @@ shared_ptr SignalBase::logic_data() const return result; } +bool SignalBase::segment_is_complete(uint32_t segment_id) const +{ + bool result = true; + + if (channel_type_ == AnalogChannel) + { + shared_ptr data = dynamic_pointer_cast(data_); + auto segments = data->analog_segments(); + try { + result = segments.at(segment_id)->is_complete(); + } catch (out_of_range) { + // Do nothing + } + } + + if (channel_type_ == LogicChannel) + { + shared_ptr data = dynamic_pointer_cast(data_); + auto segments = data->logic_segments(); + try { + result = segments.at(segment_id)->is_complete(); + } catch (out_of_range) { + // Do nothing + } + } + + return result; +} + SignalBase::ConversionType SignalBase::get_conversion_type() const { return conversion_type_; @@ -445,8 +482,7 @@ void SignalBase::convert_single_segment(AnalogSegment *asegment, LogicSegment *l analog->get_logic_via_threshold(threshold, lsamples); lsegment->append_payload(logic->data_pointer(), logic->data_length()); - - samples_added(lsegment, i, i + ConversionBlockSize); + samples_added(lsegment->segment_id(), i, i + ConversionBlockSize); i += ConversionBlockSize; } @@ -460,7 +496,7 @@ void SignalBase::convert_single_segment(AnalogSegment *asegment, LogicSegment *l shared_ptr logic = analog->get_logic_via_threshold(threshold, lsamples); lsegment->append_payload(logic->data_pointer(), logic->data_length()); - samples_added(lsegment, i, end_sample); + samples_added(lsegment->segment_id(), i, end_sample); } if (conversion_type_ == A2LConversionBySchmittTrigger) { @@ -479,8 +515,7 @@ void SignalBase::convert_single_segment(AnalogSegment *asegment, LogicSegment *l &state, lsamples); lsegment->append_payload(logic->data_pointer(), logic->data_length()); - - samples_added(lsegment, i, i + ConversionBlockSize); + samples_added(lsegment->segment_id(), i, i + ConversionBlockSize); i += ConversionBlockSize; } @@ -495,7 +530,7 @@ void SignalBase::convert_single_segment(AnalogSegment *asegment, LogicSegment *l analog->get_logic_via_schmitt_trigger(lo_thr, hi_thr, &state, lsamples); lsegment->append_payload(logic->data_pointer(), logic->data_length()); - samples_added(lsegment, i, end_sample); + samples_added(lsegment->segment_id(), i, end_sample); } // If acquisition is ongoing, start-/endsample may have changed @@ -513,13 +548,19 @@ void SignalBase::conversion_thread_proc() if (conversion_is_a2l()) { analog_data = dynamic_pointer_cast(data_); - if (analog_data->analog_segments().size() == 0) - return; + if (analog_data->analog_segments().size() == 0) { + unique_lock input_lock(conversion_input_mutex_); + conversion_input_cond_.wait(input_lock); + } } else // Currently, we only handle A2L conversions return; + // If we had to wait for input data, we may have been notified to terminate + if (conversion_interrupt_) + return; + uint32_t segment_id = 0; AnalogSegment *asegment = analog_data->analog_segments().front().get(); @@ -531,7 +572,7 @@ void SignalBase::conversion_thread_proc() // Create the initial logic data segment if needed if (logic_data->logic_segments().size() == 0) { shared_ptr new_segment = - make_shared(*logic_data.get(), 1, asegment->samplerate()); + make_shared(*logic_data.get(), 0, 1, asegment->samplerate()); logic_data->push_segment(new_segment); } @@ -553,8 +594,8 @@ void SignalBase::conversion_thread_proc() return; } - shared_ptr new_segment = - make_shared(*logic_data.get(), 1, asegment->samplerate()); + shared_ptr new_segment = make_shared( + *logic_data.get(), segment_id, 1, asegment->samplerate()); logic_data->push_segment(new_segment); lsegment = logic_data->logic_segments().back().get(); @@ -617,7 +658,8 @@ void SignalBase::on_samples_added(QObject* segment, uint64_t start_sample, } } - samples_added(segment, start_sample, end_sample); + data::Segment* s = qobject_cast(segment); + samples_added(s->segment_id(), start_sample, end_sample); } void SignalBase::on_min_max_changed(float min, float max)