X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Fdecoderstack.cpp;h=561e229dda8ec647f13238978b0c212cac3af480;hb=HEAD;hp=d56422a9a4f38090069c469d2e2006b13bf29643;hpb=6e89374a6796f8d5d9cc61b0a2f7e98562a034ae;p=pulseview.git diff --git a/pv/data/decoderstack.cpp b/pv/data/decoderstack.cpp deleted file mode 100644 index d56422a9..00000000 --- a/pv/data/decoderstack.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - * This file is part of the PulseView project. - * - * Copyright (C) 2012 Joel Holdsworth - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include - -#include - -#include - -#include "decoderstack.h" - -#include -#include -#include -#include - -using namespace boost; -using namespace std; - -namespace pv { -namespace data { - -const double DecoderStack::DecodeMargin = 1.0; -const double DecoderStack::DecodeThreshold = 0.2; -const int64_t DecoderStack::DecodeChunkLength = 4096; - -mutex DecoderStack::_global_decode_mutex; - -DecoderStack::DecoderStack(const srd_decoder *const dec) : - _decoder(dec), - _options(g_hash_table_new_full(g_str_hash, - g_str_equal, g_free, (GDestroyNotify)g_variant_unref)) -{ -} - -DecoderStack::~DecoderStack() -{ - _decode_thread.interrupt(); - _decode_thread.join(); - - g_hash_table_destroy(_options); -} - -const srd_decoder* DecoderStack::decoder() const -{ - return _decoder; -} - -const map >& -DecoderStack::probes() const -{ - return _probes; -} - -void DecoderStack::set_probes(std::map > probes) -{ - _probes = probes; - begin_decode(); -} - -const GHashTable* DecoderStack::options() const -{ - return _options; -} - -void DecoderStack::set_option(const char *id, GVariant *value) -{ - g_variant_ref(value); - g_hash_table_replace(_options, (void*)g_strdup(id), value); - begin_decode(); -} - -const vector< shared_ptr > - DecoderStack::annotations() const -{ - lock_guard lock(_mutex); - return _annotations; -} - -QString DecoderStack::error_message() -{ - lock_guard lock(_mutex); - return _error_message; -} - -void DecoderStack::begin_decode() -{ - _decode_thread.interrupt(); - _decode_thread.join(); - - _annotations.clear(); - - if (_probes.empty()) - return; - - // Get the samplerate and start time - shared_ptr logic_signal = - dynamic_pointer_cast( - (*_probes.begin()).second); - if (logic_signal) { - shared_ptr data( - logic_signal->data()); - if (data) { - _start_time = data->get_start_time(); - _samplerate = data->get_samplerate(); - if (_samplerate == 0.0) - _samplerate = 1.0; - } - } - - // 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; - assert(sig); - shared_ptr data = sig->data(); - - _decode_thread = boost::thread(&DecoderStack::decode_proc, this, - data); -} - -void DecoderStack::clear_snapshots() -{ -} - -void DecoderStack::decode_proc(shared_ptr data) -{ - srd_session *session; - uint8_t chunk[DecodeChunkLength]; - - assert(data); - - const deque< shared_ptr > &snapshots = - data->get_snapshots(); - if (snapshots.empty()) - return; - - const shared_ptr &snapshot = - snapshots.front(); - const int64_t sample_count = snapshot->get_sample_count() - 1; - - // Create the session - srd_session_new(&session); - assert(session); - - srd_session_metadata_set(session, SRD_CONF_SAMPLERATE, - g_variant_new_uint64((uint64_t)_samplerate)); - - srd_pd_output_callback_add(session, SRD_OUTPUT_ANN, - DecoderStack::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; - } - - // 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) - { - lock_guard decode_lock(_global_decode_mutex); - - const int64_t chunk_end = min( - i + DecodeChunkLength, sample_count); - snapshot->get_samples(chunk, i, chunk_end); - - if (srd_session_send(session, i, i + sample_count, - chunk, chunk_end - i) != SRD_OK) { - _error_message = tr("Failed to initialise decoder"); - break; - } - } - - // Destroy the session - srd_session_destroy(session); -} - -void DecoderStack::annotation_callback(srd_proto_data *pdata, void *decoder) -{ - using namespace pv::view::decode; - - assert(pdata); - assert(decoder); - - DecoderStack *const d = (DecoderStack*)decoder; - - shared_ptr a(new Annotation(pdata)); - lock_guard lock(d->_mutex); - d->_annotations.push_back(a); - - d->new_decode_data(); -} - -} // namespace data -} // namespace pv