X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fdecodesignal.cpp;h=b39904a2200090fb6d624f7cc7d9f9b216a7dacf;hp=a57a9a1a9624556d5658dc3d6d3877f160194095;hb=1becee23bdd2b44145b753edd05bf01f7fb0707e;hpb=762ab7a4b20928a784b2b3400ce748d901e32d2d diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index a57a9a1a..b39904a2 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -62,8 +62,6 @@ DecodeSignal::DecodeSignal(pv::Session &session) : { connect(&session_, SIGNAL(capture_state_changed(int)), this, SLOT(on_capture_state_changed(int))); - - set_name(tr("Empty decoder signal")); } DecodeSignal::~DecodeSignal() @@ -238,8 +236,8 @@ void DecodeSignal::begin_decode() const int64_t ch_count = get_assigned_signal_count(); const int64_t unit_size = (ch_count + 7) / 8; logic_mux_data_ = make_shared(ch_count); - segment_ = make_shared(*logic_mux_data_, unit_size, samplerate_); - logic_mux_data_->push_segment(segment_); + logic_mux_segment_ = make_shared(*logic_mux_data_, unit_size, samplerate_); + logic_mux_data_->push_segment(logic_mux_segment_); } // Make sure the logic output data is complete and up-to-date @@ -508,11 +506,13 @@ void DecodeSignal::restore_settings(QSettings &settings) // Include the newly created decode channels in the channel lists update_channel_list(); + commit_decoder_channels(); break; } } settings.endGroup(); + channels_updated(); } // Restore channel mapping @@ -574,7 +574,7 @@ void DecodeSignal::update_channel_list() if (!ch_added) { // Create new entry without a mapped signal - data::DecodeChannel ch = {id++, false, nullptr, + data::DecodeChannel ch = {id++, 0, false, nullptr, QString::fromUtf8(pdch->name), QString::fromUtf8(pdch->desc), SRD_INITIAL_PIN_SAME_AS_SAMPLE0, decoder, pdch}; channels_.push_back(ch); @@ -597,7 +597,7 @@ void DecodeSignal::update_channel_list() if (!ch_added) { // Create new entry without a mapped signal - data::DecodeChannel ch = {id++, true, nullptr, + data::DecodeChannel ch = {id++, 0, true, nullptr, QString::fromUtf8(pdch->name), QString::fromUtf8(pdch->desc), SRD_INITIAL_PIN_SAME_AS_SAMPLE0, decoder, pdch}; channels_.push_back(ch); @@ -654,8 +654,11 @@ void DecodeSignal::mux_logic_samples(const int64_t start, const int64_t end) vector signal_in_bytepos; vector signal_in_bitpos; + int id = 0; for (data::DecodeChannel &ch : channels_) if (ch.assigned_signal) { + ch.bit_id = id++; + const shared_ptr logic_data = ch.assigned_signal->logic_data(); const shared_ptr segment = logic_data->logic_segments().front(); segments.push_back(segment); @@ -670,15 +673,15 @@ void DecodeSignal::mux_logic_samples(const int64_t start, const int64_t end) } // Perform the muxing of signal data into the output data - uint8_t* output = new uint8_t[(end - start) * segment_->unit_size()]; + uint8_t* output = new uint8_t[(end - start) * logic_mux_segment_->unit_size()]; unsigned int signal_count = signal_data.size(); for (int64_t sample_cnt = 0; sample_cnt < (end - start); sample_cnt++) { int bitpos = 0; uint8_t bytepos = 0; - const int out_sample_pos = sample_cnt * segment_->unit_size(); - for (unsigned int i = 0; i < segment_->unit_size(); i++) + const int out_sample_pos = sample_cnt * logic_mux_segment_->unit_size(); + for (unsigned int i = 0; i < logic_mux_segment_->unit_size(); i++) output[out_sample_pos + i] = 0; for (unsigned int i = 0; i < signal_count; i++) { @@ -698,7 +701,7 @@ void DecodeSignal::mux_logic_samples(const int64_t start, const int64_t end) } } - segment_->append_payload(output, (end - start) * segment_->unit_size()); + logic_mux_segment_->append_payload(output, (end - start) * logic_mux_segment_->unit_size()); delete[] output; for (const uint8_t* data : signal_data) @@ -709,7 +712,7 @@ void DecodeSignal::logic_mux_proc() { do { const uint64_t input_sample_count = get_working_sample_count(); - const uint64_t output_sample_count = segment_->get_sample_count(); + const uint64_t output_sample_count = logic_mux_segment_->get_sample_count(); const uint64_t samples_to_process = (input_sample_count > output_sample_count) ? @@ -717,7 +720,7 @@ void DecodeSignal::logic_mux_proc() // Process the samples if necessary... if (samples_to_process > 0) { - const uint64_t unit_size = segment_->unit_size(); + const uint64_t unit_size = logic_mux_segment_->unit_size(); const uint64_t chunk_sample_count = DecodeChunkLength / unit_size; uint64_t processed_samples = 0; @@ -795,7 +798,7 @@ void DecodeSignal::query_input_metadata() void DecodeSignal::decode_data( const int64_t abs_start_samplenum, const int64_t sample_count) { - const int64_t unit_size = segment_->unit_size(); + const int64_t unit_size = logic_mux_segment_->unit_size(); const int64_t chunk_sample_count = DecodeChunkLength / unit_size; for (int64_t i = abs_start_samplenum; @@ -807,7 +810,7 @@ void DecodeSignal::decode_data( int64_t data_size = (chunk_end - i) * unit_size; uint8_t* chunk = new uint8_t[data_size]; - segment_->get_samples(i, chunk_end, chunk); + logic_mux_segment_->get_samples(i, chunk_end, chunk); if (srd_session_send(srd_session_, i, chunk_end, chunk, data_size, unit_size) != SRD_OK) { @@ -844,7 +847,7 @@ void DecodeSignal::decode_proc() // Keep processing new samples until we exhaust the input data do { lock_guard input_lock(input_mutex_); - sample_count = segment_->get_sample_count() - abs_start_samplenum; + sample_count = logic_mux_segment_->get_sample_count() - abs_start_samplenum; if (sample_count > 0) { decode_data(abs_start_samplenum, sample_count); @@ -930,25 +933,28 @@ void DecodeSignal::connect_input_notifiers() void DecodeSignal::annotation_callback(srd_proto_data *pdata, void *decode_signal) { assert(pdata); - assert(decoder); + assert(decode_signal); DecodeSignal *const ds = (DecodeSignal*)decode_signal; assert(ds); lock_guard lock(ds->output_mutex_); - const decode::Annotation a(pdata); - // Find the row assert(pdata->pdo); assert(pdata->pdo->di); const srd_decoder *const decc = pdata->pdo->di->decoder; assert(decc); + const srd_proto_data_annotation *const pda = + (const srd_proto_data_annotation*)pdata->data; + assert(pda); + auto row_iter = ds->rows_.end(); // Try looking up the sub-row of this class - const auto r = ds->class_rows_.find(make_pair(decc, a.format())); + const auto format = pda->ann_class; + const auto r = ds->class_rows_.find(make_pair(decc, format)); if (r != ds->class_rows_.end()) row_iter = ds->rows_.find((*r).second); else { @@ -959,13 +965,13 @@ void DecodeSignal::annotation_callback(srd_proto_data *pdata, void *decode_signa assert(row_iter != ds->rows_.end()); if (row_iter == ds->rows_.end()) { qDebug() << "Unexpected annotation: decoder = " << decc << - ", format = " << a.format(); + ", format = " << format; assert(false); return; } // Add the annotation - (*row_iter).second.push_annotation(a); + (*row_iter).second.emplace_annotation(pdata); } void DecodeSignal::on_capture_state_changed(int state)