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.
This commit is contained in:
Tomaž Šolc 2012-07-04 16:29:13 +02:00 committed by Bert Vermeulen
parent d67b663e21
commit c506a6a688
2 changed files with 48 additions and 14 deletions

View File

@ -29,6 +29,10 @@
#define CHUNKSIZE (512 * 1024) #define CHUNKSIZE (512 * 1024)
#define DEFAULT_NUM_PROBES 8 #define DEFAULT_NUM_PROBES 8
struct context {
int samplerate;
};
static int format_match(const char *filename) static int format_match(const char *filename)
{ {
/* suppress compiler warning */ /* suppress compiler warning */
@ -42,17 +46,37 @@ static int init(struct sr_input *in)
{ {
int num_probes, i; int num_probes, i;
char name[SR_MAX_PROBENAME_LEN + 1]; char name[SR_MAX_PROBENAME_LEN + 1];
char *param;
struct context *ctx;
if (in->param && in->param[0]) { if (!(ctx = g_try_malloc0(sizeof(*ctx)))) {
num_probes = strtoul(in->param, NULL, 10); 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) if (num_probes < 1)
return SR_ERR; return SR_ERR;
} else { }
num_probes = DEFAULT_NUM_PROBES;
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. */ /* Create a virtual device. */
in->vdev = sr_dev_new(NULL, 0); in->vdev = sr_dev_new(NULL, 0);
in->internal = ctx;
for (i = 0; i < num_probes; i++) { for (i = 0; i < num_probes; i++) {
snprintf(name, SR_MAX_PROBENAME_LEN, "%d", 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; struct sr_datafeed_logic logic;
unsigned char buffer[CHUNKSIZE]; unsigned char buffer[CHUNKSIZE];
int fd, size, num_probes; int fd, size, num_probes;
struct context *ctx;
ctx = in->internal;
if ((fd = open(filename, O_RDONLY)) == -1) if ((fd = open(filename, O_RDONLY)) == -1)
return SR_ERR; 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. */ /* Send metadata about the SR_DF_LOGIC packets to come. */
packet.type = SR_DF_META_LOGIC; packet.type = SR_DF_META_LOGIC;
packet.payload = &meta; packet.payload = &meta;
meta.samplerate = 0; meta.samplerate = ctx->samplerate;
meta.num_probes = num_probes; meta.num_probes = num_probes;
sr_session_send(in->vdev, &packet); 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; packet.type = SR_DF_END;
sr_session_send(in->vdev, &packet); sr_session_send(in->vdev, &packet);
g_free(ctx);
in->internal = NULL;
return SR_OK; return SR_OK;
} }

View File

@ -96,15 +96,19 @@ static int init(struct sr_input *in)
{ {
int num_probes, i; int num_probes, i;
char name[SR_MAX_PROBENAME_LEN + 1]; char name[SR_MAX_PROBENAME_LEN + 1];
char *param;
if (in->param && in->param[0]) { num_probes = DEFAULT_NUM_PROBES;
num_probes = strtoul(in->param, NULL, 10);
if (in->param) {
param = g_hash_table_lookup(in->param, "numprobes");
if (param) {
num_probes = strtoul(param, NULL, 10);
if (num_probes < 1) { if (num_probes < 1) {
sr_err("la8 in: %s: strtoul failed", __func__); sr_err("la8 in: %s: strtoul failed", __func__);
return SR_ERR; return SR_ERR;
} }
} else { }
num_probes = DEFAULT_NUM_PROBES;
} }
/* Create a virtual device. */ /* Create a virtual device. */