]> sigrok.org Git - libsigrok.git/blame - src/hardware/rigol-ds/api.c
rigol-ds: Store trigger sources and their number for each model
[libsigrok.git] / src / hardware / rigol-ds / api.c
CommitLineData
f4816ac6
ML
1/*
2 * This file is part of the libsigrok project.
3 *
4 * Copyright (C) 2012 Martin Ling <martin-git@earth.li>
88e429c9 5 * Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
bafd4890 6 * Copyright (C) 2013 Mathias Grimmberger <mgri@zaphod.sax.de>
f4816ac6
ML
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
6ec6c43b 22#include <config.h>
e0b7d23c
ML
23#include <fcntl.h>
24#include <unistd.h>
25#include <stdlib.h>
26#include <string.h>
ba464a12 27#include <strings.h>
2b0e4a46 28#include <math.h>
f4816ac6 29#include <glib.h>
c1aae900 30#include <libsigrok/libsigrok.h>
f4816ac6 31#include "libsigrok-internal.h"
5a1afc09 32#include "scpi.h"
f4816ac6
ML
33#include "protocol.h"
34
a0e0bb41 35static const uint32_t scanopts[] = {
ca55277c 36 SR_CONF_CONN,
05199c0a 37 SR_CONF_SERIALCOMM,
ca55277c
ML
38};
39
d73aacf1 40static const uint32_t drvopts[] = {
1953564a 41 SR_CONF_OSCILLOSCOPE,
d73aacf1
SA
42};
43
44static const uint32_t devopts[] = {
5827f61b 45 SR_CONF_LIMIT_FRAMES | SR_CONF_SET,
86621306 46 SR_CONF_SAMPLERATE | SR_CONF_GET,
5827f61b 47 SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
86621306
UH
48 SR_CONF_NUM_HDIV | SR_CONF_GET,
49 SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_SET,
5827f61b 50 SR_CONF_TRIGGER_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
b0c9d1d1 51 SR_CONF_TRIGGER_SLOPE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
9ea62f2e 52 SR_CONF_TRIGGER_LEVEL | SR_CONF_GET | SR_CONF_SET,
f579d08b 53 SR_CONF_DATA_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
f48e0249
ML
54};
55
6b82c3e5 56static const uint32_t devopts_cg_analog[] = {
5827f61b
BV
57 SR_CONF_NUM_VDIV | SR_CONF_GET,
58 SR_CONF_VDIV | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
59 SR_CONF_COUPLING | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
934cf6cf 60 SR_CONF_PROBE_FACTOR | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
e0b7d23c
ML
61};
62
f6a0ac9f 63static const uint64_t timebases[][2] = {
e0b7d23c 64 /* nanoseconds */
8e06edf5 65 { 1, 1000000000 },
e0b7d23c
ML
66 { 2, 1000000000 },
67 { 5, 1000000000 },
68 { 10, 1000000000 },
69 { 20, 1000000000 },
70 { 50, 1000000000 },
71 { 100, 1000000000 },
72 { 500, 1000000000 },
73 /* microseconds */
74 { 1, 1000000 },
75 { 2, 1000000 },
76 { 5, 1000000 },
77 { 10, 1000000 },
78 { 20, 1000000 },
79 { 50, 1000000 },
80 { 100, 1000000 },
81 { 200, 1000000 },
82 { 500, 1000000 },
83 /* milliseconds */
84 { 1, 1000 },
85 { 2, 1000 },
86 { 5, 1000 },
87 { 10, 1000 },
88 { 20, 1000 },
89 { 50, 1000 },
90 { 100, 1000 },
91 { 200, 1000 },
92 { 500, 1000 },
93 /* seconds */
94 { 1, 1 },
95 { 2, 1 },
96 { 5, 1 },
97 { 10, 1 },
98 { 20, 1 },
99 { 50, 1 },
bafd4890
ML
100 { 100, 1 },
101 { 200, 1 },
102 { 500, 1 },
8e06edf5 103 { 1000, 1 },
e0b7d23c
ML
104};
105
f6a0ac9f 106static const uint64_t vdivs[][2] = {
bafd4890
ML
107 /* microvolts */
108 { 500, 1000000 },
e0b7d23c 109 /* millivolts */
bafd4890 110 { 1, 1000 },
e0b7d23c
ML
111 { 2, 1000 },
112 { 5, 1000 },
113 { 10, 1000 },
114 { 20, 1000 },
115 { 50, 1000 },
116 { 100, 1000 },
117 { 200, 1000 },
118 { 500, 1000 },
119 /* volts */
120 { 1, 1 },
121 { 2, 1 },
122 { 5, 1 },
123 { 10, 1 },
d50725e0
UH
124 { 20, 1 },
125 { 50, 1 },
126 { 100, 1 },
e0b7d23c
ML
127};
128
6bcc81ac
VO
129static const char *trigger_sources_2_chans[] = {
130 "CH1", "CH2",
131 "EXT", "AC Line",
132 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
133 "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
134};
135static const char *trigger_sources_4_chans[] = {
f8195cb2
UH
136 "CH1", "CH2", "CH3", "CH4",
137 "EXT", "AC Line",
138 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
139 "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
e0b7d23c
ML
140};
141
5d336f11 142static const char *trigger_slopes[] = {
f8195cb2 143 "r", "f",
5d336f11
AJ
144};
145
e0b7d23c 146static const char *coupling[] = {
f8195cb2 147 "AC", "DC", "GND",
e0b7d23c
ML
148};
149
934cf6cf 150static const uint64_t probe_factor[] = {
f8195cb2 151 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000,
934cf6cf
AJ
152};
153
babab622
ML
154/* Do not change the order of entries */
155static const char *data_sources[] = {
156 "Live",
157 "Memory",
158 "Segmented",
159};
160
569d4dbd
ML
161enum vendor {
162 RIGOL,
163 AGILENT,
164};
165
166enum series {
167 VS5000,
168 DS1000,
169 DS2000,
170 DS2000A,
171 DSO1000,
702f42e8 172 DS1000Z,
569d4dbd 173};
10afee13 174
569d4dbd
ML
175/* short name, full name */
176static const struct rigol_ds_vendor supported_vendors[] = {
177 [RIGOL] = {"Rigol", "Rigol Technologies"},
14e1aa6d 178 [AGILENT] = {"Agilent", "Agilent Technologies"},
569d4dbd
ML
179};
180
181#define VENDOR(x) &supported_vendors[x]
0f8bee71
UH
182/* vendor, series/name, protocol, data format, max timebase, min vdiv,
183 * number of horizontal divs, live waveform samples, memory buffer samples */
569d4dbd
ML
184static const struct rigol_ds_series supported_series[] = {
185 [VS5000] = {VENDOR(RIGOL), "VS5000", PROTOCOL_V1, FORMAT_RAW,
186 {50, 1}, {2, 1000}, 14, 2048, 0},
187 [DS1000] = {VENDOR(RIGOL), "DS1000", PROTOCOL_V2, FORMAT_IEEE488_2,
188 {50, 1}, {2, 1000}, 12, 600, 1048576},
189 [DS2000] = {VENDOR(RIGOL), "DS2000", PROTOCOL_V3, FORMAT_IEEE488_2,
96cb7faa 190 {500, 1}, {500, 1000000}, 14, 1400, 14000},
569d4dbd
ML
191 [DS2000A] = {VENDOR(RIGOL), "DS2000A", PROTOCOL_V3, FORMAT_IEEE488_2,
192 {1000, 1}, {500, 1000000}, 14, 1400, 14000},
193 [DSO1000] = {VENDOR(AGILENT), "DSO1000", PROTOCOL_V3, FORMAT_IEEE488_2,
194 {50, 1}, {2, 1000}, 12, 600, 20480},
702f42e8
ML
195 [DS1000Z] = {VENDOR(RIGOL), "DS1000Z", PROTOCOL_V4, FORMAT_IEEE488_2,
196 {50, 1}, {1, 1000}, 12, 1200, 12000000},
569d4dbd 197};
10afee13 198
569d4dbd 199#define SERIES(x) &supported_series[x]
6bcc81ac 200#define CHANINFO(num, digital) num, digital, trigger_sources_##num##_chans, digital ? ARRAY_SIZE(trigger_sources_##num##_chans) : (num + 2)
569d4dbd 201/* series, model, min timebase, analog channels, digital */
bafd4890 202static const struct rigol_ds_model supported_models[] = {
6bcc81ac
VO
203 {SERIES(VS5000), "VS5022", {20, 1000000000}, CHANINFO(2, false)},
204 {SERIES(VS5000), "VS5042", {10, 1000000000}, CHANINFO(2, false)},
205 {SERIES(VS5000), "VS5062", {5, 1000000000}, CHANINFO(2, false)},
206 {SERIES(VS5000), "VS5102", {2, 1000000000}, CHANINFO(2, false)},
207 {SERIES(VS5000), "VS5202", {2, 1000000000}, CHANINFO(2, false)},
208 {SERIES(VS5000), "VS5022D", {20, 1000000000}, CHANINFO(2, true)},
209 {SERIES(VS5000), "VS5042D", {10, 1000000000}, CHANINFO(2, true)},
210 {SERIES(VS5000), "VS5062D", {5, 1000000000}, CHANINFO(2, true)},
211 {SERIES(VS5000), "VS5102D", {2, 1000000000}, CHANINFO(2, true)},
212 {SERIES(VS5000), "VS5202D", {2, 1000000000}, CHANINFO(2, true)},
213 {SERIES(DS1000), "DS1052E", {5, 1000000000}, CHANINFO(2, false)},
214 {SERIES(DS1000), "DS1102E", {2, 1000000000}, CHANINFO(2, false)},
215 {SERIES(DS1000), "DS1152E", {2, 1000000000}, CHANINFO(2, false)},
216 {SERIES(DS1000), "DS1052D", {5, 1000000000}, CHANINFO(2, true)},
217 {SERIES(DS1000), "DS1102D", {2, 1000000000}, CHANINFO(2, true)},
218 {SERIES(DS1000), "DS1152D", {2, 1000000000}, CHANINFO(2, true)},
219 {SERIES(DS2000), "DS2072", {5, 1000000000}, CHANINFO(2, false)},
220 {SERIES(DS2000), "DS2102", {5, 1000000000}, CHANINFO(2, false)},
221 {SERIES(DS2000), "DS2202", {2, 1000000000}, CHANINFO(2, false)},
222 {SERIES(DS2000), "DS2302", {1, 1000000000}, CHANINFO(2, false)},
223 {SERIES(DS2000A), "DS2072A", {5, 1000000000}, CHANINFO(2, false)},
224 {SERIES(DS2000A), "DS2102A", {5, 1000000000}, CHANINFO(2, false)},
225 {SERIES(DS2000A), "DS2202A", {2, 1000000000}, CHANINFO(2, false)},
226 {SERIES(DS2000A), "DS2302A", {1, 1000000000}, CHANINFO(2, false)},
227 {SERIES(DS2000A), "MSO2072A", {5, 1000000000}, CHANINFO(2, true)},
228 {SERIES(DS2000A), "MSO2102A", {5, 1000000000}, CHANINFO(2, true)},
229 {SERIES(DS2000A), "MSO2202A", {2, 1000000000}, CHANINFO(2, true)},
230 {SERIES(DS2000A), "MSO2302A", {1, 1000000000}, CHANINFO(2, true)},
231 {SERIES(DSO1000), "DSO1002A", {5, 1000000000}, CHANINFO(2, false)},
232 {SERIES(DSO1000), "DSO1004A", {5, 1000000000}, CHANINFO(4, false)},
233 {SERIES(DSO1000), "DSO1012A", {2, 1000000000}, CHANINFO(2, false)},
234 {SERIES(DSO1000), "DSO1014A", {2, 1000000000}, CHANINFO(4, false)},
235 {SERIES(DSO1000), "DSO1022A", {2, 1000000000}, CHANINFO(2, false)},
236 {SERIES(DSO1000), "DSO1024A", {2, 1000000000}, CHANINFO(4, false)},
237 {SERIES(DS1000Z), "DS1054Z", {5, 1000000000}, CHANINFO(4, false)},
238 {SERIES(DS1000Z), "DS1074Z", {5, 1000000000}, CHANINFO(4, false)},
239 {SERIES(DS1000Z), "DS1104Z", {5, 1000000000}, CHANINFO(4, false)},
240 {SERIES(DS1000Z), "DS1074Z-S", {5, 1000000000}, CHANINFO(4, false)},
241 {SERIES(DS1000Z), "DS1104Z-S", {5, 1000000000}, CHANINFO(4, false)},
242 {SERIES(DS1000Z), "DS1074Z Plus", {5, 1000000000}, CHANINFO(4, false)},
243 {SERIES(DS1000Z), "DS1104Z Plus", {5, 1000000000}, CHANINFO(4, false)},
244 {SERIES(DS1000Z), "MSO1074Z", {5, 1000000000}, CHANINFO(4, true)},
245 {SERIES(DS1000Z), "MSO1104Z", {5, 1000000000}, CHANINFO(4, true)},
246 {SERIES(DS1000Z), "MSO1074Z-S", {5, 1000000000}, CHANINFO(4, true)},
247 {SERIES(DS1000Z), "MSO1104Z-S", {5, 1000000000}, CHANINFO(4, true)},
512bb890
BV
248};
249
dd5c48a6 250static struct sr_dev_driver rigol_ds_driver_info;
f4816ac6 251
3553451f 252static void clear_helper(struct dev_context *devc)
f4816ac6 253{
effb9dd1 254 unsigned int i;
f4816ac6 255
babab622
ML
256 g_free(devc->data);
257 g_free(devc->buffer);
effb9dd1
AJ
258 for (i = 0; i < ARRAY_SIZE(devc->coupling); i++)
259 g_free(devc->coupling[i]);
fa85f376
UH
260 g_free(devc->trigger_source);
261 g_free(devc->trigger_slope);
562b7ae5 262 g_free(devc->analog_groups);
fa85f376 263}
f4816ac6 264
4f840ce9 265static int dev_clear(const struct sr_dev_driver *di)
fa85f376 266{
3553451f 267 return std_dev_clear_with_callback(di, (std_dev_clear_callback)clear_helper);
f4816ac6
ML
268}
269
9d3ae01b 270static struct sr_dev_inst *probe_device(struct sr_scpi_dev_inst *scpi)
f4816ac6 271{
cc9fd2d2
BV
272 struct dev_context *devc;
273 struct sr_dev_inst *sdi;
ae1bc1cc 274 struct sr_scpi_hw_info *hw_info;
ba7dd8bb 275 struct sr_channel *ch;
8dd0b290 276 long n[3];
f6a0ac9f 277 unsigned int i;
bafd4890 278 const struct rigol_ds_model *model = NULL;
569d4dbd 279 gchar *channel_name, **version;
fb6e5ba8 280
ae1bc1cc 281 if (sr_scpi_get_hw_id(scpi, &hw_info) != SR_OK) {
05238d28
ML
282 sr_info("Couldn't get IDN response, retrying.");
283 sr_scpi_close(scpi);
284 sr_scpi_open(scpi);
285 if (sr_scpi_get_hw_id(scpi, &hw_info) != SR_OK) {
286 sr_info("Couldn't get IDN response.");
287 return NULL;
288 }
ca55277c 289 }
e0b7d23c 290
ca55277c 291 for (i = 0; i < ARRAY_SIZE(supported_models); i++) {
34577da6 292 if (!g_ascii_strcasecmp(hw_info->manufacturer,
569d4dbd 293 supported_models[i].series->vendor->full_name) &&
10afee13 294 !strcmp(hw_info->model, supported_models[i].name)) {
bafd4890 295 model = &supported_models[i];
ca55277c 296 break;
fb6e5ba8 297 }
ca55277c 298 }
fb6e5ba8 299
0af636be 300 if (!model) {
ae1bc1cc 301 sr_scpi_hw_info_free(hw_info);
9d3ae01b 302 return NULL;
ca55277c 303 }
fb6e5ba8 304
aac29cc1 305 sdi = g_malloc0(sizeof(struct sr_dev_inst));
0af636be
UH
306 sdi->vendor = g_strdup(model->series->vendor->name);
307 sdi->model = g_strdup(model->name);
308 sdi->version = g_strdup(hw_info->firmware_version);
ae1bc1cc 309 sdi->conn = scpi;
4f840ce9 310 sdi->driver = &rigol_ds_driver_info;
ae1bc1cc 311 sdi->inst_type = SR_INST_SCPI;
b3fccc85 312 sdi->serial_num = g_strdup(hw_info->serial_number);
f57d8ffe 313 devc = g_malloc0(sizeof(struct dev_context));
cc9fd2d2 314 devc->limit_frames = 0;
bafd4890 315 devc->model = model;
569d4dbd 316 devc->format = model->series->format;
8dd0b290 317
569d4dbd
ML
318 /* DS1000 models with firmware before 0.2.4 used the old data format. */
319 if (model->series == SERIES(DS1000)) {
8dd0b290
BV
320 version = g_strsplit(hw_info->firmware_version, ".", 0);
321 do {
322 if (!version[0] || !version[1] || !version[2])
323 break;
324 if (version[0][0] == 0 || version[1][0] == 0 || version[2][0] == 0)
325 break;
326 for (i = 0; i < 3; i++) {
327 if (sr_atol(version[i], &n[i]) != SR_OK)
328 break;
329 }
330 if (i != 3)
331 break;
de285cce
BV
332 scpi->firmware_version = n[0] * 100 + n[1] * 10 + n[2];
333 if (scpi->firmware_version < 24) {
334 sr_dbg("Found DS1000 firmware < 0.2.4, using raw data format.");
335 devc->format = FORMAT_RAW;
336 }
337 break;
0c5f2abc 338 } while (0);
8dd0b290
BV
339 g_strfreev(version);
340 }
341
342 sr_scpi_hw_info_free(hw_info);
512bb890 343
562b7ae5
SA
344 devc->analog_groups = g_malloc0(sizeof(struct sr_channel_group*) *
345 model->analog_channels);
346
821fbcad 347 for (i = 0; i < model->analog_channels; i++) {
eac0c613 348 channel_name = g_strdup_printf("CH%d", i + 1);
5e23fcab 349 ch = sr_channel_new(sdi, i, SR_CHANNEL_ANALOG, TRUE, channel_name);
562b7ae5
SA
350
351 devc->analog_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
352
353 devc->analog_groups[i]->name = channel_name;
354 devc->analog_groups[i]->channels = g_slist_append(NULL, ch);
660e398f 355 sdi->channel_groups = g_slist_append(sdi->channel_groups,
562b7ae5 356 devc->analog_groups[i]);
ca55277c 357 }
512bb890 358
bafd4890 359 if (devc->model->has_digital) {
16aca766 360 devc->digital_group = g_malloc0(sizeof(struct sr_channel_group));
562b7ae5 361
effb9dd1 362 for (i = 0; i < ARRAY_SIZE(devc->digital_channels); i++) {
eac0c613 363 channel_name = g_strdup_printf("D%d", i);
5e23fcab 364 ch = sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE, channel_name);
ca55277c 365 g_free(channel_name);
562b7ae5
SA
366 devc->digital_group->channels = g_slist_append(
367 devc->digital_group->channels, ch);
512bb890 368 }
562b7ae5 369 devc->digital_group->name = g_strdup("LA");
660e398f 370 sdi->channel_groups = g_slist_append(sdi->channel_groups,
562b7ae5 371 devc->digital_group);
ca55277c 372 }
bafd4890 373
396cdca0 374 for (i = 0; i < ARRAY_SIZE(timebases); i++) {
bafd4890
ML
375 if (!memcmp(&devc->model->min_timebase, &timebases[i], sizeof(uint64_t[2])))
376 devc->timebases = &timebases[i];
569d4dbd 377 if (!memcmp(&devc->model->series->max_timebase, &timebases[i], sizeof(uint64_t[2])))
bafd4890
ML
378 devc->num_timebases = &timebases[i] - devc->timebases + 1;
379 }
380
396cdca0 381 for (i = 0; i < ARRAY_SIZE(vdivs); i++) {
a95f142e
UH
382 if (!memcmp(&devc->model->series->min_vdiv,
383 &vdivs[i], sizeof(uint64_t[2]))) {
6ff1394e 384 devc->vdivs = &vdivs[i];
396cdca0 385 devc->num_vdivs = ARRAY_SIZE(vdivs) - i;
81b85663 386 }
a95f142e 387 }
bafd4890 388
a95f142e
UH
389 devc->buffer = g_malloc(ACQ_BUFFER_SIZE);
390 devc->data = g_malloc(ACQ_BUFFER_SIZE * sizeof(float));
babab622
ML
391
392 devc->data_source = DATA_SOURCE_LIVE;
393
cc9fd2d2
BV
394 sdi->priv = devc;
395
9d3ae01b 396 return sdi;
ca55277c 397}
512bb890 398
4f840ce9 399static GSList *scan(struct sr_dev_driver *di, GSList *options)
ca55277c 400{
41812aca 401 return sr_scpi_scan(di->context, options, probe_device);
f4816ac6
ML
402}
403
6078d2c9 404static int dev_open(struct sr_dev_inst *sdi)
f4816ac6 405{
e1b5b7e7 406 int ret;
ae1bc1cc 407 struct sr_scpi_dev_inst *scpi = sdi->conn;
9bd4c956 408
e1b5b7e7
UH
409 if ((ret = sr_scpi_open(scpi)) < 0) {
410 sr_err("Failed to open SCPI device: %s.", sr_strerror(ret));
e0b7d23c 411 return SR_ERR;
e1b5b7e7 412 }
e0b7d23c 413
e1b5b7e7
UH
414 if ((ret = rigol_ds_get_dev_cfg(sdi)) < 0) {
415 sr_err("Failed to get device config: %s.", sr_strerror(ret));
254dd102 416 return SR_ERR;
e1b5b7e7 417 }
f4816ac6
ML
418
419 return SR_OK;
420}
421
6078d2c9 422static int dev_close(struct sr_dev_inst *sdi)
f4816ac6 423{
ae1bc1cc 424 struct sr_scpi_dev_inst *scpi;
22c19688 425 struct dev_context *devc;
ae1bc1cc
ML
426
427 scpi = sdi->conn;
22c19688
ML
428 devc = sdi->priv;
429
f1ba6b4b
UH
430 if (!scpi)
431 return SR_ERR_BUG;
432
6e94eb41 433 if (devc->model->series->protocol == PROTOCOL_V2)
38354d9d 434 rigol_ds_config_set(sdi, ":KEY:LOCK DISABLE");
e0b7d23c 435
f1ba6b4b 436 return sr_scpi_close(scpi);
f4816ac6
ML
437}
438
5415e602
ML
439static int analog_frame_size(const struct sr_dev_inst *sdi)
440{
441 struct dev_context *devc = sdi->priv;
ba7dd8bb
UH
442 struct sr_channel *ch;
443 int analog_channels = 0;
5415e602
ML
444 GSList *l;
445
ba7dd8bb
UH
446 for (l = sdi->channels; l; l = l->next) {
447 ch = l->data;
3f239f08 448 if (ch->type == SR_CHANNEL_ANALOG && ch->enabled)
ba7dd8bb 449 analog_channels++;
569d4dbd
ML
450 }
451
ba7dd8bb 452 if (analog_channels == 0)
824eb2ac
ML
453 return 0;
454
569d4dbd
ML
455 switch (devc->data_source) {
456 case DATA_SOURCE_LIVE:
457 return devc->model->series->live_samples;
458 case DATA_SOURCE_MEMORY:
ba7dd8bb 459 return devc->model->series->buffer_samples / analog_channels;
470140fc 460 default:
569d4dbd 461 return 0;
5415e602
ML
462 }
463}
464
d22250a9
ML
465static int digital_frame_size(const struct sr_dev_inst *sdi)
466{
467 struct dev_context *devc = sdi->priv;
468
569d4dbd
ML
469 switch (devc->data_source) {
470 case DATA_SOURCE_LIVE:
471 return devc->model->series->live_samples * 2;
472 case DATA_SOURCE_MEMORY:
473 return devc->model->series->buffer_samples * 2;
d22250a9
ML
474 default:
475 return 0;
476 }
477}
478
dd7a72ea
UH
479static int config_get(uint32_t key, GVariant **data,
480 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
d62d7ad1 481{
e43fdd8d 482 struct dev_context *devc;
ba7dd8bb 483 struct sr_channel *ch;
2b0e4a46 484 const char *tmp_str;
c2b394d5 485 uint64_t samplerate;
2b0e4a46 486 int analog_channel = -1;
c33ff377 487 float smallest_diff = INFINITY;
2b0e4a46
AJ
488 int idx = -1;
489 unsigned i;
d62d7ad1 490
709468ba 491 if (!sdi)
e43fdd8d
BV
492 return SR_ERR_ARG;
493
709468ba
UH
494 devc = sdi->priv;
495
660e398f 496 /* If a channel group is specified, it must be a valid one. */
53b4680f 497 if (cg && !g_slist_find(sdi->channel_groups, cg)) {
660e398f 498 sr_err("Invalid channel group specified.");
969edf63 499 return SR_ERR;
be60a9e4
BV
500 }
501
53b4680f 502 if (cg) {
ba7dd8bb
UH
503 ch = g_slist_nth_data(cg->channels, 0);
504 if (!ch)
2b0e4a46 505 return SR_ERR;
3f239f08 506 if (ch->type == SR_CHANNEL_ANALOG) {
ba7dd8bb 507 if (ch->name[2] < '1' || ch->name[2] > '4')
2b0e4a46 508 return SR_ERR;
ba7dd8bb 509 analog_channel = ch->name[2] - '1';
2b0e4a46
AJ
510 }
511 }
512
584560f1 513 switch (key) {
bf622e6d 514 case SR_CONF_NUM_HDIV:
569d4dbd 515 *data = g_variant_new_int32(devc->model->series->num_horizontal_divs);
d62d7ad1
BV
516 break;
517 case SR_CONF_NUM_VDIV:
81b85663 518 *data = g_variant_new_int32(devc->num_vdivs);
f44f7e61 519 break;
babab622
ML
520 case SR_CONF_DATA_SOURCE:
521 if (devc->data_source == DATA_SOURCE_LIVE)
522 *data = g_variant_new_string("Live");
523 else if (devc->data_source == DATA_SOURCE_MEMORY)
524 *data = g_variant_new_string("Memory");
525 else
526 *data = g_variant_new_string("Segmented");
527 break;
4914dd4b
ML
528 case SR_CONF_SAMPLERATE:
529 if (devc->data_source == DATA_SOURCE_LIVE) {
c2b394d5 530 samplerate = analog_frame_size(sdi) /
569d4dbd 531 (devc->timebase * devc->model->series->num_horizontal_divs);
4914dd4b 532 *data = g_variant_new_uint64(samplerate);
c2b394d5 533 } else {
e1b5b7e7 534 sr_dbg("Unknown data source: %d.", devc->data_source);
4914dd4b 535 return SR_ERR_NA;
c2b394d5 536 }
4914dd4b 537 break;
2b0e4a46
AJ
538 case SR_CONF_TRIGGER_SOURCE:
539 if (!strcmp(devc->trigger_source, "ACL"))
540 tmp_str = "AC Line";
541 else if (!strcmp(devc->trigger_source, "CHAN1"))
542 tmp_str = "CH1";
543 else if (!strcmp(devc->trigger_source, "CHAN2"))
544 tmp_str = "CH2";
545 else if (!strcmp(devc->trigger_source, "CHAN3"))
546 tmp_str = "CH3";
547 else if (!strcmp(devc->trigger_source, "CHAN4"))
548 tmp_str = "CH4";
549 else
550 tmp_str = devc->trigger_source;
551 *data = g_variant_new_string(tmp_str);
552 break;
5d336f11 553 case SR_CONF_TRIGGER_SLOPE:
e1b5b7e7 554 if (!strncmp(devc->trigger_slope, "POS", 3)) {
5d336f11 555 tmp_str = "r";
e1b5b7e7 556 } else if (!strncmp(devc->trigger_slope, "NEG", 3)) {
5d336f11 557 tmp_str = "f";
e1b5b7e7
UH
558 } else {
559 sr_dbg("Unknown trigger slope: '%s'.", devc->trigger_slope);
5d336f11 560 return SR_ERR_NA;
e1b5b7e7 561 }
5d336f11
AJ
562 *data = g_variant_new_string(tmp_str);
563 break;
9ea62f2e
AJ
564 case SR_CONF_TRIGGER_LEVEL:
565 *data = g_variant_new_double(devc->trigger_level);
566 break;
2b0e4a46
AJ
567 case SR_CONF_TIMEBASE:
568 for (i = 0; i < devc->num_timebases; i++) {
569 float tb = (float)devc->timebases[i][0] / devc->timebases[i][1];
570 float diff = fabs(devc->timebase - tb);
571 if (diff < smallest_diff) {
572 smallest_diff = diff;
573 idx = i;
574 }
575 }
e1b5b7e7
UH
576 if (idx < 0) {
577 sr_dbg("Negative timebase index: %d.", idx);
2b0e4a46 578 return SR_ERR_NA;
e1b5b7e7 579 }
2b0e4a46
AJ
580 *data = g_variant_new("(tt)", devc->timebases[idx][0],
581 devc->timebases[idx][1]);
582 break;
583 case SR_CONF_VDIV:
e1b5b7e7
UH
584 if (analog_channel < 0) {
585 sr_dbg("Negative analog channel: %d.", analog_channel);
2b0e4a46 586 return SR_ERR_NA;
e1b5b7e7 587 }
2b0e4a46
AJ
588 for (i = 0; i < ARRAY_SIZE(vdivs); i++) {
589 float vdiv = (float)vdivs[i][0] / vdivs[i][1];
590 float diff = fabs(devc->vdiv[analog_channel] - vdiv);
591 if (diff < smallest_diff) {
592 smallest_diff = diff;
593 idx = i;
594 }
595 }
e1b5b7e7
UH
596 if (idx < 0) {
597 sr_dbg("Negative vdiv index: %d.", idx);
2b0e4a46 598 return SR_ERR_NA;
e1b5b7e7 599 }
2b0e4a46
AJ
600 *data = g_variant_new("(tt)", vdivs[idx][0], vdivs[idx][1]);
601 break;
602 case SR_CONF_COUPLING:
e1b5b7e7
UH
603 if (analog_channel < 0) {
604 sr_dbg("Negative analog channel: %d.", analog_channel);
2b0e4a46 605 return SR_ERR_NA;
e1b5b7e7 606 }
2b0e4a46
AJ
607 *data = g_variant_new_string(devc->coupling[analog_channel]);
608 break;
934cf6cf
AJ
609 case SR_CONF_PROBE_FACTOR:
610 if (analog_channel < 0) {
611 sr_dbg("Negative analog channel: %d.", analog_channel);
612 return SR_ERR_NA;
613 }
614 *data = g_variant_new_uint64(devc->attenuation[analog_channel]);
615 break;
d62d7ad1 616 default:
bd6fbf62 617 return SR_ERR_NA;
d62d7ad1
BV
618 }
619
620 return SR_OK;
621}
622
dd7a72ea
UH
623static int config_set(uint32_t key, GVariant *data,
624 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
f4816ac6 625{
29d957ce 626 struct dev_context *devc;
697fb6dd 627 uint64_t p;
254dd102 628 double t_dbl;
fcd6a8bd 629 int ret, idx, i;
254dd102 630 const char *tmp_str;
889ef4a0 631 char buffer[16];
f4816ac6 632
b0baddef 633 devc = sdi->priv;
29d957ce 634
660e398f 635 /* If a channel group is specified, it must be a valid one. */
53b4680f 636 if (cg && !g_slist_find(sdi->channel_groups, cg)) {
660e398f 637 sr_err("Invalid channel group specified.");
969edf63 638 return SR_ERR;
be60a9e4
BV
639 }
640
584560f1 641 switch (key) {
1953564a 642 case SR_CONF_LIMIT_FRAMES:
f6a0ac9f 643 devc->limit_frames = g_variant_get_uint64(data);
e0b7d23c 644 break;
1953564a 645 case SR_CONF_TRIGGER_SLOPE:
697fb6dd 646 if ((idx = std_str_idx(data, ARRAY_AND_SIZE(trigger_slopes))) < 0)
ca9b9f48 647 return SR_ERR_ARG;
254dd102 648 g_free(devc->trigger_slope);
697fb6dd 649 devc->trigger_slope = g_strdup((trigger_slopes[idx][0] == 'r') ? "POS" : "NEG");
758906aa 650 return rigol_ds_config_set(sdi, ":TRIG:EDGE:SLOP %s", devc->trigger_slope);
1953564a 651 case SR_CONF_HORIZ_TRIGGERPOS:
254dd102 652 t_dbl = g_variant_get_double(data);
e1b5b7e7
UH
653 if (t_dbl < 0.0 || t_dbl > 1.0) {
654 sr_err("Invalid horiz. trigger position: %g.", t_dbl);
254dd102 655 return SR_ERR;
e1b5b7e7 656 }
254dd102
BV
657 devc->horiz_triggerpos = t_dbl;
658 /* We have the trigger offset as a percentage of the frame, but
659 * need to express this in seconds. */
bafd4890 660 t_dbl = -(devc->horiz_triggerpos - 0.5) * devc->timebase * devc->num_timebases;
889ef4a0 661 g_ascii_formatd(buffer, sizeof(buffer), "%.6f", t_dbl);
758906aa 662 return rigol_ds_config_set(sdi, ":TIM:OFFS %s", buffer);
9ea62f2e
AJ
663 case SR_CONF_TRIGGER_LEVEL:
664 t_dbl = g_variant_get_double(data);
665 g_ascii_formatd(buffer, sizeof(buffer), "%.3f", t_dbl);
666 ret = rigol_ds_config_set(sdi, ":TRIG:EDGE:LEV %s", buffer);
667 if (ret == SR_OK)
668 devc->trigger_level = t_dbl;
758906aa 669 return ret;
1953564a 670 case SR_CONF_TIMEBASE:
697fb6dd
UH
671 if ((idx = std_u64_tuple_idx(data, devc->timebases, devc->num_timebases)) < 0)
672 return SR_ERR_ARG;
673 devc->timebase = (float)devc->timebases[idx][0] / devc->timebases[idx][1];
674 g_ascii_formatd(buffer, sizeof(buffer), "%.9f",
675 devc->timebase);
758906aa 676 return rigol_ds_config_set(sdi, ":TIM:SCAL %s", buffer);
1953564a 677 case SR_CONF_TRIGGER_SOURCE:
6bcc81ac 678 if ((idx = std_str_idx(data, devc->model->trigger_sources, devc->model->num_trigger_sources)) < 0)
697fb6dd
UH
679 return SR_ERR_ARG;
680 g_free(devc->trigger_source);
6bcc81ac 681 devc->trigger_source = g_strdup(devc->model->trigger_sources[idx]);
697fb6dd
UH
682 if (!strcmp(devc->trigger_source, "AC Line"))
683 tmp_str = "ACL";
684 else if (!strcmp(devc->trigger_source, "CH1"))
685 tmp_str = "CHAN1";
686 else if (!strcmp(devc->trigger_source, "CH2"))
687 tmp_str = "CHAN2";
688 else if (!strcmp(devc->trigger_source, "CH3"))
689 tmp_str = "CHAN3";
690 else if (!strcmp(devc->trigger_source, "CH4"))
691 tmp_str = "CHAN4";
692 else
693 tmp_str = (char *)devc->trigger_source;
758906aa 694 return rigol_ds_config_set(sdi, ":TRIG:EDGE:SOUR %s", tmp_str);
1953564a 695 case SR_CONF_VDIV:
9e411f4b 696 if (!cg)
660e398f 697 return SR_ERR_CHANNEL_GROUP;
fcd6a8bd
UH
698 if ((i = std_cg_idx(cg, devc->analog_groups, devc->model->analog_channels)) < 0)
699 return SR_ERR_ARG;
700 if ((idx = std_u64_tuple_idx(data, ARRAY_AND_SIZE(vdivs))) < 0)
701 return SR_ERR_ARG;
702 devc->vdiv[i] = (float)vdivs[idx][0] / vdivs[idx][1];
703 g_ascii_formatd(buffer, sizeof(buffer), "%.3f", devc->vdiv[i]);
704 return rigol_ds_config_set(sdi, ":CHAN%d:SCAL %s", i + 1, buffer);
1953564a 705 case SR_CONF_COUPLING:
9e411f4b 706 if (!cg)
660e398f 707 return SR_ERR_CHANNEL_GROUP;
fcd6a8bd
UH
708 if ((i = std_cg_idx(cg, devc->analog_groups, devc->model->analog_channels)) < 0)
709 return SR_ERR_ARG;
710 if ((idx = std_str_idx(data, ARRAY_AND_SIZE(coupling))) < 0)
711 return SR_ERR_ARG;
712 g_free(devc->coupling[i]);
713 devc->coupling[i] = g_strdup(coupling[idx]);
714 return rigol_ds_config_set(sdi, ":CHAN%d:COUP %s", i + 1, devc->coupling[i]);
934cf6cf 715 case SR_CONF_PROBE_FACTOR:
9e411f4b 716 if (!cg)
934cf6cf 717 return SR_ERR_CHANNEL_GROUP;
fcd6a8bd
UH
718 if ((i = std_cg_idx(cg, devc->analog_groups, devc->model->analog_channels)) < 0)
719 return SR_ERR_ARG;
720 if ((idx = std_u64_idx(data, ARRAY_AND_SIZE(probe_factor))) < 0)
721 return SR_ERR_ARG;
934cf6cf 722 p = g_variant_get_uint64(data);
fcd6a8bd
UH
723 devc->attenuation[i] = probe_factor[idx];
724 ret = rigol_ds_config_set(sdi, ":CHAN%d:PROB %"PRIu64, i + 1, p);
725 if (ret == SR_OK)
726 rigol_ds_get_dev_cfg_vertical(sdi);
727 return ret;
babab622
ML
728 case SR_CONF_DATA_SOURCE:
729 tmp_str = g_variant_get_string(data, NULL);
730 if (!strcmp(tmp_str, "Live"))
731 devc->data_source = DATA_SOURCE_LIVE;
569d4dbd
ML
732 else if (devc->model->series->protocol >= PROTOCOL_V2
733 && !strcmp(tmp_str, "Memory"))
babab622 734 devc->data_source = DATA_SOURCE_MEMORY;
569d4dbd 735 else if (devc->model->series->protocol >= PROTOCOL_V3
babab622
ML
736 && !strcmp(tmp_str, "Segmented"))
737 devc->data_source = DATA_SOURCE_SEGMENTED;
e1b5b7e7
UH
738 else {
739 sr_err("Unknown data source: '%s'.", tmp_str);
babab622 740 return SR_ERR;
e1b5b7e7 741 }
babab622 742 break;
f4816ac6 743 default:
dcd438ee 744 return SR_ERR_NA;
f4816ac6
ML
745 }
746
758906aa 747 return SR_OK;
f4816ac6
ML
748}
749
dd7a72ea
UH
750static int config_list(uint32_t key, GVariant **data,
751 const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
a1c743fc 752{
e66d1892 753 struct dev_context *devc;
e43fdd8d 754
e66d1892 755 devc = (sdi) ? sdi->priv : NULL;
be60a9e4 756
e43fdd8d 757 switch (key) {
e66d1892 758 case SR_CONF_SCAN_OPTIONS:
9a6517d1 759 case SR_CONF_DEVICE_OPTIONS:
e66d1892
UH
760 if (!cg)
761 return STD_CONFIG_LIST(key, data, sdi, cg, scanopts, drvopts, devopts);
0306ae30
GS
762 if (!devc)
763 return SR_ERR_ARG;
562b7ae5 764 if (cg == devc->digital_group) {
105df674 765 *data = std_gvar_array_u32(NULL, 0);
f48e0249
ML
766 return SR_OK;
767 } else {
fcd6a8bd
UH
768 if (std_cg_idx(cg, devc->analog_groups, devc->model->analog_channels) < 0)
769 return SR_ERR_ARG;
770 *data = std_gvar_array_u32(ARRAY_AND_SIZE(devopts_cg_analog));
771 return SR_OK;
f48e0249 772 }
5f77dffc 773 break;
2a7b113d 774 case SR_CONF_COUPLING:
e66d1892 775 if (!cg)
660e398f 776 return SR_ERR_CHANNEL_GROUP;
53012da6 777 *data = g_variant_new_strv(ARRAY_AND_SIZE(coupling));
58f43369 778 break;
934cf6cf 779 case SR_CONF_PROBE_FACTOR:
e66d1892 780 if (!cg)
934cf6cf 781 return SR_ERR_CHANNEL_GROUP;
53012da6 782 *data = std_gvar_array_u64(ARRAY_AND_SIZE(probe_factor));
934cf6cf 783 break;
e4f2b2ad 784 case SR_CONF_VDIV:
7cc1a550
ML
785 if (!devc)
786 /* Can't know this until we have the exact model. */
787 return SR_ERR_ARG;
e66d1892 788 if (!cg)
660e398f 789 return SR_ERR_CHANNEL_GROUP;
58ffcf97 790 *data = std_gvar_tuple_array(devc->vdivs, devc->num_vdivs);
58f43369 791 break;
41f5bd09 792 case SR_CONF_TIMEBASE:
7cc1a550
ML
793 if (!devc)
794 /* Can't know this until we have the exact model. */
795 return SR_ERR_ARG;
a31b2ccb
AJ
796 if (devc->num_timebases <= 0)
797 return SR_ERR_NA;
58ffcf97 798 *data = std_gvar_tuple_array(devc->timebases, devc->num_timebases);
41f5bd09 799 break;
328bafab 800 case SR_CONF_TRIGGER_SOURCE:
7cc1a550
ML
801 if (!devc)
802 /* Can't know this until we have the exact model. */
803 return SR_ERR_ARG;
6bcc81ac 804 *data = g_variant_new_strv(devc->model->trigger_sources, devc->model->num_trigger_sources);
328bafab 805 break;
5d336f11 806 case SR_CONF_TRIGGER_SLOPE:
53012da6 807 *data = g_variant_new_strv(ARRAY_AND_SIZE(trigger_slopes));
5d336f11 808 break;
babab622
ML
809 case SR_CONF_DATA_SOURCE:
810 if (!devc)
811 /* Can't know this until we have the exact model. */
812 return SR_ERR_ARG;
569d4dbd
ML
813 switch (devc->model->series->protocol) {
814 case PROTOCOL_V1:
815 *data = g_variant_new_strv(data_sources, ARRAY_SIZE(data_sources) - 2);
816 break;
817 case PROTOCOL_V2:
babab622 818 *data = g_variant_new_strv(data_sources, ARRAY_SIZE(data_sources) - 1);
569d4dbd
ML
819 break;
820 default:
53012da6 821 *data = g_variant_new_strv(ARRAY_AND_SIZE(data_sources));
569d4dbd
ML
822 break;
823 }
babab622 824 break;
a1c743fc 825 default:
bd6fbf62 826 return SR_ERR_NA;
a1c743fc
BV
827 }
828
829 return SR_OK;
830}
831
695dc859 832static int dev_acquisition_start(const struct sr_dev_inst *sdi)
f4816ac6 833{
ae1bc1cc 834 struct sr_scpi_dev_inst *scpi;
29d957ce 835 struct dev_context *devc;
ba7dd8bb 836 struct sr_channel *ch;
f76c24f6 837 struct sr_datafeed_packet packet;
702f42e8 838 gboolean some_digital;
254dd102 839 GSList *l;
29d957ce 840
ae1bc1cc 841 scpi = sdi->conn;
29d957ce
UH
842 devc = sdi->priv;
843
51b294cd
ML
844 devc->num_frames = 0;
845
702f42e8 846 some_digital = FALSE;
ba7dd8bb
UH
847 for (l = sdi->channels; l; l = l->next) {
848 ch = l->data;
849 sr_dbg("handling channel %s", ch->name);
3f239f08 850 if (ch->type == SR_CHANNEL_ANALOG) {
ba7dd8bb 851 if (ch->enabled)
702f42e8
ML
852 devc->enabled_channels = g_slist_append(
853 devc->enabled_channels, ch);
ba7dd8bb 854 if (ch->enabled != devc->analog_channels[ch->index]) {
6bb192bc 855 /* Enabled channel is currently disabled, or vice versa. */
ba7dd8bb
UH
856 if (rigol_ds_config_set(sdi, ":CHAN%d:DISP %s", ch->index + 1,
857 ch->enabled ? "ON" : "OFF") != SR_OK)
6bb192bc 858 return SR_ERR;
ba7dd8bb 859 devc->analog_channels[ch->index] = ch->enabled;
6bb192bc 860 }
3f239f08 861 } else if (ch->type == SR_CHANNEL_LOGIC) {
01dd7a4c
ML
862 /* Only one list entry for older protocols. All channels are
863 * retrieved together when this entry is processed. */
702f42e8 864 if (ch->enabled && (
01dd7a4c 865 devc->model->series->protocol > PROTOCOL_V3 ||
702f42e8
ML
866 !some_digital))
867 devc->enabled_channels = g_slist_append(
868 devc->enabled_channels, ch);
ba7dd8bb 869 if (ch->enabled) {
702f42e8 870 some_digital = TRUE;
04e8e01e
ML
871 /* Turn on LA module if currently off. */
872 if (!devc->la_enabled) {
702f42e8 873 if (rigol_ds_config_set(sdi,
01dd7a4c 874 devc->model->series->protocol >= PROTOCOL_V3 ?
702f42e8 875 ":LA:STAT ON" : ":LA:DISP ON") != SR_OK)
04e8e01e
ML
876 return SR_ERR;
877 devc->la_enabled = TRUE;
878 }
879 }
ba7dd8bb 880 if (ch->enabled != devc->digital_channels[ch->index]) {
6bb192bc 881 /* Enabled channel is currently disabled, or vice versa. */
702f42e8 882 if (rigol_ds_config_set(sdi,
01dd7a4c 883 devc->model->series->protocol >= PROTOCOL_V3 ?
702f42e8 884 ":LA:DIG%d:DISP %s" : ":DIG%d:TURN %s", ch->index,
ba7dd8bb 885 ch->enabled ? "ON" : "OFF") != SR_OK)
6bb192bc 886 return SR_ERR;
ba7dd8bb 887 devc->digital_channels[ch->index] = ch->enabled;
6bb192bc 888 }
254dd102
BV
889 }
890 }
1fed20cb 891
702f42e8 892 if (!devc->enabled_channels)
254dd102 893 return SR_ERR;
e0b7d23c 894
ba7dd8bb 895 /* Turn off LA module if on and no digital channels selected. */
702f42e8
ML
896 if (devc->la_enabled && !some_digital)
897 if (rigol_ds_config_set(sdi,
01dd7a4c 898 devc->model->series->protocol >= PROTOCOL_V3 ?
702f42e8 899 ":LA:STAT OFF" : ":LA:DISP OFF") != SR_OK)
04e8e01e
ML
900 return SR_ERR;
901
e086b750
ML
902 /* Set memory mode. */
903 if (devc->data_source == DATA_SOURCE_SEGMENTED) {
904 sr_err("Data source 'Segmented' not yet supported");
905 return SR_ERR;
906 }
907
908 devc->analog_frame_size = analog_frame_size(sdi);
909 devc->digital_frame_size = digital_frame_size(sdi);
910
569d4dbd
ML
911 switch (devc->model->series->protocol) {
912 case PROTOCOL_V2:
99af83b7 913 if (rigol_ds_config_set(sdi, ":ACQ:MEMD LONG") != SR_OK)
e086b750 914 return SR_ERR;
569d4dbd
ML
915 break;
916 case PROTOCOL_V3:
e086b750
ML
917 /* Apparently for the DS2000 the memory
918 * depth can only be set in Running state -
919 * this matches the behaviour of the UI. */
38354d9d 920 if (rigol_ds_config_set(sdi, ":RUN") != SR_OK)
1fed20cb 921 return SR_ERR;
e086b750
ML
922 if (rigol_ds_config_set(sdi, ":ACQ:MDEP %d",
923 devc->analog_frame_size) != SR_OK)
924 return SR_ERR;
925 if (rigol_ds_config_set(sdi, ":STOP") != SR_OK)
1fed20cb 926 return SR_ERR;
569d4dbd
ML
927 break;
928 default:
929 break;
1fed20cb
ML
930 }
931
e086b750
ML
932 if (devc->data_source == DATA_SOURCE_LIVE)
933 if (rigol_ds_config_set(sdi, ":RUN") != SR_OK)
934 return SR_ERR;
935
102f1239
BV
936 sr_scpi_source_add(sdi->session, scpi, G_IO_IN, 50,
937 rigol_ds_receive, (void *)sdi);
e0b7d23c 938
bee2b016 939 std_session_send_df_header(sdi);
e0b7d23c 940
702f42e8 941 devc->channel_entry = devc->enabled_channels;
821fbcad 942
e086b750
ML
943 if (rigol_ds_capture_start(sdi) != SR_OK)
944 return SR_ERR;
f4816ac6 945
f76c24f6
ML
946 /* Start of first frame. */
947 packet.type = SR_DF_FRAME_BEGIN;
695dc859 948 sr_session_send(sdi, &packet);
f76c24f6 949
f4816ac6
ML
950 return SR_OK;
951}
952
695dc859 953static int dev_acquisition_stop(struct sr_dev_inst *sdi)
f4816ac6 954{
29d957ce 955 struct dev_context *devc;
ae1bc1cc 956 struct sr_scpi_dev_inst *scpi;
29d957ce 957
29d957ce
UH
958 devc = sdi->priv;
959
bee2b016 960 std_session_send_df_end(sdi);
b751cf7a 961
702f42e8
ML
962 g_slist_free(devc->enabled_channels);
963 devc->enabled_channels = NULL;
ae1bc1cc 964 scpi = sdi->conn;
102f1239 965 sr_scpi_source_remove(sdi->session, scpi);
f4816ac6
ML
966
967 return SR_OK;
968}
969
dd5c48a6 970static struct sr_dev_driver rigol_ds_driver_info = {
3086efdd
ML
971 .name = "rigol-ds",
972 .longname = "Rigol DS",
f4816ac6 973 .api_version = 1,
c2fdcc25 974 .init = std_init,
700d6b64 975 .cleanup = std_cleanup,
6078d2c9 976 .scan = scan,
c01bf34c 977 .dev_list = std_dev_list,
3b412e3a 978 .dev_clear = dev_clear,
d62d7ad1 979 .config_get = config_get,
035a1078 980 .config_set = config_set,
a1c743fc 981 .config_list = config_list,
6078d2c9
UH
982 .dev_open = dev_open,
983 .dev_close = dev_close,
254dd102
BV
984 .dev_acquisition_start = dev_acquisition_start,
985 .dev_acquisition_stop = dev_acquisition_stop,
41812aca 986 .context = NULL,
f4816ac6 987};
dd5c48a6 988SR_REGISTER_DEV_DRIVER(rigol_ds_driver_info);