X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fsignalbase.cpp;h=97f705084e91fc654c85ab7ce07cbfec64a3df50;hp=c15a44319d21030b3795fcdd3e25b8513869ce49;hb=HEAD;hpb=516b0c4163547a969da7686702c043e7e0335419 diff --git a/pv/data/signalbase.cpp b/pv/data/signalbase.cpp index c15a4431..97f70508 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; @@ -567,7 +590,12 @@ void SignalBase::restore_settings(QSettings &settings) QVariant value = settings.value("color"); // Workaround for Qt QColor serialization bug on OSX - if ((QMetaType::Type)(value.type()) == QMetaType::QColor) +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + bool is_qcolor = (QMetaType::Type)(value.typeId()) == QMetaType::QColor; +#else + bool is_qcolor = (QMetaType::Type)(value.type()) == QMetaType::QColor; +#endif + if (is_qcolor) set_color(value.value()); else set_color(QColor::fromRgba(value.value())); @@ -601,8 +629,8 @@ bool SignalBase::conversion_is_a2l() const (conversion_type_ == A2LConversionBySchmittTrigger))); } -void SignalBase::convert_single_segment_range(AnalogSegment *asegment, - LogicSegment *lsegment, uint64_t start_sample, uint64_t end_sample) +void SignalBase::convert_single_segment_range(shared_ptr asegment, + shared_ptr lsegment, uint64_t start_sample, uint64_t end_sample) { if (end_sample > start_sample) { tie(min_value_, max_value_) = asegment->get_min_max(); @@ -676,6 +704,7 @@ void SignalBase::convert_single_segment_range(AnalogSegment *asegment, lsegment->append_payload(logic->data_pointer(), logic->data_length()); samples_added(lsegment->segment_id(), i, i + ConversionBlockSize); + i += ConversionBlockSize; } @@ -699,9 +728,12 @@ void SignalBase::convert_single_segment_range(AnalogSegment *asegment, delete[] lsamples; delete[] asamples; } + + samples_added(lsegment->segment_id(), start_sample, end_sample); } -void SignalBase::convert_single_segment(AnalogSegment *asegment, LogicSegment *lsegment) +void SignalBase::convert_single_segment(shared_ptr asegment, + shared_ptr lsegment) { uint64_t start_sample, end_sample, old_end_sample; start_sample = end_sample = 0; @@ -731,6 +763,9 @@ void SignalBase::convert_single_segment(AnalogSegment *asegment, LogicSegment *l // 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() @@ -755,8 +790,9 @@ void SignalBase::conversion_thread_proc() uint32_t segment_id = 0; - AnalogSegment *asegment = analog_data->analog_segments().front().get(); + 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); @@ -768,7 +804,7 @@ void SignalBase::conversion_thread_proc() logic_data->push_segment(new_segment); } - LogicSegment *lsegment = logic_data->logic_segments().front().get(); + shared_ptr lsegment = logic_data->logic_segments().front(); assert(lsegment); do { @@ -777,11 +813,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).get(); + 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(); @@ -792,7 +833,7 @@ void SignalBase::conversion_thread_proc() *logic_data.get(), segment_id, 1, asegment->samplerate()); logic_data->push_segment(new_segment); - lsegment = logic_data->logic_segments().back().get(); + lsegment = logic_data->logic_segments().back(); } else { // No more samples/segments to process, wait for data or interrupt if (!conversion_interrupt_) { @@ -801,6 +842,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) @@ -812,13 +855,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() @@ -832,10 +884,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, @@ -855,6 +907,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