dmm/bm86x: unbreak temperature modes (two probes and no probes)

The Brymen BM86x supports up to two temperature probes. The dual display
can show individual temperatures of the two probes or differences. The
previous implementation "detected" a value of zero degrees when no probe
was attached and the display showed dash lines. When cycling assignments
of probes to displays, some valid combinations did not result in values
shown by the libsigrok driver.

An implementation detail of the formerly separate brymen-bm86x driver
was lost during recent migration of the dmm/bm86x parser into the
serial-dmm driver. When the meter's temperature function is selected,
it's essential to inspect the primary display's flags and digits, to
determine the secondary display's quantity and unit. Previous versions
never bothered to explicitly check for the "----" digits text, but the
combination of the primary's last digit showing C/F as well as the
binary C/F flags before the value provided hints which the secondary
displays group of digits and flags did not.

This fixes bug #1394.
This commit is contained in:
Gerhard Sittig 2019-06-20 11:53:36 +02:00 committed by Uwe Hermann
parent 3775ef8c7a
commit e378e3a2d4
1 changed files with 10 additions and 4 deletions

View File

@ -164,6 +164,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
@ -212,7 +213,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;
@ -278,9 +279,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) {
@ -295,7 +301,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;