X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Foutput%2Fanalog.c;h=4018ec888659f797231f48fbca4d97eb2df1be62;hb=98654c99daf85bd2a81a9c87f517e800c31e34f2;hp=77cf8b1074755f0888417d221a3e7e5dc10ee35c;hpb=a24da9a81358644265465325d12579cd8aa34ba5;p=libsigrok.git diff --git a/src/output/analog.c b/src/output/analog.c index 77cf8b10..4018ec88 100644 --- a/src/output/analog.c +++ b/src/output/analog.c @@ -17,11 +17,12 @@ * along with this program. If not, see . */ +#include #include #include #include #include -#include "libsigrok.h" +#include #include "libsigrok-internal.h" #define LOG_PREFIX "output/analog" @@ -47,7 +48,7 @@ static int init(struct sr_output *o, GHashTable *options) if (!o || !o->sdi) return SR_ERR_ARG; - o->priv = ctx = g_try_malloc0(sizeof(struct context)); + o->priv = ctx = g_malloc0(sizeof(struct context)); s = g_variant_get_string(g_hash_table_lookup(options, "digits"), NULL); if (!strcmp(s, "all")) ctx->digits = DIGITS_ALL; @@ -95,6 +96,7 @@ static void si_printf(float value, GString *out, char *unitstr) } +/* Please use the same order as in enum sr_unit (libsigrok.h). */ static void fancyprint(int unit, int mqflags, float value, GString *out) { switch (unit) { @@ -111,9 +113,6 @@ static void fancyprint(int unit, int mqflags, float value, GString *out) case SR_UNIT_FARAD: si_printf(value, out, "F"); break; - case SR_UNIT_HENRY: - si_printf(value, out, "H"); - break; case SR_UNIT_KELVIN: si_printf(value, out, "K"); break; @@ -151,6 +150,9 @@ 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_UNITLESS: + si_printf(value, out, ""); + break; case SR_UNIT_DECIBEL_SPL: if (mqflags & SR_MQFLAG_SPL_FREQ_WEIGHT_A) si_printf(value, out, "dB(A)"); @@ -173,7 +175,7 @@ static void fancyprint(int unit, int mqflags, float value, GString *out) g_string_append(out, " %oA"); break; case SR_UNIT_CONCENTRATION: - g_string_append_printf(out, "%f ppm", value * 1000000); + g_string_append_printf(out, "%f ppm", value * (1000 * 1000)); break; case SR_UNIT_REVOLUTIONS_PER_MINUTE: si_printf(value, out, "RPM"); @@ -200,11 +202,48 @@ static void fancyprint(int unit, int mqflags, float value, GString *out) si_printf(value, out, ""); g_string_append_unichar(out, 0x00b0); break; + case SR_UNIT_HENRY: + si_printf(value, out, "H"); + break; + case SR_UNIT_GRAM: + si_printf(value, out, "g"); + break; + case SR_UNIT_CARAT: + si_printf(value, out, "ct"); + break; + case SR_UNIT_OUNCE: + si_printf(value, out, "oz"); + break; + case SR_UNIT_TROY_OUNCE: + si_printf(value, out, "oz t"); + break; + case SR_UNIT_POUND: + si_printf(value, out, "lb"); + break; + case SR_UNIT_PENNYWEIGHT: + si_printf(value, out, "dwt"); + break; + case SR_UNIT_GRAIN: + si_printf(value, out, "gr"); + break; + case SR_UNIT_TAEL: + si_printf(value, out, "tael"); + break; + case SR_UNIT_MOMME: + si_printf(value, out, "momme"); + break; + case SR_UNIT_TOLA: + si_printf(value, out, "tola"); + break; + case SR_UNIT_PIECE: + si_printf(value, out, "pcs"); + break; default: si_printf(value, out, ""); break; } + /* Please use the same order as in enum sr_mqflag (libsigrok.h). */ if (mqflags & SR_MQFLAG_AC) g_string_append_printf(out, " AC"); if (mqflags & SR_MQFLAG_DC) @@ -223,10 +262,15 @@ static void fancyprint(int unit, int mqflags, float value, GString *out) g_string_append_printf(out, " AUTO"); if (mqflags & SR_MQFLAG_RELATIVE) g_string_append_printf(out, " REL"); + /* Note: SR_MQFLAG_SPL_* is handled above. */ + if (mqflags & SR_MQFLAG_DURATION) + g_string_append_printf(out, " DURATION"); if (mqflags & SR_MQFLAG_AVG) g_string_append_printf(out, " AVG"); if (mqflags & SR_MQFLAG_REFERENCE) g_string_append_printf(out, " REF"); + if (mqflags & SR_MQFLAG_UNSTABLE) + g_string_append_printf(out, " UNSTABLE"); g_string_append_c(out, '\n'); } @@ -271,7 +315,9 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p break; case SR_DF_ANALOG2: analog2 = packet->payload; - if (!(fdata = g_try_malloc(analog2->num_samples * sizeof(float)))) + num_channels = g_slist_length(analog2->meaning->channels); + if (!(fdata = g_try_malloc( + analog2->num_samples * num_channels * sizeof(float)))) return SR_ERR_MALLOC; if ((ret = sr_analog_to_float(analog2, fdata)) != SR_OK) return ret; @@ -286,7 +332,6 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p digits = 6; } sr_analog_unit_to_string(analog2, &suffix); - num_channels = g_slist_length(analog2->meaning->channels); for (i = 0; i < analog2->num_samples; i++) { for (l = analog2->meaning->channels, c = 0; l; l = l->next, c++) { ch = l->data; @@ -344,6 +389,8 @@ SR_PRIV struct sr_output_module output_analog = { .id = "analog", .name = "Analog", .desc = "Analog data and types", + .exts = NULL, + .flags = 0, .options = get_options, .init = init, .receive = receive,