]> sigrok.org Git - sigrok-cli.git/blobdiff - sigrok-cli.c
cli: no need to specify stacking order if it's the same as the PD list
[sigrok-cli.git] / sigrok-cli.c
index 053591fccee48e9fdd4f6b119fcae5bf4f55cdcd..12e8adf806987d5a607b05dc2f20566cd8433de3 100644 (file)
@@ -65,8 +65,8 @@ 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},
@@ -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++) {
@@ -119,11 +124,13 @@ static void show_version(void)
                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)
@@ -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,38 +1042,44 @@ 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;
                }
-       }
 
-       if (opt_pd_stack) {
-               pds = g_strsplit(opt_pd_stack, ",", 0);
-               if (g_strv_length(pds) < 2) {
-                       printf("Specify at least two protocol decoders to stack.\n");
-                       return 1;
-               }
+               pds = g_strsplit(opt_pds, ",", 0);
+               if (g_strv_length(pds) > 1) {
+                       if (opt_pd_stack) {
+                               /* A stack setup was specified, use that. */
+                               g_strfreev(pds);
+                               pds = g_strsplit(opt_pd_stack, ",", 0);
+                               if (g_strv_length(pds) < 2) {
+                                       g_strfreev(pds);
+                                       printf("Specify at least two protocol decoders to stack.\n");
+                                       return 1;
+                               }
+                       }
 
-               if (!(di_from = srd_inst_find_by_id(pds[0]))) {
-                       printf("Cannot stack protocol decoder '%s': instance not found.\n", pds[0]);
-                       return 1;
-               }
-               for (i = 1; pds[i]; i++) {
-                       if (!(di_to = srd_inst_find_by_id(pds[i]))) {
-                               printf("Cannot stack protocol decoder '%s': instance not found.\n", pds[i]);
+                       if (!(di_from = srd_inst_find_by_id(pds[0]))) {
+                               printf("Cannot stack protocol decoder '%s': instance not found.\n", pds[0]);
                                return 1;
                        }
-                       if ((ret = srd_inst_stack(di_from, di_to) != SRD_OK))
-                               return ret;
+                       for (i = 1; pds[i]; i++) {
+                               if (!(di_to = srd_inst_find_by_id(pds[i]))) {
+                                       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)
+                                       return ret;
 
-                       /* Don't show annotation from this PD. Only the last PD in
-                        * the stack will be left on the annotation list.
-                        */
-                       g_datalist_remove_data(&pd_ann_visible, di_from->inst_id);
+                               /* Don't show annotation from this PD. Only the last PD in
+                                * the stack will be left on the annotation list.
+                                */
+                               g_datalist_remove_data(&pd_ann_visible, di_from->inst_id);
 
-                       di_from = di_to;
+                               di_from = di_to;
+                       }
                }
                g_strfreev(pds);
        }