X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Fdecodesignal.cpp;h=640e58148ef751e3aa7557dca2d7af5d526c2240;hb=9431e2d3d256f3602c3637847a8ec3ad3fdcd590;hp=b9a1fabc74917fc2cc8791ed9ae7abe8ff04b38b;hpb=f5a26d5ea895f820c980326be6cee1d46cb958e3;p=pulseview.git diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index b9a1fabc..640e5814 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -308,7 +308,13 @@ void DecodeSignal::auto_assign_signals(const shared_ptr dec) } } - if (match) { + // Prevent using a signal more than once as D1 would match e.g. D1 and D10 + bool signal_not_already_used = true; + for (decode::DecodeChannel& ch : channels_) + if (ch.assigned_signal && (ch.assigned_signal == match)) + signal_not_already_used = false; + + if (match && signal_not_already_used) { ch.assigned_signal = match; new_assignment = true; } @@ -1167,11 +1173,11 @@ void DecodeSignal::logic_mux_proc() logic_mux_data_->push_segment(output_segment); output_segment->set_samplerate(get_input_samplerate(segment_id)); + } else { + // Wait for more input data if we're processing the currently last segment + unique_lock logic_mux_lock(logic_mux_mutex_); + logic_mux_cond_.wait(logic_mux_lock); } - } else { - // Wait for more input - unique_lock logic_mux_lock(logic_mux_mutex_); - logic_mux_cond_.wait(logic_mux_lock); } } } while (!logic_mux_interrupt_); @@ -1185,8 +1191,7 @@ void DecodeSignal::decode_data( const int64_t chunk_sample_count = DecodeChunkLength / unit_size; for (int64_t i = abs_start_samplenum; - error_message_.isEmpty() && !decode_interrupt_ && - (i < (abs_start_samplenum + sample_count)); + !decode_interrupt_ && (i < (abs_start_samplenum + sample_count)); i += chunk_sample_count) { const int64_t chunk_end = min(i + chunk_sample_count, @@ -1272,7 +1277,7 @@ void DecodeSignal::decode_proc() // If the input segment is complete, we've exhausted this segment if (input_segment->is_complete()) { - if (current_segment_id_ < logic_mux_data_->logic_segments().size() - 1) { + if (current_segment_id_ < (logic_mux_data_->logic_segments().size() - 1)) { // Process next segment current_segment_id_++; @@ -1298,12 +1303,13 @@ void DecodeSignal::decode_proc() // All segments have been processed if (!decode_interrupt_) decode_finished(); + + // Wait for more input data + unique_lock input_wait_lock(input_mutex_); + decode_input_cond_.wait(input_wait_lock); } - } else { - // Wait for more input data - unique_lock input_wait_lock(input_mutex_); - decode_input_cond_.wait(input_wait_lock); } + } } while (!decode_interrupt_); } @@ -1625,6 +1631,11 @@ void DecodeSignal::on_data_received() // to work with if ((!error_message_.isEmpty()) && (get_input_segment_count() == 0)) return; + else { + error_message_.clear(); + // TODO Emulate noquote() + qDebug().nospace() << name() << ": Error cleared"; + } if (!logic_mux_thread_.joinable()) begin_decode();