]> sigrok.org Git - pulseview.git/blobdiff - pv/session.cpp
Use SignalBase instead of LogicSignal for decoders
[pulseview.git] / pv / session.cpp
index 9c3a2c259e2a635f2eed79f5a8a607a9c33d490c..99dca2157e96641ed0fdbf7dd3100749dd35f963 100644 (file)
@@ -275,7 +275,7 @@ const unordered_set< shared_ptr<view::Signal> > Session::signals() const
 #ifdef ENABLE_DECODE
 bool Session::add_decoder(srd_decoder *const dec)
 {
-       map<const srd_channel*, shared_ptr<view::LogicSignal> > channels;
+       map<const srd_channel*, shared_ptr<data::SignalBase> > channels;
        shared_ptr<data::DecoderStack> decoder_stack;
 
        try {
@@ -294,13 +294,12 @@ bool Session::add_decoder(srd_decoder *const dec)
 
                // Auto select the initial channels
                for (const srd_channel *pdch : all_channels)
-                       for (shared_ptr<view::Signal> s : signals_) {
-                               shared_ptr<view::LogicSignal> l =
-                                       dynamic_pointer_cast<view::LogicSignal>(s);
-                               if (l && QString::fromUtf8(pdch->name).
-                                       toLower().contains(
-                                       s->channel()->name().toLower()))
-                                       channels[pdch] = l;
+                       for (shared_ptr<data::SignalBase> b : signalbases_) {
+                               if (b->type() == ChannelType::LOGIC) {
+                                       if (QString::fromUtf8(pdch->name).toLower().
+                                               contains(b->name().toLower()))
+                                               channels[pdch] = b;
+                               }
                        }
 
                assert(decoder_stack);
@@ -412,16 +411,11 @@ void Session::update_signals()
                        const auto iter = std::find_if(
                                prev_sigs.cbegin(), prev_sigs.cend(),
                                [&](const shared_ptr<view::Signal> &s) {
-                                       return s->channel()->channel() == channel;
+                                       return s->base()->channel() == channel;
                                });
                        if (iter != prev_sigs.end()) {
                                // Copy the signal from the old set to the new
                                signal = *iter;
-                               auto logic_signal = dynamic_pointer_cast<
-                                       view::LogicSignal>(signal);
-                               if (logic_signal)
-                                       logic_signal->set_logic_data(
-                                               logic_data_);
                        } else {
                                // Create a new signal
                                signalbase = shared_ptr<data::SignalBase>(
@@ -429,20 +423,21 @@ void Session::update_signals()
 
                                switch(channel->type()->id()) {
                                case SR_CHANNEL_LOGIC:
+                                       signalbase->set_data(logic_data_);
                                        signal = shared_ptr<view::Signal>(
                                                new view::LogicSignal(*this,
-                                                       device_, signalbase, logic_data_));
+                                                       device_, signalbase));
                                        all_signal_data_.insert(logic_data_);
                                        signalbases_.insert(signalbase);
                                        break;
 
                                case SR_CHANNEL_ANALOG:
                                {
-                                       shared_ptr<data::Analog> data(
-                                               new data::Analog());
+                                       shared_ptr<data::Analog> data(new data::Analog());
+                                       signalbase->set_data(data);
                                        signal = shared_ptr<view::Signal>(
                                                new view::AnalogSignal(
-                                                       *this, signalbase, data));
+                                                       *this, signalbase));
                                        all_signal_data_.insert(data);
                                        signalbases_.insert(signalbase);
                                        break;
@@ -462,7 +457,7 @@ void Session::update_signals()
        signals_changed();
 }
 
-shared_ptr<data::SignalBase> Session::signal_from_channel(
+shared_ptr<data::SignalBase> Session::signalbase_from_channel(
        shared_ptr<sigrok::Channel> channel) const
 {
        for (shared_ptr<data::SignalBase> sig : signalbases_) {
@@ -633,12 +628,10 @@ void Session::feed_in_analog(shared_ptr<Analog> analog)
                        cur_analog_segments_[channel] = segment;
 
                        // Find the analog data associated with the channel
-                       shared_ptr<view::AnalogSignal> sig =
-                               dynamic_pointer_cast<view::AnalogSignal>(
-                                       signal_from_channel(channel));
-                       assert(sig);
+                       shared_ptr<data::SignalBase> base = signalbase_from_channel(channel);
+                       assert(base);
 
-                       shared_ptr<data::Analog> data(sig->analog_data());
+                       shared_ptr<data::Analog> data(base->analog_data());
                        assert(data);
 
                        // Push the segment into the analog data.