X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fdmm%2Fut372.c;h=271d034c3bbc3c3de899d23dace1b0fa5131f707;hb=2ea1fdf12113311cbe1a4316e9e2efe4d8ac40f0;hp=b5e2c703f7682eaf132888aa4fb70362951d089f;hpb=472bef399078cd7e80f35940a527828a1c841c46;p=libsigrok.git diff --git a/src/dmm/ut372.c b/src/dmm/ut372.c index b5e2c703..271d034c 100644 --- a/src/dmm/ut372.c +++ b/src/dmm/ut372.c @@ -14,22 +14,23 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * along with this program; if not, see . */ /* * UNI-T UT372 protocol parser. */ +#include #include +#include #include -#include "libsigrok.h" +#include #include "libsigrok-internal.h" #define LOG_PREFIX "ut372" -char lookup[] = { +static const uint8_t lookup[] = { 0x7B, 0x60, 0x5E, @@ -39,35 +40,86 @@ char lookup[] = { 0x3F, 0x70, 0x7F, - 0x7D + 0x7D, }; #define DECIMAL_POINT_MASK 0x80 +#define FLAGS1_HOLD_MASK (1 << 2) + +#define FLAGS2_RPM_MASK (1 << 0) +#define FLAGS2_COUNT_MASK (1 << 1) +#define FLAGS2_MAX_MASK (1 << 4) +#define FLAGS2_MIN_MASK (1 << 5) +#define FLAGS2_AVG_MASK (1 << 6) + +/* Decode a pair of characters into a byte. */ +static uint8_t decode_pair(const uint8_t *buf) +{ + unsigned int i; + char hex[3]; + + hex[2] = '\0'; + + for (i = 0; i < 2; i++) { + hex[i] = buf[i]; + if (hex[i] > 0x39) + hex[i] += 7; + } + + return strtol(hex, NULL, 16); +} + SR_PRIV gboolean sr_ut372_packet_valid(const uint8_t *buf) { - return (buf[25] == '\r' && buf[26] == '\n'); + uint8_t flags2; + + if (!(buf[25] == '\r' && buf[26] == '\n')) + return FALSE; + + flags2 = decode_pair(buf + 23); + + if (!(flags2 & (FLAGS2_RPM_MASK | FLAGS2_COUNT_MASK))) + /* Device is in the setup menu - no valid data shown. */ + return FALSE; + + return TRUE; } SR_PRIV int sr_ut372_parse(const uint8_t *buf, float *floatval, struct sr_datafeed_analog *analog, void *info) { - unsigned int i, j, segments, value, divisor; - char hex[3]; + unsigned int i, j, value; + uint8_t segments, flags1, flags2; + int exponent; (void) info; - hex[2] = '\0'; + 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; - divisor = 1; + exponent = 0; for (i = 0; i < 5; i++) { - for (j = 0; j < 2; j++) { - hex[j] = buf[2*i + 1 + j]; - if (hex[j] > 0x39) - hex[j] += 7; - } - segments = strtol(hex, NULL, 16); + 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); @@ -75,13 +127,13 @@ SR_PRIV int sr_ut372_parse(const uint8_t *buf, float *floatval, } } if (segments & DECIMAL_POINT_MASK) - divisor = pow(10, i); + exponent = -i; } - *floatval = (float) value / divisor; + *floatval = (float) value * powf(10, exponent); - analog->mq = SR_MQ_FREQUENCY; - analog->unit = SR_UNIT_REVOLUTIONS_PER_MINUTE; + analog->encoding->digits = -exponent; + analog->spec->spec_digits = -exponent; return SR_OK; }