X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fsession.cpp;h=4edba0f7a2de9c5f428e9f07fe38d7532e69ad1e;hp=c18f809446a037475f4106e10576f3a89d5c1688;hb=e771b42d654ecb1e8e4d6ca60687c545461e3750;hpb=dc4ada2bfd5d9f4386661ffbf7ff3ad000b6bfb5 diff --git a/pv/session.cpp b/pv/session.cpp index c18f8094..4edba0f7 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -17,6 +17,7 @@ * along with this program; if not, see . */ +#include #include #include @@ -32,7 +33,6 @@ #include "data/analog.hpp" #include "data/analogsegment.hpp" #include "data/decode/decoder.hpp" -#include "data/decoderstack.hpp" #include "data/logic.hpp" #include "data/logicsegment.hpp" #include "data/signalbase.hpp" @@ -43,16 +43,17 @@ #include "toolbars/mainbar.hpp" -#include "view/analogsignal.hpp" -#include "view/decodetrace.hpp" -#include "view/logicsignal.hpp" -#include "view/signal.hpp" -#include "view/view.hpp" +#include "views/trace/analogsignal.hpp" +#include "views/trace/decodetrace.hpp" +#include "views/trace/logicsignal.hpp" +#include "views/trace/signal.hpp" +#include "views/trace/view.hpp" #include #ifdef ENABLE_DECODE #include +#include "data/decodesignal.hpp" #endif using std::bad_alloc; @@ -172,7 +173,7 @@ void Session::save_settings(QSettings &settings) const { map dev_info; list key_list; - int stacks = 0, views = 0; + int decode_signals = 0, views = 0; if (device_) { shared_ptr hw_device = @@ -216,14 +217,8 @@ void Session::save_settings(QSettings &settings) const for (shared_ptr base : signalbases_) { #ifdef ENABLE_DECODE if (base->is_decode_signal()) { - shared_ptr decoder_stack = - base->decoder_stack(); - shared_ptr top_decoder = - decoder_stack->stack().front(); - - settings.beginGroup("decoder_stack" + QString::number(stacks++)); - settings.setValue("id", top_decoder->decoder()->id); - settings.setValue("name", top_decoder->decoder()->name); + settings.beginGroup("decode_signal" + QString::number(decode_signals++)); + base->save_settings(settings); settings.endGroup(); } else #endif @@ -234,7 +229,7 @@ void Session::save_settings(QSettings &settings) const } } - settings.setValue("decoder_stacks", stacks); + settings.setValue("decode_signals", decode_signals); // Save view states and their signal settings // Note: main_view must be saved as view0 @@ -318,14 +313,12 @@ void Session::restore_settings(QSettings &settings) // Restore decoders #ifdef ENABLE_DECODE - int stacks = settings.value("decoder_stacks").toInt(); - - for (int i = 0; i < stacks; i++) { - settings.beginGroup("decoder_stack" + QString::number(i++)); - - QString id = settings.value("id").toString(); - add_decoder(srd_decoder_get_by_id(id.toStdString().c_str())); + 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.endGroup(); } #endif @@ -434,26 +427,76 @@ void Session::set_default_device() set_device((iter == devices.end()) ? devices.front() : *iter); } +/** + * Convert generic options to data types that are specific to InputFormat. + * + * @param[in] user_spec Vector of tokenized words, string format. + * @param[in] fmt_opts Input format's options, result of InputFormat::options(). + * + * @return Map of options suitable for InputFormat::create_input(). + */ +map +Session::input_format_options(vector user_spec, + map> fmt_opts) +{ + map result; + + for (auto entry : user_spec) { + /* + * Split key=value specs. Accept entries without separator + * (for simplified boolean specifications). + */ + string key, val; + size_t pos = entry.find("="); + if (pos == std::string::npos) { + key = entry; + val = ""; + } else { + key = entry.substr(0, pos); + val = entry.substr(pos + 1); + } + + /* + * Skip user specifications that are not a member of the + * format's set of supported options. Have the text input + * spec converted to the required input format specific + * data type. + */ + auto found = fmt_opts.find(key); + if (found == fmt_opts.end()) + continue; + shared_ptr