X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=output%2Fanalog.c;h=7437663924f86d1688fc190f134fe2fa9aee7e80;hb=71f1302b4b4b712149303d235876146e8d1d9af5;hp=448b112efce12578c508980412a83d16c1b433b1;hpb=7249d7833b69c1d753b18112891870d8aeda3d69;p=libsigrok.git diff --git a/output/analog.c b/output/analog.c index 448b112e..74376639 100644 --- a/output/analog.c +++ b/output/analog.c @@ -1,5 +1,5 @@ /* - * This file is part of the sigrok project. + * This file is part of the libsigrok project. * * Copyright (C) 2012 Bert Vermeulen * @@ -24,19 +24,18 @@ #include "libsigrok.h" #include "libsigrok-internal.h" -/* Message logging helpers with driver-specific prefix string. */ -#define DRIVER_LOG_DOMAIN "output/analog: " -#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/analog: " +#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; GPtrArray *probelist; - GString *out; }; static int init(struct sr_output *o) @@ -66,8 +65,6 @@ static int init(struct sr_output *o) ctx->num_enabled_probes++; } - ctx->out = g_string_sized_new(512); - return SR_OK; } @@ -102,131 +99,147 @@ static void si_printf(float value, GString *out, char *unitstr) static void fancyprint(int unit, int mqflags, float value, GString *out) { switch (unit) { - case SR_UNIT_VOLT: - si_printf(value, out, "V"); - break; - case SR_UNIT_AMPERE: - si_printf(value, out, "A"); - break; - case SR_UNIT_OHM: - si_printf(value, out, ""); - g_string_append_unichar(out, 0x2126); - break; - case SR_UNIT_FARAD: - si_printf(value, out, "F"); - break; - case SR_UNIT_KELVIN: - si_printf(value, out, "K"); - break; - case SR_UNIT_CELSIUS: - si_printf(value, out, ""); - g_string_append_unichar(out, 0x00b0); - g_string_append_c(out, 'C'); - break; - case SR_UNIT_FAHRENHEIT: - si_printf(value, out, ""); - g_string_append_unichar(out, 0x00b0); - g_string_append_c(out, 'F'); - break; - case SR_UNIT_HERTZ: - si_printf(value, out, "Hz"); - break; - case SR_UNIT_PERCENTAGE: - g_string_append_printf(out, "%f%%", value); - break; - case SR_UNIT_BOOLEAN: - if (value > 0) - g_string_append_printf(out, "TRUE"); - else - g_string_append_printf(out, "FALSE"); - break; - case SR_UNIT_SECOND: - si_printf(value, out, "s"); - break; - case SR_UNIT_SIEMENS: - si_printf(value, out, "S"); - break; - case SR_UNIT_DECIBEL_MW: - si_printf(value, out, "dBu"); - break; - case SR_UNIT_DECIBEL_VOLT: - si_printf(value, out, "dBV"); - break; - case SR_UNIT_DECIBEL_SPL: - if (mqflags & SR_MQFLAG_SPL_FREQ_WEIGHT_A) - si_printf(value, out, "dB(A)"); - else if (mqflags & SR_MQFLAG_SPL_FREQ_WEIGHT_C) - si_printf(value, out, "dB(C)"); - else if (mqflags & SR_MQFLAG_SPL_FREQ_WEIGHT_Z) - si_printf(value, out, "dB(Z)"); - else - /* No frequency weighting, or non-standard "flat" */ - si_printf(value, out, "dB(SPL)"); - if (mqflags & SR_MQFLAG_SPL_TIME_WEIGHT_S) - g_string_append(out, " S"); - else if (mqflags & SR_MQFLAG_SPL_TIME_WEIGHT_F) - g_string_append(out, " F"); - if (mqflags & SR_MQFLAG_SPL_LAT) - g_string_append(out, " LAT"); - else if (mqflags & SR_MQFLAG_SPL_PCT_OVER_ALARM) - /* Not a standard function for SLMs, so this is - * a made-up notation. */ - g_string_append(out, " %oA"); - break; - case SR_UNIT_CONCENTRATION: - g_string_append_printf(out, "%f ppm", value * 1000000); - break; - default: - si_printf(value, out, ""); + case SR_UNIT_VOLT: + si_printf(value, out, "V"); + break; + case SR_UNIT_AMPERE: + si_printf(value, out, "A"); + break; + case SR_UNIT_OHM: + si_printf(value, out, ""); + g_string_append_unichar(out, 0x2126); + break; + case SR_UNIT_FARAD: + si_printf(value, out, "F"); + break; + case SR_UNIT_KELVIN: + si_printf(value, out, "K"); + break; + case SR_UNIT_CELSIUS: + si_printf(value, out, ""); + g_string_append_unichar(out, 0x00b0); + g_string_append_c(out, 'C'); + break; + case SR_UNIT_FAHRENHEIT: + si_printf(value, out, ""); + g_string_append_unichar(out, 0x00b0); + g_string_append_c(out, 'F'); + break; + case SR_UNIT_HERTZ: + si_printf(value, out, "Hz"); + break; + case SR_UNIT_PERCENTAGE: + g_string_append_printf(out, "%f%%", value); + break; + case SR_UNIT_BOOLEAN: + if (value > 0) + g_string_append_printf(out, "TRUE"); + else + g_string_append_printf(out, "FALSE"); + break; + case SR_UNIT_SECOND: + si_printf(value, out, "s"); + break; + case SR_UNIT_SIEMENS: + si_printf(value, out, "S"); + break; + case SR_UNIT_DECIBEL_MW: + si_printf(value, out, "dBu"); + break; + case SR_UNIT_DECIBEL_VOLT: + si_printf(value, out, "dBV"); + break; + case SR_UNIT_DECIBEL_SPL: + if (mqflags & SR_MQFLAG_SPL_FREQ_WEIGHT_A) + si_printf(value, out, "dB(A)"); + else if (mqflags & SR_MQFLAG_SPL_FREQ_WEIGHT_C) + si_printf(value, out, "dB(C)"); + else if (mqflags & SR_MQFLAG_SPL_FREQ_WEIGHT_Z) + si_printf(value, out, "dB(Z)"); + else + /* No frequency weighting, or non-standard "flat" */ + si_printf(value, out, "dB(SPL)"); + if (mqflags & SR_MQFLAG_SPL_TIME_WEIGHT_S) + g_string_append(out, " S"); + else if (mqflags & SR_MQFLAG_SPL_TIME_WEIGHT_F) + g_string_append(out, " F"); + if (mqflags & SR_MQFLAG_SPL_LAT) + g_string_append(out, " LAT"); + else if (mqflags & SR_MQFLAG_SPL_PCT_OVER_ALARM) + /* Not a standard function for SLMs, so this is + * a made-up notation. */ + g_string_append(out, " %oA"); + break; + case SR_UNIT_CONCENTRATION: + g_string_append_printf(out, "%f ppm", value * 1000000); + break; + case SR_UNIT_REVOLUTIONS_PER_MINUTE: + si_printf(value, out, "RPM"); + break; + default: + si_printf(value, out, ""); + break; } - if ((mqflags & (SR_MQFLAG_AC | SR_MQFLAG_DC)) == (SR_MQFLAG_AC | SR_MQFLAG_DC)) - g_string_append_printf(out, " AC+DC"); - else if (mqflags & SR_MQFLAG_AC) + + if (mqflags & SR_MQFLAG_AC) g_string_append_printf(out, " AC"); - else if (mqflags & SR_MQFLAG_DC) + if (mqflags & SR_MQFLAG_DC) g_string_append_printf(out, " DC"); + if (mqflags & SR_MQFLAG_RMS) + g_string_append_printf(out, " RMS"); + if (mqflags & SR_MQFLAG_DIODE) + g_string_append_printf(out, " DIODE"); + if (mqflags & SR_MQFLAG_HOLD) + g_string_append_printf(out, " HOLD"); + if (mqflags & SR_MQFLAG_MAX) + g_string_append_printf(out, " MAX"); + if (mqflags & SR_MQFLAG_MIN) + g_string_append_printf(out, " MIN"); + if (mqflags & SR_MQFLAG_AUTORANGE) + g_string_append_printf(out, " AUTO"); + if (mqflags & SR_MQFLAG_RELATIVE) + g_string_append_printf(out, " REL"); g_string_append_c(out, '\n'); } -static GString *receive(struct sr_output *o, const struct sr_dev_inst *sdi, - 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) { - struct sr_datafeed_analog *analog; - struct context *ctx; - float *fdata; - int i, j; + const struct sr_datafeed_analog *analog; + struct sr_probe *probe; + GSList *l; + const float *fdata; + int i, p; (void)sdi; + *out = NULL; if (!o || !o->sdi) - return NULL; - ctx = o->internal; + return SR_ERR_ARG; - g_string_set_size(ctx->out, 0); switch (packet->type) { - case SR_DF_HEADER: - break; case SR_DF_FRAME_BEGIN: - g_string_append_printf(ctx->out, "FRAME-BEGIN\n"); + *out = g_string_new("FRAME-BEGIN\n"); break; case SR_DF_FRAME_END: - g_string_append_printf(ctx->out, "FRAME-END\n"); + *out = g_string_new("FRAME-END\n"); break; case SR_DF_ANALOG: analog = packet->payload; - fdata = (float *)analog->data; + fdata = (const float *)analog->data; + *out = g_string_sized_new(512); for (i = 0; i < analog->num_samples; i++) { - for (j = 0; j < ctx->num_enabled_probes; j++) { - g_string_append_printf(ctx->out, "%s: ", - (char *)g_ptr_array_index(ctx->probelist, j)); + for (l = analog->probes, p = 0; l; l = l->next, p++) { + probe = l->data; + g_string_append_printf(*out, "%s: ", probe->name); fancyprint(analog->unit, analog->mqflags, - fdata[i + j], ctx->out); + fdata[i + p], *out); } } break; } - return ctx->out; + return SR_OK; } static int cleanup(struct sr_output *o) @@ -238,7 +251,6 @@ static int cleanup(struct sr_output *o) ctx = o->internal; g_ptr_array_free(ctx->probelist, 1); - g_string_free(ctx->out, 1); g_free(ctx); o->internal = NULL; @@ -250,6 +262,6 @@ SR_PRIV struct sr_output_format output_analog = { .description = "Analog data", .df_type = SR_DF_ANALOG, .init = init, - .recv = receive, + .receive = receive, .cleanup = cleanup };