X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fdata%2Fdecodesignal.cpp;h=b1f3cea75a9d8d40a629df8d2f67ddb824cf2c0d;hb=d3feec232211b3acec6a323ca3b8008ed8b2faa0;hp=4a9c139bb039a90627960d35c6a24a4f64ae7b3f;hpb=c8e60bdf0f33b3005e695a6b256b559dbc7b8576;p=pulseview.git diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index 4a9c139..b1f3cea 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include using std::lock_guard; @@ -415,22 +416,61 @@ void DecodeSignal::save_settings(QSettings &settings) const settings.setValue("decoders", (int)(stack_.size())); + // Save decoder stack int decoder_idx = 0; for (shared_ptr decoder : stack_) { settings.beginGroup("decoder" + QString::number(decoder_idx++)); settings.setValue("id", decoder->decoder()->id); + // Save decoder options + const map& options = decoder->options(); + + settings.setValue("options", (int)options.size()); + + // Note: decode::Decoder::options() returns only the options + // that differ from the default. See binding::Decoder::getter() + int i = 0; + for (auto option : options) { + settings.beginGroup("option" + QString::number(i)); + settings.setValue("name", QString::fromStdString(option.first)); + GlobalSettings::store_gvariant(settings, option.second); + settings.endGroup(); + i++; + } + settings.endGroup(); } - // TODO Save channel mapping and decoder options + // Save channel mapping + settings.setValue("channels", (int)channels_.size()); + + for (unsigned int channel_id = 0; channel_id < channels_.size(); channel_id++) { + auto channel = find_if(channels_.begin(), channels_.end(), + [&](data::DecodeChannel ch) { return ch.id == channel_id; }); + + if (channel == channels_.end()) { + qDebug() << "ERROR: Gap in channel index:" << channel_id; + continue; + } + + settings.beginGroup("channel" + QString::number(channel_id)); + + settings.setValue("name", channel->name); // Useful for debugging + settings.setValue("initial_pin_state", channel->initial_pin_state); + + if (channel->assigned_signal) + settings.setValue("assigned_signal_name", channel->assigned_signal->name()); + + settings.endGroup(); + } } void DecodeSignal::restore_settings(QSettings &settings) { SignalBase::restore_settings(settings); + // Restore decoder stack GSList *dec_list = g_slist_copy((GSList*)srd_decoder_list()); int decoders = settings.value("decoders").toInt(); @@ -446,7 +486,21 @@ void DecodeSignal::restore_settings(QSettings &settings) continue; if (QString::fromUtf8(dec->id) == id) { - stack_.push_back(make_shared(dec)); + shared_ptr decoder = + make_shared(dec); + + stack_.push_back(decoder); + + // Restore decoder options that differ from their default + int options = settings.value("options").toInt(); + + for (int i = 0; i < options; i++) { + settings.beginGroup("option" + QString::number(i)); + QString name = settings.value("name").toString(); + GVariant *value = GlobalSettings::restore_gvariant(settings); + decoder->set_option(name.toUtf8(), value); + settings.endGroup(); + } // Include the newly created decode channels in the channel lists update_channel_list(); @@ -457,7 +511,35 @@ void DecodeSignal::restore_settings(QSettings &settings) settings.endGroup(); } - // TODO Restore channel mapping and decoder options + // Restore channel mapping + unsigned int channels = settings.value("channels").toInt(); + + const unordered_set< shared_ptr > signalbases = + session_.signalbases(); + + for (unsigned int channel_id = 0; channel_id < channels; channel_id++) { + auto channel = find_if(channels_.begin(), channels_.end(), + [&](data::DecodeChannel ch) { return ch.id == channel_id; }); + + if (channel == channels_.end()) { + qDebug() << "ERROR: Non-existant channel index:" << channel_id; + continue; + } + + settings.beginGroup("channel" + QString::number(channel_id)); + + QString assigned_signal_name = settings.value("assigned_signal_name").toString(); + + for (shared_ptr signal : signalbases) + if (signal->name() == assigned_signal_name) + channel->assigned_signal = signal.get(); + + channel->initial_pin_state = settings.value("initial_pin_state").toInt(); + + settings.endGroup(); + } + + begin_decode(); } void DecodeSignal::update_channel_list()