]> sigrok.org Git - libsigrok.git/commitdiff
analog output: convert binary to digital digits of precision.
authorMartin Ling <redacted>
Thu, 20 Sep 2018 01:40:06 +0000 (02:40 +0100)
committerUwe Hermann <redacted>
Thu, 20 Sep 2018 18:35:57 +0000 (20:35 +0200)
This fixes parts of bug #950.

src/output/analog.c

index 94175369e1a15c43e4d0a48f7a3a6df9b4fb6b4e..6632cda68844fc631e8ac1143af6dd2b7119e5ab 100644 (file)
@@ -27,6 +27,8 @@
 
 #define LOG_PREFIX "output/analog"
 
+#define BIN_TO_DEC_DIGITS (log(2) / log(10))
+
 struct context {
        int num_enabled_channels;
        GPtrArray *channellist;
@@ -130,15 +132,12 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
                if ((ret = sr_analog_to_float(analog, fdata)) != SR_OK)
                        return ret;
                *out = g_string_sized_new(512);
-               if (analog->encoding->is_digits_decimal) {
-                       if (ctx->digits == DIGITS_ALL)
-                               digits = analog->encoding->digits;
-                       else
-                               digits = analog->spec->spec_digits;
-               } else {
-                       /* TODO we don't know how to print by number of bits yet. */
-                       digits = 6;
-               }
+               if (ctx->digits == DIGITS_ALL)
+                       digits = analog->encoding->digits;
+               else
+                       digits = analog->spec->spec_digits;
+               if (!analog->encoding->is_digits_decimal)
+                       digits = copysign(ceil(abs(digits) * BIN_TO_DEC_DIGITS), digits);
                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++) {