X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdevices%2Finputfile.cpp;h=46886ed516399eaebb7b624edf951a70775b7b01;hp=1bf34bad22a33bc0307199657bfe5ecf8dc9ef3d;hb=16a832bc5bb4cce24598537c99e0655edb65c1d0;hpb=3b0acbcbcd902ac61a3841e7c558cbc5f8448b7f diff --git a/pv/devices/inputfile.cpp b/pv/devices/inputfile.cpp index 1bf34bad..46886ed5 100644 --- a/pv/devices/inputfile.cpp +++ b/pv/devices/inputfile.cpp @@ -21,11 +21,18 @@ #include #include +#include #include +#include + #include "inputfile.hpp" +using sigrok::InputFormat; + using std::map; +using std::out_of_range; +using std::pair; using std::shared_ptr; using std::streamsize; using std::string; @@ -36,7 +43,10 @@ using std::vector; namespace pv { namespace devices { -const streamsize InputFile::BufferSize = 16384; +// Use a 4MB chunk size for reading a file into memory. Larger values don't +// seem to provide any substancial performance improvements, but can cause +// UI lag and a visually "stuttering" display of the data currently loading. +const streamsize InputFile::BufferSize = (4 * 1024 * 1024); InputFile::InputFile(const shared_ptr &context, const string &file_name, @@ -50,6 +60,56 @@ InputFile::InputFile(const shared_ptr &context, { } +InputFile::InputFile(const shared_ptr &context, + QSettings &settings): + File(""), + context_(context), + interrupt_(false) +{ + file_name_ = settings.value("filename").toString().toStdString(); + + QString format_name = settings.value("format").toString(); + + // Find matching format + const map > formats = context->input_formats(); + + try { + format_ = formats.at(format_name.toStdString()); + + // Restore all saved options + 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(); + options_[name.toStdString()] = GlobalSettings::restore_variantbase(settings); + settings.endGroup(); + } + + } catch (out_of_range&) { + qWarning() << "Could not find input format" << format_name << + "needed to restore session input file"; + } +} + +void InputFile::save_meta_to_settings(QSettings &settings) +{ + settings.setValue("filename", QString::fromStdString(file_name_)); + + settings.setValue("format", QString::fromStdString(format_->name())); + + settings.setValue("options", (int)options_.size()); + + int i = 0; + for (pair option : options_) { + settings.beginGroup("option" + QString::number(i)); + settings.setValue("name", QString::fromStdString(option.first)); + GlobalSettings::store_variantbase(settings, option.second); + settings.endGroup(); + i++; + } +} + void InputFile::open() { if (session_) @@ -57,6 +117,9 @@ void InputFile::open() else session_ = context_->create_session(); + if (!format_) + return; + input_ = format_->create_input(options_); if (!input_) @@ -96,6 +159,9 @@ void InputFile::start() void InputFile::run() { + if (!input_) + return; + if (!f) { // Previous call to run() processed the entire file already f = new ifstream(file_name_, ios::binary);