X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=sigsession.cpp;h=aecd21c2c3b5c5231c9407156edd24cad52acfc0;hp=37c758f776e098d86023bb07c123874ad53b2972;hb=274d4f133825cddfc6a42438dd47899db20c7d97;hpb=28a4c9c5eb20296199fc3496bb40b7733dffac75 diff --git a/sigsession.cpp b/sigsession.cpp index 37c758f7..aecd21c2 100644 --- a/sigsession.cpp +++ b/sigsession.cpp @@ -22,12 +22,14 @@ #include "logicdata.h" #include "logicdatasnapshot.h" +#include "logicsignal.h" #include #include using namespace boost; +using namespace std; // TODO: This should not be necessary SigSession* SigSession::session = NULL; @@ -55,6 +57,47 @@ void SigSession::loadFile(const std::string &name) } } +void SigSession::start_capture(struct sr_dev_inst *sdi, + uint64_t sample_rate) +{ + sr_session_new(); + sr_session_datafeed_callback_add(dataFeedInProc); + + if (sr_session_dev_add(sdi) != SR_OK) { + qDebug() << "Failed to use device."; + sr_session_destroy(); + return; + } + + uint64_t limit_samples = 10000; + if (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_SAMPLES, + &limit_samples) != SR_OK) { + qDebug() << "Failed to configure time-based sample limit."; + sr_session_destroy(); + return; + } + + if (sr_dev_config_set(sdi, SR_HWCAP_SAMPLERATE, + &sample_rate) != SR_OK) { + qDebug() << "Failed to configure samplerate."; + sr_session_destroy(); + return; + } + + if (sr_session_start() != SR_OK) { + qDebug() << "Failed to start session."; + return; + } + + sr_session_run(); + sr_session_destroy(); +} + +vector< shared_ptr >& SigSession::get_signals() +{ + return _signals; +} + void SigSession::dataFeedIn(const struct sr_dev_inst *sdi, struct sr_datafeed_packet *packet) { @@ -63,34 +106,59 @@ void SigSession::dataFeedIn(const struct sr_dev_inst *sdi, switch (packet->type) { case SR_DF_HEADER: + _signals.clear(); break; case SR_DF_META_LOGIC: { assert(packet->payload); - _logic_data.reset(new LogicData( - *(sr_datafeed_meta_logic*)packet->payload)); + const sr_datafeed_meta_logic &meta_logic = + *(sr_datafeed_meta_logic*)packet->payload; + // Create an empty LogiData for coming data snapshots + _logic_data.reset(new LogicData(meta_logic)); assert(_logic_data); if(!_logic_data) break; - // Add an empty data snapshot - shared_ptr snapshot( - new LogicDataSnapshot()); - _logic_data->push_snapshot(snapshot); - _cur_logic_snapshot = snapshot; + // Add the signals + for (int i = 0; i < meta_logic.num_probes; i++) + { + const sr_probe *const probe = + (const sr_probe*)g_slist_nth_data( + sdi->probes, i); + if(probe->enabled) + { + boost::shared_ptr signal( + new LogicSignal(probe->name, + _logic_data, + probe->index)); + _signals.push_back(signal); + } + } break; } case SR_DF_LOGIC: + assert(packet->payload); - assert(_cur_logic_snapshot); - if(_cur_logic_snapshot) + if(!_cur_logic_snapshot) + { + // Create a new data snapshot + _cur_logic_snapshot = shared_ptr( + new LogicDataSnapshot( + *(sr_datafeed_logic*)packet->payload)); + _logic_data->push_snapshot(_cur_logic_snapshot); + } + else + { + // Append to the existing data snapshot _cur_logic_snapshot->append_payload( *(sr_datafeed_logic*)packet->payload); + } + break; case SR_DF_END: