]> sigrok.org Git - libsigrok.git/blobdiff - src/dmm/m2110.c
Backport recent changes from mainline.
[libsigrok.git] / src / dmm / m2110.c
index 5863cef1e706e31d4923a51d02754f65c3c1cc32..4f3af6940c062e2a9a28aa12e09a14f2fab9f613 100644 (file)
  * Most probably the simplest multimeter protocol ever ;-) .
  */
 
+#include <config.h>
 #include <string.h>
 #include <math.h>
 #include <glib.h>
-#include "libsigrok.h"
+#include <libsigrok/libsigrok.h>
 #include "libsigrok-internal.h"
 
 #define LOG_PREFIX "m2110"
@@ -43,7 +44,7 @@ SR_PRIV gboolean sr_m2110_packet_valid(const uint8_t *buf)
        if (!strncmp((const char *)buf, "OVERRNG", 7))
                return TRUE;
 
-       if (sscanf((const char *)buf, "%f", &val) == 1)
+       if (sr_atof_ascii((const char *)buf, &val) == SR_OK)
                return TRUE;
        else
                return FALSE;
@@ -52,19 +53,27 @@ SR_PRIV gboolean sr_m2110_packet_valid(const uint8_t *buf)
 SR_PRIV int sr_m2110_parse(const uint8_t *buf, float *floatval,
                                struct sr_datafeed_analog *analog, void *info)
 {
+       int dot_pos, digits = 0;
        float val;
 
        (void)info;
 
        /* We don't know the unit, so that's the best we can do. */
-       analog->mq = SR_MQ_GAIN;
-       analog->unit = SR_UNIT_UNITLESS;
-       analog->mqflags = 0;
+       analog->meaning->mq = SR_MQ_GAIN;
+       analog->meaning->unit = SR_UNIT_UNITLESS;
+       analog->meaning->mqflags = 0;
 
        if (!strncmp((const char *)buf, "OVERRNG", 7))
                *floatval = INFINITY;
-       else if (sscanf((const char *)buf, "%f", &val) == 1)
+       else if (sr_atof_ascii((const char *)buf, &val) == SR_OK) {
                *floatval = val;
+               dot_pos = strcspn((const char *)buf, ".");
+               if (dot_pos < 7)
+                       digits = 6 - dot_pos;
+       }
+
+       analog->encoding->digits  = digits;
+       analog->spec->spec_digits = digits;
 
        return SR_OK;
 }