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.
When loading an input file, assume it's in the specified format. If this
option is not supplied (in addition to
.BR \-\-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 " <filename>
Save output to a file instead of writing it to stdout. The default format
.TP
.BR "\-o, \-\-output\-file " <filename>
Save output to a file instead of writing it to stdout. The default format
static struct sr_output_format *output_format = NULL;
static int default_output_format = FALSE;
static char *output_format_param = NULL;
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;
static GHashTable *pd_ann_visible = NULL;
static gboolean opt_version = FALSE;
/* If the user specified -I / --input-format, use that one. */
if (opt) {
for (i = 0; inputs[i]; i++) {
/* 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);
continue;
g_debug("Using user-specified input file format '%s'.",
inputs[i]->id);
/* The user specified an unknown input format, return NULL. */
g_critical("Error: specified input file format '%s' is "
/* The user specified an unknown input format, return NULL. */
g_critical("Error: specified input file format '%s' is "
- "unknown.", opt_input_format);
static void load_input_file_format(void)
{
static void load_input_file_format(void)
{
+ GHashTable *fmtargs = NULL;
struct stat st;
struct sr_input *in;
struct sr_input_format *input_format;
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,
if (!(input_format = determine_input_file_format(opt_input_file,
/* The exact cause was already logged. */
return;
/* 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,
if (stat(opt_input_file, &st) == -1) {
g_critical("Failed to load %s: %s", opt_input_file,
exit(1);
}
in->format = input_format;
exit(1);
}
in->format = input_format;
- in->param = input_format_param;
if (in->format->init) {
if (in->format->init(in) != SR_OK) {
g_critical("Input format init failed.");
if (in->format->init) {
if (in->format->init(in) != SR_OK) {
g_critical("Input format init failed.");
g_critical("Failed to save session.");
}
sr_session_destroy();
g_critical("Failed to save session.");
}
sr_session_destroy();
+
+ if (fmtargs)
+ g_hash_table_destroy(fmtargs);
}
static void load_input_file(void)
}
static void load_input_file(void)