src = g_try_malloc(sizeof(struct sr_config));
src->key = srci->key;
value = g_hash_table_lookup(hash, key);
- src->value = g_strdup(value);
+ src->data = g_variant_new_string(value);
opts = g_slist_append(opts, src);
}
g_list_free(keys);
static void free_drvopts(struct sr_config *src)
{
- g_free((void *)src->value);
+ g_variant_unref(src->data);
g_free(src);
}
{
struct sr_dev_inst *sdi;
const struct sr_config_info *srci;
- const struct sr_samplerates *samplerates;
- struct sr_rational *rationals;
GSList *devices;
- uint64_t *integers;
- const int *hwopts, *hwcaps;
- int cap, num_devices, *tmp_bool, i;
- char *s, *title;
+ GVariant *gvar_opts, *gvar_dict, *gvar_list, *gvar;
+ gsize num_opts, num_elements;
+ const uint64_t *uint64, p, q;
+ const int32_t *opts;
+ unsigned int num_devices, tmp_bool, o, i;
+ char *s;
const char *charopts, **stropts;
if (!(devices = device_scan())) {
return;
}
- if (sr_config_list(sdi->driver, SR_CONF_TRIGGER_TYPE, (const void **)&charopts,
- sdi) == SR_OK && charopts) {
- printf("Supported triggers: ");
- while (*charopts) {
- printf("%c ", *charopts);
- charopts++;
- }
- printf("\n");
- }
-
- if ((sr_config_list(sdi->driver, SR_CONF_SCAN_OPTIONS, (const void **)&hwopts,
- NULL) == SR_OK) && hwopts) {
+ if ((sr_config_list(sdi->driver, SR_CONF_SCAN_OPTIONS, &gvar_opts,
+ NULL) == SR_OK)) {
+ opts = g_variant_get_fixed_array(gvar_opts, &num_elements,
+ sizeof(int32_t));
printf("Supported driver options:\n");
- for (i = 0; hwopts[i]; i++) {
- if (!(srci = sr_config_info_get(hwopts[i])))
+ for (i = 0; i < num_elements; i++) {
+ if (!(srci = sr_config_info_get(opts[i])))
continue;
printf(" %s\n", srci->id);
}
+ g_variant_unref(gvar_opts);
}
- title = "Supported device options:\n";
- if ((sr_config_list(sdi->driver, SR_CONF_DEVICE_OPTIONS, (const void **)&hwcaps,
- NULL) != SR_OK) || !hwcaps)
+ if ((sr_config_list(sdi->driver, SR_CONF_DEVICE_OPTIONS, &gvar_opts,
+ sdi) != SR_OK))
/* Driver supports no device instance options. */
return;
- for (cap = 0; hwcaps[cap]; cap++) {
- if (!(srci = sr_config_info_get(hwcaps[cap])))
+ printf("Supported device options:\n");
+ opts = g_variant_get_fixed_array(gvar_opts, &num_opts, sizeof(int32_t));
+ for (o = 0; o < num_opts; o++) {
+ if (!(srci = sr_config_info_get(opts[o])))
continue;
- if (title) {
- printf("%s", title);
- title = NULL;
- }
+ if (srci->key == SR_CONF_TRIGGER_TYPE) {
+ if (sr_config_list(sdi->driver, srci->key, &gvar,
+ sdi) != SR_OK) {
+ printf("\n");
+ continue;
+ }
+ charopts = g_variant_get_string(gvar, NULL);
+ printf(" Supported triggers: ");
+ while (*charopts) {
+ printf("%c ", *charopts);
+ charopts++;
+ }
+ printf("\n");
+ g_variant_unref(gvar);
- if (srci->key == SR_CONF_PATTERN_MODE) {
+ } else if (srci->key == SR_CONF_PATTERN_MODE) {
/* Pattern generator modes */
printf(" %s", srci->id);
- if (sr_config_list(sdi->driver, SR_CONF_PATTERN_MODE,
- (const void **)&stropts, sdi) == SR_OK) {
+ if (sr_config_list(sdi->driver, srci->key, &gvar,
+ sdi) == SR_OK) {
printf(" - supported patterns:\n");
- for (i = 0; stropts[i]; i++)
+ stropts = g_variant_get_strv(gvar, &num_elements);
+ for (i = 0; i < num_elements; i++)
printf(" %s\n", stropts[i]);
+ g_variant_unref(gvar);
} else {
printf("\n");
}
/* Supported samplerates */
printf(" %s", srci->id);
if (sr_config_list(sdi->driver, SR_CONF_SAMPLERATE,
- (const void **)&samplerates, sdi) != SR_OK) {
+ &gvar_dict, sdi) != SR_OK) {
printf("\n");
continue;
}
- if (samplerates->step) {
+ if ((gvar_list = g_variant_lookup_value(gvar_dict,
+ "samplerates", G_VARIANT_TYPE("at")))) {
+ uint64 = g_variant_get_fixed_array(gvar_list,
+ &num_elements, sizeof(uint64_t));
+ printf(" - supported samplerates:\n");
+ for (i = 0; i < num_elements; i++)
+ printf(" %s\n", sr_samplerate_string(uint64[i]));
+ } if ((gvar_list = g_variant_lookup_value(gvar_dict,
+ "samplerate-steps", G_VARIANT_TYPE("at")))) {
+ uint64 = g_variant_get_fixed_array(gvar_list,
+ &num_elements, sizeof(uint64_t));
/* low */
- if (!(s = sr_samplerate_string(samplerates->low)))
+ if (!(s = sr_samplerate_string(uint64[0])))
continue;
printf(" (%s", s);
g_free(s);
/* high */
- if (!(s = sr_samplerate_string(samplerates->high)))
+ if (!(s = sr_samplerate_string(uint64[1])))
continue;
printf(" - %s", s);
g_free(s);
/* step */
- if (!(s = sr_samplerate_string(samplerates->step)))
+ if (!(s = sr_samplerate_string(uint64[2])))
continue;
printf(" in steps of %s)\n", s);
g_free(s);
- } else {
- printf(" - supported samplerates:\n");
- for (i = 0; samplerates->list[i]; i++)
- printf(" %s\n", sr_samplerate_string(samplerates->list[i]));
+ g_variant_unref(gvar_list);
}
+ g_variant_unref(gvar_dict);
} else if (srci->key == SR_CONF_BUFFERSIZE) {
/* Supported buffer sizes */
printf(" %s", srci->id);
if (sr_config_list(sdi->driver, SR_CONF_BUFFERSIZE,
- (const void **)&integers, sdi) != SR_OK) {
+ &gvar_list, sdi) != SR_OK) {
printf("\n");
continue;
}
+ uint64 = g_variant_get_fixed_array(gvar_list,
+ &num_elements, sizeof(uint64_t));
printf(" - supported buffer sizes:\n");
- for (i = 0; integers[i]; i++)
- printf(" %"PRIu64"\n", integers[i]);
+ for (i = 0; i < num_elements; i++)
+ printf(" %"PRIu64"\n", uint64[i]);
+ g_variant_unref(gvar_list);
} else if (srci->key == SR_CONF_TIMEBASE) {
/* Supported time bases */
printf(" %s", srci->id);
if (sr_config_list(sdi->driver, SR_CONF_TIMEBASE,
- (const void **)&rationals, sdi) != SR_OK) {
+ &gvar_list, sdi) != SR_OK) {
printf("\n");
continue;
}
printf(" - supported time bases:\n");
- for (i = 0; rationals[i].p && rationals[i].q; i++)
- printf(" %s\n", sr_period_string(
- rationals[i].p * rationals[i].q));
+ num_elements = g_variant_n_children(gvar_list);
+ for (i = 0; i < num_elements; i++) {
+ gvar = g_variant_get_child_value(gvar_list, i);
+ g_variant_get(gvar, "(tt)", &p, &q);
+ s = sr_period_string(p * q);
+ printf(" %s\n", s);
+ g_free(s);
+ }
+ g_variant_unref(gvar_list);
} else if (srci->key == SR_CONF_TRIGGER_SOURCE) {
/* Supported trigger sources */
printf(" %s", srci->id);
if (sr_config_list(sdi->driver, SR_CONF_TRIGGER_SOURCE,
- (const void **)&stropts, sdi) != SR_OK) {
+ &gvar, sdi) != SR_OK) {
printf("\n");
continue;
}
printf(" - supported trigger sources:\n");
- for (i = 0; stropts[i]; i++)
+ stropts = g_variant_get_strv(gvar, &num_elements);
+ for (i = 0; i < num_elements; i++)
printf(" %s\n", stropts[i]);
+ g_variant_unref(gvar);
} else if (srci->key == SR_CONF_FILTER) {
/* Supported filters */
printf(" %s", srci->id);
if (sr_config_list(sdi->driver, SR_CONF_FILTER,
- (const void **)&stropts, sdi) != SR_OK) {
+ &gvar, sdi) != SR_OK) {
printf("\n");
continue;
}
printf(" - supported filter targets:\n");
- for (i = 0; stropts[i]; i++)
+ stropts = g_variant_get_strv(gvar, &num_elements);
+ for (i = 0; i < num_elements; i++)
printf(" %s\n", stropts[i]);
+ g_variant_unref(gvar);
} else if (srci->key == SR_CONF_VDIV) {
/* Supported volts/div values */
printf(" %s", srci->id);
if (sr_config_list(sdi->driver, SR_CONF_VDIV,
- (const void **)&rationals, sdi) != SR_OK) {
+ &gvar_list, sdi) != SR_OK) {
printf("\n");
continue;
}
printf(" - supported volts/div:\n");
- for (i = 0; rationals[i].p && rationals[i].q; i++)
- printf(" %s\n", sr_voltage_string( &rationals[i]));
+ num_elements = g_variant_n_children(gvar_list);
+ for (i = 0; i < num_elements; i++) {
+ gvar = g_variant_get_child_value(gvar_list, i);
+ g_variant_get(gvar, "(tt)", &p, &q);
+ s = sr_voltage_string(p, q);
+ printf(" %s\n", s);
+ g_free(s);
+ }
+ g_variant_unref(gvar_list);
} else if (srci->key == SR_CONF_COUPLING) {
/* Supported coupling settings */
printf(" %s", srci->id);
if (sr_config_list(sdi->driver, SR_CONF_COUPLING,
- (const void **)&stropts, sdi) != SR_OK) {
+ &gvar, sdi) != SR_OK) {
printf("\n");
continue;
}
printf(" - supported coupling options:\n");
- for (i = 0; stropts[i]; i++)
+ stropts = g_variant_get_strv(gvar, &num_elements);
+ for (i = 0; i < num_elements; i++)
printf(" %s\n", stropts[i]);
+ g_variant_unref(gvar);
} else if (srci->key == SR_CONF_DATALOG) {
+ /* TODO test */
/* Turning on/off internal data logging. */
printf(" %s\t(on/off", srci->id);
if (sr_config_get(sdi->driver, SR_CONF_DATALOG,
- (const void **)&tmp_bool, sdi) == SR_OK) {
- printf(", currently %s", *tmp_bool ? "on" : "off");
+ &gvar, sdi) == SR_OK) {
+ tmp_bool = g_variant_get_boolean(gvar);
+ printf(", currently %s", tmp_bool ? "on" : "off");
+ g_variant_unref(gvar);
}
printf(")\n");
} else {
printf(" %s\n", srci->id);
}
}
+ g_variant_unref(gvar_opts);
sr_session_destroy();
static int unitsize = 0;
static int triggered = 0;
static FILE *outfile = NULL;
+ GSList *l;
+ GString *out;
+ GVariant *gvar;
int sample_size, ret;
- uint64_t *samplerate, output_len, filter_out_len;
+ uint64_t samplerate, output_len, filter_out_len;
uint8_t *output_buf, *filter_out;
- GString *out;
- GSList *l;
/* If the first packet to come in isn't a header, don't even try. */
if (packet->type != SR_DF_HEADER && o == NULL)
#ifdef HAVE_SRD
if (opt_pds && logic_probelist->len) {
if (sr_config_get(sdi->driver, SR_CONF_SAMPLERATE,
- (const void **)&samplerate, sdi) != SR_OK) {
+ &gvar, sdi) != SR_OK) {
g_critical("Unable to initialize protocol "
"decoders: no samplerate found.");
break;
}
- srd_session_start(logic_probelist->len, unitsize,
- *samplerate);
+ samplerate = g_variant_get_uint64(gvar);
+ g_variant_unref(gvar);
+ srd_session_start(logic_probelist->len, unitsize, samplerate);
}
#endif
break;
src = l->data;
switch (src->key) {
case SR_CONF_SAMPLERATE:
- samplerate = (uint64_t *)src->value;
- g_debug("cli: got samplerate %"PRIu64" Hz", *samplerate);
+ samplerate = g_variant_get_uint64(src->data);
+ g_debug("cli: got samplerate %"PRIu64" Hz", samplerate);
break;
case SR_CONF_SAMPLE_INTERVAL:
- samplerate = (uint64_t *)src->value;
- g_debug("cli: got sample interval %"PRIu64" ms", *samplerate);
+ samplerate = g_variant_get_uint64(src->data);
+ g_debug("cli: got sample interval %"PRIu64" ms", samplerate);
break;
default:
/* Unknown metadata is not an error. */
GHashTableIter iter;
gpointer key, value;
int ret;
- float tmp_float;
- uint64_t tmp_u64;
- struct sr_rational tmp_rat;
+ double tmp_double;
+ uint64_t tmp_u64, p, q;
gboolean tmp_bool;
- void *val;
+ GVariant *val, *rational[2];
g_hash_table_iter_init(&iter, args);
while (g_hash_table_iter_next(&iter, &key, &value)) {
ret = sr_parse_sizestring(value, &tmp_u64);
if (ret != SR_OK)
break;
- val = &tmp_u64;
+ val = g_variant_new_uint64(tmp_u64);
break;
case SR_T_CHAR:
- val = value;
+ val = g_variant_new_string(value);
break;
case SR_T_BOOL:
if (!value)
tmp_bool = TRUE;
else
tmp_bool = sr_parse_boolstring(value);
- val = &tmp_bool;
+ val = g_variant_new_boolean(tmp_bool);
break;
case SR_T_FLOAT:
- tmp_float = strtof(value, NULL);
- val = &tmp_float;
+ tmp_double = strtof(value, NULL);
+ val = g_variant_new_double(tmp_double);
break;
case SR_T_RATIONAL_PERIOD:
- if ((ret = sr_parse_period(value, &tmp_rat)) != SR_OK)
+ if ((ret = sr_parse_period(value, &p, &q)) != SR_OK)
break;
- val = &tmp_rat;
+ rational[0] = g_variant_new_uint64(p);
+ rational[1] = g_variant_new_uint64(q);
+ val = g_variant_new_tuple(rational, 2);
break;
case SR_T_RATIONAL_VOLT:
- if ((ret = sr_parse_voltage(value, &tmp_rat)) != SR_OK)
+ if ((ret = sr_parse_voltage(value, &p, &q)) != SR_OK)
break;
- val = &tmp_rat;
+ rational[0] = g_variant_new_uint64(p);
+ rational[1] = g_variant_new_uint64(q);
+ val = g_variant_new_tuple(rational, 2);
break;
default:
ret = SR_ERR;
static int set_limit_time(const struct sr_dev_inst *sdi)
{
+ GVariant *gvar;
uint64_t time_msec;
- uint64_t *samplerate;
+ uint64_t samplerate;
if (!(time_msec = sr_parse_timestring(opt_time))) {
g_critical("Invalid time '%s'", opt_time);
}
if (sr_dev_has_option(sdi, SR_CONF_LIMIT_MSEC)) {
- if (sr_config_set(sdi, SR_CONF_LIMIT_MSEC, &time_msec) != SR_OK) {
+ gvar = g_variant_new_uint64(time_msec);
+ if (sr_config_set(sdi, SR_CONF_LIMIT_MSEC, gvar) != SR_OK) {
g_critical("Failed to configure time limit.");
return SR_ERR;
}
} else if (sr_dev_has_option(sdi, SR_CONF_SAMPLERATE)) {
/* Convert to samples based on the samplerate. */
- sr_config_get(sdi->driver, SR_CONF_SAMPLERATE,
- (const void **)&samplerate, sdi);
- limit_samples = (*samplerate) * time_msec / (uint64_t)1000;
+ sr_config_get(sdi->driver, SR_CONF_SAMPLERATE, &gvar, sdi);
+ samplerate = g_variant_get_uint64(gvar);
+ g_variant_unref(gvar);
+ limit_samples = (samplerate) * time_msec / (uint64_t)1000;
if (limit_samples == 0) {
g_critical("Not enough time at this samplerate.");
return SR_ERR;
}
- if (sr_config_set(sdi, SR_CONF_LIMIT_SAMPLES,
- &limit_samples) != SR_OK) {
+ gvar = g_variant_new_uint64(limit_samples);
+ if (sr_config_set(sdi, SR_CONF_LIMIT_SAMPLES, gvar) != SR_OK) {
g_critical("Failed to configure time-based sample limit.");
return SR_ERR;
}
{
GSList *devices;
GHashTable *devargs;
+ GVariant *gvar;
struct sr_dev_inst *sdi;
int max_probes, i;
char **triggerlist;
}
if (opt_samples) {
- if ((sr_parse_sizestring(opt_samples, &limit_samples) != SR_OK)
- || (sr_config_set(sdi, SR_CONF_LIMIT_SAMPLES,
- &limit_samples) != SR_OK)) {
+ if ((sr_parse_sizestring(opt_samples, &limit_samples) != SR_OK)) {
+ g_critical("Invalid sample limit '%s'.", opt_samples);
+ sr_session_destroy();
+ return;
+ }
+ gvar = g_variant_new_uint64(limit_samples);
+ if (sr_config_set(sdi, SR_CONF_LIMIT_SAMPLES, gvar) != SR_OK) {
g_critical("Failed to configure sample limit.");
sr_session_destroy();
return;
}
if (opt_frames) {
- if ((sr_parse_sizestring(opt_frames, &limit_frames) != SR_OK)
- || (sr_config_set(sdi, SR_CONF_LIMIT_FRAMES,
- &limit_frames) != SR_OK)) {
+ if ((sr_parse_sizestring(opt_frames, &limit_frames) != SR_OK)) {
+ g_critical("Invalid sample limit '%s'.", opt_samples);
+ sr_session_destroy();
+ return;
+ }
+ gvar = g_variant_new_uint64(limit_frames);
+ if (sr_config_set(sdi, SR_CONF_LIMIT_FRAMES, gvar) != SR_OK) {
g_critical("Failed to configure frame limit.");
sr_session_destroy();
return;