]> sigrok.org Git - libsigrok.git/blob - src/hardware/siglent-sds/protocol.c
8fced83afddd1a55b6549cf29770fc0fba584b4f
[libsigrok.git] / src / hardware / siglent-sds / protocol.c
1 /*
2  * This file is part of the libsigrok project.
3  *
4  * Copyright (C) 2016 mhooijboer <marchelh@gmail.com>
5  * Copyright (C) 2012 Martin Ling <martin-git@earth.li>
6  * Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
7  * Copyright (C) 2013 Mathias Grimmberger <mgri@zaphod.sax.de>
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  */
22
23 #define _GNU_SOURCE
24
25 #include <config.h>
26 #include <errno.h>
27 #include <glib.h>
28 #include <math.h>
29 #include <stdlib.h>
30 #include <stdarg.h>
31 #include <string.h>
32 #include <time.h>
33 #include <unistd.h>
34 #include <libsigrok/libsigrok.h>
35 #include "libsigrok-internal.h"
36 #include "scpi.h"
37 #include "protocol.h"
38
39 /* Set the next event to wait for in siglent_sds_receive(). */
40 static void siglent_sds_set_wait_event(struct dev_context *devc, enum wait_events event)
41 {
42         if (event == WAIT_STOP) {
43                 devc->wait_status = 2;
44         } else {
45                 devc->wait_status = 1;
46                 devc->wait_event = event;
47         }
48 }
49
50 /*
51  * Waiting for a event will return a timeout after 2 to 3 seconds in order
52  * to not block the application.
53  */
54 static int siglent_sds_event_wait(const struct sr_dev_inst *sdi)
55 {
56         char *buf;
57         long s;
58         int out;
59         struct dev_context *devc;
60         time_t start;
61
62         if (!(devc = sdi->priv))
63                 return SR_ERR;
64
65         start = time(NULL);
66
67         s = 10000; /* Sleep time for status refresh. */
68         if (devc->wait_status == 1) {
69                 do {
70                         if (time(NULL) - start >= 3) {
71                                 sr_dbg("Timeout waiting for trigger.");
72                                 return SR_ERR_TIMEOUT;
73                         }
74
75                         if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK)
76                                 return SR_ERR;
77                         sr_atoi(buf, &out);
78                         g_usleep(s);
79                 } while (out == 0);
80
81                 sr_dbg("Device triggered.");
82
83                 if ((devc->timebase < 0.51) && (devc->timebase > 0.99e-6)) {
84                         /*
85                          * Timebase * num hor. divs * 85(%) * 1e6(usecs) / 100
86                          * -> 85 percent of sweep time
87                          */
88                         s = (devc->timebase * devc->model->series->num_horizontal_divs * 1000);
89                         sr_spew("Sleeping for %ld usecs after trigger, "
90                                 "to let the acq buffer in the device fill", s);
91                         g_usleep(s);
92                 }
93         }
94         if (devc->wait_status == 2) {
95                 do {
96                         if (time(NULL) - start >= 3) {
97                                 sr_dbg("Timeout waiting for trigger.");
98                                 return SR_ERR_TIMEOUT;
99                         }
100                         if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK)
101                                 return SR_ERR;
102                         sr_atoi(buf, &out);
103                         g_usleep(s);
104                 /* XXX
105                  * Now this loop condition looks suspicious! A bitwise
106                  * OR of a variable and a non-zero literal should be
107                  * non-zero. Logical AND of several non-zero values
108                  * should be non-zero. Are many parts of the condition
109                  * not taking effect? Was some different condition meant
110                  * to get encoded? This needs review, and adjustment.
111                  */
112                 } while (out != DEVICE_STATE_TRIG_RDY || out != DEVICE_STATE_DATA_TRIG_RDY || out != DEVICE_STATE_STOPPED);
113
114                 sr_dbg("Device triggered.");
115
116                 siglent_sds_set_wait_event(devc, WAIT_NONE);
117         }
118
119         return SR_OK;
120 }
121
122 static int siglent_sds_trigger_wait(const struct sr_dev_inst *sdi)
123 {
124         struct dev_context *devc;
125
126         if (!(devc = sdi->priv))
127                 return SR_ERR;
128         return siglent_sds_event_wait(sdi);
129 }
130
131 /* Wait for scope to got to "Stop" in single shot mode. */
132 static int siglent_sds_stop_wait(const struct sr_dev_inst *sdi)
133 {
134         return siglent_sds_event_wait(sdi);
135 }
136
137 /* Send a configuration setting. */
138 SR_PRIV int siglent_sds_config_set(const struct sr_dev_inst *sdi, const char *format, ...)
139 {
140         va_list args;
141         int ret;
142
143         va_start(args, format);
144         ret = sr_scpi_send_variadic(sdi->conn, format, args);
145         va_end(args);
146
147         return ret;
148 }
149
150 /* Start capturing a new frameset. */
151 SR_PRIV int siglent_sds_capture_start(const struct sr_dev_inst *sdi)
152 {
153         struct dev_context *devc;
154
155         if (!(devc = sdi->priv))
156                 return SR_ERR;
157
158         switch (devc->model->series->protocol) {
159         case SPO_MODEL:
160                 if (devc->data_source == DATA_SOURCE_SCREEN) {
161                         char *buf;
162                         int out;
163
164                         sr_dbg("Starting data capture for active frameset %" PRIu64 " of %" PRIu64,
165                                 devc->num_frames + 1, devc->limit_frames);
166                         if (siglent_sds_config_set(sdi, "ARM") != SR_OK)
167                                 return SR_ERR;
168                         if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK)
169                                 return SR_ERR;
170                         sr_atoi(buf, &out);
171                         if (out == DEVICE_STATE_TRIG_RDY) {
172                                 siglent_sds_set_wait_event(devc, WAIT_TRIGGER);
173                         } else if (out == DEVICE_STATE_DATA_TRIG_RDY) {
174                                 sr_spew("Device triggered.");
175                                 siglent_sds_set_wait_event(devc, WAIT_BLOCK);
176                                 return SR_OK;
177                         } else {
178                                 sr_spew("Device did not enter ARM mode.");
179                                 return SR_ERR;
180                         }
181                 } else { /* TODO: Implement history retrieval. */
182                         unsigned int framecount;
183                         char buf[200];
184                         int ret;
185
186                         sr_dbg("Starting data capture for history frameset.");
187                         if (siglent_sds_config_set(sdi, "FPAR?") != SR_OK)
188                                 return SR_ERR;
189                         ret = sr_scpi_read_data(sdi->conn, buf, 200);
190                         if (ret < 0) {
191                                 sr_err("Read error while reading data header.");
192                                 return SR_ERR;
193                         }
194                         memcpy(&framecount, buf + 40, 4);
195                         if (devc->limit_frames > framecount)
196                                 sr_err("Frame limit higher than frames in buffer of device!");
197                         else if (devc->limit_frames == 0)
198                                 devc->limit_frames = framecount;
199                         sr_dbg("Starting data capture for history frameset %" PRIu64 " of %" PRIu64,
200                                 devc->num_frames + 1, devc->limit_frames);
201                         if (siglent_sds_config_set(sdi, "FRAM %i", devc->num_frames + 1) != SR_OK)
202                                 return SR_ERR;
203                         if (siglent_sds_channel_start(sdi) != SR_OK)
204                                 return SR_ERR;
205                         siglent_sds_set_wait_event(devc, WAIT_STOP);
206                 }
207                 break;
208         case ESERIES:
209                 if (devc->data_source == DATA_SOURCE_SCREEN) {
210                         char *buf;
211                         int out;
212
213                         sr_dbg("Starting data capture for active frameset %" PRIu64 " of %" PRIu64,
214                                 devc->num_frames + 1, devc->limit_frames);
215                         if (siglent_sds_config_set(sdi, "ARM") != SR_OK)
216                                 return SR_ERR;
217                         if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK)
218                                 return SR_ERR;
219                         sr_atoi(buf, &out);
220                         if (out == DEVICE_STATE_TRIG_RDY) {
221                                 siglent_sds_set_wait_event(devc, WAIT_TRIGGER);
222                         } else if (out == DEVICE_STATE_DATA_TRIG_RDY) {
223                                 sr_spew("Device triggered.");
224                                 siglent_sds_set_wait_event(devc, WAIT_BLOCK);
225                                 return SR_OK;
226                         } else {
227                                 sr_spew("Device did not enter ARM mode.");
228                                 return SR_ERR;
229                         }
230                 } else { /* TODO: Implement history retrieval. */
231                         unsigned int framecount;
232                         char buf[200];
233                         int ret;
234
235                         sr_dbg("Starting data capture for history frameset.");
236                         if (siglent_sds_config_set(sdi, "FPAR?") != SR_OK)
237                                 return SR_ERR;
238                         ret = sr_scpi_read_data(sdi->conn, buf, 200);
239                         if (ret < 0) {
240                                 sr_err("Read error while reading data header.");
241                                 return SR_ERR;
242                         }
243                         memcpy(&framecount, buf + 40, 4);
244                         if (devc->limit_frames > framecount)
245                                 sr_err("Frame limit higher than frames in buffer of device!");
246                         else if (devc->limit_frames == 0)
247                                 devc->limit_frames = framecount;
248                         sr_dbg("Starting data capture for history frameset %" PRIu64 " of %" PRIu64,
249                                 devc->num_frames + 1, devc->limit_frames);
250                         if (siglent_sds_config_set(sdi, "FRAM %i", devc->num_frames + 1) != SR_OK)
251                                 return SR_ERR;
252                         if (siglent_sds_channel_start(sdi) != SR_OK)
253                                 return SR_ERR;
254                         siglent_sds_set_wait_event(devc, WAIT_STOP);
255                 }
256                 break;
257         case NON_SPO_MODEL:
258                 siglent_sds_set_wait_event(devc, WAIT_TRIGGER);
259                 break;
260         }
261
262         return SR_OK;
263 }
264
265 /* Start reading data from the current channel. */
266 SR_PRIV int siglent_sds_channel_start(const struct sr_dev_inst *sdi)
267 {
268         struct dev_context *devc;
269         struct sr_channel *ch;
270         const char *s;
271
272         if (!(devc = sdi->priv))
273                 return SR_ERR;
274
275         ch = devc->channel_entry->data;
276
277         sr_dbg("Start reading data from channel %s.", ch->name);
278
279         switch (devc->model->series->protocol) {
280         case NON_SPO_MODEL:
281         case SPO_MODEL:
282                 s = (ch->type == SR_CHANNEL_LOGIC) ? "D%d:WF?" : "C%d:WF? ALL";
283                 if (sr_scpi_send(sdi->conn, s, ch->index + 1) != SR_OK)
284                         return SR_ERR;
285                 siglent_sds_set_wait_event(devc, WAIT_NONE);
286                 break;
287         case ESERIES:
288                 if (ch->type == SR_CHANNEL_ANALOG) {
289                         if (sr_scpi_send(sdi->conn, "C%d:WF? ALL",
290                                 ch->index + 1) != SR_OK)
291                                 return SR_ERR;
292                 }
293                 siglent_sds_set_wait_event(devc, WAIT_NONE);
294                 if (sr_scpi_read_begin(sdi->conn) != SR_OK)
295                         return TRUE;
296                 siglent_sds_set_wait_event(devc, WAIT_BLOCK);
297                 break;
298         }
299
300         devc->num_channel_bytes = 0;
301         devc->num_header_bytes = 0;
302         devc->num_block_bytes = 0;
303
304         return SR_OK;
305 }
306
307 /* Read the header of a data block. */
308 static int siglent_sds_read_header(struct sr_dev_inst *sdi)
309 {
310         struct sr_scpi_dev_inst *scpi = sdi->conn;
311         struct dev_context *devc = sdi->priv;
312         char *buf = (char *)devc->buffer;
313         int ret, desc_length;
314         int block_offset = 15; /* Offset for descriptor block. */
315         long data_length = 0;
316
317         /* Read header from device. */
318         ret = sr_scpi_read_data(scpi, buf, SIGLENT_HEADER_SIZE);
319         if (ret < SIGLENT_HEADER_SIZE) {
320                 sr_err("Read error while reading data header.");
321                 return SR_ERR;
322         }
323         sr_dbg("Device returned %i bytes.", ret);
324         devc->num_header_bytes += ret;
325         buf += block_offset; /* Skip to start descriptor block. */
326
327         /* Parse WaveDescriptor header. */
328         memcpy(&desc_length, buf + 36, 4); /* Descriptor block length */
329         memcpy(&data_length, buf + 60, 4); /* Data block length */
330
331         devc->block_header_size = desc_length + 15;
332         devc->num_samples = data_length;
333
334         sr_dbg("Received data block header: '%s' -> block length %d.", buf, ret);
335
336         return ret;
337 }
338
339 static int siglent_sds_get_digital(const struct sr_dev_inst *sdi, struct sr_channel *ch)
340 {
341         struct sr_scpi_dev_inst *scpi = sdi->conn;
342         struct dev_context *devc = sdi->priv;
343         GArray *tmp_samplebuf; /* Temp buffer while iterating over the scope samples */
344         char *buf = (char *)devc->buffer; /* Buffer from scope */
345         uint8_t tmp_value; /* Holding temp value from data */
346         GArray *data_low_channels, *data_high_channels, *buffdata;
347         GSList *l;
348         gboolean low_channels; /* Lower channels enabled */
349         gboolean high_channels; /* Higher channels enabled */
350         int len, channel_index;
351         uint64_t samples_index;
352
353         len = 0;
354         channel_index = 0;
355         low_channels = FALSE;
356         high_channels = FALSE;
357         data_low_channels = g_array_new(FALSE, TRUE, sizeof(uint8_t));
358         data_high_channels = g_array_new(FALSE, TRUE, sizeof(uint8_t));
359
360         for (l = sdi->channels; l; l = l->next) {
361                 ch = l->data;
362                 samples_index = 0;
363                 if (ch->type == SR_CHANNEL_LOGIC) {
364                         if (ch->enabled) {
365                                 if (sr_scpi_send(sdi->conn, "D%d:WF? DAT2", ch->index) != SR_OK)
366                                         return SR_ERR;
367                                 if (sr_scpi_read_begin(scpi) != SR_OK)
368                                         return TRUE;
369                                 len = sr_scpi_read_data(scpi, buf, -1);
370                                 if (len < 0)
371                                         return TRUE;
372                                 len -= 15;
373                                 buffdata = g_array_sized_new(FALSE, FALSE, sizeof(uint8_t), len);
374                                 buf += 15; /* Skipping the data header. */
375                                 g_array_append_vals(buffdata, buf, len);
376                                 tmp_samplebuf = g_array_sized_new(FALSE, FALSE, sizeof(uint8_t), len); /* New temp buffer. */
377                                 for (uint64_t cur_sample_index = 0; cur_sample_index < devc->memory_depth_digital; cur_sample_index++) {
378                                         char sample = (char)g_array_index(buffdata, uint8_t, cur_sample_index);
379                                         for (int ii = 0; ii < 8; ii++, sample >>= 1) {
380                                                 if (ch->index < 8) {
381                                                         channel_index = ch->index;
382                                                         if (data_low_channels->len <= samples_index) {
383                                                                 tmp_value = 0; /* New sample. */
384                                                                 low_channels = TRUE; /* We have at least one enabled low channel. */
385                                                         } else {
386                                                                 /* Get previous stored sample from low channel buffer. */
387                                                                 tmp_value = g_array_index(data_low_channels, uint8_t, samples_index);
388                                                         }
389                                                 } else {
390                                                         channel_index = ch->index - 8;
391                                                         if (data_high_channels->len <= samples_index) {
392                                                                 tmp_value = 0; /* New sample. */
393                                                                 high_channels = TRUE; /* We have at least one enabled high channel. */
394                                                         } else {
395                                                                 /* Get previous stored sample from high channel buffer. */
396                                                                 tmp_value = g_array_index(data_high_channels, uint8_t, samples_index);
397                                                         }
398                                                 }
399                                                 /* Check if the current scope sample bit is set. */
400                                                 if (sample & 0x1)
401                                                         tmp_value |= 1UL << channel_index; /* Set current scope sample bit based on channel index. */
402                                                 g_array_append_val(tmp_samplebuf, tmp_value);
403                                                 samples_index++;
404                                         }
405                                 }
406
407                                 /* Clear the buffers to prepare for the new samples */
408                                 if (ch->index < 8) {
409                                         g_array_free(data_low_channels, FALSE);
410                                         data_low_channels = g_array_new(FALSE, FALSE, sizeof(uint8_t));
411                                 } else {
412                                         g_array_free(data_high_channels, FALSE);
413                                         data_high_channels = g_array_new(FALSE, FALSE, sizeof(uint8_t));
414                                 }
415
416                                 /* Storing the converted temp values from the the scope into the buffers. */
417                                 for (uint64_t index = 0; index < tmp_samplebuf->len; index++) {
418                                         uint8_t value = g_array_index(tmp_samplebuf, uint8_t, index);
419                                         if (ch->index < 8)
420                                                 g_array_append_val(data_low_channels, value);
421                                         else
422                                                 g_array_append_val(data_high_channels, value);
423                                 }
424                                 g_array_free(tmp_samplebuf, TRUE);
425                                 g_array_free(buffdata, TRUE);
426                         }
427                 }
428         }
429
430         /* Combining the lower and higher channel buffers into one buffer for sigrok. */
431         devc->dig_buffer = g_array_new(FALSE, FALSE, sizeof(uint8_t));
432         for (uint64_t index = 0; index < devc->memory_depth_digital; index++) {
433                 uint8_t value;
434                 if (low_channels) {
435                         value = g_array_index(data_low_channels, uint8_t, index);
436                         g_array_append_val(devc->dig_buffer, value);
437                 } else {
438                         value = 0;
439                         g_array_append_val(devc->dig_buffer, value);
440                 }
441                 if (high_channels) {
442                         value = g_array_index(data_high_channels, uint8_t, index);
443                         g_array_append_val(devc->dig_buffer, value);
444                 } else {
445                         value = 0;
446                         g_array_append_val(devc->dig_buffer, value);
447                 }
448         }
449
450         g_array_free(data_low_channels, TRUE);
451         g_array_free(data_high_channels, TRUE);
452
453         return len;
454 }
455
456 SR_PRIV int siglent_sds_receive(int fd, int revents, void *cb_data)
457 {
458         struct sr_dev_inst *sdi;
459         struct sr_scpi_dev_inst *scpi;
460         struct dev_context *devc;
461         struct sr_datafeed_packet packet;
462         struct sr_datafeed_analog analog;
463         struct sr_analog_encoding encoding;
464         struct sr_analog_meaning meaning;
465         struct sr_analog_spec spec;
466         struct sr_datafeed_logic logic;
467         struct sr_channel *ch;
468         int len, i;
469         float wait;
470         gboolean read_complete = FALSE;
471
472         (void)fd;
473
474         if (!(sdi = cb_data))
475                 return TRUE;
476
477         if (!(devc = sdi->priv))
478                 return TRUE;
479
480         scpi = sdi->conn;
481
482         if (!(revents == G_IO_IN || revents == 0))
483                 return TRUE;
484
485         switch (devc->wait_event) {
486         case WAIT_NONE:
487                 break;
488         case WAIT_TRIGGER:
489                 if (siglent_sds_trigger_wait(sdi) != SR_OK)
490                         return TRUE;
491                 if (siglent_sds_channel_start(sdi) != SR_OK)
492                         return TRUE;
493                 return TRUE;
494         case WAIT_BLOCK:
495                 if (siglent_sds_channel_start(sdi) != SR_OK)
496                         return TRUE;
497                 break;
498         case WAIT_STOP:
499                 if (siglent_sds_stop_wait(sdi) != SR_OK)
500                         return TRUE;
501                 if (siglent_sds_channel_start(sdi) != SR_OK)
502                         return TRUE;
503                 return TRUE;
504         default:
505                 sr_err("BUG: Unknown event target encountered.");
506                 break;
507         }
508
509         ch = devc->channel_entry->data;
510         len = 0;
511
512         if (ch->type == SR_CHANNEL_ANALOG) {
513                 if (devc->num_block_bytes == 0) {
514                         /* Wait for the device to fill its output buffers. */
515                         switch (devc->model->series->protocol) {
516                         case NON_SPO_MODEL:
517                         case SPO_MODEL:
518                                 /* The older models need more time to prepare the the output buffers due to CPU speed. */
519                                 wait = (devc->memory_depth_analog * 2.5);
520                                 sr_dbg("Waiting %.f0 ms for device to prepare the output buffers", wait / 1000);
521                                 g_usleep(wait);
522                                 if (sr_scpi_read_begin(scpi) != SR_OK)
523                                         return TRUE;
524                                 break;
525                         case ESERIES:
526                                 /* The newer models (ending with the E) have faster CPUs but still need time when a slow timebase is selected. */
527                                 if (sr_scpi_read_begin(scpi) != SR_OK)
528                                         return TRUE;
529                                 wait = ((devc->timebase * devc->model->series->num_horizontal_divs) * 100000);
530                                 sr_dbg("Waiting %.f0 ms for device to prepare the output buffers", wait / 1000);
531                                 g_usleep(wait);
532                                 break;
533                         }
534
535                         sr_dbg("New block with header expected.");
536                         len = siglent_sds_read_header(sdi);
537                         if (len == 0)
538                                 /* Still reading the header. */
539                                 return TRUE;
540                         if (len == -1) {
541                                 sr_err("Read error, aborting capture.");
542                                 std_session_send_df_frame_end(sdi);
543                                 sdi->driver->dev_acquisition_stop(sdi);
544                                 return TRUE;
545                         }
546                         devc->num_block_bytes = len;
547                         devc->num_block_read = 0;
548
549                         if (len == -1) {
550                                 sr_err("Read error, aborting capture.");
551                                 std_session_send_df_frame_end(sdi);
552                                 sdi->driver->dev_acquisition_stop(sdi);
553                                 return TRUE;
554                         }
555
556                         do {
557                                 read_complete = FALSE;
558                                 if (devc->num_block_bytes > devc->num_samples) {
559                                         /* We received all data as one block. */
560                                         /* Offset the data block buffer past the IEEE header and description header. */
561                                         devc->buffer += devc->block_header_size;
562                                         len = devc->num_samples;
563                                 } else {
564                                         sr_dbg("Requesting: %" PRIu64 " bytes.", devc->num_samples - devc->num_block_bytes);
565                                         len = sr_scpi_read_data(scpi, (char *)devc->buffer, devc->num_samples-devc->num_block_bytes);
566                                         if (len == -1) {
567                                                 sr_err("Read error, aborting capture.");
568                                                 std_session_send_df_frame_end(sdi);
569                                                 sdi->driver->dev_acquisition_stop(sdi);
570                                                 return TRUE;
571                                         }
572                                         devc->num_block_read++;
573                                         devc->num_block_bytes += len;
574                                 }
575                                 sr_dbg("Received block: %i, %d bytes.", devc->num_block_read, len);
576                                 if (ch->type == SR_CHANNEL_ANALOG) {
577                                         float vdiv = devc->vdiv[ch->index];
578                                         float offset = devc->vert_offset[ch->index];
579                                         GArray *float_data;
580                                         static GArray *data;
581                                         float voltage, vdivlog;
582                                         int digits;
583
584                                         data = g_array_sized_new(FALSE, FALSE, sizeof(uint8_t), len);
585                                         g_array_append_vals(data, devc->buffer, len);
586                                         float_data = g_array_new(FALSE, FALSE, sizeof(float));
587                                         for (i = 0; i < len; i++) {
588                                                 voltage = (float)g_array_index(data, int8_t, i) / 25;
589                                                 voltage = ((vdiv * voltage) - offset);
590                                                 g_array_append_val(float_data, voltage);
591                                         }
592                                         vdivlog = log10f(vdiv);
593                                         digits = -(int) vdivlog + (vdivlog < 0.0);
594                                         sr_analog_init(&analog, &encoding, &meaning, &spec, digits);
595                                         analog.meaning->channels = g_slist_append(NULL, ch);
596                                         analog.num_samples = float_data->len;
597                                         analog.data = (float *)float_data->data;
598                                         analog.meaning->mq = SR_MQ_VOLTAGE;
599                                         analog.meaning->unit = SR_UNIT_VOLT;
600                                         analog.meaning->mqflags = 0;
601                                         packet.type = SR_DF_ANALOG;
602                                         packet.payload = &analog;
603                                         sr_session_send(sdi, &packet);
604                                         g_slist_free(analog.meaning->channels);
605                                         g_array_free(data, TRUE);
606                                 }
607                                 len = 0;
608                                 if (devc->num_samples == (devc->num_block_bytes - SIGLENT_HEADER_SIZE)) {
609                                         sr_dbg("Transfer has been completed.");
610                                         devc->num_header_bytes = 0;
611                                         devc->num_block_bytes = 0;
612                                         read_complete = TRUE;
613                                         if (!sr_scpi_read_complete(scpi)) {
614                                                 sr_err("Read should have been completed.");
615                                                 std_session_send_df_frame_end(sdi);
616                                                 sdi->driver->dev_acquisition_stop(sdi);
617                                                 return TRUE;
618                                         }
619                                         devc->num_block_read = 0;
620                                 } else {
621                                         sr_dbg("%" PRIu64 " of %" PRIu64 " block bytes read.",
622                                                 devc->num_block_bytes, devc->num_samples);
623                                 }
624                         } while (!read_complete);
625
626                         if (devc->channel_entry->next) {
627                                 /* We got the frame for this channel, now get the next channel. */
628                                 devc->channel_entry = devc->channel_entry->next;
629                                 siglent_sds_channel_start(sdi);
630                         } else {
631                                 /* Done with this frame. */
632                                 std_session_send_df_frame_end(sdi);
633                                 if (++devc->num_frames == devc->limit_frames) {
634                                         /* Last frame, stop capture. */
635                                         sdi->driver->dev_acquisition_stop(sdi);
636                                 } else {
637                                         /* Get the next frame, starting with the first channel. */
638                                         devc->channel_entry = devc->enabled_channels;
639                                         siglent_sds_capture_start(sdi);
640
641                                         /* Start of next frame. */
642                                         std_session_send_df_frame_begin(sdi);
643                                 }
644                         }
645                 }
646         } else {
647                 if (!siglent_sds_get_digital(sdi, ch))
648                         return TRUE;
649                 logic.length = devc->dig_buffer->len;
650                 logic.unitsize = 2;
651                 logic.data = devc->dig_buffer->data;
652                 packet.type = SR_DF_LOGIC;
653                 packet.payload = &logic;
654                 sr_session_send(sdi, &packet);
655                 std_session_send_df_frame_end(sdi);
656                 sdi->driver->dev_acquisition_stop(sdi);
657
658                 if (++devc->num_frames == devc->limit_frames) {
659                         /* Last frame, stop capture. */
660                         sdi->driver->dev_acquisition_stop(sdi);
661                 } else {
662                         /* Get the next frame, starting with the first channel. */
663                         devc->channel_entry = devc->enabled_channels;
664                         siglent_sds_capture_start(sdi);
665
666                         /* Start of next frame. */
667                         std_session_send_df_frame_begin(sdi);
668                 }
669         }
670
671         // sr_session_send(sdi, &packet);
672         // std_session_send_df_frame_end(sdi);
673         // sdi->driver->dev_acquisition_stop(sdi);
674
675         return TRUE;
676 }
677
678 SR_PRIV int siglent_sds_get_dev_cfg(const struct sr_dev_inst *sdi)
679 {
680         struct dev_context *devc;
681         struct sr_channel *ch;
682         char *cmd, *response;
683         unsigned int i;
684         int res, num_tokens;
685         gchar **tokens;
686         int len;
687         float trigger_pos;
688
689         devc = sdi->priv;
690
691         /* Analog channel state. */
692         for (i = 0; i < devc->model->analog_channels; i++) {
693                 cmd = g_strdup_printf("C%i:TRA?", i + 1);
694                 res = sr_scpi_get_bool(sdi->conn, cmd, &devc->analog_channels[i]);
695                 g_free(cmd);
696                 if (res != SR_OK)
697                         return SR_ERR;
698                 ch = g_slist_nth_data(sdi->channels, i);
699                 ch->enabled = devc->analog_channels[i];
700         }
701         sr_dbg("Current analog channel state:");
702         for (i = 0; i < devc->model->analog_channels; i++)
703                 sr_dbg("CH%d %s", i + 1, devc->analog_channels[i] ? "On" : "Off");
704
705         /* Digital channel state. */
706         if (devc->model->has_digital) {
707                 gboolean status;
708
709                 sr_dbg("Check logic analyzer channel state.");
710                 devc->la_enabled = FALSE;
711                 cmd = g_strdup_printf("DI:SW?");
712                 res = sr_scpi_get_bool(sdi->conn, cmd, &status);
713                 g_free(cmd);
714                 if (res != SR_OK)
715                         return SR_ERR;
716                 sr_dbg("Logic analyzer status: %s", status ? "On" : "Off");
717                 if (status) {
718                         devc->la_enabled = TRUE;
719                         for (i = 0; i < ARRAY_SIZE(devc->digital_channels); i++) {
720                                 cmd = g_strdup_printf("D%i:TRA?", i);
721                                 res = sr_scpi_get_bool(sdi->conn, cmd, &devc->digital_channels[i]);
722                                 g_free(cmd);
723                                 if (res != SR_OK)
724                                         return SR_ERR;
725                                 ch = g_slist_nth_data(sdi->channels, i + devc->model->analog_channels);
726                                 ch->enabled = devc->digital_channels[i];
727                                 sr_dbg("D%d: %s", i, devc->digital_channels[i] ? "On" : "Off");
728                         }
729                 } else {
730                         for (i = 0; i < ARRAY_SIZE(devc->digital_channels); i++) {
731                                 ch = g_slist_nth_data(sdi->channels, i + devc->model->analog_channels);
732                                 devc->digital_channels[i] = FALSE;
733                                 ch->enabled = devc->digital_channels[i];
734                                 sr_dbg("D%d: %s", i, devc->digital_channels[i] ? "On" : "Off");
735                         }
736                 }
737         }
738
739         /* Timebase. */
740         if (sr_scpi_get_float(sdi->conn, ":TDIV?", &devc->timebase) != SR_OK)
741                 return SR_ERR;
742         sr_dbg("Current timebase: %g.", devc->timebase);
743
744         /* Probe attenuation. */
745         for (i = 0; i < devc->model->analog_channels; i++) {
746                 cmd = g_strdup_printf("C%d:ATTN?", i + 1);
747                 res = sr_scpi_get_float(sdi->conn, cmd, &devc->attenuation[i]);
748                 g_free(cmd);
749                 if (res != SR_OK)
750                         return SR_ERR;
751         }
752         sr_dbg("Current probe attenuation:");
753         for (i = 0; i < devc->model->analog_channels; i++)
754                 sr_dbg("CH%d %g", i + 1, devc->attenuation[i]);
755
756         /* Vertical gain and offset. */
757         if (siglent_sds_get_dev_cfg_vertical(sdi) != SR_OK)
758                 return SR_ERR;
759
760         /* Coupling. */
761         for (i = 0; i < devc->model->analog_channels; i++) {
762                 cmd = g_strdup_printf("C%d:CPL?", i + 1);
763                 res = sr_scpi_get_string(sdi->conn, cmd, &devc->coupling[i]);
764                 g_free(cmd);
765                 if (res != SR_OK)
766                         return SR_ERR;
767         }
768
769         sr_dbg("Current coupling:");
770         for (i = 0; i < devc->model->analog_channels; i++)
771                 sr_dbg("CH%d %s", i + 1, devc->coupling[i]);
772
773         /* Trigger source. */
774         response = NULL;
775         tokens = NULL;
776         if (sr_scpi_get_string(sdi->conn, "TRSE?", &response) != SR_OK)
777                 return SR_ERR;
778         tokens = g_strsplit(response, ",", 0);
779         for (num_tokens = 0; tokens[num_tokens] != NULL; num_tokens++);
780         if (num_tokens < 4) {
781                 sr_dbg("IDN response not according to spec: %80.s.", response);
782                 g_strfreev(tokens);
783                 g_free(response);
784                 return SR_ERR_DATA;
785         }
786         g_free(response);
787         devc->trigger_source = g_strstrip(g_strdup(tokens[2]));
788         sr_dbg("Current trigger source: %s.", devc->trigger_source);
789
790         /* TODO: Horizontal trigger position. */
791         response = "";
792         trigger_pos = 0;
793         // if (sr_scpi_get_string(sdi->conn, g_strdup_printf("%s:TRDL?", devc->trigger_source), &response) != SR_OK)
794         //      return SR_ERR;
795         // len = strlen(response);
796         len = strlen(tokens[4]);
797         if (!g_ascii_strcasecmp(tokens[4] + (len - 2), "us")) {
798                 trigger_pos = atof(tokens[4]) / SR_GHZ(1);
799                 sr_dbg("Current trigger position us %s.", tokens[4] );
800         } else if (!g_ascii_strcasecmp(tokens[4] + (len - 2), "ns")) {
801                 trigger_pos = atof(tokens[4]) / SR_MHZ(1);
802                 sr_dbg("Current trigger position ms %s.", tokens[4] );
803         } else if (!g_ascii_strcasecmp(tokens[4] + (len - 2), "ms")) {
804                 trigger_pos = atof(tokens[4]) / SR_KHZ(1);
805                 sr_dbg("Current trigger position ns %s.", tokens[4] );
806         } else if (!g_ascii_strcasecmp(tokens[4] + (len - 2), "s")) {
807                 trigger_pos = atof(tokens[4]);
808                 sr_dbg("Current trigger position s %s.", tokens[4] );
809         };
810         devc->horiz_triggerpos = trigger_pos;
811
812         sr_dbg("Current horizontal trigger position %.10f.", devc->horiz_triggerpos);
813
814         /* Trigger slope. */
815         cmd = g_strdup_printf("%s:TRSL?", devc->trigger_source);
816         res = sr_scpi_get_string(sdi->conn, cmd, &devc->trigger_slope);
817         g_free(cmd);
818         if (res != SR_OK)
819                 return SR_ERR;
820         sr_dbg("Current trigger slope: %s.", devc->trigger_slope);
821
822         /* Trigger level, only when analog channel. */
823         if (g_str_has_prefix(tokens[2], "C")) {
824                 cmd = g_strdup_printf("%s:TRLV?", devc->trigger_source);
825                 res = sr_scpi_get_float(sdi->conn, cmd, &devc->trigger_level);
826                 g_free(cmd);
827                 if (res != SR_OK)
828                         return SR_ERR;
829                 sr_dbg("Current trigger level: %g.", devc->trigger_level);
830         }
831
832         return SR_OK;
833 }
834
835 SR_PRIV int siglent_sds_get_dev_cfg_vertical(const struct sr_dev_inst *sdi)
836 {
837         struct dev_context *devc;
838         char *cmd;
839         unsigned int i;
840         int res;
841
842         devc = sdi->priv;
843
844         /* Vertical gain. */
845         for (i = 0; i < devc->model->analog_channels; i++) {
846                 cmd = g_strdup_printf("C%d:VDIV?", i + 1);
847                 res = sr_scpi_get_float(sdi->conn, cmd, &devc->vdiv[i]);
848                 g_free(cmd);
849                 if (res != SR_OK)
850                         return SR_ERR;
851         }
852         sr_dbg("Current vertical gain:");
853         for (i = 0; i < devc->model->analog_channels; i++)
854                 sr_dbg("CH%d %g", i + 1, devc->vdiv[i]);
855
856         /* Vertical offset. */
857         for (i = 0; i < devc->model->analog_channels; i++) {
858                 cmd = g_strdup_printf("C%d:OFST?", i + 1);
859                 res = sr_scpi_get_float(sdi->conn, cmd, &devc->vert_offset[i]);
860                 g_free(cmd);
861                 if (res != SR_OK)
862                         return SR_ERR;
863         }
864         sr_dbg("Current vertical offset:");
865         for (i = 0; i < devc->model->analog_channels; i++)
866                 sr_dbg("CH%d %g", i + 1, devc->vert_offset[i]);
867
868         return SR_OK;
869 }
870
871 SR_PRIV int siglent_sds_get_dev_cfg_horizontal(const struct sr_dev_inst *sdi)
872 {
873         struct dev_context *devc;
874         char *cmd;
875         int res;
876         char *sample_points_string;
877         float samplerate_scope, fvalue;
878
879         devc = sdi->priv;
880
881         switch (devc->model->series->protocol) {
882         case SPO_MODEL:
883         case NON_SPO_MODEL:
884                 cmd = g_strdup_printf("SANU? C1");
885                 res = sr_scpi_get_string(sdi->conn, cmd, &sample_points_string);
886                 g_free(cmd);
887                 samplerate_scope = 0;
888                 fvalue = 0;
889                 if (res != SR_OK)
890                         return SR_ERR;
891                 if (g_strstr_len(sample_points_string, -1, "Mpts") != NULL) {
892                         sample_points_string[strlen(sample_points_string) - 4] = '\0';
893                         if (sr_atof_ascii(sample_points_string, &fvalue) != SR_OK) {
894                                 sr_dbg("Invalid float converted from scope response.");
895                                 return SR_ERR;
896                         }
897                         samplerate_scope = fvalue * 1000000;
898                 } else if (g_strstr_len(sample_points_string, -1, "Kpts") != NULL) {
899                         sample_points_string[strlen(sample_points_string) - 4] = '\0';
900                         if (sr_atof_ascii(sample_points_string, &fvalue) != SR_OK) {
901                                 sr_dbg("Invalid float converted from scope response.");
902                                 return SR_ERR;
903                         }
904                         samplerate_scope = fvalue * 10000;
905                 } else {
906                         samplerate_scope = fvalue;
907                 }
908                 g_free(sample_points_string);
909                 devc->memory_depth_analog = samplerate_scope;
910                 break;
911         case ESERIES:
912                 cmd = g_strdup_printf("SANU? C1");
913                 if (sr_scpi_get_float(sdi->conn, cmd, &fvalue) != SR_OK)
914                         return SR_ERR;
915                 devc->memory_depth_analog = (long)fvalue;
916                 if (devc->la_enabled) {
917                         cmd = g_strdup_printf("SANU? D0");
918                         if (sr_scpi_get_float(sdi->conn, cmd, &fvalue) != SR_OK)
919                                 return SR_ERR;
920                         devc->memory_depth_digital = (long)fvalue;
921                 }
922                 g_free(cmd);
923                 break;
924         };
925
926         /* Get the timebase. */
927         if (sr_scpi_get_float(sdi->conn, ":TDIV?", &devc->timebase) != SR_OK)
928                 return SR_ERR;
929
930         sr_dbg("Current timebase: %g.", devc->timebase);
931         devc->samplerate = devc->memory_depth_analog / (devc->timebase * devc->model->series->num_horizontal_divs);
932         sr_dbg("Current samplerate: %0f.", devc->samplerate);
933         sr_dbg("Current memory depth: %" PRIu64 ".", devc->memory_depth_analog);
934
935         return SR_OK;
936 }