X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=session.c;h=090fdce8f32fea1b408f25e6199ff446d2472db1;hb=28b0b84e7ac805ab5a5c40191012d2739e550c74;hp=b0241969b7481a8ff4f2c765d68e2ca44c34f718;hpb=e45889373bd907f0b760aab531787d87bf2bf691;p=sigrok-cli.git diff --git a/session.c b/session.c index b024196..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) { @@ -337,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; @@ -426,6 +457,9 @@ int opt_to_gvar(char *key, char *value, struct sr_config *src) ret = -1; } + if (ret < 0) + g_critical("Invalid value: '%s' for option '%s'", value, key); + return ret; } @@ -444,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; } } @@ -465,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) { @@ -610,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);