]> sigrok.org Git - libsigrok.git/commitdiff
Allow setting samplerate when reading binary files
authorTomaž Šolc <redacted>
Wed, 4 Jul 2012 14:29:13 +0000 (16:29 +0200)
committerBert Vermeulen <redacted>
Sun, 29 Jul 2012 00:16:17 +0000 (02:16 +0200)
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
input/chronovu_la8.c

index 16081776a77ff264cbbf0b1c7201317702f902b8..3209c038922989c797a20ea030d222167b8184d5 100644 (file)
 #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 (!(ctx = g_try_malloc0(sizeof(*ctx)))) {
+               sr_err("binary in: %s: ctx malloc failed", __func__);
+               return SR_ERR_MALLOC;
+       }
 
-       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;
+       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;
 }
 
index ceafd4db0a8366b9cab184ad27e6fcf38c77864a..681b812df4d03e759b4e61dc0fe6476875eb5119 100644 (file)
@@ -96,15 +96,19 @@ static int init(struct sr_input *in)
 {
        int num_probes, i;
        char name[SR_MAX_PROBENAME_LEN + 1];
-
-       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;
+       char *param;
+
+       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. */