X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fdata%2Fsignalbase.cpp;h=018e4a2733fca8f813efeff6f9b9c0fd1dd6a9f6;hb=2b3dda54bb8e390e6a5d378c0e88f2bafacf0870;hp=9f47a9755eee6fc6ec085e3a831fb51062971183;hpb=63253d727162257aa0a3765bfb897c6826ebf611;p=pulseview.git diff --git a/pv/data/signalbase.cpp b/pv/data/signalbase.cpp index 9f47a97..018e4a2 100644 --- a/pv/data/signalbase.cpp +++ b/pv/data/signalbase.cpp @@ -201,6 +201,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_; @@ -513,13 +542,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();