X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=session.c;h=090fdce8f32fea1b408f25e6199ff446d2472db1;hb=28b0b84e7ac805ab5a5c40191012d2739e550c74;hp=0011445df9ebd2dd2281cb2610b21b9cbeca79e3;hpb=24bd9719166584e3b4e6e6423d6d6bcbc1a88251;p=sigrok-cli.git diff --git a/session.c b/session.c index 0011445..090fdce 100644 --- a/session.c +++ b/session.c @@ -115,6 +115,37 @@ 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; + 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 +357,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 +368,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 +436,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; } @@ -425,7 +478,8 @@ int set_dev_options(struct sr_dev_inst *sdi, GHashTable *args) cg = select_channel_group(sdi); if ((ret = maybe_config_set(sr_dev_inst_driver_get(sdi), sdi, cg, src.key, src.data)) != SR_OK) { - g_critical("Failed to set device option '%s'.", (char *)key); + g_critical("Failed to set device option '%s': %s.", + (char *)key, sr_strerror(ret)); 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);