X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=output%2Ftext%2Ftext.c;h=e32e843d27a8b4d94dd78cc34434345ba0993690;hp=9be3397400f41c56c384c9bc8874d23337946ab0;hb=ba7dd8bbb8168cba432a844259a3e239aa5f36d7;hpb=d3c74a6fb05118e32ad421443251b7b3288918f9 diff --git a/output/text/text.c b/output/text/text.c index 9be33974..e32e843d 100644 --- a/output/text/text.c +++ b/output/text/text.c @@ -27,40 +27,33 @@ #include "libsigrok-internal.h" #include "text.h" -/* Message logging helpers with subsystem-specific prefix string. */ -#define LOG_PREFIX "output/text: " -#define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args) -#define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args) -#define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args) -#define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args) -#define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args) -#define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args) +#define LOG_PREFIX "output/text" SR_PRIV void flush_linebufs(struct context *ctx, uint8_t *outbuf) { - static int max_probename_len = 0; + static int max_channelname_len = 0; int len, i; GSList *l; - char *probe_name; + char *channel_name; if (ctx->linebuf[0] == 0) return; - if (max_probename_len == 0) { + if (max_channelname_len == 0) { /* First time through... */ - for (l = ctx->probenames; l; l = l->next) { - probe_name = l->data; - len = strlen(probe_name); - if (len > max_probename_len) - max_probename_len = len; + for (l = ctx->channelnames; l; l = l->next) { + channel_name = l->data; + len = strlen(channel_name); + if (len > max_channelname_len) + max_channelname_len = len; } } - for (i = 0, l = ctx->probenames; l; l = l->next, i++) { - probe_name = l->data; + for (i = 0, l = ctx->channelnames; l; l = l->next, i++) { + channel_name = l->data; sprintf((char *)outbuf + strlen((const char *)outbuf), - "%*s:%s\n", max_probename_len, - probe_name, ctx->linebuf + i * ctx->linebuf_len); + "%*s:%s\n", max_channelname_len, + channel_name, ctx->linebuf + i * ctx->linebuf_len); } /* Mark trigger with a ^ character. */ @@ -81,11 +74,11 @@ SR_PRIV void flush_linebufs(struct context *ctx, uint8_t *outbuf) SR_PRIV int init(struct sr_output *o, int default_spl, enum outputmode mode) { struct context *ctx; - struct sr_probe *probe; + struct sr_channel *ch; GSList *l; GVariant *gvar; uint64_t samplerate; - int num_probes, ret; + int num_channels, ret; char *samplerate_s; if (!(ctx = g_try_malloc0(sizeof(struct context)))) { @@ -94,18 +87,20 @@ SR_PRIV int init(struct sr_output *o, int default_spl, enum outputmode mode) } o->internal = ctx; - ctx->num_enabled_probes = 0; - ctx->probenames = NULL; + ctx->num_enabled_channels = 0; + ctx->channelnames = NULL; - for (l = o->sdi->probes; l; l = l->next) { - probe = l->data; - if (!probe->enabled) + for (l = o->sdi->channels; l; l = l->next) { + ch = l->data; + if (ch->type != SR_PROBE_LOGIC) continue; - ctx->probenames = g_slist_append(ctx->probenames, probe->name); - ctx->num_enabled_probes++; + if (!ch->enabled) + continue; + ctx->channelnames = g_slist_append(ctx->channelnames, ch->name); + ctx->num_enabled_channels++; } - ctx->unitsize = (ctx->num_enabled_probes + 7) / 8; + ctx->unitsize = (ctx->num_enabled_channels + 7) / 8; ctx->line_offset = 0; ctx->spl_cnt = 0; ctx->mark_trigger = -1; @@ -128,7 +123,7 @@ SR_PRIV int init(struct sr_output *o, int default_spl, enum outputmode mode) } snprintf(ctx->header, 511, "%s\n", PACKAGE_STRING); - num_probes = g_slist_length(o->sdi->probes); + 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); @@ -139,25 +134,25 @@ SR_PRIV int init(struct sr_output *o, int default_spl, enum outputmode mode) } snprintf(ctx->header + strlen(ctx->header), 511 - strlen(ctx->header), - "Acquisition with %d/%d probes at %s\n", - ctx->num_enabled_probes, num_probes, samplerate_s); + "Acquisition with %d/%d channels at %s\n", + ctx->num_enabled_channels, num_channels, samplerate_s); g_free(samplerate_s); } ctx->linebuf_len = ctx->samples_per_line * 2 + 4; - if (!(ctx->linebuf = g_try_malloc0(num_probes * ctx->linebuf_len))) { + if (!(ctx->linebuf = g_try_malloc0(num_channels * ctx->linebuf_len))) { sr_err("%s: ctx->linebuf malloc failed", __func__); ret = SR_ERR_MALLOC; goto err; } - if (!(ctx->linevalues = g_try_malloc0(num_probes))) { + if (!(ctx->linevalues = g_try_malloc0(num_channels))) { sr_err("%s: ctx->linevalues malloc failed", __func__); ret = SR_ERR_MALLOC; } if (mode == MODE_ASCII && - !(ctx->prevsample = g_try_malloc0(num_probes / 8))) { + !(ctx->prevsample = g_try_malloc0(num_channels / 8))) { sr_err("%s: ctx->prevsample malloc failed", __func__); ret = SR_ERR_MALLOC; } @@ -171,6 +166,31 @@ err: return ret; } +SR_PRIV int text_cleanup(struct sr_output *o) +{ + struct context *ctx; + + if (!o) + return SR_ERR_ARG; + + ctx = o->internal; + + g_free(ctx->header); + g_free(ctx->linebuf); + g_free(ctx->linevalues); + + if (ctx->prevsample) + g_free(ctx->prevsample); + + g_slist_free(ctx->channelnames); + + g_free(ctx); + + o->internal = NULL; + + return SR_OK; +} + SR_PRIV int event(struct sr_output *o, int event_type, uint8_t **data_out, uint64_t *length_out) { @@ -186,7 +206,7 @@ SR_PRIV int event(struct sr_output *o, int event_type, uint8_t **data_out, *length_out = 0; break; case SR_DF_END: - outsize = ctx->num_enabled_probes + outsize = ctx->num_enabled_channels * (ctx->samples_per_line + 20) + 512; if (!(outbuf = g_try_malloc0(outsize))) { sr_err("%s: outbuf malloc failed", __func__); @@ -195,8 +215,6 @@ SR_PRIV int event(struct sr_output *o, int event_type, uint8_t **data_out, flush_linebufs(ctx, outbuf); *data_out = outbuf; *length_out = strlen((const char *)outbuf); - g_free(o->internal); - o->internal = NULL; break; default: *data_out = NULL;