X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Foutput%2Fanalog.c;h=f5d23e6fc085b896e0a18246bf51e2134041294a;hb=7ee8511be45fa75a683aaff05d21cc6cf40ef75c;hp=99daf3ac8a56f0ab1f03f57ce63c60664d733d91;hpb=d1d3d2e0c4f74625f6f8379a3128412c600ad98d;p=libsigrok.git diff --git a/src/output/analog.c b/src/output/analog.c index 99daf3ac..f5d23e6f 100644 --- a/src/output/analog.c +++ b/src/output/analog.c @@ -75,11 +75,14 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p { struct context *ctx; const struct sr_datafeed_analog *analog; + const struct sr_datafeed_meta *meta; + const struct sr_config *src; + const struct sr_key_info *srci; struct sr_channel *ch; GSList *l; float *fdata; unsigned int i; - int num_channels, c, ret, digits; + int num_channels, c, ret, digits, actual_digits; char *number, *suffix; *out = NULL; @@ -94,6 +97,28 @@ 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_META: + meta = packet->payload; + for (l = meta->config; l; l = l->next) { + src = l->data; + if (!(srci = sr_key_info_get(SR_KEY_CONFIG, src->key))) + return SR_ERR; + *out = g_string_sized_new(512); + g_string_append(*out, "META "); + g_string_append_printf(*out, "%s: ", srci->id); + if (srci->datatype == SR_T_BOOL) { + g_string_append_printf(*out, "%u", + g_variant_get_boolean(src->data)); + } else if (srci->datatype == SR_T_FLOAT) { + g_string_append_printf(*out, "%f", + g_variant_get_double(src->data)); + } else if (srci->datatype == SR_T_UINT64) { + g_string_append_printf(*out, "%" PRIu64, + g_variant_get_uint64(src->data)); + } + g_string_append(*out, "\n"); + } + break; case SR_DF_ANALOG: analog = packet->payload; num_channels = g_slist_length(analog->meaning->channels); @@ -113,16 +138,22 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p /* TODO we don't know how to print by number of bits yet. */ digits = 6; } + gboolean si_friendly = sr_analog_si_prefix_friendly(analog->meaning->unit); 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++) { + float value = fdata[i * num_channels + c]; + const char *prefix = ""; + actual_digits = digits; + if (si_friendly) + prefix = sr_analog_si_prefix(&value, &actual_digits); ch = l->data; g_string_append_printf(*out, "%s: ", ch->name); - number = g_strdup_printf("%.*f", digits, - fdata[i * num_channels + c]); + number = g_strdup_printf("%.*f", MAX(actual_digits, 0), value); g_string_append(*out, number); g_free(number); g_string_append(*out, " "); + g_string_append(*out, prefix); g_string_append(*out, suffix); g_string_append(*out, "\n"); }