X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fstoresession.cpp;h=f024a36cb8a8c49792eb5d8bd14d424429f42d2c;hb=4353c902e15b08115d42ca18b0db84d4b31a7930;hp=50815c26dcedfcaff7716f115b2eb376c371960a;hpb=b82243f74a175f621af26aabbc0f32e2ecb125fa;p=pulseview.git diff --git a/pv/storesession.cpp b/pv/storesession.cpp index 50815c26..f024a36c 100644 --- a/pv/storesession.cpp +++ b/pv/storesession.cpp @@ -21,6 +21,8 @@ #include "storesession.hpp" +#include + #include #include #include @@ -28,6 +30,7 @@ #include #include #include +#include #include #include @@ -97,7 +100,7 @@ bool StoreSession::start() vector< shared_ptr > achannel_list; vector< shared_ptr > asegment_list; - for (shared_ptr signal : sigs) { + for (const shared_ptr& signal : sigs) { if (!signal->enabled()) continue; @@ -145,6 +148,7 @@ bool StoreSession::start() uint64_t end_sample; if (sample_range_.first == sample_range_.second) { + // No sample range specified, save everything we have start_sample_ = 0; sample_count_ = any_segment->get_sample_count(); } else { @@ -159,6 +163,12 @@ bool StoreSession::start() } } + // Make sure the sample range is valid + if (start_sample_ > any_segment->get_sample_count()) { + error_ = tr("Can't save range without sample data."); + return false; + } + // Begin storing try { const auto context = session_.device_manager().context(); @@ -175,13 +185,27 @@ bool StoreSession::start() {{ConfigKey::SAMPLERATE, Glib::Variant::create( any_segment->samplerate())}}); output_->receive(meta); - } catch (Error error) { + } catch (Error& error) { error_ = tr("Error while saving: ") + error.what(); return false; } thread_ = std::thread(&StoreSession::store_proc, this, achannel_list, asegment_list, lsegment); + + // Save session setup if we're saving to srzip and the user wants it + GlobalSettings settings; + bool save_with_setup = settings.value(GlobalSettings::Key_General_SaveWithSetup).toBool(); + + if ((output_format_->name() == "srzip") && (save_with_setup)) { + QString setup_file_name = QString::fromStdString(file_name_); + setup_file_name.truncate(setup_file_name.lastIndexOf('.')); + setup_file_name.append(".pvs"); + + QSettings settings_storage(setup_file_name, QSettings::IniFormat); + session_.save_setup(settings_storage); + } + return true; } @@ -227,6 +251,7 @@ void StoreSession::store_proc(vector< shared_ptr > achannel_li const unsigned int samples_per_block = min(asamples_per_block, lsamples_per_block); + const auto context = session_.device_manager().context(); while (!interrupt_ && sample_count_) { progress_updated(); @@ -234,8 +259,6 @@ void StoreSession::store_proc(vector< shared_ptr > achannel_li min((uint64_t)samples_per_block, sample_count_); try { - const auto context = session_.device_manager().context(); - for (unsigned int i = 0; i < achannel_list.size(); i++) { shared_ptr achannel = (achannel_list.at(i))->channel(); shared_ptr asegment = asegment_list.at(i); @@ -269,7 +292,7 @@ void StoreSession::store_proc(vector< shared_ptr > achannel_li delete[] ldata; } - } catch (Error error) { + } catch (Error& error) { error_ = tr("Error while saving: ") + error.what(); break; } @@ -279,6 +302,11 @@ void StoreSession::store_proc(vector< shared_ptr > achannel_li units_stored_ = unit_count_ - (sample_count_ >> progress_scale); } + auto dfend = context->create_end_packet(); + const string ldata_str = output_->receive(dfend); + if (output_stream_.is_open()) + output_stream_ << ldata_str; + // Zeroing the progress variables indicates completion units_stored_ = unit_count_ = 0;