struct context {
int num_enabled_probes;
- char *probelist[SR_MAX_NUM_PROBES + 1];
- int probeindices[SR_MAX_NUM_PROBES + 1];
+ GArray *probeindices;
GString *header;
uint8_t *prevsample;
int period;
o->internal = ctx;
ctx->num_enabled_probes = 0;
+ ctx->probeindices = g_array_new(FALSE, FALSE, sizeof(int));
for (l = o->sdi->probes; l; l = l->next) {
probe = l->data;
if (!probe->enabled)
continue;
- ctx->probelist[ctx->num_enabled_probes] = probe->name;
- ctx->probeindices[ctx->num_enabled_probes] = probe->index;
+ ctx->probeindices = g_array_append_val(
+ ctx->probeindices, probe->index);
ctx->num_enabled_probes++;
}
if (ctx->num_enabled_probes > 94) {
}
ctx->unitsize = (ctx->num_enabled_probes + 7) / 8;
- ctx->probelist[ctx->num_enabled_probes] = 0;
ctx->header = g_string_sized_new(512);
num_probes = g_slist_length(o->sdi->probes);
g_string_append_printf(ctx->header, "$version %s %s $end\n",
PACKAGE, PACKAGE_VERSION);
- if (o->sdi->driver && sr_dev_has_option(o->sdi, SR_CONF_SAMPLERATE)) {
- o->sdi->driver->config_get(SR_CONF_SAMPLERATE, &gvar, o->sdi);
+ if (sr_config_get(o->sdi->driver, SR_CONF_SAMPLERATE, &gvar,
+ o->sdi) == SR_OK) {
ctx->samplerate = g_variant_get_uint64(gvar);
+ g_variant_unref(gvar);
if (!((samplerate_s = sr_samplerate_string(ctx->samplerate)))) {
g_string_free(ctx->header, TRUE);
g_free(ctx);
- g_variant_unref(gvar);
return SR_ERR;
}
g_string_append_printf(ctx->header, vcd_header_comment,
ctx->num_enabled_probes, num_probes, samplerate_s);
g_free(samplerate_s);
- g_variant_unref(gvar);
}
/* timescale */
g_string_append_printf(ctx->header, "$scope module %s $end\n", PACKAGE);
/* Wires / channels */
- for (i = 0; i < ctx->num_enabled_probes; i++) {
+ for (i = 0, l = o->sdi->probes; l; l = l->next, i++) {
+ probe = l->data;
+ if (!probe->enabled)
+ continue;
g_string_append_printf(ctx->header, "$var wire 1 %c %s $end\n",
- (char)('!' + i), ctx->probelist[i]);
+ (char)('!' + i), probe->name);
}
g_string_append(ctx->header, "$upscope $end\n"
return SR_OK;
}
-static GString *receive(struct sr_output *o, const struct sr_dev_inst *sdi,
- const struct sr_datafeed_packet *packet)
+static int receive(struct sr_output *o, const struct sr_dev_inst *sdi,
+ const struct sr_datafeed_packet *packet, GString **out)
{
const struct sr_datafeed_logic *logic;
struct context *ctx;
- GString *text;
unsigned int i;
int p, curbit, prevbit, index;
uint8_t *sample;
(void)sdi;
+ *out = NULL;
if (!o || !o->internal)
- return NULL;
+ return SR_ERR_ARG;
ctx = o->internal;
if (packet->type == SR_DF_END) {
- text = g_string_sized_new(16);
- g_string_printf(text, "$dumpoff\n$end\n");
- return text;
+ *out = g_string_new("$dumpoff\n$end\n");
+ return SR_OK;
} else if (packet->type != SR_DF_LOGIC)
- return NULL;
+ return SR_OK;
if (ctx->header) {
/* The header is still here, this must be the first packet. */
- text = ctx->header;
+ *out = ctx->header;
ctx->header = NULL;
} else {
- text = g_string_sized_new(512);
+ *out = g_string_sized_new(512);
}
logic = packet->payload;
sample = logic->data + i;
for (p = 0; p < ctx->num_enabled_probes; p++) {
- index = ctx->probeindices[p % 8];
+ index = g_array_index(ctx->probeindices, int, p);
curbit = (sample[p / 8] & (((uint8_t) 1) << index)) >> index;
prevbit = (ctx->prevsample[p / 8] & (((uint64_t) 1) << index)) >> index;
continue;
/* Output which signal changed to which value. */
- g_string_append_printf(text, "#%" PRIu64 "\n%i%c\n",
+ g_string_append_printf(*out, "#%" PRIu64 "\n%i%c\n",
(uint64_t)(((float)samplecount / ctx->samplerate)
* ctx->period), curbit, (char)('!' + p));
}
memcpy(ctx->prevsample, sample, ctx->unitsize);
}
- return text;
+ return SR_OK;
}
static int cleanup(struct sr_output *o)
.description = "Value Change Dump (VCD)",
.df_type = SR_DF_LOGIC,
.init = init,
- .recv = receive,
+ .receive = receive,
.cleanup = cleanup,
};