+ unsigned int i, j, value, divisor;
+ uint8_t segments, flags1, flags2;
+
+ (void) info;
+
+ flags1 = decode_pair(buf + 21);
+ flags2 = decode_pair(buf + 23);
+
+ if (flags2 & FLAGS2_RPM_MASK) {
+ analog->mq = SR_MQ_FREQUENCY;
+ analog->unit = SR_UNIT_REVOLUTIONS_PER_MINUTE;
+ } else if (flags2 & FLAGS2_COUNT_MASK) {
+ analog->mq = SR_MQ_COUNT;
+ analog->unit = SR_UNIT_UNITLESS;
+ }
+
+ if (flags1 & FLAGS1_HOLD_MASK)
+ analog->mqflags |= SR_MQFLAG_HOLD;
+ if (flags2 & FLAGS2_MIN_MASK)
+ analog->mqflags |= SR_MQFLAG_MIN;
+ if (flags2 & FLAGS2_MAX_MASK)
+ analog->mqflags |= SR_MQFLAG_MAX;
+ if (flags2 & FLAGS2_AVG_MASK)
+ analog->mqflags |= SR_MQFLAG_AVG;
+
+ value = 0;
+ divisor = 1;
+
+ 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)
+ divisor = pow(10, i);
+ }
+
+ *floatval = (float) value / divisor;
+