From: Tomaž Šolc Date: Wed, 4 Jul 2012 14:29:13 +0000 (+0200) Subject: Allow setting samplerate when reading binary files X-Git-Tag: sigrok-cli-0.4.0~97 X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=commitdiff_plain;h=943d0c0835811a77261b48e1f77dd0a342fea1d2;ds=inline Allow setting samplerate when reading binary files I had a binary file that I needed to decode using UART decoder. UART decoder needs to know the sample rate for the data, but currently it's not possible to pass parameters to input formats and so the "binary" file format always sets the samplerate to 0. This patch adds the possibility to append a colon-separated list of key=value options to the -I argument, in the same way -d supports it. Also, it makes the "binary" format support the "samplerate" option. I included the GHashTable containing input format options directly in the sr_input struct. I'm not sure if that's the right way to do it. I saw that -d uses a much more elaborate system with device capabilities and typed options, but that seemed like an overkill for input formats. --- diff --git a/doc/sigrok-cli.1 b/doc/sigrok-cli.1 index cc13722..d86e53b 100644 --- a/doc/sigrok-cli.1 +++ b/doc/sigrok-cli.1 @@ -76,7 +76,12 @@ the input file. When loading an input file, assume it's in the specified format. If this option is not supplied (in addition to .BR \-\-input\-file ), -sigrok-cli attempts to autodetect the file format of the input file. +sigrok-cli attempts to autodetect the file format of the input file. Use the +.B \-V +option to see a list of available input formats. The format name may +optionally be followed by a colon-separated list of options, where each +option takes the form +.BR "key=value" . .TP .BR "\-o, \-\-output\-file " Save output to a file instead of writing it to stdout. The default format diff --git a/sigrok-cli.c b/sigrok-cli.c index 3a460bf..a0e4f08 100644 --- a/sigrok-cli.c +++ b/sigrok-cli.c @@ -43,7 +43,6 @@ static uint64_t limit_frames = 0; static struct sr_output_format *output_format = NULL; static int default_output_format = FALSE; static char *output_format_param = NULL; -static char *input_format_param = NULL; static GHashTable *pd_ann_visible = NULL; static gboolean opt_version = FALSE; @@ -991,7 +990,7 @@ static struct sr_input_format *determine_input_file_format( /* If the user specified -I / --input-format, use that one. */ if (opt) { for (i = 0; inputs[i]; i++) { - if (strcasecmp(inputs[i]->id, opt_input_format)) + if (strcasecmp(inputs[i]->id, opt)) continue; g_debug("Using user-specified input file format '%s'.", inputs[i]->id); @@ -1000,7 +999,7 @@ static struct sr_input_format *determine_input_file_format( /* The user specified an unknown input format, return NULL. */ g_critical("Error: specified input file format '%s' is " - "unknown.", opt_input_format); + "unknown.", opt); return NULL; } @@ -1024,14 +1023,25 @@ static struct sr_input_format *determine_input_file_format( static void load_input_file_format(void) { + GHashTable *fmtargs = NULL; struct stat st; struct sr_input *in; struct sr_input_format *input_format; + char *fmtspec = NULL; + + if (opt_input_format) { + fmtargs = parse_generic_arg(opt_input_format); + fmtspec = g_hash_table_lookup(fmtargs, "sigrok_key"); + } if (!(input_format = determine_input_file_format(opt_input_file, - opt_input_format))) + fmtspec))) { /* The exact cause was already logged. */ return; + } +; + if (fmtargs) + g_hash_table_remove(fmtargs, "sigrok_key"); if (stat(opt_input_file, &st) == -1) { g_critical("Failed to load %s: %s", opt_input_file, @@ -1045,7 +1055,7 @@ static void load_input_file_format(void) exit(1); } in->format = input_format; - in->param = input_format_param; + in->param = fmtargs; if (in->format->init) { if (in->format->init(in) != SR_OK) { g_critical("Input format init failed."); @@ -1070,6 +1080,9 @@ static void load_input_file_format(void) g_critical("Failed to save session."); } sr_session_destroy(); + + if (fmtargs) + g_hash_table_destroy(fmtargs); } static void load_input_file(void)