]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/lecroy-xstream/protocol.c
lecroy-xstream: Perform acquisition if no data is available
[libsigrok.git] / src / hardware / lecroy-xstream / protocol.c
index f1f69fc5d40e192cbbe3cc4914ec9b73a1fe2910..1f421913f3d48328360558965069bc1575f65114 100644 (file)
@@ -620,6 +620,7 @@ static int lecroy_waveform_to_analog(GByteArray *data,
 
 SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data)
 {
+       char command[MAX_COMMAND_SIZE];
        struct sr_channel *ch;
        struct sr_dev_inst *sdi;
        struct dev_context *devc;
@@ -644,21 +645,12 @@ SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data)
 
        ch = devc->current_channel->data;
 
-       /*
-        * Send "frame begin" packet upon reception of data for the
-        * first enabled channel.
-        */
-       if (devc->current_channel == devc->enabled_channels) {
-               packet.type = SR_DF_FRAME_BEGIN;
-               sr_session_send(sdi, &packet);
-       }
-
        if (ch->type != SR_CHANNEL_ANALOG)
                return SR_ERR;
 
        /* Pass on the received data of the channel(s). */
        if (sr_scpi_read_data(sdi->conn, buf, 4) != 4) {
-               sr_err("Reading header failed.");
+               sr_err("Reading header failed, scope probably didn't send any data.");
                return TRUE;
        }
 
@@ -675,6 +667,22 @@ SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data)
        if (lecroy_waveform_to_analog(data, &analog) != SR_OK)
                return SR_ERR;
 
+       if (analog.num_samples == 0) {
+               /* No data available, we have to acquire data first. */
+               g_snprintf(command, sizeof(command), "ARM;WAIT;*OPC;C%d:WAVEFORM?", ch->index + 1);
+               sr_scpi_send(sdi->conn, command);
+               return TRUE;
+       }
+
+       /*
+        * Send "frame begin" packet upon reception of data for the
+        * first enabled channel.
+        */
+       if (devc->current_channel == devc->enabled_channels) {
+               packet.type = SR_DF_FRAME_BEGIN;
+               sr_session_send(sdi, &packet);
+       }
+
        meaning.channels = g_slist_append(NULL, ch);
        packet.payload = &analog;
        packet.type = SR_DF_ANALOG;