X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=sigrok-cli.c;h=300c621b967acbfe32c3a7bc8ac865bd0b9a2cde;hp=b81c4780743cfe6d61345e220fe2196d434ed31f;hb=5905a251d96f89418319641532b2d2ec8e848336;hpb=120f9ee7614636c32a08516d5833d866d576eb80 diff --git a/sigrok-cli.c b/sigrok-cli.c index b81c478..300c621 100644 --- a/sigrok-cli.c +++ b/sigrok-cli.c @@ -56,7 +56,7 @@ static gchar *opt_probes = NULL; static gchar *opt_triggers = NULL; static gchar *opt_pds = NULL; static gchar *opt_pd_stack = NULL; -static gchar *opt_pd_annotation = NULL; +static gchar *opt_pd_annotations = NULL; static gchar *opt_input_format = NULL; static gchar *opt_output_format = NULL; static gchar *opt_time = NULL; @@ -67,7 +67,7 @@ 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/libsigrokdecode loglevel", NULL}, + "Set 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, @@ -90,8 +90,8 @@ static GOptionEntry optargs[] = { "Protocol decoders to run", NULL}, {"protocol-decoder-stack", 's', 0, G_OPTION_ARG_STRING, &opt_pd_stack, "Protocol decoder stack", NULL}, - {"protocol-decoder-annotation", 0, 0, G_OPTION_ARG_STRING, &opt_pd_annotation, - "Protocol decoder annotation to show", NULL}, + {"protocol-decoder-annotations", 'A', 0, G_OPTION_ARG_STRING, &opt_pd_annotations, + "Protocol decoder annotation(s) to show", 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, @@ -551,8 +551,9 @@ static int register_pds(struct sr_dev *dev, const char *pdstring) * This will be pared down later to leave only the last PD * in the stack. */ - if (!opt_pd_annotation) - g_hash_table_insert(pd_ann_visible, g_strdup(di->inst_id), NULL); + if (!opt_pd_annotations) + g_hash_table_insert(pd_ann_visible, + g_strdup(di->inst_id), NULL); /* Any keys left in the options hash are probes, where the key * is the probe name as specified in the decoder class, and the @@ -614,8 +615,9 @@ int setup_pd_stack(void) * the stack will be left on the annotation list (unless * the annotation list was specifically provided). */ - if (!opt_pd_annotation) - g_hash_table_remove(pd_ann_visible, di_from->inst_id); + if (!opt_pd_annotations) + g_hash_table_remove(pd_ann_visible, + di_from->inst_id); di_from = di_to; } @@ -633,8 +635,8 @@ int setup_pd_annotations(void) char **pds, **pdtok, **keyval, **ann_descr; /* Set up custom list of PDs and annotations to show. */ - if (opt_pd_annotation) { - pds = g_strsplit(opt_pd_annotation, ",", 0); + if (opt_pd_annotations) { + pds = g_strsplit(opt_pd_annotations, ",", 0); for (pdtok = pds; *pdtok && **pdtok; pdtok++) { ann = 0; keyval = g_strsplit(*pdtok, "=", 0); @@ -669,7 +671,53 @@ int setup_pd_annotations(void) return 0; } -void show_pd_annotation(struct srd_proto_data *pdata, void *cb_data) +int setup_output_format(void) +{ + GHashTable *fmtargs; + GHashTableIter iter; + gpointer key, value; + struct sr_output_format **outputs; + int i; + char *fmtspec; + + 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_output_format); + fmtspec = g_hash_table_lookup(fmtargs, "sigrok_key"); + if (!fmtspec) { + g_critical("Invalid output format."); + return 1; + } + outputs = sr_output_list(); + for (i = 0; outputs[i]; i++) { + if (strcmp(outputs[i]->id, fmtspec)) + continue; + g_hash_table_remove(fmtargs, "sigrok_key"); + output_format = outputs[i]; + g_hash_table_iter_init(&iter, fmtargs); + while (g_hash_table_iter_next(&iter, &key, &value)) { + /* only supporting one parameter per output module + * for now, and only its value */ + output_format_param = g_strdup(value); + break; + } + break; + } + if (!output_format) { + g_critical("Invalid output format %s.", opt_output_format); + return 1; + } + g_hash_table_destroy(fmtargs); + + return 0; +} + +void show_pd_annotations(struct srd_proto_data *pdata, void *cb_data) { int i; char **annotations; @@ -784,6 +832,9 @@ static struct sr_input_format *determine_input_file_format( g_critical("Error: no matching input module found."); return NULL; } + + g_debug("cli: Autodetected '%s' input format for file '%s'.", + inputs[i]->id, filename); return inputs[i]; } @@ -1114,12 +1165,6 @@ int main(int argc, char **argv) { GOptionContext *context; GError *error; - GHashTable *fmtargs; - GHashTableIter iter; - gpointer key, value; - struct sr_output_format **outputs; - int i; - char *fmtspec; g_log_set_default_handler(logger, NULL); @@ -1149,7 +1194,7 @@ int main(int argc, char **argv) if (register_pds(NULL, opt_pds) != 0) return 1; if (srd_pd_output_callback_add(SRD_OUTPUT_ANN, - show_pd_annotation, NULL) != SRD_OK) + show_pd_annotations, NULL) != SRD_OK) return 1; if (setup_pd_stack() != 0) return 1; @@ -1157,39 +1202,8 @@ int main(int argc, char **argv) return 1; } - 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_output_format); - fmtspec = g_hash_table_lookup(fmtargs, "sigrok_key"); - if (!fmtspec) { - g_critical("Invalid output format."); + if (setup_output_format() != 0) return 1; - } - outputs = sr_output_list(); - for (i = 0; outputs[i]; i++) { - if (strcmp(outputs[i]->id, fmtspec)) - continue; - g_hash_table_remove(fmtargs, "sigrok_key"); - output_format = outputs[i]; - g_hash_table_iter_init(&iter, fmtargs); - while (g_hash_table_iter_next(&iter, &key, &value)) { - /* only supporting one parameter per output module - * for now, and only its value */ - output_format_param = g_strdup(value); - break; - } - break; - } - if (!output_format) { - g_critical("Invalid output format %s.", opt_output_format); - return 1; - } - g_hash_table_destroy(fmtargs); if (opt_version) show_version();