diff --git a/configure.ac b/configure.ac index 496f96f9..e09d8f43 100644 --- a/configure.ac +++ b/configure.ac @@ -189,9 +189,9 @@ if test "x$HW_RADIOSHACK_DMM" = "xyes"; then fi AC_ARG_ENABLE(tekpower-dmm, AC_HELP_STRING([--enable-tekpower-dmm], - [enable Tekpower DMM support. [default=yes]]), - [HW_TEKPOWER_DMM="$enableval"], - [HW_TEKPOWER_DMM=yes]) + [enable TekPower DMM support [default=yes]]), + [HW_TEKPOWER_DMM="$enableval"], + [HW_TEKPOWER_DMM=yes]) AM_CONDITIONAL(HW_TEKPOWER_DMM, test x$HW_TEKPOWER_DMM = xyes) if test "x$HW_TEKPOWER_DMM" = "xyes"; then AC_DEFINE(HAVE_HW_TEKPOWER_DMM, 1, [TekPower DMM support]) @@ -380,7 +380,7 @@ echo " - Hantek DSO...................... $HW_HANTEK_DSO" echo " - Link MSO-19..................... $LA_LINK_MSO19" echo " - Openbench Logic Sniffer......... $LA_OLS" echo " - Radioshack DMM.................. $HW_RADIOSHACK_DMM" -echo " - Tekpower DMM.................... $HW_TEKPOWER_DMM" +echo " - TekPower DMM.................... $HW_TEKPOWER_DMM" echo " - ZEROPLUS Logic Cube............. $LA_ZEROPLUS_LOGIC_CUBE" echo diff --git a/hardware/tekpower-dmm/api.c b/hardware/tekpower-dmm/api.c index 1069935c..74f190b2 100644 --- a/hardware/tekpower-dmm/api.c +++ b/hardware/tekpower-dmm/api.c @@ -19,14 +19,14 @@ */ #include -#include "libsigrok.h" -#include "libsigrok-internal.h" -#include "protocol.h" #include #include #include #include #include +#include "libsigrok.h" +#include "libsigrok-internal.h" +#include "protocol.h" static const int hwopts[] = { SR_HWOPT_CONN, @@ -46,8 +46,8 @@ static const char *probe_names[] = { NULL, }; -SR_PRIV struct sr_dev_driver tekpower_driver_info; -static struct sr_dev_driver *di = &tekpower_driver_info; +SR_PRIV struct sr_dev_driver tekpower_dmm_driver_info; +static struct sr_dev_driver *di = &tekpower_dmm_driver_info; /* Properly close and free all devices. */ static int clear_instances(void) @@ -80,8 +80,8 @@ static int hw_init(void) struct drv_context *drvc; if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) { - sr_err("driver context malloc failed."); - return SR_ERR; + sr_err("Driver context malloc failed."); + return SR_ERR_MALLOC; } di->priv = drvc; @@ -89,7 +89,7 @@ static int hw_init(void) return SR_OK; } -static int serial_readline(int fd, char **buf, size_t *buflen, +static int serial_readline(int fd, char **buf, int *buflen, uint64_t timeout_ms) { uint64_t start; @@ -100,7 +100,7 @@ static int serial_readline(int fd, char **buf, size_t *buflen, maxlen = *buflen; *buflen = len = 0; - while(1) { + while (1) { len = maxlen - *buflen - 1; if (len < 1) break; @@ -129,52 +129,49 @@ static GSList *lcd14_scan(const char *conn, const char *serialcomm) struct drv_context *drvc; struct dev_context *devc; struct sr_probe *probe; + struct lcd14_packet *packet; GSList *devices; - int fd, retry; - size_t len; + int i, len, fd, retry, good_packets = 0, dropped, ret; char buf[128], *b; - if ((fd = serial_open(conn, O_RDONLY|O_NONBLOCK)) == -1) { - sr_err("unable to open %s: %s", - conn, strerror(errno)); + if ((fd = serial_open(conn, O_RDONLY | O_NONBLOCK)) == -1) { + sr_err("Unable to open %s: %s.", conn, strerror(errno)); return NULL; } - if (serial_set_paramstr(fd, serialcomm) != SR_OK) { - sr_err("unable to set serial parameters"); + if ((ret = serial_set_paramstr(fd, serialcomm)) != SR_OK) { + sr_err("Unable to set serial parameters: %d", ret); return NULL; } - sr_info("probing port %s readonly", conn); + sr_info("Probing port %s readonly.", conn); drvc = di->priv; b = buf; retry = 0; devices = NULL; serial_flush(fd); - /* There's no way to get an ID from the multimeter. It just sends data - * periodically, so the best we can do is check if the packets match the - * expected format. */ - while (!devices && retry < 3) - { - size_t i; - size_t good_packets = 0; + + /* + * There's no way to get an ID from the multimeter. It just sends data + * periodically, so the best we can do is check if the packets match + * the expected format. + */ + while (!devices && retry < 3) { retry++; - /* Let's get a bit of data and see if we can find a packet */ + /* Let's get a bit of data and see if we can find a packet. */ len = sizeof(buf); serial_readline(fd, &b, &len, 500); - if( (len == 0) || (len < LCD14_PACKET_SIZE) ) { - /* Not enough data received, is the DMM connected ? */ + if ((len == 0) || (len < LCD14_PACKET_SIZE)) { + /* Not enough data received, is the DMM connected? */ continue; } /* Let's treat our buffer like a stream, and find any * valid packets */ - for( i = 0; i < len - LCD14_PACKET_SIZE + 1; - /* don't increment i here */ ) - { - const lcd14_packet *packet = (void *)(&buf[i]); - if( !lcd14_is_packet_valid(packet, NULL) ){ + for (i = 0; i < len - LCD14_PACKET_SIZE + 1;) { + packet = (void *)(&buf[i]); + if (!lcd14_is_packet_valid(packet, NULL)) { i++; continue; } @@ -182,27 +179,28 @@ static GSList *lcd14_scan(const char *conn, const char *serialcomm) i += LCD14_PACKET_SIZE; } - /* If we dropped more than two packets worth of data, something - * is wrong */ - size_t dropped = len - (good_packets * LCD14_PACKET_SIZE); - if(dropped > 2 * LCD14_PACKET_SIZE) + /* + * If we dropped more than two packets worth of data, + * something is wrong. + */ + dropped = len - (good_packets * LCD14_PACKET_SIZE); + if (dropped > 2 * LCD14_PACKET_SIZE) continue; - /* Let's see if we have anything good */ + /* Let's see if we have anything good. */ if (good_packets == 0) continue; - sr_info("found device on port %s", conn); + sr_info("Found device on port %s.", conn); if (!(sdi = sr_dev_inst_new(0, SR_ST_INACTIVE, "TekPower", "TP4000ZC", ""))) return NULL; if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) { - sr_dbg("failed to malloc devc"); + sr_err("Device context malloc failed."); return NULL; } - /* devc->profile = RADIOSHACK_22_812; */ devc->serial = sr_serial_dev_inst_new(conn, -1); devc->serialcomm = g_strdup(serialcomm); @@ -245,7 +243,7 @@ static GSList *hw_scan(GSList *options) /* Use the provided comm specs. */ devices = lcd14_scan(conn, serialcomm); } else { - /* Then try the default 2400 8n1 */ + /* Try the default 2400/8n1. */ devices = lcd14_scan(conn, "2400/8n1"); } @@ -263,6 +261,7 @@ static GSList *hw_dev_list(void) static int hw_dev_open(struct sr_dev_inst *sdi) { + int ret; struct dev_context *devc; if (!(devc = sdi->priv)) { @@ -272,12 +271,13 @@ static int hw_dev_open(struct sr_dev_inst *sdi) devc->serial->fd = serial_open(devc->serial->port, O_RDONLY); if (devc->serial->fd == -1) { - sr_err("Couldn't open serial port '%s'.", - devc->serial->port); + sr_err("Couldn't open serial port '%s'.", devc->serial->port); return SR_ERR; } - if (serial_set_paramstr(devc->serial->fd, devc->serialcomm) != SR_OK) { - sr_err("unable to set serial parameters"); + + ret = serial_set_paramstr(devc->serial->fd, devc->serialcomm); + if (ret != SR_OK) { + sr_err("Unable to set serial parameters: %d.", ret); return SR_ERR; } sdi->status = SR_ST_ACTIVE; @@ -311,9 +311,9 @@ static int hw_cleanup(void) } static int hw_info_get(int info_id, const void **data, - const struct sr_dev_inst *sdi) + const struct sr_dev_inst *sdi) { - (void)sdi; /* Does nothing. prevents "unused parameter" warning */ + (void)sdi; switch (info_id) { case SR_DI_HWOPTS: @@ -336,7 +336,7 @@ static int hw_info_get(int info_id, const void **data, } static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, - const void *value) + const void *value) { struct dev_context *devc; @@ -364,7 +364,7 @@ static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, } static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, - void *cb_data) + void *cb_data) { struct sr_datafeed_packet packet; struct sr_datafeed_header header; @@ -380,9 +380,11 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, devc->cb_data = cb_data; - /* Reset the number of samples to take. If we've already collected our + /* + * Reset the number of samples to take. If we've already collected our * quota, but we start a new session, and don't reset this, we'll just - * quit without aquiring any new samples */ + * quit without acquiring any new samples. + */ devc->num_samples = 0; /* Send header packet to the session bus. */ @@ -400,15 +402,15 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, meta.num_probes = 1; sr_session_send(devc->cb_data, &packet); - /* Poll every 100ms, or whenever some data comes in. */ + /* Poll every 50ms, or whenever some data comes in. */ sr_source_add(devc->serial->fd, G_IO_IN, 50, - lcd14_receive_data, (void *)sdi ); + tekpower_dmm_receive_data, (void *)sdi); return SR_OK; } static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi, - void *cb_data) + void *cb_data) { struct sr_datafeed_packet packet; struct dev_context *devc; @@ -434,9 +436,9 @@ static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi, return SR_OK; } -SR_PRIV struct sr_dev_driver tekpower_driver_info = { +SR_PRIV struct sr_dev_driver tekpower_dmm_driver_info = { .name = "tekpower-dmm", - .longname = "TekPower/Digitek 4000ZC", + .longname = "TekPower/Digitek TP4000ZC/DT4000ZC DMM", .api_version = 1, .init = hw_init, .cleanup = hw_cleanup, diff --git a/hardware/tekpower-dmm/protocol.c b/hardware/tekpower-dmm/protocol.c index a468cb9a..7f501959 100644 --- a/hardware/tekpower-dmm/protocol.c +++ b/hardware/tekpower-dmm/protocol.c @@ -18,129 +18,129 @@ */ #include -#include "libsigrok.h" -#include "libsigrok-internal.h" -#include "config.h" -#include "protocol.h" #include #include #include #include +#include "libsigrok.h" +#include "libsigrok-internal.h" +#include "protocol.h" - -static gboolean lcd14_is_sync_valid(const lcd14_packet *packet) +static gboolean lcd14_is_sync_valid(const struct lcd14_packet *packet) { - size_t i; - /* Check the syncronization nibbles, and make sure they all match */ - for(i = 0; i < LCD14_PACKET_SIZE; i++) - { - uint8_t sync = (packet->raw[i] & LCD14_SYNC_MASK) >> 4; - if(sync != (i+1) ) + int i; + uint8_t sync; + + /* Check the syncronization nibbles, and make sure they all match. */ + for (i = 0; i < LCD14_PACKET_SIZE; i++) { + sync = (packet->raw[i] & LCD14_SYNC_MASK) >> 4; + if (sync != (i + 1)) return FALSE; } return TRUE; } -static gboolean lcd14_is_selection_good(const lcd14_data *data) +static gboolean lcd14_is_selection_good(const struct lcd14_data *data) { - int n_postfix = 0; - int n_type = 0; - /* Does the packet have more than one multiplier ? */ - if(data->flags & LCD14_NANO) + int n_postfix = 0, n_type = 0; + + /* Does the packet have more than one multiplier? */ + if (data->flags & LCD14_NANO) n_postfix++; - if(data->flags & LCD14_MICRO) + if (data->flags & LCD14_MICRO) n_postfix++; - if(data->flags & LCD14_MILLI) + if (data->flags & LCD14_MILLI) n_postfix++; - if(data->flags & LCD14_KILO) + if (data->flags & LCD14_KILO) n_postfix++; - if(data->flags & LCD14_MEGA) + if (data->flags & LCD14_MEGA) n_postfix++; - if(n_postfix > 1) + if (n_postfix > 1) return FALSE; - /* Does the packet "measure" more than one type of value ?*/ - if(data->flags & LCD14_HZ) + /* Does the packet "measure" more than one type of value? */ + if (data->flags & LCD14_HZ) n_type++; - if(data->flags & LCD14_OHM) + if (data->flags & LCD14_OHM) n_type++; - if(data->flags & LCD14_FARAD) + if (data->flags & LCD14_FARAD) n_type++; - if(data->flags & LCD14_AMP) + if (data->flags & LCD14_AMP) n_type++; - if(data->flags & LCD14_VOLT) + if (data->flags & LCD14_VOLT) n_type++; - if(data->flags & LCD14_DUTY) + if (data->flags & LCD14_DUTY) n_type++; - if(data->flags & LCD14_CELSIUS) + if (data->flags & LCD14_CELSIUS) n_type++; - /* Do not test for hFE. hFE is not implemented and always '1' */ - if(n_type > 1) + /* Do not test for hFE. hFE is not implemented and always '1'. */ + if (n_type > 1) return FALSE; - /* Both AC and DC ? */ - if( (data->flags & LCD14_AC) && (data->flags & LCD14_DC) ) + /* Both AC and DC? */ + if ((data->flags & LCD14_AC) && (data->flags & LCD14_DC)) return FALSE; - /* OK, no duplicates */ + /* OK, no duplicates. */ return TRUE; } -/* We "cook" a raw lcd14_pcaket into a more pallatable form, lcd14_data */ -static void lcd14_cook_raw(const lcd14_packet *packet, lcd14_data * data) +/* We "cook" a raw lcd14_pcaket into a more pallatable form, lcd14_data. */ +static void lcd14_cook_raw(const struct lcd14_packet *packet, + struct lcd14_data *data) { - size_t i; + int i, j; - /* Get the digits out */ - for(i = 0; i < 4; i++) - { - size_t j = (i << 1) + 1; - data->digit[i] = ( (packet->raw[j] & ~LCD14_SYNC_MASK) << 4 ) | - ( (packet->raw[j+1] & ~LCD14_SYNC_MASK) ); + /* Get the digits out. */ + for (i = 0; i < 4; i++) { + j = (i << 1) + 1; + data->digit[i] = ((packet->raw[j] & ~LCD14_SYNC_MASK) << 4) | + ((packet->raw[j + 1] & ~LCD14_SYNC_MASK)); } - /* Now extract the flags */ - data->flags = ( (packet->raw[0] & ~LCD14_SYNC_MASK) << 20) | - ( (packet->raw[9] & ~LCD14_SYNC_MASK) << 16) | - ( (packet->raw[10]& ~LCD14_SYNC_MASK) << 12) | - ( (packet->raw[11]& ~LCD14_SYNC_MASK) << 8) | - ( (packet->raw[12]& ~LCD14_SYNC_MASK) << 4) | - ( (packet->raw[13]& ~LCD14_SYNC_MASK) ); + /* Now extract the flags. */ + data->flags = ((packet->raw[0] & ~LCD14_SYNC_MASK) << 20) | + ((packet->raw[9] & ~LCD14_SYNC_MASK) << 16) | + ((packet->raw[10] & ~LCD14_SYNC_MASK) << 12) | + ((packet->raw[11] & ~LCD14_SYNC_MASK) << 8) | + ((packet->raw[12] & ~LCD14_SYNC_MASK) << 4) | + ((packet->raw[13] & ~LCD14_SYNC_MASK)); } - -/* Since the DMM does not identify itslef in any way shape, or form, we really +/* + * Since the DMM does not identify itself in any way shape, or form, we really * don't know for sure who is sending the data. We must use every possible - * check to filter out bad packets, especially since detection mechanism depends - * on how well we can filter out bad packets packets */ -SR_PRIV gboolean lcd14_is_packet_valid(const lcd14_packet *packet, - lcd14_data *data) + * check to filter out bad packets, especially since the detection mechanism + * depends on how well we can filter out bad packets packets. + */ +SR_PRIV gboolean lcd14_is_packet_valid(const struct lcd14_packet *packet, + struct lcd14_data *data) { - /* Callers not interested in the data, pass NULL */ - lcd14_data placeholder; - if(data == NULL) + struct lcd14_data placeholder; + + /* Callers not interested in the data, pass NULL. */ + if (data == NULL) data = &placeholder; - /* We start with our syncronization nibbles, then move to more advanced - * checks */ - if(!lcd14_is_sync_valid(packet)) + + if (!lcd14_is_sync_valid(packet)) return FALSE; lcd14_cook_raw(packet, data); - if(!lcd14_is_selection_good(data)) + if (!lcd14_is_selection_good(data)) return FALSE; - /* Made it here, huh? Then this looks to be a valid packet */ + /* If we made it here, this looks to be a valid packet. */ return TRUE; } static uint8_t lcd14_to_digit(uint8_t raw_digit) { - /* Take out the decimal point, so we can use a simple switch() */ + /* Take out the decimal point, so we can use a simple switch(). */ raw_digit &= ~LCD14_DP_MASK; - switch(raw_digit) - { + + switch (raw_digit) { case 0x00: case LCD14_LCD_0: return 0; @@ -167,178 +167,169 @@ static uint8_t lcd14_to_digit(uint8_t raw_digit) } } -static double lcdraw_to_double(lcd14_data *data) +/* Get a raw floating point value from the data. */ +static double lcdraw_to_double(struct lcd14_data *data) { - /* ********************************************************************* - * Get a raw floating point value from the data - **********************************************************************/ double rawval; double multiplier = 1; - uint8_t digit; + uint8_t digit, raw_digit; gboolean dp_reached = FALSE; int i; - /* We have 4 digits, and we start from the most significant */ - for(i = 0; i < 4; i++) - { - uint8_t raw_digit = data->digit[i]; + /* We have 4 digits, and we start from the most significant. */ + for (i = 0; i < 4; i++) { + raw_digit = data->digit[i]; digit = lcd14_to_digit(raw_digit); - if(digit == LCD14_LCD_INVALID) { + if (digit == LCD14_LCD_INVALID) { rawval = NAN; break; } - /* Digit 1 does not have a decimal point. Instead, the decimal - * point is used to indicate MAX, so we must avoid testing it */ - if( (i > 0) && (raw_digit & LCD14_DP_MASK) ) + + /* + * Digit 1 does not have a decimal point. Instead, the decimal + * point is used to indicate MAX, so we must avoid testing it. + */ + if ((i > 0) && (raw_digit & LCD14_DP_MASK)) dp_reached = TRUE; - if(dp_reached) multiplier /= 10; + if (dp_reached) + multiplier /= 10; rawval = rawval * 10 + digit; } rawval *= multiplier; - if(data->digit[0] & LCD14_D0_NEG) + if (data->digit[0] & LCD14_D0_NEG) rawval *= -1; - /* See if we need to multiply our raw value by anything */ - if(data->flags & LCD14_NANO) { + /* See if we need to multiply our raw value by anything. */ + if (data->flags & LCD14_NANO) rawval *= 1E-9; - } else if(data->flags & LCD14_MICRO) { + else if (data->flags & LCD14_MICRO) rawval *= 1E-6; - } else if(data->flags & LCD14_MILLI) { + else if (data->flags & LCD14_MILLI) rawval *= 1E-3; - } else if(data->flags & LCD14_KILO) { + else if (data->flags & LCD14_KILO) rawval *= 1E3; - } else if(data->flags & LCD14_MEGA) { + else if (data->flags & LCD14_MEGA) rawval *= 1E6; - } return rawval; } -static void lcd14_handle_packet(lcd14_data *data, struct dev_context *devc) +/* Now see what the value means, and pass that on. */ +static void lcd14_handle_packet(struct lcd14_data *data, + struct dev_context *devc) { - double rawval = lcdraw_to_double(data); - /* ********************************************************************* - * Now see what the value means, and pass that on - **********************************************************************/ + double rawval; struct sr_datafeed_packet packet; struct sr_datafeed_analog *analog; - if( !(analog = g_try_malloc0(sizeof(struct sr_datafeed_analog))) ) { - sr_err("failed to malloc packet"); + if (!(analog = g_try_malloc0(sizeof(struct sr_datafeed_analog)))) { + sr_err("Failed to malloc packet."); return; } - analog->num_samples = 1; - if( !(analog->data = g_try_malloc(sizeof(float))) ) { - sr_err("failed to malloc data"); + + if (!(analog->data = g_try_malloc(sizeof(float)))) { + sr_err("Failed to malloc data."); g_free(analog); return; } + + rawval = lcdraw_to_double(data); + + analog->num_samples = 1; *analog->data = (float)rawval; + analog->mq = -1; - /* What does the data mean ? */ - if(data->flags & LCD14_VOLT) { + /* What does the data mean? */ + if (data->flags & LCD14_VOLT) { analog->mq = SR_MQ_VOLTAGE; analog->unit = SR_UNIT_VOLT; - if(data->flags & LCD14_AC) + if (data->flags & LCD14_AC) analog->mqflags |= SR_MQFLAG_AC; else analog->mqflags |= SR_MQFLAG_DC; - } - else if(data->flags & LCD14_AMP) { + } else if (data->flags & LCD14_AMP) { analog->mq = SR_MQ_CURRENT; analog->unit = SR_UNIT_AMPERE; - if(data->flags & LCD14_AC) + if (data->flags & LCD14_AC) analog->mqflags |= SR_MQFLAG_AC; else analog->mqflags |= SR_MQFLAG_DC; - } - else if(data->flags & LCD14_OHM) { - if(data->flags & LCD14_BEEP) + } else if (data->flags & LCD14_OHM) { + if (data->flags & LCD14_BEEP) analog->mq = SR_MQ_CONTINUITY; else analog->mq = SR_MQ_RESISTANCE; - if(!isnan(rawval) ) + if (!isnan(rawval)) analog->unit = SR_UNIT_OHM; else { analog->unit = SR_UNIT_BOOLEAN; *analog->data = FALSE; } - } - else if(data->flags & LCD14_FARAD) { + } else if (data->flags & LCD14_FARAD) { analog->mq = SR_MQ_CAPACITANCE; analog->unit = SR_UNIT_FARAD; - } - else if(data->flags & LCD14_CELSIUS) { + } else if (data->flags & LCD14_CELSIUS) { analog->mq = SR_MQ_TEMPERATURE; - /* No Kelvin or Fahrenheit from the deive, just Celsius */ + /* No Kelvin or Fahrenheit from the device, just Celsius. */ analog->unit = SR_UNIT_CELSIUS; - } - else if(data->flags & LCD14_HZ) { + } else if (data->flags & LCD14_HZ) { analog->mq = SR_MQ_FREQUENCY; analog->unit = SR_UNIT_HERTZ; - } - else if(data->flags & LCD14_DUTY) { + } else if (data->flags & LCD14_DUTY) { analog->mq = SR_MQ_DUTY_CYCLE; analog->unit = SR_UNIT_PERCENTAGE; - } - else if(data->flags & LCD14_HFE) { + } else if (data->flags & LCD14_HFE) { analog->mq = SR_MQ_GAIN; analog->unit = SR_UNIT_UNITLESS; - } - else if(data->flags & LCD14_DIODE) { + } else if (data->flags & LCD14_DIODE) { analog->mq = SR_MQ_VOLTAGE; analog->unit = SR_UNIT_VOLT; analog->mqflags |= SR_MQFLAG_DIODE | SR_MQFLAG_DC; - } - else { - sr_warn("unable to identify measurement mode"); + } else { + sr_warn("Unable to identify measurement mode."); } /* What other flags are associated with the data? */ - if(data->flags & LCD14_HOLD) { + if (data->flags & LCD14_HOLD) analog->mqflags |= SR_MQFLAG_HOLD; - } - if(data->flags & LCD14_AUTO) { + if (data->flags & LCD14_AUTO) analog->mqflags |= SR_MQFLAG_AUTORANGE; - } - if(data->flags & LCD14_REL) { + if (data->flags & LCD14_REL) analog->mqflags |= SR_MQFLAG_RELATIVE; - } if (analog->mq != -1) { /* Got a measurement. */ - sr_spew("val %f", rawval); + sr_spew("Measurement value is %f.", rawval); packet.type = SR_DF_ANALOG; packet.payload = analog; sr_session_send(devc->cb_data, &packet); devc->num_samples++; } + g_free(analog->data); g_free(analog); } static void handle_new_data(struct dev_context *devc, int fd) { - int len; - size_t i; - size_t offset = 0; - /* Try to get as much data as the buffer can hold */ + int len, i, offset = 0; + struct lcd14_packet *packet; + struct lcd14_data data; + + /* Try to get as much data as the buffer can hold. */ len = DMM_BUFSIZE - devc->buflen; len = serial_read(fd, devc->buf + devc->buflen, len); if (len < 1) { - sr_err("serial port read error!"); + sr_err("Serial port read error: %d.", len); return; } devc->buflen += len; - /* Now look for packets in that data */ - while((devc->buflen - offset) >= LCD14_PACKET_SIZE) - { - lcd14_packet * packet = (void *)(devc->buf + offset); - lcd14_data data; - if( lcd14_is_packet_valid(packet, &data) ) - { + /* Now look for packets in that data. */ + while ((devc->buflen - offset) >= LCD14_PACKET_SIZE) { + packet = (void *)(devc->buf + offset); + if (lcd14_is_packet_valid(packet, &data)) { lcd14_handle_packet(&data, devc); offset += LCD14_PACKET_SIZE; } else { @@ -346,13 +337,13 @@ static void handle_new_data(struct dev_context *devc, int fd) } } - /* If we have any data left, move it to the beginning of our buffer */ - for(i = 0; i < devc->buflen - offset; i++) + /* If we have any data left, move it to the beginning of our buffer. */ + for (i = 0; i < devc->buflen - offset; i++) devc->buf[i] = devc->buf[offset + i]; devc->buflen -= offset; } -SR_PRIV int lcd14_receive_data(int fd, int revents, void *cb_data) +SR_PRIV int tekpower_dmm_receive_data(int fd, int revents, void *cb_data) { const struct sr_dev_inst *sdi; struct dev_context *devc; @@ -363,8 +354,7 @@ SR_PRIV int lcd14_receive_data(int fd, int revents, void *cb_data) if (!(devc = sdi->priv)) return TRUE; - if (revents == G_IO_IN) - { + if (revents == G_IO_IN) { /* Serial data arrived. */ handle_new_data(devc, fd); } diff --git a/hardware/tekpower-dmm/protocol.h b/hardware/tekpower-dmm/protocol.h index 71dd1d2d..7a66e019 100644 --- a/hardware/tekpower-dmm/protocol.h +++ b/hardware/tekpower-dmm/protocol.h @@ -29,86 +29,87 @@ #define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args) #define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args) -#define DMM_BUFSIZE 256 +#define DMM_BUFSIZE 256 /* Flags present in the packet */ -#define LCD14_AC (1<<23) -#define LCD14_DC (1<<22) -#define LCD14_AUTO (1<<21) -#define LCD14_RS232 (1<<20) -#define LCD14_MICRO (1<<19) -#define LCD14_NANO (1<<18) -#define LCD14_KILO (1<<17) -#define LCD14_DIODE (1<<16) -#define LCD14_MILLI (1<<15) -#define LCD14_DUTY (1<<14) -#define LCD14_MEGA (1<<13) -#define LCD14_BEEP (1<<12) -#define LCD14_FARAD (1<<11) -#define LCD14_OHM (1<<10) -#define LCD14_REL (1<< 9) -#define LCD14_HOLD (1<< 8) -#define LCD14_AMP (1<< 7) -#define LCD14_VOLT (1<< 6) -#define LCD14_HZ (1<< 5) -#define LCD14_LOW_BATT (1<< 4) -#define LCD14_HFE (1<< 3) -#define LCD14_CELSIUS (1<< 2) -#define LCD14_RSVD1 (1<< 1) -#define LCD14_RSVD0 (0<< 0) +#define LCD14_AC (1 << 23) +#define LCD14_DC (1 << 22) +#define LCD14_AUTO (1 << 21) +#define LCD14_RS232 (1 << 20) +#define LCD14_MICRO (1 << 19) +#define LCD14_NANO (1 << 18) +#define LCD14_KILO (1 << 17) +#define LCD14_DIODE (1 << 16) +#define LCD14_MILLI (1 << 15) +#define LCD14_DUTY (1 << 14) +#define LCD14_MEGA (1 << 13) +#define LCD14_BEEP (1 << 12) +#define LCD14_FARAD (1 << 11) +#define LCD14_OHM (1 << 10) +#define LCD14_REL (1 << 9) +#define LCD14_HOLD (1 << 8) +#define LCD14_AMP (1 << 7) +#define LCD14_VOLT (1 << 6) +#define LCD14_HZ (1 << 5) +#define LCD14_LOW_BATT (1 << 4) +#define LCD14_HFE (1 << 3) +#define LCD14_CELSIUS (1 << 2) +#define LCD14_RSVD1 (1 << 1) +#define LCD14_RSVD0 (0 << 0) -/* mask to remove the decimal point from a digit */ -#define LCD14_DP_MASK (0x80) -#define LCD14_D0_NEG LCD14_DP_MASK -/* mask to remove the syncronization nibble */ -#define LCD14_SYNC_MASK (0xF0) +/* Mask used to remove the decimal point from a digit. */ +#define LCD14_DP_MASK 0x80 +#define LCD14_D0_NEG LCD14_DP_MASK +/* Mask used to remove the syncronization nibble. */ +#define LCD14_SYNC_MASK 0xf0 /* What the LCD values represent */ -#define LCD14_LCD_0 0x7d -#define LCD14_LCD_1 0x05 -#define LCD14_LCD_2 0x5b -#define LCD14_LCD_3 0x1f -#define LCD14_LCD_4 0x27 -#define LCD14_LCD_5 0x3e -#define LCD14_LCD_6 0x7e -#define LCD14_LCD_7 0x15 -#define LCD14_LCD_8 0x7f -#define LCD14_LCD_9 0x3f - +#define LCD14_LCD_0 0x7d +#define LCD14_LCD_1 0x05 +#define LCD14_LCD_2 0x5b +#define LCD14_LCD_3 0x1f +#define LCD14_LCD_4 0x27 +#define LCD14_LCD_5 0x3e +#define LCD14_LCD_6 0x7e +#define LCD14_LCD_7 0x15 +#define LCD14_LCD_8 0x7f +#define LCD14_LCD_9 0x3f #define LCD14_LCD_INVALID 0xff -typedef struct { - uint8_t raw[14]; -} lcd14_packet; +#define LCD14_PACKET_SIZE 14 -typedef struct { +struct lcd14_packet { + uint8_t raw[LCD14_PACKET_SIZE]; +}; + +struct lcd14_data { uint8_t digit[4]; uint32_t flags; -} lcd14_data; +}; -#define LCD14_PACKET_SIZE (sizeof(lcd14_packet)) +SR_PRIV gboolean lcd14_is_packet_valid(const struct lcd14_packet *packet, + struct lcd14_data *data); -SR_PRIV gboolean lcd14_is_packet_valid(const lcd14_packet *packet, - lcd14_data *data); - -/* Private, per-device-instance driver context. */ +/** Private, per-device-instance driver context. */ struct dev_context { + /** The current sampling limit (in number of samples). */ uint64_t limit_samples; + + /** Opaque pointer passed in by the frontend. */ + void *cb_data; + + /** The current number of already received samples. */ + uint64_t num_samples; + struct sr_serial_dev_inst *serial; char *serialcomm; - /* Opaque pointer passed in by the frontend. */ - void *cb_data; - - /* Runtime. */ - uint64_t num_samples; uint8_t buf[DMM_BUFSIZE]; - size_t bufoffset; - size_t buflen; + int bufoffset; + int buflen; }; +SR_PRIV int tekpower_dmm_receive_data(int fd, int revents, void *cb_data); -SR_PRIV int lcd14_receive_data(int fd, int revents, void *cb_data); - -#endif /* LIBSIGROK_HARDWARE_TEKPOWER_DMM_PROTOCOL_H */ +#endif diff --git a/hwdriver.c b/hwdriver.c index 33d6b4a5..a5bb1ea9 100644 --- a/hwdriver.c +++ b/hwdriver.c @@ -108,7 +108,7 @@ extern SR_PRIV struct sr_dev_driver flukedmm_driver_info; extern SR_PRIV struct sr_dev_driver radioshackdmm_driver_info; #endif #ifdef HAVE_HW_TEKPOWER_DMM -extern SR_PRIV struct sr_dev_driver tekpower_driver_info; +extern SR_PRIV struct sr_dev_driver tekpower_dmm_driver_info; #endif /** @endcond */ @@ -153,7 +153,7 @@ static struct sr_dev_driver *drivers_list[] = { &radioshackdmm_driver_info, #endif #ifdef HAVE_HW_TEKPOWER_DMM - &tekpower_driver_info, + &tekpower_dmm_driver_info, #endif NULL, };