]> sigrok.org Git - pulseview.git/blobdiff - pv/session.cpp
Session: Make sure we don't try to add a non-existant decoder
[pulseview.git] / pv / session.cpp
index e84f78042b89593e9cb96adef18ed187067e5b11..0056e460b81ad92b2ef075bc43014914bd16ba3e 100644 (file)
@@ -89,7 +89,6 @@ using std::vector;
 
 using sigrok::Analog;
 using sigrok::Channel;
-using sigrok::ChannelType;
 using sigrok::ConfigKey;
 using sigrok::DatafeedCallbackFunction;
 using sigrok::Error;
@@ -621,6 +620,9 @@ const unordered_set< shared_ptr<data::SignalBase> > Session::signalbases() const
 #ifdef ENABLE_DECODE
 bool Session::add_decoder(srd_decoder *const dec)
 {
+       if (!dec)
+               return false;
+
        map<const srd_channel*, shared_ptr<data::SignalBase> > channels;
        shared_ptr<data::DecoderStack> decoder_stack;
 
@@ -638,7 +640,7 @@ bool Session::add_decoder(srd_decoder *const dec)
                // Auto select the initial channels
                for (const srd_channel *pdch : all_channels)
                        for (shared_ptr<data::SignalBase> b : signalbases_) {
-                               if (b->type() == ChannelType::LOGIC) {
+                               if (b->logic_data()) {
                                        if (QString::fromUtf8(pdch->name).toLower().
                                                contains(b->name().toLower()))
                                                channels[pdch] = b;
@@ -652,7 +654,7 @@ bool Session::add_decoder(srd_decoder *const dec)
 
                // Create the decode signal
                shared_ptr<data::SignalBase> signalbase =
-                       make_shared<data::SignalBase>(nullptr);
+                       make_shared<data::SignalBase>(nullptr, data::SignalBase::DecodeChannel);
 
                signalbase->set_decoder_stack(decoder_stack);
                signalbases_.insert(signalbase);
@@ -730,7 +732,7 @@ void Session::update_signals()
        unsigned int logic_channel_count = count_if(
                channels.begin(), channels.end(),
                [] (shared_ptr<Channel> channel) {
-                       return channel->type() == ChannelType::LOGIC; });
+                       return channel->type() == sigrok::ChannelType::LOGIC; });
 
        // Create data containers for the logic data segments
        {
@@ -780,7 +782,8 @@ void Session::update_signals()
                                        switch(channel->type()->id()) {
                                        case SR_CHANNEL_LOGIC:
                                                if (!signalbase) {
-                                                       signalbase = make_shared<data::SignalBase>(channel);
+                                                       signalbase = make_shared<data::SignalBase>(channel,
+                                                               data::SignalBase::LogicChannel);
                                                        signalbases_.insert(signalbase);
 
                                                        all_signal_data_.insert(logic_data_);
@@ -796,7 +799,8 @@ void Session::update_signals()
                                        case SR_CHANNEL_ANALOG:
                                        {
                                                if (!signalbase) {
-                                                       signalbase = make_shared<data::SignalBase>(channel);
+                                                       signalbase = make_shared<data::SignalBase>(channel,
+                                                               data::SignalBase::AnalogChannel);
                                                        signalbases_.insert(signalbase);
 
                                                        shared_ptr<data::Analog> data(new data::Analog());
@@ -961,7 +965,7 @@ void Session::feed_in_logic(shared_ptr<Logic> logic)
 
                // Create a new data segment
                cur_logic_segment_ = make_shared<data::LogicSegment>(
-                       *logic_data_, logic, cur_samplerate_);
+                       *logic_data_, logic->unit_size(), cur_samplerate_);
                logic_data_->push_segment(cur_logic_segment_);
 
                // @todo Putting this here means that only listeners querying
@@ -969,11 +973,10 @@ void Session::feed_in_logic(shared_ptr<Logic> logic)
                // frame_began is DecoderStack, but in future we need to signal
                // this after both analog and logic sweeps have begun.
                frame_began();
-       } else {
-               // Append to the existing data segment
-               cur_logic_segment_->append_payload(logic);
        }
 
+       cur_logic_segment_->append_payload(logic);
+
        data_received();
 }