From: Bert Vermeulen Date: Mon, 28 Apr 2014 21:54:47 +0000 (-0700) Subject: output/bits: Support getting samplerate from meta packets. X-Git-Tag: libsigrok-0.3.0~61 X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=35159a6b28adfbed14d10b745668bee47b5b8c1a output/bits: Support getting samplerate from meta packets. --- diff --git a/output/bits.c b/output/bits.c index fa48e834..b44f1057 100644 --- a/output/bits.c +++ b/output/bits.c @@ -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;