]> sigrok.org Git - libsigrok.git/commitdiff
brymen-dmm: unbreak temperature response parsing
authorGerhard Sittig <redacted>
Mon, 21 Sep 2020 18:32:21 +0000 (20:32 +0200)
committerGerhard Sittig <redacted>
Mon, 21 Sep 2020 19:29:43 +0000 (21:29 +0200)
The BM850s temperature function response includes the C/F unit in an
unexpected position ("0.0272CE+3") which breaks number conversion. Drop
the C/F unit to unbreak the conversion.

This was observed with BM859s. Absence of the C/F unit in the response
is fatal in this implementation. If other meter firmware versions or
models don't suffer from that issue, the removal must be silent and
non-fatal.

src/hardware/brymen-dmm/parser.c

index 9811012b733228730bf254cf20666339a5cde9cc..40ca6c86074084cd6bf320627e1e725c70c6bf15 100644 (file)
@@ -223,6 +223,7 @@ SR_PRIV int brymen_parse(const uint8_t *buf, float *floatval,
        uint8_t *bfunc;
        const char *txt;
        int txtlen;
+       char *unit;
        int ret;
 
        (void)info;
@@ -236,6 +237,18 @@ SR_PRIV int brymen_parse(const uint8_t *buf, float *floatval,
 
        memset(&flags, 0, sizeof(flags));
        parse_flags(bfunc, &flags);
+       if (flags.is_fahrenheit || flags.is_celsius) {
+               /*
+                * The value text in temperature mode includes the C/F
+                * suffix between the mantissa and the exponent, which
+                * breaks the text to number conversion. Example data:
+                * " 0.0217CE+3". Remove the C/F unit identifier.
+                */
+               unit = strchr(txt, flags.is_fahrenheit ? 'F' : 'C');
+               if (!unit)
+                       return SR_ERR;
+               *unit = ' ';
+       }
        ret = parse_value(txt, txtlen, floatval);
        sr_dbg("floatval: %f, ret %d", *floatval, ret);
        if (ret != SR_OK)