From c506a6a688877793752d23e43d692c49d0f52dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20=C5=A0olc?= Date: Wed, 4 Jul 2012 16:29:13 +0200 Subject: [PATCH] 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. --- input/binary.c | 44 +++++++++++++++++++++++++++++++++++++------- input/chronovu_la8.c | 18 +++++++++++------- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/input/binary.c b/input/binary.c index 16081776..3209c038 100644 --- a/input/binary.c +++ b/input/binary.c @@ -29,6 +29,10 @@ #define CHUNKSIZE (512 * 1024) #define DEFAULT_NUM_PROBES 8 +struct context { + int samplerate; +}; + static int format_match(const char *filename) { /* suppress compiler warning */ @@ -42,17 +46,37 @@ static int init(struct sr_input *in) { int num_probes, i; char name[SR_MAX_PROBENAME_LEN + 1]; + char *param; + struct context *ctx; - if (in->param && in->param[0]) { - num_probes = strtoul(in->param, NULL, 10); - if (num_probes < 1) - return SR_ERR; - } else { - num_probes = DEFAULT_NUM_PROBES; + if (!(ctx = g_try_malloc0(sizeof(*ctx)))) { + sr_err("binary in: %s: ctx malloc failed", __func__); + return SR_ERR_MALLOC; + } + + num_probes = DEFAULT_NUM_PROBES; + ctx->samplerate = 0; + + if(in->param) { + param = g_hash_table_lookup(in->param, "numprobes"); + if (param) { + num_probes = strtoul(param, NULL, 10); + if (num_probes < 1) + return SR_ERR; + } + + param = g_hash_table_lookup(in->param, "samplerate"); + if (param) { + ctx->samplerate = strtoul(param, NULL, 10); + if (ctx->samplerate < 1) { + return SR_ERR; + } + } } /* Create a virtual device. */ in->vdev = sr_dev_new(NULL, 0); + in->internal = ctx; for (i = 0; i < num_probes; i++) { snprintf(name, SR_MAX_PROBENAME_LEN, "%d", i); @@ -71,6 +95,9 @@ static int loadfile(struct sr_input *in, const char *filename) struct sr_datafeed_logic logic; unsigned char buffer[CHUNKSIZE]; int fd, size, num_probes; + struct context *ctx; + + ctx = in->internal; if ((fd = open(filename, O_RDONLY)) == -1) return SR_ERR; @@ -87,7 +114,7 @@ static int loadfile(struct sr_input *in, const char *filename) /* Send metadata about the SR_DF_LOGIC packets to come. */ packet.type = SR_DF_META_LOGIC; packet.payload = &meta; - meta.samplerate = 0; + meta.samplerate = ctx->samplerate; meta.num_probes = num_probes; sr_session_send(in->vdev, &packet); @@ -106,6 +133,9 @@ static int loadfile(struct sr_input *in, const char *filename) packet.type = SR_DF_END; sr_session_send(in->vdev, &packet); + g_free(ctx); + in->internal = NULL; + return SR_OK; } diff --git a/input/chronovu_la8.c b/input/chronovu_la8.c index ceafd4db..681b812d 100644 --- a/input/chronovu_la8.c +++ b/input/chronovu_la8.c @@ -96,15 +96,19 @@ static int init(struct sr_input *in) { int num_probes, i; char name[SR_MAX_PROBENAME_LEN + 1]; + char *param; - if (in->param && in->param[0]) { - num_probes = strtoul(in->param, NULL, 10); - if (num_probes < 1) { - sr_err("la8 in: %s: strtoul failed", __func__); - return SR_ERR; + num_probes = DEFAULT_NUM_PROBES; + + if (in->param) { + param = g_hash_table_lookup(in->param, "numprobes"); + if (param) { + num_probes = strtoul(param, NULL, 10); + if (num_probes < 1) { + sr_err("la8 in: %s: strtoul failed", __func__); + return SR_ERR; + } } - } else { - num_probes = DEFAULT_NUM_PROBES; } /* Create a virtual device. */