X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Ftekpower-dmm%2Fprotocol.c;h=f1d01feeff42a7b425c5f9d988d0cee0c4e57c30;hb=39e5d79826cd2c1991007faf1a6cde05af995aa9;hp=bb52e00c9a596cb250ed11ea4ae2273e5c88dd5f;hpb=be5c1d3b52a4c774bdd182ba54225a234d55336f;p=libsigrok.git diff --git a/hardware/tekpower-dmm/protocol.c b/hardware/tekpower-dmm/protocol.c index bb52e00c..f1d01fee 100644 --- a/hardware/tekpower-dmm/protocol.c +++ b/hardware/tekpower-dmm/protocol.c @@ -26,21 +26,35 @@ #include "libsigrok-internal.h" #include "protocol.h" +/* User-defined FS9721_LP3 flag 'c2c1_10' means temperature on this DMM. */ +#define is_temperature info.is_c2c1_10 + +static void log_dmm_packet(const uint8_t *buf) +{ + sr_dbg("DMM packet: %02x %02x %02x %02x %02x %02x %02x" + " %02x %02x %02x %02x %02x %02x %02x", + buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], + buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13]); +} + /* Now see what the value means, and pass that on. */ -static void fs9721_serial_handle_packet(const struct fs9721_data *data, +static void fs9721_serial_handle_packet(const uint8_t *buf, struct dev_context *devc) { - float rawval; + float floatval; struct sr_datafeed_packet packet; struct sr_datafeed_analog *analog; + struct fs9721_info info; + + log_dmm_packet(buf); if (!(analog = g_try_malloc0(sizeof(struct sr_datafeed_analog)))) { - sr_err("Failed to malloc packet."); + sr_err("Analog packet malloc failed."); return; } if (!(analog->data = g_try_malloc(sizeof(float)))) { - sr_err("Failed to malloc data."); + sr_err("Analog value malloc failed."); g_free(analog); return; } @@ -48,16 +62,15 @@ static void fs9721_serial_handle_packet(const struct fs9721_data *data, analog->num_samples = 1; analog->mq = -1; - sr_dmm_smart_parse_fs9721(data, &rawval, analog); - *analog->data = rawval; + sr_fs9721_parse(buf, &floatval, analog, &info); + *analog->data = floatval; - if (data->flags & FLAG_TEMP_CELSIUS) { + if (is_temperature) { analog->mq = SR_MQ_TEMPERATURE; /* No Kelvin or Fahrenheit from the device, just Celsius. */ analog->unit = SR_UNIT_CELSIUS; } - if (analog->mq != -1) { /* Got a measurement. */ packet.type = SR_DF_ANALOG; @@ -70,15 +83,13 @@ static void fs9721_serial_handle_packet(const struct fs9721_data *data, g_free(analog); } -static void handle_new_data(struct dev_context *devc, int fd) +static void handle_new_data(struct dev_context *devc) { int len, i, offset = 0; - struct fs9721_packet *packet; - struct fs9721_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); + len = serial_read(devc->serial, devc->buf + devc->buflen, len); if (len < 1) { sr_err("Serial port read error: %d.", len); return; @@ -87,9 +98,8 @@ static void handle_new_data(struct dev_context *devc, int fd) /* Now look for packets in that data. */ while ((devc->buflen - offset) >= FS9721_PACKET_SIZE) { - packet = (void *)(devc->buf + offset); - if (fs9721_is_packet_valid(packet, &data)) { - fs9721_serial_handle_packet(&data, devc); + if (sr_fs9721_packet_valid(devc->buf + offset)) { + fs9721_serial_handle_packet(devc->buf + offset, devc); offset += FS9721_PACKET_SIZE; } else { offset++; @@ -104,9 +114,11 @@ static void handle_new_data(struct dev_context *devc, int fd) SR_PRIV int tekpower_dmm_receive_data(int fd, int revents, void *cb_data) { - const struct sr_dev_inst *sdi; + struct sr_dev_inst *sdi; struct dev_context *devc; + (void)fd; + if (!(sdi = cb_data)) return TRUE; @@ -115,10 +127,11 @@ SR_PRIV int tekpower_dmm_receive_data(int fd, int revents, void *cb_data) if (revents == G_IO_IN) { /* Serial data arrived. */ - handle_new_data(devc, fd); + handle_new_data(devc); } if (devc->num_samples >= devc->limit_samples) { + sr_info("Requested number of samples reached, stopping."); sdi->driver->dev_acquisition_stop(sdi, cb_data); return TRUE; }