X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=output%2Fanalog.c;h=9029f099d3f9e51ddb60d0ea2da24ef2dc31b67f;hb=af36b8096942a704afa7e858fcd8fc8e15b92e09;hp=58c37dba6ae933d7f5f125744f5a185d01823ac1;hpb=7c1d391c8b33bf76f7c6617fe9d5174e16a04f95;p=libsigrok.git diff --git a/output/analog.c b/output/analog.c index 58c37dba..9029f099 100644 --- a/output/analog.c +++ b/output/analog.c @@ -1,7 +1,7 @@ /* * This file is part of the sigrok project. * - * Copyright (C) 2010 Bert Vermeulen + * Copyright (C) 2010-2012 Bert Vermeulen * Copyright (C) 2011 HÃ¥vard Espeland * Copyright (C) 2011 Daniel Ribeiro * @@ -41,8 +41,8 @@ struct context { unsigned int unitsize; int line_offset; int linebuf_len; - char *probelist[65]; - char *linebuf; + char *probelist[SR_MAX_NUM_PROBES + 1]; + uint8_t *linebuf; int spl_cnt; uint8_t *linevalues; char *header; @@ -51,7 +51,7 @@ struct context { enum outputmode mode; }; -static void flush_linebufs(struct context *ctx, char *outbuf) +static void flush_linebufs(struct context *ctx, uint8_t *outbuf) { static int max_probename_len = 0; int len, i; @@ -97,13 +97,15 @@ static int init(struct sr_output *o, int default_spl, enum outputmode mode) int num_probes; char *samplerate_s; - if (!(ctx = calloc(1, sizeof(struct context)))) + if (!(ctx = g_try_malloc0(sizeof(struct context)))) { + sr_err("analog out: %s: ctx malloc failed", __func__); return SR_ERR_MALLOC; + } o->internal = ctx; ctx->num_enabled_probes = 0; - for (l = o->device->probes; l; l = l->next) { + for (l = o->dev->probes; l; l = l->next) { probe = l->data; if (!probe->enabled) continue; @@ -125,49 +127,53 @@ static int init(struct sr_output *o, int default_spl, enum outputmode mode) } else ctx->samples_per_line = default_spl; - if (!(ctx->header = malloc(512))) { - free(ctx); + if (!(ctx->header = g_try_malloc(512))) { + g_free(ctx); + sr_err("analog out: %s: ctx->header malloc failed", __func__); return SR_ERR_MALLOC; } snprintf(ctx->header, 511, "%s\n", PACKAGE_STRING); - num_probes = g_slist_length(o->device->probes); - if (o->device->plugin && sr_device_has_hwcap(o->device, SR_HWCAP_SAMPLERATE)) { - samplerate = *((uint64_t *) o->device->plugin->get_device_info( - o->device->plugin_index, SR_DI_CUR_SAMPLERATE)); + num_probes = g_slist_length(o->dev->probes); + if (o->dev->driver && sr_dev_has_hwcap(o->dev, SR_HWCAP_SAMPLERATE)) { + samplerate = *((uint64_t *) o->dev->driver->dev_info_get( + o->dev->driver_index, SR_DI_CUR_SAMPLERATE)); if (!(samplerate_s = sr_samplerate_string(samplerate))) { - free(ctx->header); - free(ctx); + g_free(ctx->header); + g_free(ctx); return SR_ERR; } 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); - free(samplerate_s); + g_free(samplerate_s); } ctx->linebuf_len = ctx->samples_per_line * 2 + 4; - if (!(ctx->linebuf = calloc(1, num_probes * ctx->linebuf_len))) { - free(ctx->header); - free(ctx); + if (!(ctx->linebuf = g_try_malloc0(num_probes * ctx->linebuf_len))) { + g_free(ctx->header); + g_free(ctx); + sr_err("analog out: %s: ctx->linebuf malloc failed", __func__); return SR_ERR_MALLOC; } - if (!(ctx->linevalues = calloc(1, num_probes))) { - free(ctx->header); - free(ctx); + if (!(ctx->linevalues = g_try_malloc0(num_probes))) { + g_free(ctx->header); + g_free(ctx); + sr_err("analog out: %s: ctx->linevalues malloc failed", + __func__); return SR_ERR_MALLOC; } return SR_OK; } -static int event(struct sr_output *o, int event_type, char **data_out, +static int event(struct sr_output *o, int event_type, uint8_t **data_out, uint64_t *length_out) { struct context *ctx; int outsize; - char *outbuf; + uint8_t *outbuf; ctx = o->internal; switch (event_type) { @@ -179,12 +185,15 @@ static int event(struct sr_output *o, int event_type, char **data_out, case SR_DF_END: outsize = ctx->num_enabled_probes * (ctx->samples_per_line + 20) + 512; - if (!(outbuf = calloc(1, outsize))) + if (!(outbuf = g_try_malloc0(outsize))) { + sr_err("analog out: %s: outbuf malloc failed", + __func__); return SR_ERR_MALLOC; + } flush_linebufs(ctx, outbuf); *data_out = outbuf; *length_out = strlen(outbuf); - free(o->internal); + g_free(o->internal); o->internal = NULL; break; default: @@ -201,14 +210,15 @@ static int init_bits(struct sr_output *o) return init(o, DEFAULT_BPL_BITS, MODE_BITS); } -static int data_bits(struct sr_output *o, const char *data_in, - uint64_t length_in, char **data_out, uint64_t *length_out) +static int data_bits(struct sr_output *o, const uint8_t *data_in, + uint64_t length_in, uint8_t **data_out, + uint64_t *length_out) { struct context *ctx; unsigned int outsize, offset, p; int max_linelen; struct sr_analog_sample *sample; - char *outbuf, c; + uint8_t *outbuf, c; ctx = o->internal; max_linelen = SR_MAX_PROBENAME_LEN + 3 + ctx->samples_per_line @@ -220,14 +230,16 @@ static int data_bits(struct sr_output *o, const char *data_in, outsize = 512 + (1 + (length_in / ctx->unitsize) / ctx->samples_per_line) * (ctx->num_enabled_probes * max_linelen); - if (!(outbuf = calloc(1, outsize + 1))) + if (!(outbuf = g_try_malloc0(outsize + 1))) { + sr_err("analog out: %s: outbuf malloc failed", __func__); return SR_ERR_MALLOC; + } outbuf[0] = '\0'; if (ctx->header) { /* The header is still here, this must be the first packet. */ strncpy(outbuf, ctx->header, outsize); - free(ctx->header); + g_free(ctx->header); ctx->header = NULL; /* Ensure first transition. */ @@ -273,7 +285,8 @@ static int data_bits(struct sr_output *o, const char *data_in, } } } else { - sr_info("short buffer (length_in=%" PRIu64 ")", length_in); + sr_info("analog out: short buffer (length_in=%" PRIu64 ")", + length_in); } *data_out = outbuf; @@ -287,14 +300,15 @@ static int init_hex(struct sr_output *o) return init(o, DEFAULT_BPL_HEX, MODE_HEX); } -static int data_hex(struct sr_output *o, const char *data_in, - uint64_t length_in, char **data_out, uint64_t *length_out) +static int data_hex(struct sr_output *o, const uint8_t *data_in, + uint64_t length_in, uint8_t **data_out, + uint64_t *length_out) { struct context *ctx; unsigned int outsize, offset, p; int max_linelen; uint64_t sample; - char *outbuf; + uint8_t *outbuf; ctx = o->internal; max_linelen = SR_MAX_PROBENAME_LEN + 3 + ctx->samples_per_line @@ -302,14 +316,16 @@ static int data_hex(struct sr_output *o, const char *data_in, outsize = length_in / ctx->unitsize * ctx->num_enabled_probes / ctx->samples_per_line * max_linelen + 512; - if (!(outbuf = calloc(1, outsize + 1))) + if (!(outbuf = g_try_malloc0(outsize + 1))) { + sr_err("analog out: %s: outbuf malloc failed", __func__); return SR_ERR_MALLOC; + } outbuf[0] = '\0'; if (ctx->header) { /* The header is still here, this must be the first packet. */ strncpy(outbuf, ctx->header, outsize); - free(ctx->header); + g_free(ctx->header); ctx->header = NULL; } @@ -352,14 +368,15 @@ static int init_ascii(struct sr_output *o) return init(o, DEFAULT_BPL_ASCII, MODE_ASCII); } -static int data_ascii(struct sr_output *o, const char *data_in, - uint64_t length_in, char **data_out, uint64_t *length_out) +static int data_ascii(struct sr_output *o, const uint8_t *data_in, + uint64_t length_in, uint8_t **data_out, + uint64_t *length_out) { struct context *ctx; unsigned int outsize, offset, p; int max_linelen; uint64_t sample; - char *outbuf; + uint8_t *outbuf; ctx = o->internal; max_linelen = SR_MAX_PROBENAME_LEN + 3 + ctx->samples_per_line @@ -371,14 +388,16 @@ static int data_ascii(struct sr_output *o, const char *data_in, outsize = 512 + (1 + (length_in / ctx->unitsize) / ctx->samples_per_line) * (ctx->num_enabled_probes * max_linelen); - if (!(outbuf = calloc(1, outsize + 1))) + if (!(outbuf = g_try_malloc0(outsize + 1))) { + sr_err("analog out: %s: outbuf malloc failed", __func__); return SR_ERR_MALLOC; + } outbuf[0] = '\0'; if (ctx->header) { /* The header is still here, this must be the first packet. */ strncpy(outbuf, ctx->header, outsize); - free(ctx->header); + g_free(ctx->header); ctx->header = NULL; } @@ -427,7 +446,8 @@ static int data_ascii(struct sr_output *o, const char *data_in, ctx->prevsample = sample; } } else { - sr_info("short buffer (length_in=%" PRIu64 ")", length_in); + sr_info("analog out: short buffer (length_in=%" PRIu64 ")", + length_in); } *data_out = outbuf; @@ -439,7 +459,7 @@ static int data_ascii(struct sr_output *o, const char *data_in, SR_PRIV struct sr_output_format output_analog_bits = { .id = "analog_bits", - .description = "Bits (takes argument, default 64)", + .description = "Bits", .df_type = SR_DF_ANALOG, .init = init_bits, .data = data_bits, @@ -449,7 +469,7 @@ SR_PRIV struct sr_output_format output_analog_bits = { #if 0 struct sr_output_format output_analog_hex = { .id = "analog_hex", - .description = "Hexadecimal (takes argument, default 192)", + .description = "Hexadecimal", .df_type = SR_DF_ANALOG, .init = init_hex, .data = data_hex, @@ -458,7 +478,7 @@ struct sr_output_format output_analog_hex = { struct sr_output_format output_analog_ascii = { .id = "analog_ascii", - .description = "ASCII (takes argument, default 74)", + .description = "ASCII", .df_type = SR_DF_ANALOG, .init = init_ascii, .data = data_ascii,