X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=output%2Fanalog.c;h=b40439c2bed0c8533d5ba4b5424c33d1d0a8d015;hb=3864648bb6ebf24106898a1296bc106daa55e964;hp=05194daba4b9a2d868bf26537cff198eda13d524;hpb=796a79eb75e35fe47becfbf62a840464efbbe96a;p=libsigrok.git diff --git a/output/analog.c b/output/analog.c index 05194dab..b40439c2 100644 --- a/output/analog.c +++ b/output/analog.c @@ -19,11 +19,19 @@ #include #include +#include #include -#include "config.h" #include "libsigrok.h" #include "libsigrok-internal.h" -#include + +/* 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) struct context { int num_enabled_probes; @@ -31,19 +39,21 @@ struct context { GString *out; }; - static int init(struct sr_output *o) { struct context *ctx; struct sr_probe *probe; GSList *l; - sr_spew("output/analog: initializing"); + sr_spew("Initializing output module."); + if (!o || !o->sdi) return SR_ERR_ARG; - if (!(ctx = g_try_malloc0(sizeof(struct context)))) + if (!(ctx = g_try_malloc0(sizeof(struct context)))) { + sr_err("Output module context malloc failed."); return SR_ERR_MALLOC; + } o->internal = ctx; /* Get the number of probes and their names. */ @@ -91,7 +101,6 @@ 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"); @@ -143,6 +152,32 @@ static void fancyprint(int unit, int mqflags, float value, GString *out) 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, ""); } if ((mqflags & (SR_MQFLAG_AC | SR_MQFLAG_DC)) == (SR_MQFLAG_AC | SR_MQFLAG_DC)) g_string_append_printf(out, " AC+DC"); @@ -151,18 +186,20 @@ static void fancyprint(int unit, int mqflags, float value, GString *out) else if (mqflags & SR_MQFLAG_DC) g_string_append_printf(out, " DC"); g_string_append_c(out, '\n'); - } static GString *receive(struct sr_output *o, const struct sr_dev_inst *sdi, - struct sr_datafeed_packet *packet) + const struct sr_datafeed_packet *packet) { - 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; + if (!o || !o->sdi) return NULL; ctx = o->internal; @@ -179,13 +216,13 @@ static GString *receive(struct sr_output *o, const struct sr_dev_inst *sdi, break; case SR_DF_ANALOG: analog = packet->payload; - fdata = (float *)analog->data; + fdata = (const float *)analog->data; 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(ctx->out, "%s: ", probe->name); fancyprint(analog->unit, analog->mqflags, - fdata[i + j], ctx->out); + fdata[i + p], ctx->out); } } break; @@ -210,7 +247,6 @@ static int cleanup(struct sr_output *o) return SR_OK; } - SR_PRIV struct sr_output_format output_analog = { .id = "analog", .description = "Analog data",