From: Matthias Heidbrink Date: Wed, 18 Dec 2013 22:37:42 +0000 (+0100) Subject: serial-dmm: Add BBC Goerz Metrawatt M2110 DMM driver. X-Git-Tag: libsigrok-0.3.0~425 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=825da8b20f8eb879cd6b3e7911b4aa7b35a5b9ed;p=libsigrok.git serial-dmm: Add BBC Goerz Metrawatt M2110 DMM driver. --- diff --git a/hardware/common/dmm/Makefile.am b/hardware/common/dmm/Makefile.am index ccae327d..2439a114 100644 --- a/hardware/common/dmm/Makefile.am +++ b/hardware/common/dmm/Makefile.am @@ -25,6 +25,7 @@ libsigrok_hw_common_dmm_la_SOURCES = \ es519xx.c \ fs9721.c \ fs9922.c \ + m2110.c \ metex14.c \ rs9lcd.c diff --git a/hardware/common/dmm/m2110.c b/hardware/common/dmm/m2110.c new file mode 100644 index 00000000..1461f627 --- /dev/null +++ b/hardware/common/dmm/m2110.c @@ -0,0 +1,77 @@ +/* + * This file is part of the libsigrok project. + * + * Copyright (C) 2013 Matthias Heidbrink + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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, see . + */ + +/** \file + * BBC Goerz Metrawatt M2110 ASCII protocol parser. + * + * Most probably the simplest multimeter protocol ever ;-) . + */ + + +#include +#include +#include +#include "libsigrok.h" +#include "libsigrok-internal.h" + + +/* Message logging helpers with subsystem-specific prefix string. */ +#define LOG_PREFIX "bbcgm-m2110: " +#define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args) +#define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args) +#define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args) +#define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args) +#define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args) +#define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args) + +SR_PRIV gboolean sr_m2110_packet_valid(const uint8_t *buf) +{ + float val; + + if ((buf[7] != '\r') || (buf[8] != '\n')) + return FALSE; + + if (!strncmp((const char*)buf, "OVERRNG", 7)) + return TRUE; + + if (sscanf((const char*)buf, "%f", &val) == 1) + return TRUE; + else + return FALSE; +} + +SR_PRIV int sr_m2110_parse(const uint8_t *buf, float *floatval, + struct sr_datafeed_analog *analog, void *info) +{ + float val; + + (void)info; + + analog->mq = SR_MQ_GAIN; /* We don't know the unit, so that's the best we can do.*/ + analog->unit = SR_UNIT_UNITLESS; + analog->mqflags = 0; + + if (!strncmp((const char*)buf, "OVERRNG", 7)) { + *floatval = INFINITY; + } + else if (sscanf((const char*)buf, "%f", &val) == 1) + *floatval = val; + + return SR_OK; +} diff --git a/hardware/serial-dmm/api.c b/hardware/serial-dmm/api.c index a3123b08..57bca222 100644 --- a/hardware/serial-dmm/api.c +++ b/hardware/serial-dmm/api.c @@ -41,6 +41,7 @@ static const int32_t hwcaps[] = { SR_CONF_CONTINUOUS, }; +SR_PRIV struct sr_dev_driver bbcgm_m2110_driver_info; SR_PRIV struct sr_dev_driver digitek_dt4000zc_driver_info; SR_PRIV struct sr_dev_driver tekpower_tp4000zc_driver_info; SR_PRIV struct sr_dev_driver metex_me31_driver_info; @@ -67,6 +68,13 @@ SR_PRIV struct sr_dev_driver uni_t_ut61e_ser_driver_info; SR_PRIV struct sr_dev_driver iso_tech_idm103n_driver_info; SR_PRIV struct dmm_info dmms[] = { + { + "BBC Goertz Metrawatt", "M2110", "1200/7n2", 1200, + BBCGM_M2110_PACKET_SIZE, NULL, + sr_m2110_packet_valid, sr_m2110_parse, + NULL, + &bbcgm_m2110_driver_info, receive_data_BBCGM_M2110, + }, { "Digitek", "DT4000ZC", "2400/8n1/dtr=1", 2400, FS9721_PACKET_SIZE, NULL, @@ -523,6 +531,7 @@ SR_PRIV struct sr_dev_driver ID##_driver_info = { \ .priv = NULL, \ }; +DRV(bbcgm_m2110, BBCGM_M2110, "bbcgm-m2110", "BBC Goertz Metrawatt M2110") DRV(digitek_dt4000zc, DIGITEK_DT4000ZC, "digitek-dt4000zc", "Digitek DT4000ZC") DRV(tekpower_tp4000zc, TEKPOWER_TP4000ZC, "tekpower-tp4000zc", "TekPower TP4000ZC") DRV(metex_me31, METEX_ME31, "metex-me31", "Metex ME-31") diff --git a/hardware/serial-dmm/protocol.c b/hardware/serial-dmm/protocol.c index fab6c4ae..06e0acd0 100644 --- a/hardware/serial-dmm/protocol.c +++ b/hardware/serial-dmm/protocol.c @@ -160,6 +160,7 @@ SR_PRIV int receive_data_##ID_UPPER(int fd, int revents, void *cb_data) { \ return receive_data(fd, revents, ID_UPPER, &info, cb_data); } /* Driver-specific receive_data() wrappers */ +RECEIVE_DATA(BBCGM_M2110, metex14) /* metex14_info used as a dummy. */ RECEIVE_DATA(DIGITEK_DT4000ZC, fs9721) RECEIVE_DATA(TEKPOWER_TP4000ZC, fs9721) RECEIVE_DATA(METEX_ME31, metex14) diff --git a/hardware/serial-dmm/protocol.h b/hardware/serial-dmm/protocol.h index 20c5ae71..e24c8ab4 100644 --- a/hardware/serial-dmm/protocol.h +++ b/hardware/serial-dmm/protocol.h @@ -31,6 +31,7 @@ /* Note: When adding entries here, don't forget to update DMM_COUNT. */ enum { + BBCGM_M2110, DIGITEK_DT4000ZC, TEKPOWER_TP4000ZC, METEX_ME31, @@ -57,7 +58,7 @@ enum { ISO_TECH_IDM103N, }; -#define DMM_COUNT 24 +#define DMM_COUNT 25 struct dmm_info { /** Manufacturer/brand */ @@ -110,6 +111,7 @@ struct dev_context { int buflen; }; +SR_PRIV int receive_data_BBCGM_M2110(int fd, int revents, void *cb_data); SR_PRIV int receive_data_DIGITEK_DT4000ZC(int fd, int revents, void *cb_data); SR_PRIV int receive_data_TEKPOWER_TP4000ZC(int fd, int revents, void *cb_data); SR_PRIV int receive_data_METEX_ME31(int fd, int revents, void *cb_data); diff --git a/hwdriver.c b/hwdriver.c index 92058343..275f30d9 100644 --- a/hwdriver.c +++ b/hwdriver.c @@ -197,6 +197,7 @@ extern SR_PRIV struct sr_dev_driver agdmm_driver_info; extern SR_PRIV struct sr_dev_driver flukedmm_driver_info; #endif #ifdef HAVE_HW_SERIAL_DMM +extern SR_PRIV struct sr_dev_driver bbcgm_m2110_driver_info; extern SR_PRIV struct sr_dev_driver digitek_dt4000zc_driver_info; extern SR_PRIV struct sr_dev_driver tekpower_tp4000zc_driver_info; extern SR_PRIV struct sr_dev_driver metex_me31_driver_info; @@ -326,6 +327,7 @@ static struct sr_dev_driver *drivers_list[] = { &flukedmm_driver_info, #endif #ifdef HAVE_HW_SERIAL_DMM + &bbcgm_m2110_driver_info, &digitek_dt4000zc_driver_info, &tekpower_tp4000zc_driver_info, &metex_me31_driver_info, diff --git a/libsigrok-internal.h b/libsigrok-internal.h index 6073f4bd..9c00d9bd 100644 --- a/libsigrok-internal.h +++ b/libsigrok-internal.h @@ -460,6 +460,14 @@ SR_PRIV void sr_fs9721_01_temp_c(struct sr_datafeed_analog *analog, void *info); SR_PRIV void sr_fs9721_10_temp_c(struct sr_datafeed_analog *analog, void *info); SR_PRIV void sr_fs9721_01_10_temp_f_c(struct sr_datafeed_analog *analog, void *info); +/*--- hardware/common/dmm/m2110.c -----------------------------------------*/ + +#define BBCGM_M2110_PACKET_SIZE 9 + +SR_PRIV gboolean sr_m2110_packet_valid(const uint8_t *buf); +SR_PRIV int sr_m2110_parse(const uint8_t *buf, float *floatval, + struct sr_datafeed_analog *analog, void *info); + /*--- hardware/common/dmm/metex14.c -----------------------------------------*/ #define METEX14_PACKET_SIZE 14