]> sigrok.org Git - libsigrok.git/blobdiff - hardware/tekpower-dmm/protocol.c
serial: RTS/DTR support on Windows/MinGW.
[libsigrok.git] / hardware / tekpower-dmm / protocol.c
index bb52e00c9a596cb250ed11ea4ae2273e5c88dd5f..f1d01feeff42a7b425c5f9d988d0cee0c4e57c30 100644 (file)
 #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;
        }