]> sigrok.org Git - sigrok-cli.git/blobdiff - session.c
Implement support for running transform modules.
[sigrok-cli.git] / session.c
index 0011445df9ebd2dd2281cb2610b21b9cbeca79e3..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)
 {
@@ -326,7 +358,9 @@ int opt_to_gvar(char *key, char *value, struct sr_config *src)
        double tmp_double, dlow, dhigh;
        uint64_t tmp_u64, p, q, low, high;
        GVariant *rational[2], *range[2];
+       GVariantBuilder *vbl;
        gboolean tmp_bool;
+       gchar **keyval;
        int ret;
 
        if (!(srci = sr_config_info_name_get(key))) {
@@ -335,7 +369,7 @@ int opt_to_gvar(char *key, char *value, struct sr_config *src)
        }
        src->key = srci->key;
 
-       if ((value == NULL) &&
+       if ((value == NULL || strlen(value) == 0) &&
                (srci->datatype != SR_T_BOOL)) {
                g_critical("Option '%s' needs a value.", (char *)key);
                return -1;
@@ -403,10 +437,30 @@ int opt_to_gvar(char *key, char *value, struct sr_config *src)
                        src->data = g_variant_new_tuple(range, 2);
                }
                break;
+       case SR_T_KEYVALUE:
+               /* Expects the argument to be in the form of key=value. */
+               keyval = g_strsplit(value, "=", 2);
+               if (!keyval[0] || !keyval[1]) {
+                       g_strfreev(keyval);
+                       ret = -1;
+                       break;
+               } else {
+                       vbl = g_variant_builder_new(G_VARIANT_TYPE_DICTIONARY);
+                       g_variant_builder_add(vbl, "{ss}",
+                                             keyval[0], keyval[1]);
+                       src->data = g_variant_builder_end(vbl);
+                       g_strfreev(keyval);
+               }
+               break;
        default:
+               g_critical("Unknown data type specified for option '%s' "
+                          "(driver implementation bug?).", key);
                ret = -1;
        }
 
+       if (ret < 0)
+               g_critical("Invalid value: '%s' for option '%s'", value, key);
+
        return ret;
 }
 
@@ -446,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) {
@@ -591,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);