using boost::lock_guard;
using boost::mutex;
using boost::shared_ptr;
+using std::list;
using std::map;
using std::set;
using std::string;
{
// TODO: This should not be necessary
_session = this;
+
+ set_default_device();
}
SigSession::~SigSession()
// Create the decoder
decoder_stack = shared_ptr<data::DecoderStack>(
- new data::DecoderStack(dec));
+ new data::DecoderStack(*this, dec));
// Make a list of all the probes
std::vector<const srd_probe*> all_probes;
capture_state_changed(state);
}
+void SigSession::set_default_device()
+{
+ shared_ptr<pv::device::DevInst> default_device;
+ const list< shared_ptr<device::Device> > &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<pv::device::Device> 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<device::DevInst> dev_inst)
{
assert(dev_inst);
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<mutex> lock(_data_mutex);
_cur_logic_snapshot = shared_ptr<data::LogicSnapshot>(
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
{
_cur_logic_snapshot->append_payload(logic);
}
- data_updated();
+ data_received();
}
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,
*(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);
_cur_logic_snapshot.reset();
_cur_analog_snapshots.clear();
}
- data_updated();
+ frame_ended();
break;
}
}