]> sigrok.org Git - libsigrok.git/commitdiff
output/bits: Support getting samplerate from meta packets.
authorBert Vermeulen <redacted>
Mon, 28 Apr 2014 21:54:47 +0000 (14:54 -0700)
committerBert Vermeulen <redacted>
Mon, 28 Apr 2014 21:54:47 +0000 (14:54 -0700)
output/bits.c

index fa48e834530c88e54e0d3bddf95e5a092ff6e443..b44f1057d82c645676ec16a4c31094b3221060ea 100644 (file)
@@ -32,10 +32,11 @@ struct context {
        int samples_per_line;
        int spl_cnt;
        int trigger;
+       uint64_t samplerate;
        int *channel_index;
        char **channel_names;
+       gboolean header_done;
        GString **lines;
-       GString *header;
 };
 
 static int init(struct sr_output *o)
@@ -43,13 +44,10 @@ static int init(struct sr_output *o)
        struct context *ctx;
        struct sr_channel *ch;
        GSList *l;
-       GVariant *gvar;
        GHashTableIter iter;
        gpointer key, value;
-       uint64_t samplerate;
        unsigned int i, j;
-       int spl, num_channels;
-       char *samplerate_s;
+       int spl;
 
        if (!o || !o->sdi)
                return SR_ERR_ARG;
@@ -99,27 +97,49 @@ static int init(struct sr_output *o)
                j++;
        }
 
-       ctx->header = g_string_sized_new(512);
-       g_string_printf(ctx->header, "%s\n", PACKAGE_STRING);
+       return SR_OK;
+}
+
+static GString *gen_header(struct sr_output *o)
+{
+       struct context *ctx;
+       GVariant *gvar;
+       GString *header;
+       int num_channels;
+       char *samplerate_s;
+
+       ctx = o->internal;
+       if (ctx->samplerate == 0) {
+               if (sr_config_get(o->sdi->driver, o->sdi, NULL, SR_CONF_SAMPLERATE,
+                               &gvar) == SR_OK) {
+                       ctx->samplerate = g_variant_get_uint64(gvar);
+                       g_variant_unref(gvar);
+               }
+       }
+
+       header = g_string_sized_new(512);
+       g_string_printf(header, "%s\n", PACKAGE_STRING);
        num_channels = g_slist_length(o->sdi->channels);
-       if (sr_config_get(o->sdi->driver, o->sdi, NULL, SR_CONF_SAMPLERATE,
-                       &gvar) == SR_OK) {
-               samplerate = g_variant_get_uint64(gvar);
-               samplerate_s = sr_samplerate_string(samplerate);
-               g_string_append_printf(ctx->header, "Acquisition with %d/%d channels at %s\n",
-                        ctx->num_enabled_channels, num_channels, samplerate_s);
+       g_string_append_printf(header, "Acquisition with %d/%d channels",
+                       ctx->num_enabled_channels, num_channels);
+       if (ctx->samplerate != 0) {
+               samplerate_s = sr_samplerate_string(ctx->samplerate);
+               g_string_append_printf(header, " at %s", samplerate_s);
                g_free(samplerate_s);
-               g_variant_unref(gvar);
        }
+       g_string_append_printf(header, "\n");
 
-       return SR_OK;
+       return header;
 }
 
 static int receive(struct sr_output *o, const struct sr_datafeed_packet *packet,
                GString **out)
 {
+       const struct sr_datafeed_meta *meta;
        const struct sr_datafeed_logic *logic;
+       const struct sr_config *src;
        struct context *ctx;
+       GSList *l;
        int idx, offset;
        uint64_t i, j;
        gchar *p, c;
@@ -131,14 +151,22 @@ static int receive(struct sr_output *o, const struct sr_datafeed_packet *packet,
                return SR_ERR_ARG;
 
        switch (packet->type) {
+       case SR_DF_META:
+               meta = packet->payload;
+               for (l = meta->config; l; l = l->next) {
+                       src = l->data;
+                       if (src->key != SR_CONF_SAMPLERATE)
+                               continue;
+                       ctx->samplerate = g_variant_get_uint64(src->data);
+               }
+               break;
        case SR_DF_TRIGGER:
                ctx->trigger = ctx->spl_cnt;
                break;
        case SR_DF_LOGIC:
-               if (ctx->header) {
-                       /* The header is still here, this must be the first packet. */
-                       *out = ctx->header;
-                       ctx->header = NULL;
+               if (!ctx->header_done) {
+                       *out = gen_header(o);
+                       ctx->header_done = TRUE;
                } else
                        *out = g_string_sized_new(512);
 
@@ -202,8 +230,6 @@ static int cleanup(struct sr_output *o)
        for (i = 0; i < ctx->num_enabled_channels; i++)
                g_string_free(ctx->lines[i], TRUE);
        g_free(ctx->lines);
-       if (ctx->header)
-               g_string_free(ctx->header, TRUE);
        g_free(ctx);
        o->internal = NULL;