X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Ffluke-dmm%2Fprotocol.c;h=de565e49265728e1731844d5d419d551d4ca1737;hb=e7f803f3e0bc0e984354e40b9d1982011dee7cd4;hp=77200c3ed163be8e9f4f00358963190e4bdb9a3d;hpb=ad42cfebcbda16a4021c7e1532ccfc15074bc870;p=libsigrok.git diff --git a/src/hardware/fluke-dmm/protocol.c b/src/hardware/fluke-dmm/protocol.c index 77200c3e..de565e49 100644 --- a/src/hardware/fluke-dmm/protocol.c +++ b/src/hardware/fluke-dmm/protocol.c @@ -26,6 +26,24 @@ #include "libsigrok-internal.h" #include "protocol.h" +static int count_digits(const char *str) { + int digits; + + while (*str && *str != ' ' && *str != ',' && *str != '.') + str++; + + digits = 0; + if (*str == '.') { + str++; + while (*str && *str != ' ' && *str != ',') { + str++; + digits++; + } + } + + return digits; +} + static void handle_qm_18x(const struct sr_dev_inst *sdi, char **tokens) { struct dev_context *devc; @@ -37,6 +55,7 @@ static void handle_qm_18x(const struct sr_dev_inst *sdi, char **tokens) float fvalue; char *e, *u; gboolean is_oor; + int digits; devc = sdi->priv; @@ -46,6 +65,7 @@ static void handle_qm_18x(const struct sr_dev_inst *sdi, char **tokens) if ((e = strstr(tokens[1], "Out of range"))) { is_oor = TRUE; fvalue = -1; + digits = 0; while (*e && *e != '.') e++; } else { @@ -58,15 +78,15 @@ static void handle_qm_18x(const struct sr_dev_inst *sdi, char **tokens) *e++ = '\0'; if (sr_atof_ascii(tokens[1], &fvalue) != SR_OK) { /* Happens all the time, when switching modes. */ - sr_dbg("Invalid float."); + sr_dbg("Invalid float: '%s'", tokens[1]); return; } + digits = count_digits(tokens[1]); } while (*e && *e == ' ') e++; - /* TODO: Use proper 'digits' value for this device (and its modes). */ - sr_analog_init(&analog, &encoding, &meaning, &spec, 2); + sr_analog_init(&analog, &encoding, &meaning, &spec, digits); analog.data = &fvalue; analog.meaning->channels = sdi->channels; analog.num_samples = 1; @@ -167,6 +187,7 @@ static void handle_qm_28x(const struct sr_dev_inst *sdi, char **tokens) struct sr_analog_meaning meaning; struct sr_analog_spec spec; float fvalue; + int digits; devc = sdi->priv; @@ -177,9 +198,9 @@ static void handle_qm_28x(const struct sr_dev_inst *sdi, char **tokens) sr_err("Invalid float '%s'.", tokens[0]); return; } + digits = count_digits(tokens[0]); - /* TODO: Use proper 'digits' value for this device (and its modes). */ - sr_analog_init(&analog, &encoding, &meaning, &spec, 2); + sr_analog_init(&analog, &encoding, &meaning, &spec, digits); analog.data = &fvalue; analog.meaning->channels = sdi->channels; analog.num_samples = 1; @@ -378,7 +399,9 @@ static void handle_qm_19x_data(const struct sr_dev_inst *sdi, char **tokens) struct sr_analog_meaning meaning; struct sr_analog_spec spec; float fvalue; + int digits; + digits = 2; if (!strcmp(tokens[0], "9.9E+37")) { /* An invalid measurement shows up on the display as "OL", but * comes through like this. Since comparing 38-digit floats @@ -389,6 +412,7 @@ static void handle_qm_19x_data(const struct sr_dev_inst *sdi, char **tokens) sr_err("Invalid float '%s'.", tokens[0]); return; } + digits = count_digits(tokens[0]); } devc = sdi->priv; @@ -405,8 +429,7 @@ static void handle_qm_19x_data(const struct sr_dev_inst *sdi, char **tokens) fvalue = 1.0; } - /* TODO: Use proper 'digits' value for this device (and its modes). */ - sr_analog_init(&analog, &encoding, &meaning, &spec, 2); + sr_analog_init(&analog, &encoding, &meaning, &spec, digits); analog.meaning->channels = sdi->channels; analog.num_samples = 1; analog.data = &fvalue; @@ -443,7 +466,8 @@ static void handle_line(const struct sr_dev_inst *sdi) tokens = g_strsplit(devc->buf, ",", 0); if (tokens[0]) { - if (devc->profile->model == FLUKE_187 || devc->profile->model == FLUKE_189) { + if (devc->profile->model == FLUKE_87 || devc->profile->model == FLUKE_89 || + devc->profile->model == FLUKE_187 || devc->profile->model == FLUKE_189) { devc->expect_response = FALSE; handle_qm_18x(sdi, tokens); } else if (devc->profile->model == FLUKE_287 || devc->profile->model == FLUKE_289) {