]> sigrok.org Git - sigrok-cli.git/blobdiff - sigrok-cli.c
cli: Print required/optional probes info.
[sigrok-cli.git] / sigrok-cli.c
index d5427a785b82e4287799363d09c77be30e07ef7c..560cbc5d08e7d18caef4208f802bdb64cf26aa03 100644 (file)
@@ -58,25 +58,25 @@ static gchar *opt_triggers = NULL;
 static gchar *opt_pds = NULL;
 static gchar *opt_pd_stack = NULL;
 static gchar *opt_input_format = NULL;
-static gchar *opt_format = NULL;
+static gchar *opt_output_format = NULL;
 static gchar *opt_time = NULL;
 static gchar *opt_samples = NULL;
 static gchar *opt_continuous = NULL;
 
 static GOptionEntry optargs[] = {
        {"version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, "Show version and support list", NULL},
-       {"loglevel", 'l', 0, G_OPTION_ARG_INT, &opt_loglevel, "Select libsigrok loglevel", NULL},
-       {"list-devices", 'D', 0, G_OPTION_ARG_NONE, &opt_list_devs, "List devices", NULL},
+       {"loglevel", 'l', 0, G_OPTION_ARG_INT, &opt_loglevel, "Select libsigrok/libsigrokdecode loglevel", NULL},
+       {"list-devices", 'D', 0, G_OPTION_ARG_NONE, &opt_list_devs, "Scan for devices", NULL},
+       {"device", 'd', 0, G_OPTION_ARG_STRING, &opt_dev, "Use specified device", NULL},
        {"input-file", 'i', 0, G_OPTION_ARG_FILENAME, &opt_input_file, "Load input from file", NULL},
+       {"input-format", 'I', 0, G_OPTION_ARG_STRING, &opt_input_format, "Input format", NULL},
        {"output-file", 'o', 0, G_OPTION_ARG_FILENAME, &opt_output_file, "Save output to file", NULL},
-       {"device", 'd', 0, G_OPTION_ARG_STRING, &opt_dev, "Use device ID", NULL},
+       {"output-format", 'O', 0, G_OPTION_ARG_STRING, &opt_output_format, "Output format", NULL},
        {"probes", 'p', 0, G_OPTION_ARG_STRING, &opt_probes, "Probes to use", NULL},
        {"triggers", 't', 0, G_OPTION_ARG_STRING, &opt_triggers, "Trigger configuration", NULL},
        {"wait-trigger", 'w', 0, G_OPTION_ARG_NONE, &opt_wait_trigger, "Wait for trigger", NULL},
-       {"protocol-decoders", 'a', 0, G_OPTION_ARG_STRING, &opt_pds, "Protocol decoder sequence", NULL},
+       {"protocol-decoders", 'a', 0, G_OPTION_ARG_STRING, &opt_pds, "Protocol decoders to run", NULL},
        {"protocol-decoder-stack", 's', 0, G_OPTION_ARG_STRING, &opt_pd_stack, "Protocol decoder stack", NULL},
-       {"input-format", 'I', 0, G_OPTION_ARG_STRING, &opt_input_format, "Input format", NULL},
-       {"format", 'f', 0, G_OPTION_ARG_STRING, &opt_format, "Output format", NULL},
        {"time", 0, 0, G_OPTION_ARG_STRING, &opt_time, "How long to sample (ms)", NULL},
        {"samples", 0, 0, G_OPTION_ARG_STRING, &opt_samples, "Number of samples to acquire", NULL},
        {"continuous", 0, 0, G_OPTION_ARG_NONE, &opt_continuous, "Sample continuously", NULL},
@@ -94,6 +94,11 @@ static void show_version(void)
 
        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());
+       printf("Using libsigrokdecode %s (lib version %s).\n\n",
+              srd_package_version_string_get(), srd_lib_version_string_get());
+
        printf("Supported hardware drivers:\n");
        drivers = sr_driver_list();
        for (i = 0; drivers[i]; i++) {
@@ -115,15 +120,17 @@ static void show_version(void)
 
        if (srd_init(NULL) == SRD_OK) {
                printf("Supported protocol decoders:\n");
-               srd_decoders_load_all();
-               for (l = srd_decoders_list(); l; l = l->next) {
+               srd_decoder_load_all();
+               for (l = srd_decoder_list(); l; l = l->next) {
                        dec = l->data;
                        printf("  %-20s %s\n", dec->id, dec->longname);
+                       /* Print protocol description upon "-l 3" or higher. */
+                       if (opt_loglevel >= SR_LOG_INFO)
+                               printf("  %-20s %s\n", "", dec->desc);
                }
                srd_exit();
        }
        printf("\n");
-
 }
 
 static void print_dev_line(const struct sr_dev *dev)
@@ -212,9 +219,9 @@ static void show_dev_detail(void)
 
                if (hwo->hwcap == SR_HWCAP_PATTERN_MODE) {
                        printf("    %s", hwo->shortname);
-                       if (sr_dev_info_get(dev, SR_DI_PATTERNMODES,
+                       if (sr_dev_info_get(dev, SR_DI_PATTERNS,
                                        (const void **)&stropts) == SR_OK) {
-                               printf(" - supported modes:\n");
+                               printf(" - supported patterns:\n");
                                for (i = 0; stropts[i]; i++)
                                        printf("      %s\n", stropts[i]);
                        } else {
@@ -262,6 +269,7 @@ static void show_pd_detail(void)
        GSList *l;
        struct srd_decoder *dec;
        char **pdtokens, **pdtok, **ann, *doc;
+       struct srd_probe *p;
 
        pdtokens = g_strsplit(opt_pds, ",", -1);
        for (pdtok = pdtokens; *pdtok; pdtok++) {
@@ -272,27 +280,50 @@ static 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("Annotations:\n");
                if (dec->annotations) {
-                       printf("Annotations:\n");
                        for (l = dec->annotations; l; l = l->next) {
                                ann = l->data;
                                printf("- %s\n  %s\n", ann[0], ann[1]);
                        }
+               } else {
+                       printf("None.\n");
                }
-               if ((doc = srd_decoder_doc(dec))) {
-                       printf("Documentation:\n%s\n", doc[0] == '\n' ? doc+1 : doc);
+               /* TODO: Print supported decoder options. */
+               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);
+                       }
+               } else {
+                       printf("None.\n");
+               }
+               if ((doc = srd_decoder_doc_get(dec))) {
+                       printf("Documentation:\n%s\n",
+                              doc[0] == '\n' ? doc + 1 : doc);
                        g_free(doc);
                }
        }
 
        g_strfreev(pdtokens);
-
 }
 
 static void datafeed_in(struct sr_dev *dev, struct sr_datafeed_packet *packet)
 {
        static struct sr_output *o = NULL;
-       static int probelist[SR_MAX_NUM_PROBES] = { 0 };
+       static int probelist[SR_MAX_NUM_PROBES + 1] = { 0 };
        static uint64_t received_samples = 0;
        static int unitsize = 0;
        static int triggered = 0;
@@ -302,7 +333,7 @@ static void datafeed_in(struct sr_dev *dev, struct sr_datafeed_packet *packet)
        struct sr_datafeed_logic *logic;
        int num_enabled_probes, sample_size, ret, i;
        uint64_t output_len, filter_out_len;
-       char *output_buf, *filter_out;
+       uint8_t *output_buf, *filter_out;
 
        /* If the first packet to come in isn't a header, don't even try. */
        if (packet->type != SR_DF_HEADER && o == NULL)
@@ -351,7 +382,7 @@ static void datafeed_in(struct sr_dev *dev, struct sr_datafeed_packet *packet)
                                }
                        } else {
                                /* saving to a file in whatever format was set
-                                * with --format, so all we need is a filehandle */
+                                * with -O, so all we need is a filehandle */
                                outfile = g_fopen(opt_output_file, "wb");
                        }
                }
@@ -438,7 +469,7 @@ static void datafeed_in(struct sr_dev *dev, struct sr_datafeed_packet *packet)
                goto cleanup;
 
        if (opt_pds) {
-               if (srd_session_feed(received_samples, (uint8_t*)filter_out,
+               if (srd_session_send(received_samples, (uint8_t*)filter_out,
                                filter_out_len) != SRD_OK)
                        sr_session_halt();
        } else {
@@ -454,7 +485,6 @@ static void datafeed_in(struct sr_dev *dev, struct sr_datafeed_packet *packet)
 cleanup:
        g_free(filter_out);
        received_samples += logic->length / sample_size;
-
 }
 
 /* Register the given PDs for this session.
@@ -498,7 +528,7 @@ static int register_pds(struct sr_dev *dev, const char *pdstring)
                 * is the probe name as specified in the decoder class, and the
                 * value is the probe number i.e. the order in which the PD's
                 * incoming samples are arranged. */
-               if (srd_inst_probes_set(di, pd_opthash) != SRD_OK)
+               if (srd_inst_probe_set_all(di, pd_opthash) != SRD_OK)
                        goto err_out;
                g_hash_table_destroy(pd_opthash);
                pd_opthash = NULL;
@@ -539,7 +569,6 @@ void show_pd_annotation(struct srd_proto_data *pdata, void *cb_data)
        for (i = 0; annotations[i]; i++)
                printf("\"%s\" ", annotations[i]);
        printf("\n");
-
 }
 
 static int select_probes(struct sr_dev *dev)
@@ -683,7 +712,6 @@ static void load_input_file_format(void)
                        printf("Failed to save session.\n");
        }
        sr_session_destroy();
-
 }
 
 static void load_input_file(void)
@@ -700,7 +728,6 @@ static void load_input_file(void)
                /* fall back on input modules */
                load_input_file_format();
        }
-
 }
 
 int num_real_devs(void)
@@ -939,7 +966,6 @@ static void run_session(void)
                        printf("Failed to save session.\n");
        }
        sr_session_destroy();
-
 }
 
 static void logger(const gchar *log_domain, GLogLevelFlags log_level,
@@ -1016,7 +1042,7 @@ int main(int argc, char **argv)
                        printf("Failed to register protocol decoders\n");
                        return 1;
                }
-               if (srd_register_callback(SRD_OUTPUT_ANN,
+               if (srd_pd_output_callback_add(SRD_OUTPUT_ANN,
                                show_pd_annotation, NULL) != SRD_OK) {
                        printf("Failed to register protocol decoder callback\n");
                        return 1;
@@ -1039,7 +1065,7 @@ int main(int argc, char **argv)
                                printf("Cannot stack protocol decoder '%s': instance not found.\n", pds[i]);
                                return 1;
                        }
-                       if ((ret = srd_inst_stack(di_from, di_to) != SRD_OK))
+                       if ((ret = srd_inst_stack(di_from, di_to)) != SRD_OK)
                                return ret;
 
                        /* Don't show annotation from this PD. Only the last PD in
@@ -1052,14 +1078,14 @@ int main(int argc, char **argv)
                g_strfreev(pds);
        }
 
-       if (!opt_format) {
-               opt_format = DEFAULT_OUTPUT_FORMAT;
+       if (!opt_output_format) {
+               opt_output_format = DEFAULT_OUTPUT_FORMAT;
                /* we'll need to remember this so when saving to a file
                 * later, sigrok session format will be used.
                 */
                default_output_format = TRUE;
        }
-       fmtargs = parse_generic_arg(opt_format);
+       fmtargs = parse_generic_arg(opt_output_format);
        fmtspec = g_hash_table_lookup(fmtargs, "sigrok_key");
        if (!fmtspec) {
                printf("Invalid output format.\n");
@@ -1081,7 +1107,7 @@ int main(int argc, char **argv)
                break;
        }
        if (!output_format) {
-               printf("invalid output format %s\n", opt_format);
+               printf("invalid output format %s\n", opt_output_format);
                return 1;
        }