X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fsigsession.cpp;h=e51acde2b6a2d93733177dd1865641c3512abd9d;hp=92118b4816711f32d06b314c56e211b327ff7e25;hb=4871ed92f2d9e6e514223383ba16e6ad78c81161;hpb=bdc5c3b09d09781aa50ae3b128b2a7c6e2a53d5b diff --git a/pv/sigsession.cpp b/pv/sigsession.cpp index 92118b48..e51acde2 100644 --- a/pv/sigsession.cpp +++ b/pv/sigsession.cpp @@ -126,6 +126,28 @@ void SigSession::set_file(const string &name) throw(QString) set_device(shared_ptr(device::File::create(name))); } +void SigSession::set_default_device() +{ + shared_ptr default_device; + const list< shared_ptr > &devices = + _device_manager.devices(); + + if (!devices.empty()) { + // Fall back to the first device in the list. + default_device = devices.front(); + + // Try and find the demo device and select that by default + BOOST_FOREACH (shared_ptr dev, devices) + if (strcmp(dev->dev_inst()->driver->name, + "demo") == 0) { + default_device = dev; + break; + } + } + + set_device(default_device); +} + void SigSession::release_device(device::DevInst *dev_inst) { (void)dev_inst; @@ -155,15 +177,15 @@ void SigSession::start_capture(function error_handler) // Check that at least one probe is enabled const GSList *l; - for (l = _dev_inst->dev_inst()->probes; l; l = l->next) { - sr_probe *const probe = (sr_probe*)l->data; + for (l = _dev_inst->dev_inst()->channels; l; l = l->next) { + sr_channel *const probe = (sr_channel*)l->data; assert(probe); if (probe->enabled) break; } if (!l) { - error_handler(tr("No probes enabled.")); + error_handler(tr("No channels enabled.")); return; } @@ -290,28 +312,6 @@ void SigSession::set_capture_state(capture_state state) capture_state_changed(state); } -void SigSession::set_default_device() -{ - shared_ptr default_device; - const list< shared_ptr > &devices = - _device_manager.devices(); - - if (!devices.empty()) { - // Fall back to the first device in the list. - default_device = devices.front(); - - // Try and find the demo device and select that by default - BOOST_FOREACH (shared_ptr dev, devices) - if (strcmp(dev->dev_inst()->driver->name, - "demo") == 0) { - default_device = dev; - break; - } - } - - set_device(default_device); -} - void SigSession::update_signals(shared_ptr dev_inst) { assert(dev_inst); @@ -325,14 +325,14 @@ void SigSession::update_signals(shared_ptr dev_inst) // Detect what data types we will receive if(dev_inst) { assert(dev_inst->dev_inst()); - for (const GSList *l = dev_inst->dev_inst()->probes; + for (const GSList *l = dev_inst->dev_inst()->channels; l; l = l->next) { - const sr_probe *const probe = (const sr_probe *)l->data; + const sr_channel *const probe = (const sr_channel *)l->data; if (!probe->enabled) continue; switch(probe->type) { - case SR_PROBE_LOGIC: + case SR_CHANNEL_LOGIC: logic_probe_count++; break; } @@ -361,20 +361,20 @@ void SigSession::update_signals(shared_ptr dev_inst) break; assert(dev_inst->dev_inst()); - for (const GSList *l = dev_inst->dev_inst()->probes; + for (const GSList *l = dev_inst->dev_inst()->channels; l; l = l->next) { shared_ptr signal; - sr_probe *const probe = (sr_probe *)l->data; + sr_channel *const probe = (sr_channel *)l->data; assert(probe); switch(probe->type) { - case SR_PROBE_LOGIC: + case SR_CHANNEL_LOGIC: signal = shared_ptr( new view::LogicSignal(dev_inst, probe, _logic_data)); break; - case SR_PROBE_ANALOG: + case SR_CHANNEL_ANALOG: { shared_ptr data( new data::Analog()); @@ -399,7 +399,7 @@ void SigSession::update_signals(shared_ptr dev_inst) } shared_ptr SigSession::signal_from_probe( - const sr_probe *probe) const + const sr_channel *probe) const { lock_guard lock(_signals_mutex); BOOST_FOREACH(shared_ptr sig, _signals) { @@ -493,6 +493,12 @@ void SigSession::feed_in_meta(const sr_dev_inst *sdi, signals_changed(); } +void SigSession::feed_in_frame_begin() +{ + if (_cur_logic_snapshot || !_cur_analog_snapshots.empty()) + frame_began(); +} + void SigSession::feed_in_logic(const sr_datafeed_logic &logic) { lock_guard lock(_data_mutex); @@ -512,6 +518,12 @@ void SigSession::feed_in_logic(const sr_datafeed_logic &logic) _cur_logic_snapshot = shared_ptr( new data::LogicSnapshot(logic, _dev_inst->get_sample_limit())); _logic_data->push_snapshot(_cur_logic_snapshot); + + // @todo Putting this here means that only listeners querying + // for logic will be notified. Currently the only user of + // frame_began is DecoderStack, but in future we need to signal + // this after both analog and logic sweeps have begun. + frame_began(); } else { @@ -519,27 +531,27 @@ void SigSession::feed_in_logic(const sr_datafeed_logic &logic) _cur_logic_snapshot->append_payload(logic); } - data_updated(); + data_received(); } void SigSession::feed_in_analog(const sr_datafeed_analog &analog) { lock_guard lock(_data_mutex); - const unsigned int probe_count = g_slist_length(analog.probes); + const unsigned int probe_count = g_slist_length(analog.channels); const size_t sample_count = analog.num_samples / probe_count; const float *data = analog.data; bool sweep_beginning = false; - for (GSList *p = analog.probes; p; p = p->next) + for (GSList *p = analog.channels; p; p = p->next) { shared_ptr snapshot; - sr_probe *const probe = (sr_probe*)p->data; + sr_channel *const probe = (sr_channel*)p->data; assert(probe); // Try to get the snapshot of the probe - const map< const sr_probe*, shared_ptr >:: + const map< const sr_channel*, shared_ptr >:: iterator iter = _cur_analog_snapshots.find(probe); if (iter != _cur_analog_snapshots.end()) snapshot = (*iter).second; @@ -580,7 +592,7 @@ void SigSession::feed_in_analog(const sr_datafeed_analog &analog) set_capture_state(Running); } - data_updated(); + data_received(); } void SigSession::data_feed_in(const struct sr_dev_inst *sdi, @@ -600,6 +612,10 @@ void SigSession::data_feed_in(const struct sr_dev_inst *sdi, *(const sr_datafeed_meta*)packet->payload); break; + case SR_DF_FRAME_BEGIN: + feed_in_frame_begin(); + break; + case SR_DF_LOGIC: assert(packet->payload); feed_in_logic(*(const sr_datafeed_logic*)packet->payload); @@ -617,7 +633,7 @@ void SigSession::data_feed_in(const struct sr_dev_inst *sdi, _cur_logic_snapshot.reset(); _cur_analog_snapshots.clear(); } - data_updated(); + frame_ended(); break; } }