From c0a1e532f57c0405621a06f5b360c1ef25aa4c52 Mon Sep 17 00:00:00 2001 From: Uwe Hermann Date: Tue, 10 Feb 2015 21:24:23 +0100 Subject: [PATCH] transform: Hook up transforms. --- src/libsigrok-internal.h | 1 + src/session.c | 37 +++++++++++++++++++++++++++++++++++++ src/transform/transform.c | 3 +++ 3 files changed, 41 insertions(+) diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index 14320a75..9e080265 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -669,6 +669,7 @@ struct sr_session { GSList *owned_devs; /** List of struct datafeed_callback pointers. */ GSList *datafeed_callbacks; + GSList *transforms; struct sr_trigger *trigger; GTimeVal starttime; gboolean running; diff --git a/src/session.c b/src/session.c index 3d02e677..4ef3bd43 100644 --- a/src/session.c +++ b/src/session.c @@ -697,6 +697,9 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi, { GSList *l; struct datafeed_callback *cb_struct; + struct sr_datafeed_packet *packet_in, *packet_out; + struct sr_transform *t; + int ret; if (!sdi) { sr_err("%s: sdi was NULL", __func__); @@ -713,6 +716,40 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi, return SR_ERR_BUG; } + /* + * Pass the packet to the first transform module. If that returns + * another packet (instead of NULL), pass that packet to the next + * transform module in the list, and so on. + */ + packet_in = (struct sr_datafeed_packet *)packet; + for (l = sdi->session->transforms; l; l = l->next) { + t = l->data; + sr_spew("Running transform module '%s'.", t->module->id); + ret = t->module->receive(t, packet_in, &packet_out); + if (ret < 0) { + sr_err("Error while running transform module: %d.", ret); + return SR_ERR; + } + if (!packet_out) { + /* + * If any of the transforms don't return an output + * packet, abort. + */ + sr_spew("Transform module didn't return a packet, aborting."); + return SR_OK; + } else { + /* + * Use this transform module's output packet as input + * for the next transform module. + */ + packet_in = packet_out; + } + } + + /* + * If the last transform did output a packet, pass it to all datafeed + * callbacks. + */ for (l = sdi->session->datafeed_callbacks; l; l = l->next) { if (sr_log_loglevel_get() >= SR_LOG_DBG) datafeed_dump(packet); diff --git a/src/transform/transform.c b/src/transform/transform.c index 3e787e91..0c569a6f 100644 --- a/src/transform/transform.c +++ b/src/transform/transform.c @@ -247,6 +247,9 @@ SR_API const struct sr_transform *sr_transform_new(const struct sr_transform_mod if (new_opts) g_hash_table_destroy(new_opts); + /* Add the transform to the session's list of transforms. */ + sdi->session->transforms = g_slist_append(sdi->session->transforms, t); + return t; }