]> sigrok.org Git - pulseview.git/blobdiff - pv/session.cpp
AnalogSignal: Use setting change handler for threshold display
[pulseview.git] / pv / session.cpp
index f96fc869ecad613816196072409c4d1458e198ad..4dcc2e8b7b77f5da1cfce26781e694d16f23eb7f 100644 (file)
@@ -91,6 +91,9 @@ using sigrok::Session;
 using Glib::VariantBase;
 
 namespace pv {
+
+shared_ptr<sigrok::Context> Session::sr_context;
+
 Session::Session(DeviceManager &device_manager, QString name) :
        device_manager_(device_manager),
        default_name_(name),
@@ -316,9 +319,9 @@ void Session::restore_settings(QSettings &settings)
                int decode_signals = settings.value("decode_signals").toInt();
 
                for (int i = 0; i < decode_signals; i++) {
-                       settings.beginGroup("decode_signal" + QString::number(i++));
-                       // TODO Split up add_decoder() into add_decode_signal() and add_decoder(),
-                       // then call add_decode_signal() and signal->restore_settings() here
+                       settings.beginGroup("decode_signal" + QString::number(i));
+                       shared_ptr<data::DecodeSignal> signal = add_decode_signal();
+                       signal->restore_settings(settings);
                        settings.endGroup();
                }
 #endif
@@ -597,7 +600,42 @@ void Session::register_view(shared_ptr<views::ViewBase> view)
 
        views_.push_back(view);
 
+       // Add all device signals
        update_signals();
+
+       // Add all other signals
+       unordered_set< shared_ptr<data::SignalBase> > view_signalbases =
+               view->signalbases();
+
+       views::trace::View *trace_view =
+               qobject_cast<views::trace::View*>(view.get());
+
+       if (trace_view) {
+               for (shared_ptr<data::SignalBase> signalbase : signalbases_) {
+                       const int sb_exists = count_if(
+                               view_signalbases.cbegin(), view_signalbases.cend(),
+                               [&](const shared_ptr<data::SignalBase> &sb) {
+                                       return sb == signalbase;
+                               });
+                       // Add the signal to the view as it doesn't have it yet
+                       if (!sb_exists)
+                               switch (signalbase->type()) {
+                               case data::SignalBase::AnalogChannel:
+                               case data::SignalBase::LogicChannel:
+                               case data::SignalBase::DecodeChannel:
+#ifdef ENABLE_DECODE
+                                       trace_view->add_decode_signal(
+                                               dynamic_pointer_cast<data::DecodeSignal>(signalbase));
+#endif
+                                       break;
+                               case data::SignalBase::MathChannel:
+                                       // TBD
+                                       break;
+                               }
+               }
+       }
+
+       signals_changed();
 }
 
 void Session::deregister_view(shared_ptr<views::ViewBase> view)
@@ -645,31 +683,27 @@ const unordered_set< shared_ptr<data::SignalBase> > Session::signalbases() const
 }
 
 #ifdef ENABLE_DECODE
-bool Session::add_decoder(srd_decoder *const dec)
+shared_ptr<data::DecodeSignal> Session::add_decode_signal()
 {
-       if (!dec)
-               return false;
+       shared_ptr<data::DecodeSignal> signal;
 
        try {
                // Create the decode signal
-               shared_ptr<data::DecodeSignal> signal =
-                       make_shared<data::DecodeSignal>(*this);
+               signal = make_shared<data::DecodeSignal>(*this);
 
                signalbases_.insert(signal);
 
                // Add the decode signal to all views
                for (shared_ptr<views::ViewBase> view : views_)
                        view->add_decode_signal(signal);
-
-               // Add decoder
-               signal->stack_decoder(dec);
        } catch (runtime_error e) {
-               return false;
+               remove_decode_signal(signal);
+               return nullptr;
        }
 
        signals_changed();
 
-       return true;
+       return signal;
 }
 
 void Session::remove_decode_signal(shared_ptr<data::DecodeSignal> signal)