]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/fluke-dmm/protocol.c
juntek-jds6600: Initial driver skeleton.
[libsigrok.git] / src / hardware / fluke-dmm / protocol.c
index cb641af9b17342ca36ea71dd7de86d2d6ffa1c85..d8837f661c1efc45049eaf529ba1ce52c470cfbb 100644 (file)
 #include "libsigrok-internal.h"
 #include "protocol.h"
 
-static int count_digits(const char *str) {
+static int count_digits(const char *str)
+{
        int digits;
 
-       while (*str && *str != ' ' && *str != ',' && *str != '.')
+       if (*str == '-' || *str == '+')
+               str++;
+
+       while (*str >= '0' && *str <= '9')
                str++;
 
        digits = 0;
        if (*str == '.') {
                str++;
-               while (*str && *str != ' ' && *str != ',') {
+               while (*str >= '0' && *str <= '9') {
                        str++;
                        digits++;
                }
@@ -202,17 +206,37 @@ static void handle_qm_28x(const struct sr_dev_inst *sdi, char **tokens)
        struct sr_analog_spec spec;
        float fvalue;
        int digits;
+       int exponent;
+       char *e;
 
        devc = sdi->priv;
 
        if (!tokens[1])
                return;
 
+       /* Split measurement into mantissa / exponent */
+       e = tokens[0];
+       while (*e) {
+               if (*e == 'e' || *e == 'E') {
+                       *e = '\0';
+                       e++;
+                       break;
+               }
+               e++;
+       }
+
        if (sr_atof_ascii(tokens[0], &fvalue) != SR_OK) {
-               sr_err("Invalid float '%s'.", tokens[0]);
+               sr_err("Invalid mantissa '%s'.", tokens[0]);
                return;
        }
-       digits = count_digits(tokens[0]);
+
+       if (sr_atoi(e, &exponent) != SR_OK) {
+               sr_err("Invalid exponent '%s'.", e);
+               return;
+       }
+
+       digits = count_digits(tokens[0]) - exponent;
+       fvalue *= pow(10.0f, exponent);
 
        sr_analog_init(&analog, &encoding, &meaning, &spec, digits);
        analog.data = &fvalue;