X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Foutput%2Fanalog.c;h=72d1eb87efa744756f02fe9ae747c17006706cf5;hb=5379fea5eff59c51134a697b1d30048faf2f7c57;hp=ed8e163e4984f7ec3b626cd29e38867f369c5ad5;hpb=c1aae90038456a61d0f9313d34e6107c3440d3e7;p=libsigrok.git diff --git a/src/output/analog.c b/src/output/analog.c index ed8e163e..72d1eb87 100644 --- a/src/output/analog.c +++ b/src/output/analog.c @@ -17,6 +17,7 @@ * along with this program. If not, see . */ +#include #include #include #include @@ -30,6 +31,7 @@ struct context { int num_enabled_channels; GPtrArray *channellist; int digits; + float *fdata; }; enum { @@ -63,11 +65,12 @@ static int init(struct sr_output *o, GHashTable *options) g_ptr_array_add(ctx->channellist, ch->name); ctx->num_enabled_channels++; } + ctx->fdata = NULL; return SR_OK; } -static void si_printf(float value, GString *out, char *unitstr) +static void si_printf(float value, GString *out, const char *unitstr) { float v; @@ -95,6 +98,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 +115,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 +152,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)"); @@ -200,11 +204,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 +264,17 @@ 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"); + if (mqflags & SR_MQFLAG_FOUR_WIRE) + g_string_append_printf(out, " 4-WIRE"); g_string_append_c(out, '\n'); } @@ -234,8 +282,8 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p GString **out) { struct context *ctx; + const struct sr_datafeed_analog_old *analog_old; const struct sr_datafeed_analog *analog; - const struct sr_datafeed_analog2 *analog2; struct sr_channel *ch; GSList *l; float *fdata; @@ -255,44 +303,46 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p case SR_DF_FRAME_END: *out = g_string_new("FRAME-END\n"); break; - case SR_DF_ANALOG: - analog = packet->payload; - fdata = (float *)analog->data; + case SR_DF_ANALOG_OLD: + analog_old = packet->payload; + fdata = (float *)analog_old->data; *out = g_string_sized_new(512); - num_channels = g_slist_length(analog->channels); - for (si = 0; si < analog->num_samples; si++) { - for (l = analog->channels, c = 0; l; l = l->next, c++) { + num_channels = g_slist_length(analog_old->channels); + for (si = 0; si < analog_old->num_samples; si++) { + for (l = analog_old->channels, c = 0; l; l = l->next, c++) { ch = l->data; g_string_append_printf(*out, "%s: ", ch->name); - fancyprint(analog->unit, analog->mqflags, + fancyprint(analog_old->unit, analog_old->mqflags, fdata[si * num_channels + c], *out); } } break; - case SR_DF_ANALOG2: - analog2 = packet->payload; - if (!(fdata = g_try_malloc(analog2->num_samples * sizeof(float)))) + case SR_DF_ANALOG: + analog = packet->payload; + num_channels = g_slist_length(analog->meaning->channels); + if (!(fdata = g_try_realloc(ctx->fdata, + analog->num_samples * num_channels * sizeof(float)))) return SR_ERR_MALLOC; - if ((ret = sr_analog_to_float(analog2, fdata)) != SR_OK) + ctx->fdata = fdata; + if ((ret = sr_analog_to_float(analog, fdata)) != SR_OK) return ret; *out = g_string_sized_new(512); - if (analog2->encoding->is_digits_decimal) { + if (analog->encoding->is_digits_decimal) { if (ctx->digits == DIGITS_ALL) - digits = analog2->encoding->digits; + digits = analog->encoding->digits; else - digits = analog2->spec->spec_digits; + digits = analog->spec->spec_digits; } else { /* TODO we don't know how to print by number of bits yet. */ 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++) { + sr_analog_unit_to_string(analog, &suffix); + for (i = 0; i < analog->num_samples; i++) { + for (l = analog->meaning->channels, c = 0; l; l = l->next, c++) { ch = l->data; g_string_append_printf(*out, "%s: ", ch->name); - sr_analog_float_to_string(fdata[i * num_channels + c], - digits, &number); + number = g_strdup_printf("%.*f", digits, + fdata[i * num_channels + c]); g_string_append(*out, number); g_free(number); g_string_append(*out, " "); @@ -307,21 +357,6 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p return SR_OK; } -static int cleanup(struct sr_output *o) -{ - struct context *ctx; - - if (!o || !o->sdi) - return SR_ERR_ARG; - ctx = o->priv; - - g_ptr_array_free(ctx->channellist, 1); - g_free(ctx); - o->priv = NULL; - - return SR_OK; -} - static struct sr_option options[] = { { "digits", "Digits", "Digits to show", NULL, NULL }, ALL_ZERO @@ -340,6 +375,24 @@ static const struct sr_option *get_options(void) return options; } +static int cleanup(struct sr_output *o) +{ + struct context *ctx; + + if (!o || !o->sdi) + return SR_ERR_ARG; + ctx = o->priv; + + g_ptr_array_free(ctx->channellist, 1); + g_variant_unref(options[0].def); + g_slist_free_full(options[0].values, (GDestroyNotify)g_variant_unref); + g_free(ctx->fdata); + g_free(ctx); + o->priv = NULL; + + return SR_OK; +} + SR_PRIV struct sr_output_module output_analog = { .id = "analog", .name = "Analog",