X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=output%2Fanalog.c;h=7090d0feb42f49fd7134e17f47fcfeab9e5da3b0;hb=ba6383f85574e4e374a141ca88979db86fe2893d;hp=d87e22f1afcd4740d6b3f7ae91aac9679c37a999;hpb=96b3b3d56834f7c07a4760cfa3444b516c819de3;p=libsigrok.git diff --git a/output/analog.c b/output/analog.c index d87e22f1..7090d0fe 100644 --- a/output/analog.c +++ b/output/analog.c @@ -20,7 +20,6 @@ #include #include #include -#include "config.h" #include "libsigrok.h" #include "libsigrok-internal.h" #include @@ -31,7 +30,6 @@ struct context { GString *out; }; - static int init(struct sr_output *o) { struct context *ctx; @@ -42,8 +40,10 @@ static int init(struct sr_output *o) 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/analog: Context malloc failed."); return SR_ERR_MALLOC; + } o->internal = ctx; /* Get the number of probes and their names. */ @@ -63,21 +63,27 @@ static int init(struct sr_output *o) static void si_printf(float value, GString *out, char *unitstr) { + float v; - if (value > 1000000000L) - g_string_append_printf(out, "%f G%s", value / 1000000000L, unitstr); - else if (value > 1000000) - g_string_append_printf(out, "%f M%s", value / 1000000, unitstr); - else if (value > 1000) - g_string_append_printf(out, "%f k%s", value / 1000, unitstr); - else if (value < 0.000000000001) - g_string_append_printf(out, "%f p%s", value * 1000000000000, unitstr); - else if (value < 0.000000001) - g_string_append_printf(out, "%f n%s", value * 1000000000, unitstr); - else if (value < 0.000001) - g_string_append_printf(out, "%f u%s", value * 1000000, unitstr); - else if (value < 0.001) - g_string_append_printf(out, "%f m%s", value * 1000, unitstr); + if (signbit(value)) + v = -(value); + else + v = value; + + if (v < 1e-12 || v > 1e+12) + g_string_append_printf(out, "%f %s", value, unitstr); + else if (v > 1e+9) + g_string_append_printf(out, "%f G%s", value / 1e+9, unitstr); + else if (v > 1e+6) + g_string_append_printf(out, "%f M%s", value / 1e+6, unitstr); + else if (v > 1e+3) + g_string_append_printf(out, "%f k%s", value / 1e+3, unitstr); + else if (v < 1e-9) + g_string_append_printf(out, "%f n%s", value * 1e+9, unitstr); + else if (v < 1e-6) + g_string_append_printf(out, "%f u%s", value * 1e+6, unitstr); + else if (v < 1e-3) + g_string_append_printf(out, "%f m%s", value * 1e+3, unitstr); else g_string_append_printf(out, "%f %s", value, unitstr); @@ -131,8 +137,39 @@ static void fancyprint(int unit, int mqflags, float value, GString *out) 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; + default: + si_printf(value, out, ""); } - if (mqflags & SR_MQFLAG_AC) + 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) g_string_append_printf(out, " AC"); else if (mqflags & SR_MQFLAG_DC) g_string_append_printf(out, " DC"); @@ -140,7 +177,7 @@ static void fancyprint(int unit, int mqflags, float value, GString *out) } -static GString *recv(struct sr_output *o, const struct sr_dev_inst *sdi, +static GString *receive(struct sr_output *o, const struct sr_dev_inst *sdi, struct sr_datafeed_packet *packet) { struct sr_datafeed_analog *analog; @@ -148,6 +185,7 @@ static GString *recv(struct sr_output *o, const struct sr_dev_inst *sdi, float *fdata; int i, j; + (void)sdi; if (!o || !o->sdi) return NULL; ctx = o->internal; @@ -201,6 +239,6 @@ SR_PRIV struct sr_output_format output_analog = { .description = "Analog data", .df_type = SR_DF_ANALOG, .init = init, - .recv = recv, + .recv = receive, .cleanup = cleanup };