]> sigrok.org Git - libsigrok.git/commitdiff
transform: Hook up transforms.
authorUwe Hermann <redacted>
Tue, 10 Feb 2015 20:24:23 +0000 (21:24 +0100)
committerUwe Hermann <redacted>
Wed, 11 Feb 2015 11:23:02 +0000 (12:23 +0100)
src/libsigrok-internal.h
src/session.c
src/transform/transform.c

index 14320a753c32db0c404b6ee1709aa28117c5012e..9e080265fda5e93f2fda811eee7b6884a72b2e5b 100644 (file)
@@ -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;
index 3d02e677fa10bdf5171dc631a3e256d3b6674866..4ef3bd4358939cc38c1f1a8de818ba935f0276ce 100644 (file)
@@ -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);
index 3e787e91fb6bc67a35b671bfbd08c32f0ef47666..0c569a6f9d6af52ee84018592111f9742ab054c4 100644 (file)
@@ -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;
 }