X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=show.c;h=9491110bdcfdbb82d1c0f469a02e47d043fb0875;hp=aec61f142d7aff4a90a38e32a4b80ad56fb45f2d;hb=3f85a61849759896e0e9b009be14a696108d4309;hpb=59e421bbda22512122660aee370d31b88f8ccdf4 diff --git a/show.c b/show.c index aec61f1..9491110 100644 --- a/show.c +++ b/show.c @@ -17,6 +17,7 @@ * along with this program. If not, see . */ +#include #include #include #include "sigrok-cli.h" @@ -56,6 +57,70 @@ static gint sort_pds(gconstpointer a, gconstpointer b) #endif void show_version(void) +{ + GString *s; + GSList *l, *l_orig, *m; + char *str; + const char *lib, *version; + + printf("sigrok-cli %s\n\n", SC_PACKAGE_VERSION_STRING); + + printf("Libraries and features:\n"); + + printf("- libsigrok %s/%s (rt: %s/%s).\n", + SR_PACKAGE_VERSION_STRING, SR_LIB_VERSION_STRING, + sr_package_version_string_get(), sr_lib_version_string_get()); + + s = g_string_sized_new(200); + g_string_append(s, " - Libs:\n"); + l_orig = sr_buildinfo_libs_get(); + for (l = l_orig; l; l = l->next) { + m = l->data; + lib = m->data; + version = m->next->data; + g_string_append_printf(s, " - %s %s\n", lib, version); + g_slist_free_full(m, g_free); + } + g_slist_free(l_orig); + s->str[s->len - 1] = '\0'; + printf("%s\n", s->str); + g_string_free(s, TRUE); + + str = sr_buildinfo_host_get(); + printf(" - Host: %s.\n", str); + g_free(str); + + str = sr_buildinfo_scpi_backends_get(); + printf(" - SCPI backends: %s.\n", str); + g_free(str); + +#ifdef HAVE_SRD + printf("- libsigrokdecode %s/%s (rt: %s/%s).\n", + SRD_PACKAGE_VERSION_STRING, SRD_LIB_VERSION_STRING, + srd_package_version_string_get(), srd_lib_version_string_get()); + + s = g_string_sized_new(200); + g_string_append(s, " - Libs:\n"); + l_orig = srd_buildinfo_libs_get(); + for (l = l_orig; l; l = l->next) { + m = l->data; + lib = m->data; + version = m->next->data; + g_string_append_printf(s, " - %s %s\n", lib, version); + g_slist_free_full(m, g_free); + } + g_slist_free(l_orig); + s->str[s->len - 1] = '\0'; + printf("%s\n", s->str); + g_string_free(s, TRUE); + + str = srd_buildinfo_host_get(); + printf(" - Host: %s.\n", str); + g_free(str); +#endif +} + +void show_supported(void) { struct sr_dev_driver **drivers, *driver; const struct sr_input_module **inputs, *input; @@ -68,15 +133,6 @@ void show_version(void) struct srd_decoder *dec; #endif - printf("sigrok-cli %s\n\n", VERSION); - - printf("Using libsigrok %s (lib version %s).\n", - sr_package_version_string_get(), sr_lib_version_string_get()); -#ifdef HAVE_SRD - printf("Using libsigrokdecode %s (lib version %s).\n\n", - srd_package_version_string_get(), srd_lib_version_string_get()); -#endif - printf("Supported hardware drivers:\n"); drivers = sr_driver_list(sr_ctx); for (sl = NULL, i = 0; drivers[i]; i++) @@ -223,39 +279,34 @@ void show_dev_list(void) void show_drv_detail(struct sr_dev_driver *driver) { - const struct sr_config_info *srci; - GVariant *gvar_opts; - const uint32_t *opts; - gsize num_elements, i; - - if (sr_config_list(driver, NULL, NULL, SR_CONF_DEVICE_OPTIONS, - &gvar_opts) == SR_OK) { - opts = g_variant_get_fixed_array(gvar_opts, &num_elements, - sizeof(uint32_t)); - if (num_elements) { + const struct sr_key_info *srci; + GArray *opts; + guint i; + + if ((opts = sr_dev_options(driver, NULL, NULL))) { + if (opts->len > 0) { printf("Driver functions:\n"); - for (i = 0; i < num_elements; i++) { - if (!(srci = sr_config_info_get(opts[i] & SR_CONF_MASK))) + for (i = 0; i < opts->len; i++) { + if (!(srci = sr_key_info_get(SR_KEY_CONFIG, + g_array_index(opts, uint32_t, i)))) continue; printf(" %s\n", srci->name); } } - g_variant_unref(gvar_opts); + g_array_free(opts, TRUE); } - if (sr_config_list(driver, NULL, NULL, SR_CONF_SCAN_OPTIONS, - &gvar_opts) == SR_OK) { - opts = g_variant_get_fixed_array(gvar_opts, &num_elements, - sizeof(uint32_t)); - if (num_elements) { + if ((opts = sr_driver_scan_options_list(driver))) { + if (opts->len > 0) { printf("Scan options:\n"); - for (i = 0; i < num_elements; i++) { - if (!(srci = sr_config_info_get(opts[i] & SR_CONF_MASK))) + for (i = 0; i < opts->len; i++) { + if (!(srci = sr_key_info_get(SR_KEY_CONFIG, + g_array_index(opts, uint32_t, i)))) continue; printf(" %s\n", srci->id); } } - g_variant_unref(gvar_opts); + g_array_free(opts, TRUE); } } @@ -263,19 +314,20 @@ void show_dev_detail(void) { struct sr_dev_driver *driver_from_opt, *driver; struct sr_dev_inst *sdi; - const struct sr_config_info *srci; + const struct sr_key_info *srci, *srmqi, *srmqfi; struct sr_channel *ch; struct sr_channel_group *channel_group, *cg; GSList *devices, *cgl, *chl, *channel_groups; - GVariant *gvar_opts, *gvar_dict, *gvar_list, *gvar; - gsize num_opts, num_elements; + GVariant *gvar_dict, *gvar_list, *gvar; + gsize num_elements; double dlow, dhigh, dcur_low, dcur_high; const uint64_t *uint64, p, q, low, high; - uint64_t tmp_uint64, cur_low, cur_high, cur_p, cur_q; - const uint32_t *opts; + uint64_t tmp_uint64, mask, cur_low, cur_high, cur_p, cur_q; + GArray *opts; const int32_t *int32; - uint32_t key, o; - unsigned int num_devices, i; + uint32_t key, o, cur_mq, mq; + uint64_t cur_mqflags, mqflags; + unsigned int num_devices, i, j; char *tmp_str, *s, c; const char **stropts; @@ -315,8 +367,7 @@ void show_dev_detail(void) select_channels(sdi); channel_group = select_channel_group(sdi); - if (sr_config_list(driver, sdi, channel_group, SR_CONF_DEVICE_OPTIONS, - &gvar_opts) != SR_OK) + if (!(opts = sr_dev_options(driver, sdi, channel_group))) /* Driver supports no device instance options. */ return; @@ -342,10 +393,9 @@ void show_dev_detail(void) printf(" on channel group %s", channel_group->name); } printf(":\n"); - opts = g_variant_get_fixed_array(gvar_opts, &num_opts, sizeof(uint32_t)); - for (o = 0; o < num_opts; o++) { - key = opts[o] & SR_CONF_MASK; - if (!(srci = sr_config_info_get(key))) + for (o = 0; o < opts->len; o++) { + key = g_array_index(opts, uint32_t, o); + if (!(srci = sr_key_info_get(SR_KEY_CONFIG, key))) continue; if (key == SR_CONF_TRIGGER_MATCH) { @@ -391,7 +441,8 @@ void show_dev_detail(void) g_variant_unref(gvar_list); } else if (key == SR_CONF_LIMIT_SAMPLES - && config_key_has_cap(driver, sdi, NULL, key, SR_CONF_LIST)) { + && (sr_dev_config_capabilities_list(sdi, NULL, key) + & SR_CONF_LIST)) { /* * If implemented in config_list(), this denotes the * maximum number of samples a device can send. This @@ -614,7 +665,7 @@ void show_dev_detail(void) gvar = g_variant_get_child_value(gvar_list, i); g_variant_get(gvar, "(tt)", &p, &q); if (srci->datatype == SR_T_RATIONAL_PERIOD) - s = sr_period_string(p * q); + s = sr_period_string(p, q); else s = sr_voltage_string(p, q); printf(" %s", s); @@ -625,20 +676,60 @@ void show_dev_detail(void) } g_variant_unref(gvar_list); + } else if (srci->datatype == SR_T_MQ) { + printf(" %s: ", srci->id); + if (maybe_config_get(driver, sdi, channel_group, key, + &gvar) == SR_OK + && g_variant_is_of_type(gvar, G_VARIANT_TYPE_TUPLE) + && g_variant_n_children(gvar) == 2) { + g_variant_get(gvar, "(ut)", &cur_mq, &cur_mqflags); + g_variant_unref(gvar); + } else + cur_mq = cur_mqflags = 0; + + if (maybe_config_list(driver, sdi, channel_group, + key, &gvar_list) != SR_OK) { + printf("\n"); + continue; + } + printf(" - supported measurements:\n"); + num_elements = g_variant_n_children(gvar_list); + for (i = 0; i < num_elements; i++) { + printf(" "); + gvar = g_variant_get_child_value(gvar_list, i); + g_variant_get(gvar, "(ut)", &mq, &mqflags); + if ((srmqi = sr_key_info_get(SR_KEY_MQ, mq))) + printf("%s", srmqi->id); + else + printf("%d", mq); + for (j = 0, mask = 1; j < 32; j++, mask <<= 1) { + if (!(mqflags & mask)) + continue; + if ((srmqfi = sr_key_info_get(SR_KEY_MQFLAGS, mqflags & mask))) + printf("/%s", srmqfi->id); + else + printf("/%" PRIu64, mqflags & mask); + } + if (mq == cur_mq && mqflags == cur_mqflags) + printf(" (current)"); + printf("\n"); + } + g_variant_unref(gvar_list); + } else { /* Everything else */ printf(" %s\n", srci->id); } } - g_variant_unref(gvar_opts); + g_array_free(opts, TRUE); sr_dev_close(sdi); } #ifdef HAVE_SRD -void show_pd_detail(void) +static void show_pd_detail_single(const char *pd) { struct srd_decoder *dec; struct srd_decoder_option *o; @@ -646,9 +737,9 @@ void show_pd_detail(void) struct srd_decoder_annotation_row *r; GSList *l, *ll, *ol; int idx; - char **pdtokens, **pdtok, *optsep, **ann, *val, *doc; + char **pdtokens, **pdtok, *optsep, **ann, **bin, *val, *doc, *str; - pdtokens = g_strsplit(opt_pds, ",", -1); + pdtokens = g_strsplit(pd, ",", -1); for (pdtok = pdtokens; *pdtok; pdtok++) { /* Strip options. */ if ((optsep = strchr(*pdtok, ':'))) @@ -660,6 +751,24 @@ void show_pd_detail(void) 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("Possible decoder input IDs:\n"); + if (dec->inputs) { + for (l = dec->inputs; l; l = l->next) { + str = l->data; + printf("- %s\n", str); + } + } else { + printf("None.\n"); + } + printf("Possible decoder output IDs:\n"); + if (dec->outputs) { + for (l = dec->outputs; l; l = l->next) { + str = l->data; + printf("- %s\n", str); + } + } else { + printf("None.\n"); + } printf("Annotation classes:\n"); if (dec->annotations) { for (l = dec->annotations; l; l = l->next) { @@ -686,6 +795,15 @@ void show_pd_detail(void) } else { printf("None.\n"); } + printf("Binary classes:\n"); + if (dec->binary) { + for (l = dec->binary; l; l = l->next) { + bin = l->data; + printf("- %s: %s\n", bin[0], bin[1]); + } + } else { + printf("None.\n"); + } printf("Required channels:\n"); if (dec->channels) { for (l = dec->channels; l; l = l->next) { @@ -732,6 +850,12 @@ void show_pd_detail(void) g_strfreev(pdtokens); } + +void show_pd_detail(void) +{ + for (int i = 0; opt_pds[i]; i++) + show_pd_detail_single(opt_pds[i]); +} #endif void show_input(void)