X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fdecoder.cpp;h=8a84fd4d8f4e9032a3876eaeb9ee405587fa9602;hp=00b9e0b7efb0b87b3d508828922707e46f73f5e6;hb=b6b267bba9d55d23fe5c3537e4785238d4377ad7;hpb=9cef95672622f4ecdb21edef9d81a10c789daf1e diff --git a/pv/data/decoder.cpp b/pv/data/decoder.cpp index 00b9e0b7..8a84fd4d 100644 --- a/pv/data/decoder.cpp +++ b/pv/data/decoder.cpp @@ -22,6 +22,10 @@ #include +#include + +#include + #include "decoder.h" #include @@ -41,14 +45,14 @@ const int64_t Decoder::DecodeChunkLength = 4096; Decoder::Decoder(const srd_decoder *const dec, std::map > probes, + boost::shared_ptr > probes, GHashTable *options) : _decoder(dec), _probes(probes), - _options(options), - _decoder_inst(NULL) + _options(options) { init_decoder(); + begin_decode(); } @@ -68,10 +72,16 @@ const srd_decoder* Decoder::get_decoder() const const vector< shared_ptr > Decoder::annotations() const { - lock_guard lock(_annotations_mutex); + lock_guard lock(_mutex); return _annotations; } +QString Decoder::error_message() +{ + lock_guard lock(_mutex); + return _error_message; +} + void Decoder::begin_decode() { _decode_thread.interrupt(); @@ -83,12 +93,9 @@ void Decoder::begin_decode() // We get the logic data of the first probe in the list. // This works because we are currently assuming all // LogicSignals have the same data/snapshot - shared_ptr sig = (*_probes.begin()).second; + shared_ptr sig = (*_probes.begin()).second; assert(sig); - const pv::view::LogicSignal *const l = - dynamic_cast(sig.get()); - assert(l); - shared_ptr data = l->data(); + shared_ptr data = sig->data(); _decode_thread = boost::thread(&Decoder::decode_proc, this, data); @@ -109,36 +116,18 @@ void Decoder::init_decoder() shared_ptr data( logic_signal->data()); if (data) { - _samplerate = data->get_samplerate(); _start_time = data->get_start_time(); + _samplerate = data->get_samplerate(); + if (_samplerate == 0.0) + _samplerate = 1.0; } } } - - _decoder_inst = srd_inst_new(_decoder->id, _options); - assert(_decoder_inst); - - _decoder_inst->data_samplerate = _samplerate; - - GHashTable *probes = g_hash_table_new_full(g_str_hash, - g_str_equal, g_free, (GDestroyNotify)g_variant_unref); - - for(map >:: - const_iterator i = _probes.begin(); - i != _probes.end(); i++) - { - shared_ptr signal((*i).second); - GVariant *const gvar = g_variant_new_int32( - signal->probe()->index); - g_variant_ref_sink(gvar); - g_hash_table_insert(probes, (*i).first->id, gvar); - } - - srd_inst_probe_set_all(_decoder_inst, probes); } void Decoder::decode_proc(shared_ptr data) { + srd_session *session; uint8_t chunk[DecodeChunkLength]; assert(data); @@ -153,17 +142,51 @@ void Decoder::decode_proc(shared_ptr data) const shared_ptr &snapshot = snapshots.front(); const int64_t sample_count = snapshot->get_sample_count() - 1; - double samplerate = data->get_samplerate(); - // Show sample rate as 1Hz when it is unknown - if (samplerate == 0.0) - samplerate = 1.0; + // Create the session + srd_session_new(&session); + assert(session); - srd_session_start(_probes.size(), snapshot->unit_size(), samplerate); + srd_session_config_set(session, SRD_CONF_NUM_PROBES, + g_variant_new_uint64(_probes.size())); + srd_session_config_set(session, SRD_CONF_UNITSIZE, + g_variant_new_uint64(snapshot->unit_size())); + srd_session_config_set(session, SRD_CONF_SAMPLERATE, + g_variant_new_uint64((uint64_t)_samplerate)); - srd_pd_output_callback_add(SRD_OUTPUT_ANN, + srd_pd_output_callback_add(session, SRD_OUTPUT_ANN, Decoder::annotation_callback, this); + // Create the decoder instance + srd_decoder_inst *const decoder_inst = srd_inst_new( + session, _decoder->id, _options); + if(!decoder_inst) { + _error_message = tr("Failed to initialise decoder"); + return; + } + + decoder_inst->data_samplerate = _samplerate; + + // Setup the probes + GHashTable *const probes = g_hash_table_new_full(g_str_hash, + g_str_equal, g_free, (GDestroyNotify)g_variant_unref); + + for(map >:: + const_iterator i = _probes.begin(); + i != _probes.end(); i++) + { + shared_ptr signal((*i).second); + GVariant *const gvar = g_variant_new_int32( + signal->probe()->index); + g_variant_ref_sink(gvar); + g_hash_table_insert(probes, (*i).first->id, gvar); + } + + srd_inst_probe_set_all(decoder_inst, probes); + + // Start the session + srd_session_start(session); + for (int64_t i = 0; !this_thread::interruption_requested() && i < sample_count; i += DecodeChunkLength) @@ -172,9 +195,15 @@ void Decoder::decode_proc(shared_ptr data) i + DecodeChunkLength, sample_count); snapshot->get_samples(chunk, i, chunk_end); - if (srd_session_send(i, chunk, chunk_end - i) != SRD_OK) + if (srd_session_send(session, i, chunk, chunk_end - i) != + SRD_OK) { + _error_message = tr("Failed to initialise decoder"); break; + } } + + // Destroy the session + srd_session_destroy(session); } void Decoder::annotation_callback(srd_proto_data *pdata, void *decoder) @@ -187,7 +216,7 @@ void Decoder::annotation_callback(srd_proto_data *pdata, void *decoder) Decoder *const d = (Decoder*)decoder; shared_ptr a(new Annotation(pdata)); - lock_guard lock(d->_annotations_mutex); + lock_guard lock(d->_mutex); d->_annotations.push_back(a); d->new_decode_data();