X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fsession.cpp;h=51a1aee715853ed305d331bb7f04ab158f26a00c;hb=0a952555b9d153f42912e47f35fac5dd4643fca9;hp=d406b9f21ba040c1fb4707c0f261bb7c75b05b33;hpb=5f9a52096e07e399d76da6724c1cf56bf4511c9f;p=pulseview.git diff --git a/pv/session.cpp b/pv/session.cpp index d406b9f2..51a1aee7 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -105,6 +105,10 @@ using Gst::ElementFactory; using Gst::Pipeline; #endif +using pv::views::trace::Signal; +using pv::views::trace::AnalogSignal; +using pv::views::trace::LogicSignal; + namespace pv { shared_ptr Session::sr_context; @@ -187,11 +191,50 @@ bool Session::data_saved() const return data_saved_; } +void Session::save_setup(QSettings &settings) const +{ + int decode_signals = 0, views = 0; + + // Save channels and decoders + for (const shared_ptr& base : signalbases_) { +#ifdef ENABLE_DECODE + if (base->is_decode_signal()) { + settings.beginGroup("decode_signal" + QString::number(decode_signals++)); + base->save_settings(settings); + settings.endGroup(); + } else +#endif + { + settings.beginGroup(base->internal_name()); + base->save_settings(settings); + settings.endGroup(); + } + } + + settings.setValue("decode_signals", decode_signals); + + // Save view states and their signal settings + // Note: main_view must be saved as view0 + settings.beginGroup("view" + QString::number(views++)); + main_view_->save_settings(settings); + settings.endGroup(); + + for (const shared_ptr& view : views_) { + if (view != main_view_) { + settings.beginGroup("view" + QString::number(views++)); + settings.setValue("type", view->get_type()); + view->save_settings(settings); + settings.endGroup(); + } + } + + settings.setValue("views", views); +} + void Session::save_settings(QSettings &settings) const { map dev_info; list key_list; - int decode_signals = 0, views = 0; if (device_) { shared_ptr hw_device = @@ -241,39 +284,45 @@ void Session::save_settings(QSettings &settings) const settings.endGroup(); } - // Save channels and decoders - for (const shared_ptr& base : signalbases_) { + save_setup(settings); + } +} + +void Session::restore_setup(QSettings &settings) +{ + // Restore channels + for (shared_ptr base : signalbases_) { + settings.beginGroup(base->internal_name()); + base->restore_settings(settings); + settings.endGroup(); + } + + // Restore decoders #ifdef ENABLE_DECODE - if (base->is_decode_signal()) { - settings.beginGroup("decode_signal" + QString::number(decode_signals++)); - base->save_settings(settings); - settings.endGroup(); - } else + int decode_signals = settings.value("decode_signals").toInt(); + + for (int i = 0; i < decode_signals; i++) { + settings.beginGroup("decode_signal" + QString::number(i)); + shared_ptr signal = add_decode_signal(); + signal->restore_settings(settings); + settings.endGroup(); + } #endif - { - settings.beginGroup(base->internal_name()); - base->save_settings(settings); - settings.endGroup(); - } - } - settings.setValue("decode_signals", decode_signals); + // Restore views + int views = settings.value("views").toInt(); - // Save view states and their signal settings - // Note: main_view must be saved as view0 - settings.beginGroup("view" + QString::number(views++)); - main_view_->save_settings(settings); - settings.endGroup(); + for (int i = 0; i < views; i++) { + settings.beginGroup("view" + QString::number(i)); - for (const shared_ptr& view : views_) { - if (view != main_view_) { - settings.beginGroup("view" + QString::number(views++)); - view->save_settings(settings); - settings.endGroup(); - } - } + if (i > 0) { + views::ViewType type = (views::ViewType)settings.value("type").toInt(); + add_view(type, this); + views_.back()->restore_settings(settings); + } else + main_view_->restore_settings(settings); - settings.setValue("views", views); + settings.endGroup(); } } @@ -345,42 +394,8 @@ void Session::restore_settings(QSettings &settings) } } - if (device) { - // Restore channels - for (shared_ptr base : signalbases_) { - settings.beginGroup(base->internal_name()); - base->restore_settings(settings); - settings.endGroup(); - } - - // Restore decoders -#ifdef ENABLE_DECODE - int decode_signals = settings.value("decode_signals").toInt(); - - for (int i = 0; i < decode_signals; i++) { - settings.beginGroup("decode_signal" + QString::number(i)); - shared_ptr signal = add_decode_signal(); - signal->restore_settings(settings); - settings.endGroup(); - } -#endif - - // Restore views - int views = settings.value("views").toInt(); - - for (int i = 0; i < views; i++) { - settings.beginGroup("view" + QString::number(i)); - - if (i > 0) { - views::ViewType type = (views::ViewType)settings.value("type").toInt(); - add_view(name_, type, this); - views_.back()->restore_settings(settings); - } else - main_view_->restore_settings(settings); - - settings.endGroup(); - } - } + if (device) + restore_setup(settings); } void Session::select_device(shared_ptr device) @@ -515,7 +530,8 @@ Session::input_format_options(vector user_spec, return result; } -void Session::load_init_file(const string &file_name, const string &format) +void Session::load_init_file(const string &file_name, + const string &format, const string &setup_file_name) { shared_ptr input_format; map input_opts; @@ -539,12 +555,12 @@ void Session::load_init_file(const string &file_name, const string &format) input_format->options()); } - load_file(QString::fromStdString(file_name), input_format, input_opts); + load_file(QString::fromStdString(file_name), QString::fromStdString(setup_file_name), + input_format, input_opts); } -void Session::load_file(QString file_name, - shared_ptr format, - const map &options) +void Session::load_file(QString file_name, QString setup_file_name, + shared_ptr format, const map &options) { const QString errorMessage( QString("Failed to load file %1").arg(file_name)); @@ -572,6 +588,18 @@ void Session::load_file(QString file_name, return; } + // Use the input file with .pvs extension if no setup file was given + if (setup_file_name.isEmpty()) { + setup_file_name = file_name; + setup_file_name.truncate(setup_file_name.lastIndexOf('.')); + setup_file_name.append(".pvs"); + } + + if (QFileInfo::exists(setup_file_name) && QFileInfo(setup_file_name).isReadable()) { + QSettings settings_storage(setup_file_name, QSettings::IniFormat); + restore_setup(settings_storage); + } + main_bar_->update_device_list(); start_capture([&, errorMessage](QString infoMessage) { @@ -640,9 +668,8 @@ void Session::stop_capture() void Session::register_view(shared_ptr view) { - if (views_.empty()) { + if (views_.empty()) main_view_ = view; - } views_.push_back(view); @@ -650,35 +677,29 @@ void Session::register_view(shared_ptr view) update_signals(); // Add all other signals - unordered_set< shared_ptr > view_signalbases = - view->signalbases(); - - views::trace::View *trace_view = - qobject_cast(view.get()); - - if (trace_view) { - for (const shared_ptr& signalbase : signalbases_) { - const int sb_exists = count_if( - view_signalbases.cbegin(), view_signalbases.cend(), - [&](const shared_ptr &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: + unordered_set< shared_ptr > view_signalbases = view->signalbases(); + + for (const shared_ptr& signalbase : signalbases_) { + const int sb_exists = count_if( + view_signalbases.cbegin(), view_signalbases.cend(), + [&](const shared_ptr &sb) { + return sb == signalbase; + }); + + // Add the signal to the view if it doesn't have it yet + if (!sb_exists) + switch (signalbase->type()) { + case data::SignalBase::AnalogChannel: + case data::SignalBase::LogicChannel: + case data::SignalBase::MathChannel: + view->add_signalbase(signalbase); + break; + case data::SignalBase::DecodeChannel: #ifdef ENABLE_DECODE - trace_view->add_decode_signal( - dynamic_pointer_cast(signalbase)); + view->add_decode_signal(dynamic_pointer_cast(signalbase)); #endif - break; - case data::SignalBase::MathChannel: - // TBD - break; - } - } + break; + } } signals_changed(); @@ -801,6 +822,11 @@ void Session::set_capture_state(capture_state state) { bool changed; + if (state == Running) + acq_time_.restart(); + if (state == Stopped) + qDebug("Acquisition took %.2f s", acq_time_.elapsed() / 1000.); + { lock_guard lock(sampling_mutex_); changed = capture_state_ != state; @@ -867,18 +893,17 @@ void Session::update_signals() qobject_cast(viewbase.get()); if (trace_view) { - unordered_set< shared_ptr > - prev_sigs(trace_view->signals()); + unordered_set< shared_ptr > prev_sigs(trace_view->signals()); trace_view->clear_signals(); for (auto channel : sr_dev->channels()) { shared_ptr signalbase; - shared_ptr signal; + shared_ptr signal; // Find the channel in the old signals const auto iter = find_if( prev_sigs.cbegin(), prev_sigs.cend(), - [&](const shared_ptr &s) { + [&](const shared_ptr &s) { return s->base()->channel() == channel; }); if (iter != prev_sigs.end()) { @@ -892,6 +917,8 @@ void Session::update_signals() if (b->channel() == channel) signalbase = b; + shared_ptr signal; + switch(channel->type()->id()) { case SR_CHANNEL_LOGIC: if (!signalbase) { @@ -906,10 +933,7 @@ void Session::update_signals() signalbase.get(), SLOT(on_capture_state_changed(int))); } - signal = shared_ptr( - new views::trace::LogicSignal(*this, - device_, signalbase)); - trace_view->add_signal(signal); + signal = shared_ptr(new LogicSignal(*this, device_, signalbase)); break; case SR_CHANNEL_ANALOG: @@ -927,10 +951,7 @@ void Session::update_signals() signalbase.get(), SLOT(on_capture_state_changed(int))); } - signal = shared_ptr( - new views::trace::AnalogSignal( - *this, signalbase)); - trace_view->add_signal(signal); + signal = shared_ptr(new AnalogSignal(*this, signalbase)); break; } @@ -938,6 +959,17 @@ void Session::update_signals() assert(false); break; } + + // New views take their signal settings from the main view + if (!viewbase->is_main_view()) { + shared_ptr main_tv = + dynamic_pointer_cast(main_view_); + shared_ptr main_signal = + main_tv->get_signal_by_signalbase(signalbase); + signal->restore_settings(main_signal->save_settings()); + } + + trace_view->add_signal(signal); } } } @@ -1442,4 +1474,19 @@ void Session::on_data_saved() data_saved_ = true; } +#ifdef ENABLE_DECODE +void Session::on_new_decoders_selected(vector decoders) +{ + assert(decoders.size() > 0); + + shared_ptr signal = add_decode_signal(); + + if (signal) + for (unsigned int i = 0; i < decoders.size(); i++) { + const srd_decoder* d = decoders[i]; + signal->stack_decoder(d, !(i < decoders.size() - 1)); + } +} +#endif + } // namespace pv