+ g_free(s);
+ 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,
+ &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; 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,
+ &gvar_list, sdi) != SR_OK) {
+ printf("\n");
+ continue;
+ }
+ printf(" - supported time bases:\n");
+ 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,
+ &gvar, sdi) != SR_OK) {
+ printf("\n");
+ continue;
+ }
+ printf(" - supported trigger sources:\n");
+ 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,
+ &gvar, sdi) != SR_OK) {
+ printf("\n");
+ continue;
+ }
+ printf(" - supported filter targets:\n");
+ 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,
+ &gvar_list, sdi) != SR_OK) {
+ printf("\n");
+ continue;
+ }
+ printf(" - supported volts/div:\n");
+ 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,
+ &gvar, sdi) != SR_OK) {
+ printf("\n");
+ continue;
+ }
+ printf(" - supported coupling options:\n");
+ 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,
+ &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 {
+ /* Everything else */
+ printf(" %s\n", srci->id);
+ }
+ }
+ g_variant_unref(gvar_opts);
+
+ sr_session_destroy();
+
+}
+
+#ifdef HAVE_SRD
+static void show_pd_detail(void)
+{
+ GSList *l;
+ struct srd_decoder *dec;
+ struct srd_decoder_option *o;
+ char **pdtokens, **pdtok, *optsep, **ann, *val, *doc;
+ struct srd_probe *p;
+
+ pdtokens = g_strsplit(opt_pds, ",", -1);
+ for (pdtok = pdtokens; *pdtok; pdtok++) {
+ /* Strip options. */
+ if ((optsep = strchr(*pdtok, ':')))
+ *optsep = '\0';
+ if (!(dec = srd_decoder_get_by_id(*pdtok))) {
+ g_critical("Protocol decoder %s not found.", *pdtok);
+ return;
+ }
+ printf("ID: %s\nName: %s\nLong name: %s\nDescription: %s\n",
+ dec->id, dec->name, dec->longname, dec->desc);
+ printf("License: %s\n", dec->license);
+ printf("Annotations:\n");
+ if (dec->annotations) {
+ for (l = dec->annotations; l; l = l->next) {
+ ann = l->data;
+ printf("- %s\n %s\n", ann[0], ann[1]);
+ }
+ } else {
+ printf("None.\n");
+ }
+ printf("Required probes:\n");
+ if (dec->probes) {
+ for (l = dec->probes; l; l = l->next) {
+ p = l->data;
+ printf("- %s (%s): %s\n",
+ p->name, p->id, p->desc);
+ }
+ } else {
+ printf("None.\n");
+ }
+ printf("Optional probes:\n");
+ if (dec->opt_probes) {
+ for (l = dec->opt_probes; l; l = l->next) {
+ p = l->data;
+ printf("- %s (%s): %s\n",
+ p->name, p->id, p->desc);