]> sigrok.org Git - libsigrok.git/blobdiff - hardware/rigol-ds1xx2/protocol.c
rigol-ds1xx2: fix channel numbers
[libsigrok.git] / hardware / rigol-ds1xx2 / protocol.c
index d8b0de720e4071abb1c8fbd4fe14ef61bc5b0ce9..19e402c386c4b60aff34c957061b1fd862107ad7 100644 (file)
@@ -2,6 +2,7 @@
  * This file is part of the libsigrok project.
  *
  * Copyright (C) 2012 Martin Ling <martin-git@earth.li>
+ * Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
  *
  * 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
@@ -21,6 +22,7 @@
 #include <stdarg.h>
 #include <unistd.h>
 #include <errno.h>
+#include <string.h>
 #include <glib.h>
 #include "libsigrok.h"
 #include "libsigrok-internal.h"
@@ -44,11 +46,19 @@ SR_PRIV int rigol_ds1xx2_receive_data(int fd, int revents, void *cb_data)
 
        if (revents == G_IO_IN) {
                len = read(fd, buf, WAVEFORM_SIZE);
-               sr_dbg("received %d", len);
+               sr_dbg("Received %d bytes.", len);
                if (len == -1)
                        return TRUE;
+
+               if (devc->num_frame_samples == 0) {
+                       /* Start of a new frame. */
+                       packet.type = SR_DF_FRAME_BEGIN;
+                       sr_session_send(sdi, &packet);
+               }
+
                for (i = 0; i < len; i++)
                        data[i] = devc->scale / 25.6 * (128 - buf[i]) - devc->offset;
+               analog.probes = devc->enabled_probes;
                analog.num_samples = len;
                analog.data = data;
                analog.mq = SR_MQ_VOLTAGE;
@@ -57,10 +67,17 @@ SR_PRIV int rigol_ds1xx2_receive_data(int fd, int revents, void *cb_data)
                packet.type = SR_DF_ANALOG;
                packet.payload = &analog;
                sr_session_send(cb_data, &packet);
-               if (++devc->num_frames == devc->limit_frames)
-                       sdi->driver->dev_acquisition_stop(sdi, cb_data);
-               else
-                       rigol_ds1xx2_send_data(fd, ":WAV:DATA?\n");
+
+               if (len == WAVEFORM_SIZE) {
+                       /* End of the frame. */
+                       packet.type = SR_DF_FRAME_END;
+                       sr_session_send(sdi, &packet);
+
+                       if (++devc->num_frames == devc->limit_frames)
+                               sdi->driver->dev_acquisition_stop(sdi, cb_data);
+                       else
+                               rigol_ds1xx2_send_data(fd, ":WAV:DATA?");
+               }
        }
 
        return TRUE;
@@ -70,10 +87,22 @@ SR_PRIV int rigol_ds1xx2_send_data(int fd, const char *format, ...)
 {
        va_list args;
        char buf[256];
+       int len, out, ret;
+
        va_start(args, format);
-       int len = vsprintf(buf, format, args);
+       len = vsprintf(buf, format, args);
        va_end(args);
-       len = write(fd, buf, len);
-       sr_dbg("sent %s", buf);
-       return len;
+       strcat(buf, "\n");
+       len++;
+       out = write(fd, buf, len);
+       buf[len - 1] = '\0';
+       if (out != len) {
+               sr_dbg("Only sent %d/%d bytes of '%s'.", out, len, buf);
+               ret = SR_ERR;
+       } else {
+               sr_dbg("Sent '%s'.", buf);
+               ret = SR_OK;
+       }
+
+       return ret;
 }