]> sigrok.org Git - libsigrok.git/blobdiff - hardware/rigol-ds1xx2/protocol.c
rigol-ds1xx2: properly send frame begin/end packets
[libsigrok.git] / hardware / rigol-ds1xx2 / protocol.c
index e03bc1fc359aba340300762a7f249868986f9fb8..161e73bbf0a65d5e26cc5788626bf34804d9c3aa 100644 (file)
@@ -18,6 +18,9 @@
  */
 
 #include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
 #include <glib.h>
 #include "libsigrok.h"
 #include "libsigrok-internal.h"
 
 SR_PRIV int rigol_ds1xx2_receive_data(int fd, int revents, void *cb_data)
 {
-       const struct sr_dev_inst *sdi;
+       struct sr_dev_inst *sdi;
        struct dev_context *devc;
+       struct sr_datafeed_packet packet;
+       struct sr_datafeed_analog analog;
+       unsigned char buf[WAVEFORM_SIZE];
+       float data[WAVEFORM_SIZE];
+       int len, i;
 
        if (!(sdi = cb_data))
                return TRUE;
@@ -35,8 +43,55 @@ SR_PRIV int rigol_ds1xx2_receive_data(int fd, int revents, void *cb_data)
                return TRUE;
 
        if (revents == G_IO_IN) {
-               /* TODO */
+               len = read(fd, buf, WAVEFORM_SIZE);
+               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;
+               analog.unit = SR_UNIT_VOLT;
+               analog.mqflags = 0;
+               packet.type = SR_DF_ANALOG;
+               packet.payload = &analog;
+               sr_session_send(cb_data, &packet);
+
+               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?\n");
+               }
        }
 
        return TRUE;
 }
+
+SR_PRIV int rigol_ds1xx2_send_data(int fd, const char *format, ...)
+{
+       va_list args;
+       char buf[256];
+       int len;
+
+       va_start(args, format);
+       len = vsprintf(buf, format, args);
+       va_end(args);
+       len = write(fd, buf, len);
+       sr_dbg("Sent '%s'.", buf);
+
+       return len;
+}