X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=sigsession.cpp;h=aecd21c2c3b5c5231c9407156edd24cad52acfc0;hp=e8d129fcdcc6f7f2cdd3d85455d3bcd352988b52;hb=274d4f133825cddfc6a42438dd47899db20c7d97;hpb=009e1503d46291cbc33cdb900761eaa505fd6269 diff --git a/sigsession.cpp b/sigsession.cpp index e8d129fc..aecd21c2 100644 --- a/sigsession.cpp +++ b/sigsession.cpp @@ -20,16 +20,21 @@ #include "sigsession.h" +#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; -SigSession::SigSession() : - unitSize(0), - sigData(NULL) +SigSession::SigSession() { // TODO: This should not be necessary session = this; @@ -37,8 +42,6 @@ SigSession::SigSession() : SigSession::~SigSession() { - g_array_free(sigData, TRUE); - // TODO: This should not be necessary session = NULL; } @@ -54,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) { @@ -61,50 +105,64 @@ void SigSession::dataFeedIn(const struct sr_dev_inst *sdi, assert(packet); switch (packet->type) { + case SR_DF_HEADER: + _signals.clear(); + break; + case SR_DF_META_LOGIC: { - const sr_datafeed_meta_logic *meta_logic = - (sr_datafeed_meta_logic*)packet->payload; - int num_enabled_probes = 0; - - for (int i = 0; i < meta_logic->num_probes; i++) { - const sr_probe *probe = - (sr_probe *)g_slist_nth_data(sdi->probes, i); - if (probe->enabled) { - probeList[num_enabled_probes++] = probe->index; + assert(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 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); } } - /* How many bytes we need to store num_enabled_probes bits */ - unitSize = (num_enabled_probes + 7) / 8; - sigData = g_array_new(FALSE, FALSE, unitSize); + break; } - break; case SR_DF_LOGIC: - { - uint64_t filter_out_len; - uint8_t *filter_out; - - const struct sr_datafeed_logic *const logic = - (sr_datafeed_logic*)packet->payload; - qDebug() << "SR_DF_LOGIC (length =" << logic->length - << ", unitsize = " << logic->unitsize << ")"; - - if (sr_filter_probes(logic->unitsize, unitSize, - probeList, (uint8_t*)logic->data, logic->length, - &filter_out, &filter_out_len) != SR_OK) - return; - - assert(sigData); - g_array_append_vals(sigData, filter_out, filter_out_len / unitSize); - - g_free(filter_out); + assert(packet->payload); + 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: + _cur_logic_snapshot.reset(); dataUpdated(); break; }