Fix #1024 by changing decode channel assigment to PDs
[pulseview.git] / pv / data / decodesignal.cpp
index 1d9f3c8ffb0dababec91fd579de2eef4b17e22e7..6aa3f42f13ac7c93c6e272c4f43115300e19034a 100644 (file)
@@ -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()
@@ -79,7 +77,9 @@ const vector< shared_ptr<Decoder> >& DecodeSignal::decoder_stack() const
 void DecodeSignal::stack_decoder(const srd_decoder *decoder)
 {
        assert(decoder);
-       stack_.push_back(make_shared<decode::Decoder>(decoder));
+       const shared_ptr<Decoder> dec = make_shared<decode::Decoder>(decoder);
+
+       stack_.push_back(dec);
 
        // Set name if this decoder is the first in the list
        if (stack_.size() == 1)
@@ -88,7 +88,7 @@ void DecodeSignal::stack_decoder(const srd_decoder *decoder)
        // Include the newly created decode channels in the channel lists
        update_channel_list();
 
-       auto_assign_signals();
+       auto_assign_signals(dec);
        commit_decoder_channels();
        begin_decode();
 }
@@ -263,12 +263,16 @@ const vector<data::DecodeChannel> DecodeSignal::get_channels() const
        return channels_;
 }
 
-void DecodeSignal::auto_assign_signals()
+void DecodeSignal::auto_assign_signals(const shared_ptr<Decoder> dec)
 {
        bool new_assignment = false;
 
        // Try to auto-select channels that don't have signals assigned yet
        for (data::DecodeChannel &ch : channels_) {
+               // If a decoder is given, auto-assign only its channels
+               if (dec && (ch.decoder_ != dec))
+                       continue;
+
                if (ch.assigned_signal)
                        continue;
 
@@ -502,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
@@ -568,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);
@@ -591,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);
@@ -648,8 +654,11 @@ void DecodeSignal::mux_logic_samples(const int64_t start, const int64_t end)
        vector<uint8_t> signal_in_bytepos;
        vector<uint8_t> signal_in_bitpos;
 
+       int id = 0;
        for (data::DecodeChannel &ch : channels_)
                if (ch.assigned_signal) {
+                       ch.bit_id = id++;
+
                        const shared_ptr<Logic> logic_data = ch.assigned_signal->logic_data();
                        const shared_ptr<LogicSegment> segment = logic_data->logic_segments().front();
                        segments.push_back(segment);
@@ -749,12 +758,24 @@ void DecodeSignal::query_input_metadata()
        // TODO Currently we assume all channels have the same sample rate
        // and start time
        bool samplerate_valid = false;
+       data::DecodeChannel *any_channel;
+       shared_ptr<Logic> logic_data;
 
-       auto any_channel = find_if(channels_.begin(), channels_.end(),
-               [](data::DecodeChannel ch) { return ch.assigned_signal; });
+       do {
+               any_channel = &(*find_if(channels_.begin(), channels_.end(),
+                       [](data::DecodeChannel ch) { return ch.assigned_signal; }));
 
-       shared_ptr<Logic> logic_data =
-               any_channel->assigned_signal->logic_data();
+               logic_data = any_channel->assigned_signal->logic_data();
+
+               if (!logic_data) {
+                       // Wait until input data is available or an interrupt was requested
+                       unique_lock<mutex> input_wait_lock(input_mutex_);
+                       decode_input_cond_.wait(input_wait_lock);
+               }
+       } while (!logic_data && !decode_interrupt_);
+
+       if (decode_interrupt_)
+               return;
 
        do {
                if (!logic_data->logic_segments().empty()) {
@@ -912,7 +933,7 @@ 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);