X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fdecodesignal.cpp;h=b9a1fabc74917fc2cc8791ed9ae7abe8ff04b38b;hp=b665ba8934fafde460c762922c354890836c7716;hb=f5a26d5ea895f820c980326be6cee1d46cb958e3;hpb=f6a93932056dab5e2f75207b65197b436d4141a5 diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index b665ba89..b9a1fabc 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -170,7 +170,7 @@ void DecodeSignal::reset_decode(bool shutting_down) logic_mux_data_invalid_ = true; if (!error_message_.isEmpty()) { - error_message_ = QString(); + error_message_.clear(); // TODO Emulate noquote() qDebug().nospace() << name() << ": Error cleared"; } @@ -309,7 +309,7 @@ void DecodeSignal::auto_assign_signals(const shared_ptr dec) } if (match) { - ch.assigned_signal = match.get(); + ch.assigned_signal = match; new_assignment = true; } } @@ -322,7 +322,7 @@ void DecodeSignal::auto_assign_signals(const shared_ptr dec) } } -void DecodeSignal::assign_signal(const uint16_t channel_id, const SignalBase *signal) +void DecodeSignal::assign_signal(const uint16_t channel_id, shared_ptr signal) { for (decode::DecodeChannel& ch : channels_) if (ch.id == channel_id) { @@ -340,7 +340,7 @@ int DecodeSignal::get_assigned_signal_count() const { // Count all channels that have a signal assigned to them return count_if(channels_.begin(), channels_.end(), - [](decode::DecodeChannel ch) { return ch.assigned_signal; }); + [](decode::DecodeChannel ch) { return ch.assigned_signal.get(); }); } void DecodeSignal::set_initial_pin_state(const uint16_t channel_id, const int init_state) @@ -399,8 +399,9 @@ int64_t DecodeSignal::get_working_sample_count(uint32_t segment_id) const if (segment_id >= logic_data->logic_segments().size()) return 0; - const shared_ptr segment = logic_data->logic_segments()[segment_id]; - count = min(count, (int64_t)segment->get_sample_count()); + const shared_ptr segment = logic_data->logic_segments()[segment_id]->get_shared_ptr(); + if (segment) + count = min(count, (int64_t)segment->get_sample_count()); } return (no_signals_assigned ? 0 : count); @@ -807,7 +808,7 @@ void DecodeSignal::restore_settings(QSettings &settings) for (const shared_ptr& signal : signalbases) if ((signal->name() == assigned_signal_name) && (signal->type() != SignalBase::DecodeChannel)) - channel->assigned_signal = signal.get(); + channel->assigned_signal = signal; channel->initial_pin_state = settings.value("initial_pin_state").toInt(); @@ -838,8 +839,8 @@ bool DecodeSignal::all_input_segments_complete(uint32_t segment_id) const if (segment_id >= logic_data->logic_segments().size()) return false; - const shared_ptr segment = logic_data->logic_segments()[segment_id]; - if (!segment->is_complete()) + const shared_ptr segment = logic_data->logic_segments()[segment_id]->get_shared_ptr(); + if (segment && !segment->is_complete()) all_complete = false; } @@ -878,8 +879,10 @@ double DecodeSignal::get_input_samplerate(uint32_t segment_id) const continue; try { - const shared_ptr segment = logic_data->logic_segments().at(segment_id); - samplerate = segment->samplerate(); + const shared_ptr segment = + logic_data->logic_segments().at(segment_id)->get_shared_ptr(); + if (segment) + samplerate = segment->samplerate(); } catch (out_of_range&) { // Do nothing } @@ -1006,7 +1009,7 @@ void DecodeSignal::mux_logic_samples(uint32_t segment_id, const int64_t start, c return; // Fetch the channel segments and their data - vector > segments; + vector > segments; vector signal_data; vector signal_in_bytepos; vector signal_in_bitpos; @@ -1015,14 +1018,19 @@ void DecodeSignal::mux_logic_samples(uint32_t segment_id, const int64_t start, c if (ch.assigned_signal) { const shared_ptr logic_data = ch.assigned_signal->logic_data(); - shared_ptr segment; - try { - segment = logic_data->logic_segments().at(segment_id); - } catch (out_of_range&) { + shared_ptr segment; + if (segment_id < logic_data->logic_segments().size()) { + segment = logic_data->logic_segments().at(segment_id)->get_shared_ptr(); + } else { qDebug() << "Muxer error for" << name() << ":" << ch.assigned_signal->name() \ << "has no logic segment" << segment_id; + logic_mux_interrupt_ = true; return; } + + if (!segment) + return; + segments.push_back(segment); uint8_t* data = new uint8_t[(end - start) * segment->unit_size()]; @@ -1034,7 +1042,6 @@ void DecodeSignal::mux_logic_samples(uint32_t segment_id, const int64_t start, c signal_in_bitpos.push_back(bitpos % 8); } - shared_ptr output_segment; try { output_segment = logic_mux_data_->logic_segments().at(segment_id); @@ -1042,6 +1049,7 @@ void DecodeSignal::mux_logic_samples(uint32_t segment_id, const int64_t start, c qDebug() << "Muxer error for" << name() << ": no logic mux segment" \ << segment_id << "in mux_logic_samples(), mux segments size is" \ << logic_mux_data_->logic_segments().size(); + logic_mux_interrupt_ = true; return; } @@ -1104,8 +1112,7 @@ void DecodeSignal::logic_mux_proc() // Create initial logic mux segment shared_ptr output_segment = - make_shared(*logic_mux_data_, segment_id, - logic_mux_unit_size_, 0); + make_shared(*logic_mux_data_, segment_id, logic_mux_unit_size_, 0); logic_mux_data_->push_segment(output_segment); output_segment->set_samplerate(get_input_samplerate(0)); @@ -1172,7 +1179,7 @@ void DecodeSignal::logic_mux_proc() void DecodeSignal::decode_data( const int64_t abs_start_samplenum, const int64_t sample_count, - const shared_ptr input_segment) + const shared_ptr input_segment) { const int64_t unit_size = input_segment->unit_size(); const int64_t chunk_sample_count = DecodeChunkLength / unit_size; @@ -1236,8 +1243,9 @@ void DecodeSignal::decode_proc() if (decode_interrupt_) return; - shared_ptr input_segment = logic_mux_data_->logic_segments().front(); - assert(input_segment); + shared_ptr input_segment = logic_mux_data_->logic_segments().front()->get_shared_ptr(); + if (!input_segment) + return; // Create the initial segment and set its sample rate so that we can pass it to SRD create_decode_segment(); @@ -1288,7 +1296,8 @@ void DecodeSignal::decode_proc() terminate_srd_session(); } else { // All segments have been processed - decode_finished(); + if (!decode_interrupt_) + decode_finished(); } } else { // Wait for more input data @@ -1297,11 +1306,6 @@ void DecodeSignal::decode_proc() } } } while (!decode_interrupt_); - - // Potentially reap decoders when the application no longer is - // interested in their (pending) results. - if (decode_interrupt_) - terminate_srd_session(); } void DecodeSignal::start_srd_session() @@ -1418,7 +1422,7 @@ void DecodeSignal::connect_input_notifiers() if (!ch.assigned_signal) continue; - const data::SignalBase *signal = ch.assigned_signal; + const data::SignalBase *signal = ch.assigned_signal.get(); connect(signal, &data::SignalBase::samples_cleared, this, &DecodeSignal::on_data_cleared); connect(signal, &data::SignalBase::samples_added,