+ unsigned int i, j, value;
+ uint8_t segments, flags1, flags2;
+ int exponent;
+
+ (void) info;
+
+ flags1 = decode_pair(buf + 21);
+ flags2 = decode_pair(buf + 23);
+
+ if (flags2 & FLAGS2_RPM_MASK) {
+ analog->meaning->mq = SR_MQ_FREQUENCY;
+ analog->meaning->unit = SR_UNIT_REVOLUTIONS_PER_MINUTE;
+ } else if (flags2 & FLAGS2_COUNT_MASK) {
+ analog->meaning->mq = SR_MQ_COUNT;
+ analog->meaning->unit = SR_UNIT_UNITLESS;
+ }
+
+ if (flags1 & FLAGS1_HOLD_MASK)
+ analog->meaning->mqflags |= SR_MQFLAG_HOLD;
+ if (flags2 & FLAGS2_MIN_MASK)
+ analog->meaning->mqflags |= SR_MQFLAG_MIN;
+ if (flags2 & FLAGS2_MAX_MASK)
+ analog->meaning->mqflags |= SR_MQFLAG_MAX;
+ if (flags2 & FLAGS2_AVG_MASK)
+ analog->meaning->mqflags |= SR_MQFLAG_AVG;
+
+ value = 0;
+ exponent = 0;
+
+ for (i = 0; i < 5; i++) {
+ segments = decode_pair(buf + 1 + (2 * i));
+ for (j = 0; j < ARRAY_SIZE(lookup); j++) {
+ if (lookup[j] == (segments & ~DECIMAL_POINT_MASK)) {
+ value += j * pow(10, i);
+ break;
+ }
+ }
+ if (segments & DECIMAL_POINT_MASK)
+ exponent = -i;
+ }
+
+ *floatval = (float) value * powf(10, exponent);
+
+ analog->encoding->digits = -exponent;
+ analog->spec->spec_digits = -exponent;
+