]> sigrok.org Git - pulseview.git/blobdiff - pv/data/signalbase.cpp
Fix #1629 by not reallocating DecodeSegments
[pulseview.git] / pv / data / signalbase.cpp
index 274de1a12667350a2acb1ad5ca7f2959958610b3..578d908f8d52a036b4e5c9f4a553a34865264bb3 100644 (file)
@@ -123,7 +123,8 @@ SignalBase::SignalBase(shared_ptr<sigrok::Channel> 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<pv::data::SignalData> data)
 {
        if (data_) {
@@ -298,11 +304,17 @@ void SignalBase::clear_sample_data()
 
 shared_ptr<data::Analog> SignalBase::analog_data() const
 {
+       if (!data_)
+               return nullptr;
+
        return dynamic_pointer_cast<Analog>(data_);
 }
 
 shared_ptr<data::Logic> SignalBase::logic_data() const
 {
+       if (!data_)
+               return nullptr;
+
        shared_ptr<Logic> result = dynamic_pointer_cast<Logic>(data_);
 
        if (((conversion_type_ == A2LConversionByThreshold) ||
@@ -676,6 +688,7 @@ void SignalBase::convert_single_segment_range(shared_ptr<AnalogSegment> 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<mutex> 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<mutex> 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()