* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <libsigrokdecode/libsigrokdecode.h>
+
#include "sigsession.h"
#include "devicemanager.h"
+
#include "data/analog.h"
#include "data/analogsnapshot.h"
+#include "data/decoderstack.h"
#include "data/logic.h"
#include "data/logicsnapshot.h"
+#include "data/decode/decoder.h"
+
#include "view/analogsignal.h"
+#include "view/decodetrace.h"
#include "view/logicsignal.h"
#include <assert.h>
+#include <stdexcept>
+
+#include <boost/foreach.hpp>
+
#include <sys/stat.h>
#include <QDebug>
{
stop_capture();
- if (_sampling_thread.get())
- _sampling_thread->join();
- _sampling_thread.reset();
+ _sampling_thread.join();
if (_sdi)
_device_manager.release_device(_sdi);
update_signals(sdi);
read_sample_rate(sdi);
- _sampling_thread.reset(new boost::thread(
+ _sampling_thread = boost::thread(
&SigSession::load_session_thread_proc, this,
- error_handler));
+ error_handler);
} else {
sr_input *in = NULL;
update_signals(in->sdi);
read_sample_rate(in->sdi);
- _sampling_thread.reset(new boost::thread(
+ _sampling_thread = boost::thread(
&SigSession::load_input_thread_proc, this,
- name, in, error_handler));
+ name, in, error_handler);
}
-
}
SigSession::capture_state SigSession::get_capture_state() const
}
// Begin the session
- _sampling_thread.reset(new boost::thread(
+ _sampling_thread = boost::thread(
&SigSession::sample_thread_proc, this, _sdi,
- record_length, error_handler));
+ record_length, error_handler);
}
void SigSession::stop_capture()
sr_session_stop();
// Check that sampling stopped
- if (_sampling_thread.get())
- _sampling_thread->join();
- _sampling_thread.reset();
+ _sampling_thread.join();
}
-vector< shared_ptr<view::Signal> > SigSession::get_signals()
+vector< shared_ptr<view::Signal> > SigSession::get_signals() const
{
lock_guard<mutex> lock(_signals_mutex);
return _signals;
return _logic_data;
}
+bool SigSession::add_decoder(srd_decoder *const dec)
+{
+ map<const srd_probe*, shared_ptr<view::LogicSignal> > probes;
+ shared_ptr<data::DecoderStack> decoder_stack;
+
+ try
+ {
+ lock_guard<mutex> lock(_signals_mutex);
+
+ // Create the decoder
+ decoder_stack = shared_ptr<data::DecoderStack>(
+ new data::DecoderStack(dec));
+
+ // Auto select the initial probes
+ for(const GSList *i = dec->probes; i; i = i->next)
+ {
+ const srd_probe *const probe = (const srd_probe*)i->data;
+ BOOST_FOREACH(shared_ptr<view::Signal> s, _signals)
+ {
+ shared_ptr<view::LogicSignal> l =
+ dynamic_pointer_cast<view::LogicSignal>(s);
+ if (l && QString(probe->name).toLower().contains(
+ l->get_name().toLower()))
+ probes[probe] = l;
+ }
+ }
+
+ assert(decoder_stack);
+ assert(!decoder_stack->stack().empty());
+ assert(decoder_stack->stack().front());
+ decoder_stack->stack().front()->set_probes(probes);
+
+ // Create the decode signal
+ shared_ptr<view::DecodeTrace> d(
+ new view::DecodeTrace(*this, decoder_stack,
+ _decode_traces.size()));
+ _decode_traces.push_back(d);
+ }
+ catch(std::runtime_error e)
+ {
+ return false;
+ }
+
+ signals_changed();
+
+ // Do an initial decode
+ decoder_stack->begin_decode();
+
+ return true;
+}
+
+vector< shared_ptr<view::DecodeTrace> > SigSession::get_decode_signals() const
+{
+ lock_guard<mutex> lock(_signals_mutex);
+ return _decode_traces;
+}
+
+void SigSession::remove_decode_signal(view::DecodeTrace *signal)
+{
+ for (vector< shared_ptr<view::DecodeTrace> >::iterator i =
+ _decode_traces.begin();
+ i != _decode_traces.end();
+ i++)
+ if ((*i).get() == signal)
+ {
+ _decode_traces.erase(i);
+ signals_changed();
+ return;
+ }
+}
+
void SigSession::set_capture_state(capture_state state)
{
lock_guard<mutex> lock(_sampling_mutex);
unsigned int logic_probe_count = 0;
unsigned int analog_probe_count = 0;
+ // Clear the decode traces
+ _decode_traces.clear();
+
// Detect what data types we will receive
if(sdi) {
for (const GSList *l = sdi->probes; l; l = l->next) {
if(sdi) {
for (const GSList *l = sdi->probes; l; l = l->next) {
- const sr_probe *const probe =
- (const sr_probe *)l->data;
+ sr_probe *const probe = (sr_probe *)l->data;
assert(probe);
switch(probe->type) {
// Read out the sample rate
if(sdi->driver)
{
- const int ret = sr_config_get(sdi->driver,
- SR_CONF_SAMPLERATE, &gvar, sdi);
+ const int ret = sr_config_get(sdi->driver, sdi, NULL,
+ SR_CONF_SAMPLERATE, &gvar);
if (ret != SR_OK) {
qDebug("Failed to get samplerate\n");
return;
}
// Set the sample limit
- if (sr_config_set(sdi, SR_CONF_LIMIT_SAMPLES,
+ if (sr_config_set(sdi, NULL, SR_CONF_LIMIT_SAMPLES,
g_variant_new_uint64(record_length)) != SR_OK) {
error_handler(tr("Failed to configure "
"time-based sample limit."));
break;
}
}
+
+ signals_changed();
}
void SigSession::feed_in_logic(const sr_datafeed_logic &logic)