#include "libsigrok.h"
#include "libsigrok-internal.h"
-/* Message logging helpers with driver-specific prefix string. */
-#define DRIVER_LOG_DOMAIN "output/vcd: "
-#define sr_log(l, s, args...) sr_log(l, DRIVER_LOG_DOMAIN s, ## args)
-#define sr_spew(s, args...) sr_spew(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_dbg(s, args...) sr_dbg(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_info(s, args...) sr_info(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args)
+/* Message logging helpers with subsystem-specific prefix string. */
+#define LOG_PREFIX "output/vcd: "
+#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)
struct context {
int num_enabled_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, o->sdi, NULL, SR_CONF_SAMPLERATE,
+ &gvar) == 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 */
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;
for (p = 0; p < ctx->num_enabled_probes; p++) {
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;
+ prevbit = (ctx->prevsample[p / 8] & (((uint8_t) 1) << index)) >> index;
/* VCD only contains deltas/changes of signals. */
if (prevbit == curbit)
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,
};