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)
{
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))) {
}
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;
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;
}
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;
}
}
const uint32_t *dev_opts;
int is_demo_dev;
struct sr_dev_driver *driver;
+ const struct sr_transform *t;
devices = device_scan();
if (!devices) {
}
}
+ 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);