X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fdmm%2Fbm86x.c;h=ea260d8f97180869cfa6441696be549a476323da;hb=81ceb6a51dd666987fb5c67b83c5ba14d105b301;hp=318d4af011c9af61d56e5253fb6e3f13259cf824;hpb=0759e2f55b5e45ff283f396c38c08eb180ba83b7;p=libsigrok.git diff --git a/src/dmm/bm86x.c b/src/dmm/bm86x.c index 318d4af0..ea260d8f 100644 --- a/src/dmm/bm86x.c +++ b/src/dmm/bm86x.c @@ -41,7 +41,6 @@ SR_PRIV int sr_brymen_bm86x_packet_request(struct sr_serial_dev_inst *serial) { static const uint8_t request[] = { 0x00, 0x00, 0x86, 0x66, }; - sr_spew("%s() sending request", __func__); serial_write_nonblocking(serial, request, sizeof(request)); return SR_OK; @@ -50,14 +49,6 @@ SR_PRIV int sr_brymen_bm86x_packet_request(struct sr_serial_dev_inst *serial) SR_PRIV gboolean sr_brymen_bm86x_packet_valid(const uint8_t *buf) { - GString *text; - - if (sr_log_loglevel_get() >= SR_LOG_SPEW) { - text = sr_hexdump_new(buf, BRYMEN_BM86X_PACKET_SIZE); - sr_spew("%s() checking DMM packet: %s", __func__, text->str); - sr_hexdump_free(text); - } - /* * "Model ID3" (3rd HID report, byte 3) is the only documented * fixed value, and must be 0x86. All other positions either depend @@ -68,6 +59,22 @@ SR_PRIV gboolean sr_brymen_bm86x_packet_valid(const uint8_t *buf) if (buf[19] != 0x86) return FALSE; + /* + * 2021-05 update: The devices that we have seen in the field do + * provide four bytes which we can synchronize to. Which happens + * to match the bm52x and bm82x devices' protocol. This condition + * is not documented by the vendor, but improves reliability of + * the re-synchronization for slight offsets, which were seen + * in the field, and which would have kept failing in an earlier + * implementation. + */ + if (buf[16] != 0x86) + return FALSE; + if (buf[17] != 0x86) + return FALSE; + if (buf[18] != 0x86) + return FALSE; + return TRUE; } @@ -172,6 +179,7 @@ static void brymen_bm86x_parse(const uint8_t *buf, float *floatval, int ret, digits, is_diode, over_limit, scale; uint8_t ind1, ind15; + temp_unit = '\0'; if (ch_idx == 0) { /* * Main display. Note that _some_ of the second display's @@ -220,7 +228,7 @@ static void brymen_bm86x_parse(const uint8_t *buf, float *floatval, } else if (buf[15] & 0x80) { analog->meaning->mq = SR_MQ_DUTY_CYCLE; analog->meaning->unit = SR_UNIT_PERCENTAGE; - } else if (buf[ 2] & 0x0a) { + } else if ((buf[2] & 0x0a) && temp_unit) { analog->meaning->mq = SR_MQ_TEMPERATURE; if (temp_unit == 'F') analog->meaning->unit = SR_UNIT_FAHRENHEIT; @@ -286,9 +294,14 @@ static void brymen_bm86x_parse(const uint8_t *buf, float *floatval, analog->encoding->digits = digits; analog->spec->spec_digits = digits; } else if (ch_idx == 1) { - /* Secondary display. */ + /* + * Secondary display. Also inspect _some_ primary display + * data, to determine the secondary display's validity. + */ + (void)brymen_bm86x_parse_digits(&buf[2], 6, txtbuf, + NULL, &temp_unit, NULL, 0x80); ret = brymen_bm86x_parse_digits(&buf[9], 4, txtbuf, - floatval, &temp_unit, &digits, 0x10); + floatval, NULL, &digits, 0x10); /* SI unit. */ if (buf[14] & 0x08) { @@ -303,7 +316,7 @@ static void brymen_bm86x_parse(const uint8_t *buf, float *floatval, } else if (buf[14] & 0x04) { analog->meaning->mq = SR_MQ_FREQUENCY; analog->meaning->unit = SR_UNIT_HERTZ; - } else if (buf[9] & 0x40) { + } else if ((buf[9] & 0x40) && temp_unit) { analog->meaning->mq = SR_MQ_TEMPERATURE; if (temp_unit == 'F') analog->meaning->unit = SR_UNIT_FAHRENHEIT;