Implement support for running transform modules.
authorUwe Hermann <uwe@hermann-uwe.de>
Wed, 11 Feb 2015 08:49:03 +0000 (09:49 +0100)
committerUwe Hermann <uwe@hermann-uwe.de>
Wed, 11 Feb 2015 14:57:40 +0000 (15:57 +0100)
Syntax:

 sigrok-cli ... -T <transformmodule>:opt1=val1:opt2=val2 ...

session.c

index 2c2f478365469effabd1c3513c2ef76de606127c..b6c5564861c8e5e32ad09ef162b6dbf6894209fd 100644 (file)
--- a/session.c
+++ b/session.c
@@ -115,6 +115,38 @@ const struct sr_output *setup_output_format(const struct sr_dev_inst *sdi)
        return o;
 }
 
+const struct sr_transform *setup_transform_module(const struct sr_dev_inst *sdi)
+{
+       const struct sr_transform_module *tmod;
+       const struct sr_option **options;
+       const struct sr_transform *t;
+       GHashTable *fmtargs, *fmtopts;
+       int size;
+       char *fmtspec;
+
+       if (!opt_transform_module)
+               opt_transform_module = "nop";
+
+       fmtargs = parse_generic_arg(opt_transform_module, TRUE);
+       fmtspec = g_hash_table_lookup(fmtargs, "sigrok_key");
+       if (!fmtspec)
+               g_critical("Invalid transform module.");
+       if (!(tmod = sr_transform_find(fmtspec)))
+               g_critical("Unknown transform module '%s'.", fmtspec);
+       g_hash_table_remove(fmtargs, "sigrok_key");
+       if ((options = sr_transform_options_get(tmod))) {
+               fmtopts = generic_arg_to_opt(options, fmtargs);
+               sr_transform_options_free(options);
+       } else
+               fmtopts = NULL;
+       t = sr_transform_new(tmod, fmtopts, sdi);
+       if (fmtopts)
+               g_hash_table_destroy(fmtopts);
+       g_hash_table_destroy(fmtargs);
+
+       return t;
+}
+
 void datafeed_in(const struct sr_dev_inst *sdi,
                const struct sr_datafeed_packet *packet, void *cb_data)
 {
@@ -468,6 +500,7 @@ void run_session(void)
        const uint32_t *dev_opts;
        int is_demo_dev;
        struct sr_dev_driver *driver;
+       const struct sr_transform *t;
 
        devices = device_scan();
        if (!devices) {
@@ -613,6 +646,9 @@ void run_session(void)
                }
        }
 
+       if (!(t = setup_transform_module(sdi)))
+               g_critical("Failed to initialize transform module.");
+
        if (sr_session_start(session) != SR_OK) {
                g_critical("Failed to start session.");
                sr_session_destroy(session);