struct context {
int num_enabled_probes;
- 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->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) {
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,
};