X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fsigsession.cpp;h=b5387877dda0a73a513f7cb5f066e030f3b17539;hp=6f66be7c586be3958b6b08290829264e401997c3;hb=6d483b8b51b4efceacf2f48776af33550bf5d29e;hpb=d99dc9f29066fba8948f1fca8b18a54b33064837 diff --git a/pv/sigsession.cpp b/pv/sigsession.cpp index 6f66be7c..b5387877 100644 --- a/pv/sigsession.cpp +++ b/pv/sigsession.cpp @@ -25,6 +25,7 @@ #include "sigsession.h" #include "devicemanager.h" +#include "devinst.h" #include "data/analog.h" #include "data/analogsnapshot.h" @@ -64,7 +65,6 @@ SigSession* SigSession::_session = NULL; SigSession::SigSession(DeviceManager &device_manager) : _device_manager(device_manager), - _sdi(NULL), _capture_state(Stopped) { // TODO: This should not be necessary @@ -75,41 +75,40 @@ SigSession::~SigSession() { stop_capture(); - _sampling_thread.join(); + if (_sampling_thread.joinable()) + _sampling_thread.join(); - if (_sdi) - _device_manager.release_device(_sdi); - _sdi = NULL; + if (_dev_inst) + _device_manager.release_device(_dev_inst); // TODO: This should not be necessary _session = NULL; } -struct sr_dev_inst* SigSession::get_device() const +shared_ptr SigSession::get_device() const { - return _sdi; + return _dev_inst; } -void SigSession::set_device(struct sr_dev_inst *sdi) +void SigSession::set_device(shared_ptr dev_inst) { // Ensure we are not capturing before setting the device stop_capture(); - if (_sdi) - _device_manager.release_device(_sdi); - if (sdi) - _device_manager.use_device(sdi, this); - _sdi = sdi; - update_signals(sdi); + if (_dev_inst) + _device_manager.release_device(_dev_inst); + if (dev_inst) + _device_manager.use_device(dev_inst, this); + _dev_inst = dev_inst; + update_signals(dev_inst); } -void SigSession::release_device(struct sr_dev_inst *sdi) +void SigSession::release_device(shared_ptr dev_inst) { - (void)sdi; + (void)dev_inst; assert(_capture_state == Stopped); - _sdi = NULL; - update_signals(NULL); + _dev_inst = shared_ptr(); } void SigSession::load_file(const string &name, @@ -127,12 +126,13 @@ void SigSession::load_file(const string &name, return; } - sr_dev_inst *const sdi = (sr_dev_inst*)devlist->data; + shared_ptr dev_inst( + new DevInst((sr_dev_inst*)devlist->data)); g_slist_free(devlist); _decode_traces.clear(); - update_signals(sdi); - read_sample_rate(sdi); + update_signals(dev_inst); + read_sample_rate(dev_inst->dev_inst()); _sampling_thread = boost::thread( &SigSession::load_session_thread_proc, this, @@ -146,7 +146,7 @@ void SigSession::load_file(const string &name, return; _decode_traces.clear(); - update_signals(in->sdi); + update_signals(shared_ptr(new DevInst(in->sdi))); read_sample_rate(in->sdi); _sampling_thread = boost::thread( @@ -166,14 +166,16 @@ void SigSession::start_capture(function error_handler) stop_capture(); // Check that a device instance has been selected. - if (!_sdi) { + if (!_dev_inst) { qDebug() << "No device selected"; return; } + assert(_dev_inst->dev_inst()); + // Check that at least one probe is enabled const GSList *l; - for (l = _sdi->probes; l; l = l->next) { + for (l = _dev_inst->dev_inst()->probes; l; l = l->next) { sr_probe *const probe = (sr_probe*)l->data; assert(probe); if (probe->enabled) @@ -187,7 +189,8 @@ void SigSession::start_capture(function error_handler) // Begin the session _sampling_thread = boost::thread( - &SigSession::sample_thread_proc, this, _sdi, error_handler); + &SigSession::sample_thread_proc, this, _dev_inst, + error_handler); } void SigSession::stop_capture() @@ -198,7 +201,8 @@ void SigSession::stop_capture() sr_session_stop(); // Check that sampling stopped - _sampling_thread.join(); + if (_sampling_thread.joinable()) + _sampling_thread.join(); } set< shared_ptr > SigSession::get_data() const @@ -233,10 +237,15 @@ bool SigSession::add_decoder(srd_decoder *const dec) decoder_stack = shared_ptr( new data::DecoderStack(dec)); - // Auto select the initial probes + // Make a list of all the probes + std::vector all_probes; for(const GSList *i = dec->probes; i; i = i->next) - { - const srd_probe *const probe = (const srd_probe*)i->data; + all_probes.push_back((const srd_probe*)i->data); + for(const GSList *i = dec->opt_probes; i; i = i->next) + all_probes.push_back((const srd_probe*)i->data); + + // Auto select the initial probes + BOOST_FOREACH(const srd_probe *probe, all_probes) BOOST_FOREACH(shared_ptr s, _signals) { shared_ptr l = @@ -246,7 +255,6 @@ bool SigSession::add_decoder(srd_decoder *const dec) l->get_name().toLower())) probes[probe] = l; } - } assert(decoder_stack); assert(!decoder_stack->stack().empty()); @@ -378,8 +386,9 @@ sr_input* SigSession::load_input_file_format(const string &filename, return in; } -void SigSession::update_signals(const sr_dev_inst *const sdi) +void SigSession::update_signals(shared_ptr dev_inst) { + assert(dev_inst); assert(_capture_state == Stopped); unsigned int logic_probe_count = 0; @@ -388,8 +397,10 @@ void SigSession::update_signals(const sr_dev_inst *const sdi) _decode_traces.clear(); // Detect what data types we will receive - if(sdi) { - for (const GSList *l = sdi->probes; l; l = l->next) { + if(dev_inst) { + assert(dev_inst->dev_inst()); + for (const GSList *l = dev_inst->dev_inst()->probes; + l; l = l->next) { const sr_probe *const probe = (const sr_probe *)l->data; if (!probe->enabled) continue; @@ -420,10 +431,12 @@ void SigSession::update_signals(const sr_dev_inst *const sdi) _signals.clear(); - if(!sdi) + if(!dev_inst) break; - for (const GSList *l = sdi->probes; l; l = l->next) { + assert(dev_inst->dev_inst()); + for (const GSList *l = dev_inst->dev_inst()->probes; + l; l = l->next) { shared_ptr signal; sr_probe *const probe = (sr_probe *)l->data; assert(probe); @@ -431,8 +444,8 @@ void SigSession::update_signals(const sr_dev_inst *const sdi) switch(probe->type) { case SR_PROBE_LOGIC: signal = shared_ptr( - new view::LogicSignal(*this, probe, - _logic_data)); + new view::LogicSignal(dev_inst, + probe, _logic_data)); break; case SR_PROBE_ANALOG: @@ -440,8 +453,8 @@ void SigSession::update_signals(const sr_dev_inst *const sdi) shared_ptr data( new data::Analog()); signal = shared_ptr( - new view::AnalogSignal(*this, probe, - data)); + new view::AnalogSignal(dev_inst, + probe, data)); break; } @@ -461,8 +474,9 @@ void SigSession::update_signals(const sr_dev_inst *const sdi) bool SigSession::is_trigger_enabled() const { - assert(_sdi); - for (const GSList *l = _sdi->probes; l; l = l->next) { + assert(_dev_inst); + assert(_dev_inst->dev_inst()); + for (const GSList *l = _dev_inst->dev_inst()->probes; l; l = l->next) { const sr_probe *const p = (const sr_probe *)l->data; assert(p); if (p->trigger && p->trigger[0] != '\0') @@ -554,16 +568,17 @@ void SigSession::load_input_thread_proc(const string name, delete in; } -void SigSession::sample_thread_proc(struct sr_dev_inst *sdi, +void SigSession::sample_thread_proc(shared_ptr dev_inst, function error_handler) { - assert(sdi); + assert(dev_inst); + assert(dev_inst->dev_inst()); assert(error_handler); sr_session_new(); sr_session_datafeed_callback_add(data_feed_in_proc, NULL); - if (sr_session_dev_add(sdi) != SR_OK) { + if (sr_session_dev_add(dev_inst->dev_inst()) != SR_OK) { error_handler(tr("Failed to use device.")); sr_session_destroy(); return; @@ -632,7 +647,7 @@ void SigSession::feed_in_logic(const sr_datafeed_logic &logic) // Create a new data snapshot _cur_logic_snapshot = shared_ptr( - new data::LogicSnapshot(logic)); + new data::LogicSnapshot(logic, _dev_inst->get_sample_limit())); _logic_data->push_snapshot(_cur_logic_snapshot); } else @@ -674,7 +689,7 @@ void SigSession::feed_in_analog(const sr_datafeed_analog &analog) // Create a snapshot, keep it in the maps of probes snapshot = shared_ptr( - new data::AnalogSnapshot()); + new data::AnalogSnapshot(_dev_inst->get_sample_limit())); _cur_analog_snapshots[probe] = snapshot; // Find the annalog data associated with the probe