X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Fsignalbase.cpp;h=578d908f8d52a036b4e5c9f4a553a34865264bb3;hb=9431e2d3d256f3602c3637847a8ec3ad3fdcd590;hp=274de1a12667350a2acb1ad5ca7f2959958610b3;hpb=eb8f22c04d1f5b7f9c831f9bec0778d3f3583626;p=pulseview.git diff --git a/pv/data/signalbase.cpp b/pv/data/signalbase.cpp index 274de1a1..578d908f 100644 --- a/pv/data/signalbase.cpp +++ b/pv/data/signalbase.cpp @@ -123,7 +123,8 @@ SignalBase::SignalBase(shared_ptr channel, ChannelType channel_ group_(nullptr), conversion_type_(NoConversion), min_value_(0), - max_value_(0) + max_value_(0), + error_message_("") { if (channel_) { internal_name_ = QString::fromStdString(channel_->name()); @@ -258,6 +259,11 @@ QColor SignalBase::bgcolor() const return bgcolor_; } +QString SignalBase::get_error_message() const +{ + return error_message_; +} + void SignalBase::set_data(shared_ptr data) { if (data_) { @@ -298,11 +304,17 @@ void SignalBase::clear_sample_data() shared_ptr SignalBase::analog_data() const { + if (!data_) + return nullptr; + return dynamic_pointer_cast(data_); } shared_ptr SignalBase::logic_data() const { + if (!data_) + return nullptr; + shared_ptr result = dynamic_pointer_cast(data_); if (((conversion_type_ == A2LConversionByThreshold) || @@ -676,6 +688,7 @@ void SignalBase::convert_single_segment_range(shared_ptr asegment lsegment->append_payload(logic->data_pointer(), logic->data_length()); samples_added(lsegment->segment_id(), i, i + ConversionBlockSize); + i += ConversionBlockSize; } @@ -778,6 +791,7 @@ void SignalBase::conversion_thread_proc() // Only advance to next segment if the current input segment is complete if (asegment->is_complete() && analog_data->analog_segments().size() > logic_data->logic_segments().size()) { + // There are more segments to process segment_id++; @@ -794,12 +808,12 @@ void SignalBase::conversion_thread_proc() logic_data->push_segment(new_segment); lsegment = logic_data->logic_segments().back(); - } else { - // No more samples/segments to process, wait for data or interrupt - if (!conversion_interrupt_) { - unique_lock input_lock(conversion_input_mutex_); - conversion_input_cond_.wait(input_lock); - } + } + + // No more samples/segments to process, wait for data or interrupt + if (!conversion_interrupt_) { + unique_lock input_lock(conversion_input_mutex_); + conversion_input_cond_.wait(input_lock); } } while (!conversion_interrupt_); } @@ -815,11 +829,20 @@ void SignalBase::start_conversion(bool delayed_start) if (converted_data_) converted_data_->clear(); + samples_cleared(); conversion_interrupt_ = false; - conversion_thread_ = std::thread( - &SignalBase::conversion_thread_proc, this); + conversion_thread_ = std::thread(&SignalBase::conversion_thread_proc, this); +} + +void SignalBase::set_error_message(QString msg) +{ + error_message_ = msg; + // TODO Emulate noquote() + qDebug().nospace() << name() << ": " << msg; + + error_message_changed(msg); } void SignalBase::stop_conversion()