projects
/
pulseview.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix #510 by disabling removal of the last decoder from the popup
[pulseview.git]
/
pv
/
session.cpp
diff --git
a/pv/session.cpp
b/pv/session.cpp
index d6fef9a7eee143e0de1f3f877654f6e117066719..22e0428d94abf26a5421c540377dc9e55c6ddccf 100644
(file)
--- a/
pv/session.cpp
+++ b/
pv/session.cpp
@@
-179,6
+179,10
@@
void Session::start_capture(function<void (const QString)> error_handler)
}
}
}
}
+ // Clear signal data
+ for (const shared_ptr<data::SignalData> d : get_data())
+ d->clear();
+
// Begin the session
sampling_thread_ = std::thread(
&Session::sample_thread_proc, this, device_,
// Begin the session
sampling_thread_ = std::thread(
&Session::sample_thread_proc, this, device_,
@@
-233,9
+237,9
@@
bool Session::add_decoder(srd_decoder *const dec)
// Make a list of all the channels
std::vector<const srd_channel*> all_channels;
// Make a list of all the channels
std::vector<const srd_channel*> all_channels;
- for(const GSList *i = dec->channels; i; i = i->next)
+ for
(const GSList *i = dec->channels; i; i = i->next)
all_channels.push_back((const srd_channel*)i->data);
all_channels.push_back((const srd_channel*)i->data);
- for(const GSList *i = dec->opt_channels; i; i = i->next)
+ for
(const GSList *i = dec->opt_channels; i; i = i->next)
all_channels.push_back((const srd_channel*)i->data);
// Auto select the initial channels
all_channels.push_back((const srd_channel*)i->data);
// Auto select the initial channels
@@
-297,7
+301,7
@@
void Session::set_capture_state(capture_state state)
lock_guard<mutex> lock(sampling_mutex_);
const bool changed = capture_state_ != state;
capture_state_ = state;
lock_guard<mutex> lock(sampling_mutex_);
const bool changed = capture_state_ != state;
capture_state_ = state;
- if(changed)
+ if
(changed)
capture_state_changed(state);
}
capture_state_changed(state);
}
@@
-411,8
+415,12
@@
void Session::sample_thread_proc(shared_ptr<devices::Device> device,
assert(device);
assert(error_handler);
assert(device);
assert(error_handler);
+ (void)device;
+
cur_samplerate_ = device_->read_config<uint64_t>(ConfigKey::SAMPLERATE);
cur_samplerate_ = device_->read_config<uint64_t>(ConfigKey::SAMPLERATE);
+ out_of_memory_ = false;
+
try {
device_->start();
} catch(Error e) {
try {
device_->start();
} catch(Error e) {
@@
-432,6
+440,9
@@
void Session::sample_thread_proc(shared_ptr<devices::Device> device,
qDebug("SR_DF_END was not received.");
assert(0);
}
qDebug("SR_DF_END was not received.");
assert(0);
}
+
+ if (out_of_memory_)
+ error_handler(tr("Out of memory, acquisition stopped."));
}
void Session::feed_in_header()
}
void Session::feed_in_header()
@@
-465,6
+476,8
@@
void Session::feed_in_logic(shared_ptr<Logic> logic)
{
lock_guard<recursive_mutex> lock(data_mutex_);
{
lock_guard<recursive_mutex> lock(data_mutex_);
+ const size_t sample_count = logic->data_length() / logic->unit_size();
+
if (!logic_data_)
{
// The only reason logic_data_ would not have been created is
if (!logic_data_)
{
// The only reason logic_data_ would not have been created is
@@
-478,14
+491,10
@@
void Session::feed_in_logic(shared_ptr<Logic> logic)
// This could be the first packet after a trigger
set_capture_state(Running);
// This could be the first packet after a trigger
set_capture_state(Running);
- // Get sample limit.
- const uint64_t sample_limit = device_->read_config<uint64_t>(
- ConfigKey::LIMIT_SAMPLES);
-
// Create a new data segment
cur_logic_segment_ = shared_ptr<data::LogicSegment>(
new data::LogicSegment(
// Create a new data segment
cur_logic_segment_ = shared_ptr<data::LogicSegment>(
new data::LogicSegment(
- logic, cur_samplerate_, sample_
limi
t));
+ logic, cur_samplerate_, sample_
coun
t));
logic_data_->push_segment(cur_logic_segment_);
// @todo Putting this here means that only listeners querying
logic_data_->push_segment(cur_logic_segment_);
// @todo Putting this here means that only listeners querying
@@
-529,26
+538,13
@@
void Session::feed_in_analog(shared_ptr<Analog> analog)
// in the sweep containing this segment.
sweep_beginning = true;
// in the sweep containing this segment.
sweep_beginning = true;
- // Get sample limit.
- uint64_t sample_limit;
- try {
- assert(device_);
- const std::shared_ptr<sigrok::Device> device =
- device_->device();
- assert(device);
- sample_limit = VariantBase::cast_dynamic<Variant<guint64>>(
- device->config_get(ConfigKey::LIMIT_SAMPLES)).get();
- } catch (Error) {
- sample_limit = 0;
- }
-
// Create a segment, keep it in the maps of channels
segment = shared_ptr<data::AnalogSegment>(
new data::AnalogSegment(
// Create a segment, keep it in the maps of channels
segment = shared_ptr<data::AnalogSegment>(
new data::AnalogSegment(
- cur_samplerate_, sample_
limi
t));
+ cur_samplerate_, sample_
coun
t));
cur_analog_segments_[channel] = segment;
cur_analog_segments_[channel] = segment;
- // Find the an
n
alog data associated with the channel
+ // Find the analog data associated with the channel
shared_ptr<view::AnalogSignal> sig =
dynamic_pointer_cast<view::AnalogSignal>(
signal_from_channel(channel));
shared_ptr<view::AnalogSignal> sig =
dynamic_pointer_cast<view::AnalogSignal>(
signal_from_channel(channel));
@@
-599,11
+595,21
@@
void Session::data_feed_in(shared_ptr<sigrok::Device> device,
break;
case SR_DF_LOGIC:
break;
case SR_DF_LOGIC:
- feed_in_logic(dynamic_pointer_cast<Logic>(packet->payload()));
+ try {
+ feed_in_logic(dynamic_pointer_cast<Logic>(packet->payload()));
+ } catch (std::bad_alloc) {
+ out_of_memory_ = true;
+ device_->stop();
+ }
break;
case SR_DF_ANALOG:
break;
case SR_DF_ANALOG:
- feed_in_analog(dynamic_pointer_cast<Analog>(packet->payload()));
+ try {
+ feed_in_analog(dynamic_pointer_cast<Analog>(packet->payload()));
+ } catch (std::bad_alloc) {
+ out_of_memory_ = true;
+ device_->stop();
+ }
break;
case SR_DF_END:
break;
case SR_DF_END: