X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Fsignalbase.cpp;h=5f95ec337b16d5504000ce02736d29d31f4c924c;hb=1c552f400ee967f7a489853578c4d8d4bd2edfbf;hp=274de1a12667350a2acb1ad5ca7f2959958610b3;hpb=eb8f22c04d1f5b7f9c831f9bec0778d3f3583626;p=pulseview.git diff --git a/pv/data/signalbase.cpp b/pv/data/signalbase.cpp index 274de1a1..5f95ec33 100644 --- a/pv/data/signalbase.cpp +++ b/pv/data/signalbase.cpp @@ -123,11 +123,13 @@ SignalBase::SignalBase(shared_ptr channel, ChannelType channel_ group_(nullptr), conversion_type_(NoConversion), min_value_(0), - max_value_(0) + max_value_(0), + index_(0), + error_message_("") { if (channel_) { - internal_name_ = QString::fromStdString(channel_->name()); - index_ = channel_->index(); + set_internal_name(QString::fromStdString(channel_->name())); + set_index(channel_->index()); } connect(&delayed_conversion_starter_, SIGNAL(timeout()), @@ -218,6 +220,9 @@ QString SignalBase::internal_name() const void SignalBase::set_internal_name(QString internal_name) { internal_name_ = internal_name; + + // Use this name also for the QObject instance + setObjectName(internal_name); } QString SignalBase::display_name() const @@ -258,6 +263,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,20 +308,33 @@ 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 { - shared_ptr result = dynamic_pointer_cast(data_); + if (!data_) + return nullptr; + + shared_ptr result; if (((conversion_type_ == A2LConversionByThreshold) || (conversion_type_ == A2LConversionBySchmittTrigger))) result = dynamic_pointer_cast(converted_data_); + else + result = dynamic_pointer_cast(data_); return result; } +shared_ptr SignalBase::data() const +{ + return data_; +} + bool SignalBase::segment_is_complete(uint32_t segment_id) const { bool result = true; @@ -676,6 +699,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; } @@ -699,6 +723,8 @@ void SignalBase::convert_single_segment_range(shared_ptr asegment delete[] lsamples; delete[] asamples; } + + samples_added(lsegment->segment_id(), start_sample, end_sample); } void SignalBase::convert_single_segment(shared_ptr asegment, @@ -732,6 +758,9 @@ void SignalBase::convert_single_segment(shared_ptr asegment, // we do another round of sample conversion. } while ((complete_state != old_complete_state) || (end_sample - old_end_sample >= ConversionBlockSize)); + + if (complete_state) + lsegment->set_complete(); } void SignalBase::conversion_thread_proc() @@ -758,6 +787,7 @@ void SignalBase::conversion_thread_proc() shared_ptr asegment = analog_data->analog_segments().front(); assert(asegment); + connect(asegment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed())); const shared_ptr logic_data = dynamic_pointer_cast(converted_data_); assert(logic_data); @@ -778,11 +808,16 @@ 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()) { + + disconnect(asegment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed())); + // There are more segments to process segment_id++; try { asegment = analog_data->analog_segments().at(segment_id); + disconnect(asegment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed())); + connect(asegment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed())); } catch (out_of_range&) { qDebug() << "Conversion error for" << name() << ": no analog segment" \ << segment_id << ", segments size is" << analog_data->analog_segments().size(); @@ -802,6 +837,8 @@ void SignalBase::conversion_thread_proc() } } } while (!conversion_interrupt_); + + disconnect(asegment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed())); } void SignalBase::start_conversion(bool delayed_start) @@ -813,13 +850,22 @@ void SignalBase::start_conversion(bool delayed_start) stop_conversion(); - if (converted_data_) + if (converted_data_ && (converted_data_->get_segment_count() > 0)) { converted_data_->clear(); - samples_cleared(); + 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() @@ -833,10 +879,10 @@ void SignalBase::stop_conversion() void SignalBase::on_samples_cleared() { - if (converted_data_) + if (converted_data_ && (converted_data_->get_segment_count() > 0)) { converted_data_->clear(); - - samples_cleared(); + samples_cleared(); + } } void SignalBase::on_samples_added(SharedPtrToSegment segment, uint64_t start_sample, @@ -856,6 +902,15 @@ void SignalBase::on_samples_added(SharedPtrToSegment segment, uint64_t start_sam samples_added(segment->segment_id(), start_sample, end_sample); } +void SignalBase::on_input_segment_completed() +{ + if (conversion_type_ != NoConversion) + if (conversion_thread_.joinable()) { + // Notify the conversion thread since it's running + conversion_input_cond_.notify_one(); + } +} + void SignalBase::on_min_max_changed(float min, float max) { // Restart conversion if one is enabled and uses a calculated threshold