]> sigrok.org Git - libsigrok.git/blame - src/hardware/yokogawa-dlm/protocol.c
drivers: Use ARRAY_AND_SIZE where possible.
[libsigrok.git] / src / hardware / yokogawa-dlm / protocol.c
CommitLineData
10763937
SA
1/*
2 * This file is part of the libsigrok project.
3 *
4 * Copyright (C) 2014 abraxa (Soeren Apel) <soeren@apelpie.net>
5 * Based on the Hameg HMO driver by poljar (Damir Jelić) <poljarinho@gmail.com>
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
6ec6c43b 21#include <config.h>
5a1afc09 22#include "scpi.h"
10763937
SA
23#include "protocol.h"
24
4b25cbff 25static const char *coupling_options[] = {
8ab929d6
SA
26 "AC",
27 "DC",
28 "DC50",
29 "GND",
30 NULL,
31};
32
4b25cbff 33static const char *trigger_sources_2ch[] = {
8ab929d6
SA
34 "1",
35 "2",
36 "LINE",
37 "EXT",
38 NULL,
39};
40
41/* TODO: Is BITx handled correctly or is Dx required? */
4b25cbff 42static const char *trigger_sources_4ch[] = {
8ab929d6
SA
43 "1",
44 "2",
45 "3",
46 "4",
47 "LINE",
48 "EXT",
49 "BIT1",
50 "BIT2",
51 "BIT3",
52 "BIT4",
53 "BIT5",
54 "BIT6",
55 "BIT7",
56 "BIT8",
57 NULL,
58};
59
a9308652 60/* Note: Values must correlate to the trigger_slopes values. */
f3c60fb6
SA
61const char *dlm_trigger_slopes[3] = {
62 "r",
63 "f",
64 NULL,
65};
66
67const uint64_t dlm_timebases[36][2] = {
8ab929d6
SA
68 /* nanoseconds */
69 { 1, 1000000000 },
70 { 2, 1000000000 },
71 { 5, 1000000000 },
72 { 10, 1000000000 },
73 { 20, 1000000000 },
74 { 50, 1000000000 },
75 { 100, 1000000000 },
76 { 200, 1000000000 },
77 { 500, 1000000000 },
78 /* microseconds */
79 { 1, 1000000 },
80 { 2, 1000000 },
81 { 5, 1000000 },
82 { 10, 1000000 },
83 { 20, 1000000 },
84 { 50, 1000000 },
85 { 100, 1000000 },
86 { 200, 1000000 },
87 { 500, 1000000 },
88 /* milliseconds */
89 { 1, 1000 },
90 { 2, 1000 },
91 { 5, 1000 },
92 { 10, 1000 },
93 { 20, 1000 },
94 { 50, 1000 },
95 { 100, 1000 },
96 { 200, 1000 },
97 { 500, 1000 },
98 /* seconds */
99 { 1, 1 },
100 { 2, 1 },
101 { 5, 1 },
102 { 10, 1 },
103 { 20, 1 },
104 { 50, 1 },
105 { 100, 1 },
106 { 200, 1 },
107 { 500, 1 },
108};
109
f3c60fb6 110const uint64_t dlm_vdivs[17][2] = {
8ab929d6
SA
111 /* millivolts */
112 { 2, 1000 },
113 { 5, 1000 },
114 { 10, 1000 },
115 { 20, 1000 },
116 { 50, 1000 },
117 { 100, 1000 },
118 { 200, 1000 },
119 { 500, 1000 },
120 /* volts */
121 { 1, 1 },
122 { 2, 1 },
123 { 5, 1 },
124 { 10, 1 },
125 { 20, 1 },
126 { 50, 1 },
127 { 100, 1 },
128 { 200, 1 },
129 { 500, 1 },
130};
131
132static const char *scope_analog_channel_names[] = {
133 "1",
134 "2",
135 "3",
a9308652 136 "4",
8ab929d6
SA
137};
138
7048bb1f 139static const char *scope_digital_channel_names_8[] = {
8ab929d6
SA
140 "D0",
141 "D1",
142 "D2",
143 "D3",
144 "D4",
145 "D5",
146 "D6",
a9308652 147 "D7",
8ab929d6
SA
148};
149
7048bb1f
SA
150static const char *scope_digital_channel_names_32[] = {
151 "A0",
152 "A1",
153 "A2",
154 "A3",
155 "A4",
156 "A5",
157 "A6",
158 "A7",
159 "B0",
160 "B1",
161 "B2",
162 "B3",
163 "B4",
164 "B5",
165 "B6",
166 "B7",
167 "C0",
168 "C1",
169 "C2",
170 "C3",
171 "C4",
172 "C5",
173 "C6",
174 "C7",
175 "D0",
176 "D1",
177 "D2",
178 "D3",
179 "D4",
180 "D5",
181 "D6",
182 "D7",
183};
184
329733d9 185static const struct scope_config scope_models[] = {
8ab929d6
SA
186 {
187 .model_id = {"710105", "710115", "710125", NULL},
188 .model_name = {"DLM2022", "DLM2032", "DLM2052", NULL},
189 .analog_channels = 2,
190 .digital_channels = 0,
191 .pods = 0,
192
193 .analog_names = &scope_analog_channel_names,
7048bb1f 194 .digital_names = &scope_digital_channel_names_8,
8ab929d6 195
4b25cbff
UH
196 .coupling_options = &coupling_options,
197 .trigger_sources = &trigger_sources_2ch,
8ab929d6
SA
198
199 .num_xdivs = 10,
200 .num_ydivs = 8,
201 },
202 {
d9251a2c
UH
203 .model_id = {"710110", "710120", "710130", NULL},
204 .model_name = {"DLM2024", "DLM2034", "DLM2054", NULL},
8ab929d6
SA
205 .analog_channels = 4,
206 .digital_channels = 8,
207 .pods = 1,
208
209 .analog_names = &scope_analog_channel_names,
7048bb1f
SA
210 .digital_names = &scope_digital_channel_names_8,
211
4b25cbff
UH
212 .coupling_options = &coupling_options,
213 .trigger_sources = &trigger_sources_4ch,
7048bb1f
SA
214
215 .num_xdivs = 10,
216 .num_ydivs = 8,
217 },
218 {
219 .model_id = {"701307", "701308", "701310", "701311",
d9251a2c 220 "701312", "701313", NULL},
7048bb1f 221 .model_name = {"DL9040", "DL9040L", "DL9140", "DL9140L",
d9251a2c 222 "DL9240", "DL9240L", NULL},
7048bb1f
SA
223 .analog_channels = 4,
224 .digital_channels = 0,
225 .pods = 0,
226
227 .analog_names = &scope_analog_channel_names,
228 .digital_names = NULL,
229
4b25cbff
UH
230 .coupling_options = &coupling_options,
231 .trigger_sources = &trigger_sources_4ch,
7048bb1f
SA
232
233 .num_xdivs = 10,
234 .num_ydivs = 8,
235 },
236 {
237 .model_id = {"701320", "701321", NULL},
238 .model_name = {"DL9505L", "DL9510L", NULL},
239 .analog_channels = 4,
240 .digital_channels = 16,
241 .pods = 4,
242
243 .analog_names = &scope_analog_channel_names,
244 .digital_names = &scope_digital_channel_names_32,
245
4b25cbff
UH
246 .coupling_options = &coupling_options,
247 .trigger_sources = &trigger_sources_4ch,
7048bb1f
SA
248
249 .num_xdivs = 10,
250 .num_ydivs = 8,
251 },
252 {
253 .model_id = {"701330", "701331", NULL},
254 .model_name = {"DL9705L", "DL9710L", NULL},
255 .analog_channels = 4,
256 .digital_channels = 32,
257 .pods = 4,
258
259 .analog_names = &scope_analog_channel_names,
260 .digital_names = &scope_digital_channel_names_32,
8ab929d6 261
4b25cbff
UH
262 .coupling_options = &coupling_options,
263 .trigger_sources = &trigger_sources_4ch,
8ab929d6
SA
264
265 .num_xdivs = 10,
266 .num_ydivs = 8,
267 },
268};
269
270/**
271 * Prints out the state of the device as we currently know it.
272 *
273 * @param config This is the scope configuration.
274 * @param state The current scope state to print.
275 */
329733d9 276static void scope_state_dump(const struct scope_config *config,
8ab929d6
SA
277 struct scope_state *state)
278{
279 unsigned int i;
280 char *tmp;
281
a9308652 282 for (i = 0; i < config->analog_channels; i++) {
f3c60fb6
SA
283 tmp = sr_voltage_string(dlm_vdivs[state->analog_states[i].vdiv][0],
284 dlm_vdivs[state->analog_states[i].vdiv][1]);
a9308652 285 sr_info("State of analog channel %d -> %s : %s (coupling) %s (vdiv) %2.2e (offset)",
ac10a927
SA
286 i + 1, state->analog_states[i].state ? "On" : "Off",
287 (*config->coupling_options)[state->analog_states[i].coupling],
288 tmp, state->analog_states[i].vertical_offset);
8ab929d6
SA
289 }
290
a9308652 291 for (i = 0; i < config->digital_channels; i++) {
8ab929d6 292 sr_info("State of digital channel %d -> %s", i,
ac10a927 293 state->digital_states[i] ? "On" : "Off");
8ab929d6
SA
294 }
295
a9308652 296 for (i = 0; i < config->pods; i++) {
8ab929d6 297 sr_info("State of digital POD %d -> %s", i,
ac10a927 298 state->pod_states[i] ? "On" : "Off");
8ab929d6
SA
299 }
300
6984cfb2
SA
301 tmp = sr_period_string(dlm_timebases[state->timebase][0],
302 dlm_timebases[state->timebase][1]);
8ab929d6
SA
303 sr_info("Current timebase: %s", tmp);
304 g_free(tmp);
305
306 tmp = sr_samplerate_string(state->sample_rate);
307 sr_info("Current samplerate: %s", tmp);
308 g_free(tmp);
309
af3487ec 310 sr_info("Current samples per acquisition (i.e. frame): %d",
ac10a927 311 state->samples_per_frame);
af3487ec 312
8ab929d6 313 sr_info("Current trigger: %s (source), %s (slope) %.2f (offset)",
ac10a927 314 (*config->trigger_sources)[state->trigger_source],
f3c60fb6 315 dlm_trigger_slopes[state->trigger_slope],
ac10a927 316 state->horiz_triggerpos);
8ab929d6
SA
317}
318
319/**
320 * Searches through an array of strings and returns the index to the
321 * array where a given string is located.
322 *
323 * @param value The string to search for.
324 * @param array The array of strings.
325 * @param result The index at which value is located in array. -1 on error.
326 *
327 * @return SR_ERR when value couldn't be found, SR_OK otherwise.
328 */
329static int array_option_get(char *value, const char *(*array)[],
330 int *result)
331{
332 unsigned int i;
333
334 *result = -1;
335
a9308652 336 for (i = 0; (*array)[i]; i++)
8ab929d6
SA
337 if (!g_strcmp0(value, (*array)[i])) {
338 *result = i;
339 break;
340 }
341
342 if (*result == -1)
343 return SR_ERR;
344
345 return SR_OK;
346}
347
348/**
349 * This function takes a value of the form "2.000E-03", converts it to a
350 * significand / factor pair and returns the index of an array where
351 * a matching pair was found.
352 *
353 * It's a bit convoluted because of floating-point issues. The value "10.00E-09"
354 * is parsed by g_ascii_strtod() as 0.000000009999999939, for example.
355 * Therefore it's easier to break the number up into two strings and handle
356 * them separately.
357 *
358 * @param value The string to be parsed.
359 * @param array The array of s/f pairs.
360 * @param array_len The number of pairs in the array.
361 * @param result The index at which a matching pair was found.
362 *
363 * @return SR_ERR on any parsing error, SR_OK otherwise.
364 */
365static int array_float_get(gchar *value, const uint64_t array[][2],
366 int array_len, int *result)
367{
10c4ca9c
SA
368 int i, e;
369 size_t pos;
8ab929d6
SA
370 uint64_t f;
371 float s;
ac10a927 372 unsigned int s_int;
8ab929d6
SA
373 gchar ss[10], es[10];
374
375 memset(ss, 0, sizeof(ss));
376 memset(es, 0, sizeof(es));
377
b18b8a92 378 /* Get index of the separating 'E' character and break up the string. */
10c4ca9c 379 pos = strcspn(value, "E");
b18b8a92
SA
380
381 strncpy(ss, value, pos);
382 strncpy(es, &(value[pos+1]), 3);
8ab929d6
SA
383
384 if (sr_atof_ascii(ss, &s) != SR_OK)
385 return SR_ERR;
b18b8a92 386 if (sr_atoi(es, &e) != SR_OK)
8ab929d6
SA
387 return SR_ERR;
388
389 /* Transform e.g. 10^-03 to 1000 as the array stores the inverse. */
b18b8a92 390 f = pow(10, abs(e));
8ab929d6 391
a9308652
UH
392 /*
393 * Adjust the significand/factor pair to make sure
8ab929d6
SA
394 * that f is a multiple of 1000.
395 */
b18b8a92
SA
396 while ((int)fmod(log10(f), 3) > 0) {
397 s *= 10;
398
399 if (e < 0)
400 f *= 10;
401 else
402 f /= 10;
403 }
8ab929d6
SA
404
405 /* Truncate s to circumvent rounding errors. */
ac10a927 406 s_int = (unsigned int)s;
8ab929d6
SA
407
408 for (i = 0; i < array_len; i++) {
b18b8a92 409 if ((s_int == array[i][0]) && (f == array[i][1])) {
8ab929d6
SA
410 *result = i;
411 return SR_OK;
412 }
413 }
414
415 return SR_ERR;
416}
417
418/**
419 * Obtains information about all analog channels from the oscilloscope.
420 * The internal state information is updated accordingly.
421 *
c65a021c 422 * @param sdi The device instance.
8ab929d6
SA
423 * @param config The device's device configuration.
424 * @param state The device's state information.
425 *
426 * @return SR_ERR on error, SR_OK otherwise.
427 */
c65a021c 428static int analog_channel_state_get(const struct sr_dev_inst *sdi,
329733d9 429 const struct scope_config *config,
ac10a927 430 struct scope_state *state)
8ab929d6 431{
c65a021c 432 struct sr_scpi_dev_inst *scpi;
8ab929d6 433 int i, j;
c65a021c
SA
434 GSList *l;
435 struct sr_channel *ch;
8ab929d6
SA
436 gchar *response;
437
c65a021c
SA
438 scpi = sdi->conn;
439
a9308652 440 for (i = 0; i < config->analog_channels; i++) {
8ab929d6
SA
441
442 if (dlm_analog_chan_state_get(scpi, i + 1,
ac10a927 443 &state->analog_states[i].state) != SR_OK)
8ab929d6
SA
444 return SR_ERR;
445
c65a021c
SA
446 for (l = sdi->channels; l; l = l->next) {
447 ch = l->data;
448 if (ch->index == i) {
449 ch->enabled = state->analog_states[i].state;
450 break;
451 }
452 }
453
8ab929d6
SA
454 if (dlm_analog_chan_vdiv_get(scpi, i + 1, &response) != SR_OK)
455 return SR_ERR;
456
53012da6 457 if (array_float_get(response, ARRAY_AND_SIZE(dlm_vdivs),
ac10a927 458 &j) != SR_OK) {
8ab929d6
SA
459 g_free(response);
460 return SR_ERR;
461 }
462
463 g_free(response);
464 state->analog_states[i].vdiv = j;
465
466 if (dlm_analog_chan_voffs_get(scpi, i + 1,
ac10a927 467 &state->analog_states[i].vertical_offset) != SR_OK)
8ab929d6
SA
468 return SR_ERR;
469
470 if (dlm_analog_chan_wrange_get(scpi, i + 1,
ac10a927 471 &state->analog_states[i].waveform_range) != SR_OK)
8ab929d6
SA
472 return SR_ERR;
473
474 if (dlm_analog_chan_woffs_get(scpi, i + 1,
ac10a927 475 &state->analog_states[i].waveform_offset) != SR_OK)
8ab929d6
SA
476 return SR_ERR;
477
478 if (dlm_analog_chan_coupl_get(scpi, i + 1, &response) != SR_OK) {
479 g_free(response);
480 return SR_ERR;
481 }
482
483 if (array_option_get(response, config->coupling_options,
ac10a927 484 &state->analog_states[i].coupling) != SR_OK) {
8ab929d6
SA
485 g_free(response);
486 return SR_ERR;
487 }
488 g_free(response);
489 }
490
491 return SR_OK;
492}
493
494/**
495 * Obtains information about all digital channels from the oscilloscope.
496 * The internal state information is updated accordingly.
497 *
c65a021c 498 * @param sdi The device instance.
8ab929d6
SA
499 * @param config The device's device configuration.
500 * @param state The device's state information.
501 *
502 * @return SR_ERR on error, SR_OK otherwise.
503 */
c65a021c 504static int digital_channel_state_get(const struct sr_dev_inst *sdi,
329733d9 505 const struct scope_config *config,
ac10a927 506 struct scope_state *state)
8ab929d6 507{
c65a021c
SA
508 struct sr_scpi_dev_inst *scpi;
509 int i;
510 GSList *l;
511 struct sr_channel *ch;
512
513 scpi = sdi->conn;
8ab929d6 514
a9308652
UH
515 if (!config->digital_channels) {
516 sr_warn("Tried obtaining digital channel states on a " \
517 "model without digital inputs.");
518 return SR_OK;
519 }
8ab929d6 520
a9308652 521 for (i = 0; i < config->digital_channels; i++) {
8ab929d6
SA
522 if (dlm_digital_chan_state_get(scpi, i + 1,
523 &state->digital_states[i]) != SR_OK) {
524 return SR_ERR;
525 }
c65a021c
SA
526
527 for (l = sdi->channels; l; l = l->next) {
528 ch = l->data;
529 if (ch->index == i + DLM_DIG_CHAN_INDEX_OFFS) {
530 ch->enabled = state->digital_states[i];
531 break;
532 }
533 }
8ab929d6
SA
534 }
535
a9308652 536 if (!config->pods) {
8ab929d6
SA
537 sr_warn("Tried obtaining pod states on a model without pods.");
538 return SR_OK;
539 }
540
a9308652 541 for (i = 0; i < config->pods; i++) {
8ab929d6
SA
542 if (dlm_digital_pod_state_get(scpi, i + 'A',
543 &state->pod_states[i]) != SR_OK)
544 return SR_ERR;
545 }
546
547 return SR_OK;
548}
549
c65a021c
SA
550SR_PRIV int dlm_channel_state_set(const struct sr_dev_inst *sdi,
551 const int ch_index, gboolean ch_state)
552{
553 GSList *l;
554 struct sr_channel *ch;
555 struct dev_context *devc = NULL;
556 struct scope_state *state;
557 const struct scope_config *model = NULL;
558 struct sr_scpi_dev_inst *scpi;
559 gboolean chan_found;
560 gboolean *pod_enabled;
561 int i, result;
562
563 result = SR_OK;
564
565 scpi = sdi->conn;
566 devc = sdi->priv;
567 state = devc->model_state;
568 model = devc->model_config;
569 chan_found = FALSE;
570
571 pod_enabled = g_malloc0(sizeof(gboolean) * model->pods);
572
573 for (l = sdi->channels; l; l = l->next) {
574 ch = l->data;
575
576 switch (ch->type) {
577 case SR_CHANNEL_ANALOG:
578 if (ch->index == ch_index) {
579 if (dlm_analog_chan_state_set(scpi, ch->index + 1, ch_state) != SR_OK) {
580 result = SR_ERR;
581 break;
582 }
583
584 ch->enabled = ch_state;
585 state->analog_states[ch->index].state = ch_state;
586 chan_found = TRUE;
587 break;
588 }
589 break;
590 case SR_CHANNEL_LOGIC:
591 i = ch->index - DLM_DIG_CHAN_INDEX_OFFS;
592
593 if (ch->index == ch_index) {
594 if (dlm_digital_chan_state_set(scpi, i + 1, ch_state) != SR_OK) {
595 result = SR_ERR;
596 break;
597 }
598
a9308652
UH
599 ch->enabled = ch_state;
600 state->digital_states[i] = ch_state;
601 chan_found = TRUE;
c65a021c 602
a9308652
UH
603 /* The corresponding pod has to be enabled also. */
604 pod_enabled[i / 8] |= ch->enabled;
605 } else {
c65a021c
SA
606 /* Also check all other channels. Maybe we can disable a pod. */
607 pod_enabled[i / 8] |= ch->enabled;
a9308652 608 }
c65a021c
SA
609 break;
610 default:
611 result = SR_ERR_NA;
612 }
613 }
614
a9308652 615 for (i = 0; i < model->pods; i++) {
c65a021c
SA
616 if (state->pod_states[i] == pod_enabled[i])
617 continue;
618
619 if (dlm_digital_pod_state_set(scpi, i + 1, pod_enabled[i]) != SR_OK) {
620 result = SR_ERR;
621 break;
622 }
623
624 state->pod_states[i] = pod_enabled[i];
625 }
626
627 g_free(pod_enabled);
628
629 if ((result == SR_OK) && !chan_found)
630 result = SR_ERR_BUG;
631
632 return result;
633}
634
8ab929d6
SA
635/**
636 * Obtains information about the sample rate from the oscilloscope.
637 * The internal state information is updated accordingly.
638 *
639 * @param sdi The device instance.
640 *
641 * @return SR_ERR on error, SR_OK otherwise.
642 */
643SR_PRIV int dlm_sample_rate_query(const struct sr_dev_inst *sdi)
644{
645 struct dev_context *devc;
646 struct scope_state *state;
647 float tmp_float;
648
649 devc = sdi->priv;
650 state = devc->model_state;
651
a9308652
UH
652 /*
653 * No need to find an active channel to query the sample rate:
8ab929d6
SA
654 * querying any channel will do, so we use channel 1 all the time.
655 */
656 if (dlm_analog_chan_srate_get(sdi->conn, 1, &tmp_float) != SR_OK)
657 return SR_ERR;
658
659 state->sample_rate = tmp_float;
660
661 return SR_OK;
662}
663
664/**
665 * Obtains information about the current device state from the oscilloscope,
666 * including all analog and digital channel configurations.
667 * The internal state information is updated accordingly.
668 *
669 * @param sdi The device instance.
670 *
671 * @return SR_ERR on error, SR_OK otherwise.
672 */
673SR_PRIV int dlm_scope_state_query(struct sr_dev_inst *sdi)
674{
675 struct dev_context *devc;
676 struct scope_state *state;
329733d9 677 const struct scope_config *config;
8ab929d6
SA
678 float tmp_float;
679 gchar *response;
680 int i;
681
682 devc = sdi->priv;
683 config = devc->model_config;
684 state = devc->model_state;
685
c65a021c 686 if (analog_channel_state_get(sdi, config, state) != SR_OK)
8ab929d6
SA
687 return SR_ERR;
688
c65a021c 689 if (digital_channel_state_get(sdi, config, state) != SR_OK)
8ab929d6
SA
690 return SR_ERR;
691
692 if (dlm_timebase_get(sdi->conn, &response) != SR_OK)
693 return SR_ERR;
694
53012da6 695 if (array_float_get(response, ARRAY_AND_SIZE(dlm_timebases), &i) != SR_OK) {
8ab929d6
SA
696 g_free(response);
697 return SR_ERR;
698 }
699
700 g_free(response);
701 state->timebase = i;
702
703 if (dlm_horiz_trigger_pos_get(sdi->conn, &tmp_float) != SR_OK)
704 return SR_ERR;
705
706 /* TODO: Check if the calculation makes sense for the DLM. */
707 state->horiz_triggerpos = tmp_float /
f3c60fb6
SA
708 (((double)dlm_timebases[state->timebase][0] /
709 dlm_timebases[state->timebase][1]) * config->num_xdivs);
8ab929d6
SA
710 state->horiz_triggerpos -= 0.5;
711 state->horiz_triggerpos *= -1;
712
713 if (dlm_trigger_source_get(sdi->conn, &response) != SR_OK) {
714 g_free(response);
715 return SR_ERR;
716 }
717
718 if (array_option_get(response, config->trigger_sources,
ac10a927 719 &state->trigger_source) != SR_OK) {
8ab929d6
SA
720 g_free(response);
721 return SR_ERR;
722 }
723
724 g_free(response);
725
726 if (dlm_trigger_slope_get(sdi->conn, &i) != SR_OK)
727 return SR_ERR;
728
729 state->trigger_slope = i;
730
af3487ec
SA
731 if (dlm_acq_length_get(sdi->conn, &state->samples_per_frame) != SR_OK) {
732 sr_err("Failed to query acquisition length.");
733 return SR_ERR;
734 }
735
8ab929d6
SA
736 dlm_sample_rate_query(sdi);
737
738 scope_state_dump(config, state);
739
740 return SR_OK;
741}
742
743/**
744 * Creates a new device state structure.
745 *
746 * @param config The device configuration to use.
747 *
ac10a927 748 * @return The newly allocated scope_state struct.
8ab929d6 749 */
329733d9 750static struct scope_state *dlm_scope_state_new(const struct scope_config *config)
8ab929d6
SA
751{
752 struct scope_state *state;
753
ac10a927 754 state = g_malloc0(sizeof(struct scope_state));
8ab929d6
SA
755
756 state->analog_states = g_malloc0(config->analog_channels *
ac10a927 757 sizeof(struct analog_channel_state));
8ab929d6
SA
758
759 state->digital_states = g_malloc0(config->digital_channels *
ac10a927 760 sizeof(gboolean));
8ab929d6
SA
761
762 state->pod_states = g_malloc0(config->pods * sizeof(gboolean));
763
764 return state;
765}
766
767/**
768 * Frees the memory that was allocated by a call to dlm_scope_state_new().
769 *
770 * @param state The device state structure whose memory is to be freed.
771 */
772SR_PRIV void dlm_scope_state_destroy(struct scope_state *state)
773{
774 g_free(state->analog_states);
775 g_free(state->digital_states);
776 g_free(state->pod_states);
777 g_free(state);
778}
779
780SR_PRIV int dlm_model_get(char *model_id, char **model_name, int *model_index)
781{
782 unsigned int i, j;
783
784 *model_index = -1;
785 *model_name = NULL;
786
787 for (i = 0; i < ARRAY_SIZE(scope_models); i++) {
788 for (j = 0; scope_models[i].model_id[j]; j++) {
789 if (!strcmp(model_id, scope_models[i].model_id[j])) {
790 *model_index = i;
791 *model_name = (char *)scope_models[i].model_name[j];
792 break;
793 }
794 }
795 if (*model_index != -1)
796 break;
797 }
798
799 if (*model_index == -1) {
800 sr_err("Found unsupported DLM device with model identifier %s.",
ac10a927 801 model_id);
8ab929d6
SA
802 return SR_ERR_NA;
803 }
804
805 return SR_OK;
806}
807
808/**
809 * Attempts to initialize a DL/DLM device and prepares internal structures
810 * if a suitable device was found.
811 *
812 * @param sdi The device instance.
813 */
814SR_PRIV int dlm_device_init(struct sr_dev_inst *sdi, int model_index)
815{
816 char tmp[25];
817 int i;
818 struct sr_channel *ch;
819 struct dev_context *devc;
820
821 devc = sdi->priv;
822
823 devc->analog_groups = g_malloc0(sizeof(struct sr_channel_group*) *
ac10a927 824 scope_models[model_index].analog_channels);
8ab929d6
SA
825
826 devc->digital_groups = g_malloc0(sizeof(struct sr_channel_group*) *
f77afcf0 827 scope_models[model_index].pods);
8ab929d6 828
6fd78a9f 829 /* Add analog channels, each in its own group. */
8ab929d6 830 for (i = 0; i < scope_models[model_index].analog_channels; i++) {
5e23fcab 831 ch = sr_channel_new(sdi, i, SR_CHANNEL_ANALOG, TRUE,
c368e6f3 832 (*scope_models[model_index].analog_names)[i]);
8ab929d6
SA
833
834 devc->analog_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
835
836 devc->analog_groups[i]->name = g_strdup(
ac10a927 837 (char *)(*scope_models[model_index].analog_names)[i]);
8ab929d6
SA
838 devc->analog_groups[i]->channels = g_slist_append(NULL, ch);
839
840 sdi->channel_groups = g_slist_append(sdi->channel_groups,
ac10a927 841 devc->analog_groups[i]);
8ab929d6
SA
842 }
843
844 /* Add digital channel groups. */
a9308652 845 for (i = 0; i < scope_models[model_index].pods; i++) {
8ab929d6
SA
846 g_snprintf(tmp, sizeof(tmp), "POD%d", i);
847
848 devc->digital_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
849 if (!devc->digital_groups[i])
850 return SR_ERR_MALLOC;
851
852 devc->digital_groups[i]->name = g_strdup(tmp);
853 sdi->channel_groups = g_slist_append(sdi->channel_groups,
854 devc->digital_groups[i]);
855 }
856
857 /* Add digital channels. */
858 for (i = 0; i < scope_models[model_index].digital_channels; i++) {
6fd78a9f
SA
859 ch = sr_channel_new(sdi, DLM_DIG_CHAN_INDEX_OFFS + i,
860 SR_CHANNEL_LOGIC, TRUE,
c368e6f3 861 (*scope_models[model_index].digital_names)[i]);
8ab929d6
SA
862
863 devc->digital_groups[i / 8]->channels = g_slist_append(
ac10a927 864 devc->digital_groups[i / 8]->channels, ch);
8ab929d6
SA
865 }
866 devc->model_config = &scope_models[model_index];
867 devc->frame_limit = 0;
868
869 if (!(devc->model_state = dlm_scope_state_new(devc->model_config)))
870 return SR_ERR_MALLOC;
871
872 /* Disable non-standard response behavior. */
873 if (dlm_response_headers_set(sdi->conn, FALSE) != SR_OK)
874 return SR_ERR;
875
876 return SR_OK;
877}
878
af3487ec 879SR_PRIV int dlm_channel_data_request(const struct sr_dev_inst *sdi)
8ab929d6 880{
af3487ec
SA
881 struct dev_context *devc;
882 struct sr_channel *ch;
883 int result;
8ab929d6 884
af3487ec
SA
885 devc = sdi->priv;
886 ch = devc->current_channel->data;
8ab929d6 887
af3487ec
SA
888 switch (ch->type) {
889 case SR_CHANNEL_ANALOG:
890 result = dlm_analog_data_get(sdi->conn, ch->index + 1);
891 break;
892 case SR_CHANNEL_LOGIC:
893 result = dlm_digital_data_get(sdi->conn);
894 break;
895 default:
896 sr_err("Invalid channel type encountered (%d).",
897 ch->type);
898 result = SR_ERR;
8ab929d6
SA
899 }
900
af3487ec
SA
901 if (result == SR_OK)
902 devc->data_pending = TRUE;
903 else
904 devc->data_pending = FALSE;
905
906 return result;
8ab929d6
SA
907}
908
909/**
910 * Reads and removes the block data header from a given data input.
911 * Format is #ndddd... with n being the number of decimal digits d.
912 * The string dddd... contains the decimal-encoded length of the data.
913 * Example: #9000000013 would yield a length of 13 bytes.
914 *
915 * @param data The input data.
916 * @param len The determined input data length.
917 */
918static int dlm_block_data_header_process(GArray *data, int *len)
919{
920 int i, n;
921 gchar s[20];
922
923 if (g_array_index(data, gchar, 0) != '#')
924 return SR_ERR;
925
926 n = (uint8_t)(g_array_index(data, gchar, 1) - '0');
927
928 for (i = 0; i < n; i++)
929 s[i] = g_array_index(data, gchar, 2 + i);
930 s[i] = 0;
931
932 if (sr_atoi(s, len) != SR_OK)
933 return SR_ERR;
934
935 g_array_remove_range(data, 0, 2 + n);
936
937 return SR_OK;
938}
939
940/**
941 * Turns raw sample data into voltages and sends them off to the session bus.
942 *
943 * @param data The raw sample data.
8ab929d6
SA
944 * @ch_state Pointer to the state of the channel whose data we're processing.
945 * @sdi The device instance.
946 *
947 * @return SR_ERR when data is trucated, SR_OK otherwise.
948 */
af3487ec 949static int dlm_analog_samples_send(GArray *data,
ac10a927
SA
950 struct analog_channel_state *ch_state,
951 struct sr_dev_inst *sdi)
8ab929d6 952{
af3487ec 953 uint32_t i, samples;
8ab929d6
SA
954 float voltage, range, offset;
955 GArray *float_data;
956 struct dev_context *devc;
af3487ec 957 struct scope_state *model_state;
8ab929d6 958 struct sr_channel *ch;
44040ea6
UH
959 struct sr_datafeed_analog analog;
960 struct sr_analog_encoding encoding;
961 struct sr_analog_meaning meaning;
962 struct sr_analog_spec spec;
8ab929d6
SA
963 struct sr_datafeed_packet packet;
964
af3487ec
SA
965 devc = sdi->priv;
966 model_state = devc->model_state;
967 samples = model_state->samples_per_frame;
968 ch = devc->current_channel->data;
969
8ab929d6
SA
970 if (data->len < samples * sizeof(uint8_t)) {
971 sr_err("Truncated waveform data packet received.");
972 return SR_ERR;
973 }
974
a9308652 975 range = ch_state->waveform_range;
8ab929d6
SA
976 offset = ch_state->waveform_offset;
977
a9308652
UH
978 /*
979 * Convert byte sample to voltage according to
8ab929d6
SA
980 * page 269 of the Communication Interface User's Manual.
981 */
982 float_data = g_array_new(FALSE, FALSE, sizeof(float));
983 for (i = 0; i < samples; i++) {
984 voltage = (float)g_array_index(data, int8_t, i);
985 voltage = (range * voltage /
ac10a927 986 DLM_DIVISION_FOR_BYTE_FORMAT) + offset;
8ab929d6
SA
987 g_array_append_val(float_data, voltage);
988 }
989
7dcaddd3
UH
990 /* TODO: Use proper 'digits' value for this device (and its modes). */
991 sr_analog_init(&analog, &encoding, &meaning, &spec, 2);
44040ea6 992 analog.meaning->channels = g_slist_append(NULL, ch);
8ab929d6
SA
993 analog.num_samples = float_data->len;
994 analog.data = (float*)float_data->data;
44040ea6
UH
995 analog.meaning->mq = SR_MQ_VOLTAGE;
996 analog.meaning->unit = SR_UNIT_VOLT;
997 analog.meaning->mqflags = 0;
998 packet.type = SR_DF_ANALOG;
8ab929d6
SA
999 packet.payload = &analog;
1000 sr_session_send(sdi, &packet);
44040ea6 1001 g_slist_free(analog.meaning->channels);
8ab929d6
SA
1002
1003 g_array_free(float_data, TRUE);
1004 g_array_remove_range(data, 0, samples * sizeof(uint8_t));
1005
1006 return SR_OK;
1007}
1008
1009/**
1010 * Sends logic sample data off to the session bus.
1011 *
1012 * @param data The raw sample data.
8ab929d6
SA
1013 * @ch_state Pointer to the state of the channel whose data we're processing.
1014 * @sdi The device instance.
1015 *
1016 * @return SR_ERR when data is trucated, SR_OK otherwise.
1017 */
af3487ec 1018static int dlm_digital_samples_send(GArray *data,
ac10a927 1019 struct sr_dev_inst *sdi)
8ab929d6 1020{
af3487ec
SA
1021 struct dev_context *devc;
1022 struct scope_state *model_state;
1023 uint32_t samples;
8ab929d6
SA
1024 struct sr_datafeed_logic logic;
1025 struct sr_datafeed_packet packet;
1026
af3487ec
SA
1027 devc = sdi->priv;
1028 model_state = devc->model_state;
1029 samples = model_state->samples_per_frame;
1030
8ab929d6
SA
1031 if (data->len < samples * sizeof(uint8_t)) {
1032 sr_err("Truncated waveform data packet received.");
1033 return SR_ERR;
1034 }
1035
1036 logic.length = samples;
1037 logic.unitsize = 1;
1038 logic.data = data->data;
1039 packet.type = SR_DF_LOGIC;
1040 packet.payload = &logic;
1041 sr_session_send(sdi, &packet);
1042
1043 g_array_remove_range(data, 0, samples * sizeof(uint8_t));
1044
1045 return SR_OK;
1046}
1047
1048/**
1049 * Attempts to query sample data from the oscilloscope in order to send it
1050 * to the session bus for further processing.
1051 *
1052 * @param fd The file descriptor used as the event source.
1053 * @param revents The received events.
1054 * @param cb_data Callback data, in this case our device instance.
1055 *
1056 * @return TRUE in case of success or a recoverable error,
a9308652 1057 * FALSE when a fatal error was encountered.
8ab929d6
SA
1058 */
1059SR_PRIV int dlm_data_receive(int fd, int revents, void *cb_data)
1060{
8ab929d6
SA
1061 struct sr_dev_inst *sdi;
1062 struct scope_state *model_state;
1063 struct dev_context *devc;
af3487ec 1064 struct sr_channel *ch;
8ab929d6 1065 struct sr_datafeed_packet packet;
af3487ec
SA
1066 int chunk_len, num_bytes;
1067 static GArray *data = NULL;
8ab929d6
SA
1068
1069 (void)fd;
1070 (void)revents;
1071
1072 if (!(sdi = cb_data))
1073 return FALSE;
1074
1075 if (!(devc = sdi->priv))
1076 return FALSE;
1077
1078 if (!(model_state = (struct scope_state*)devc->model_state))
1079 return FALSE;
1080
af3487ec
SA
1081 /* Are we waiting for a response from the device? */
1082 if (!devc->data_pending)
8ab929d6 1083 return TRUE;
af3487ec
SA
1084
1085 /* Check if a new query response is coming our way. */
1086 if (!data) {
1087 if (sr_scpi_read_begin(sdi->conn) == SR_OK)
1088 /* The 16 here accounts for the header and EOL. */
1089 data = g_array_sized_new(FALSE, FALSE, sizeof(uint8_t),
ac10a927 1090 16 + model_state->samples_per_frame);
af3487ec
SA
1091 else
1092 return TRUE;
8ab929d6
SA
1093 }
1094
af3487ec
SA
1095 /* Store incoming data. */
1096 chunk_len = sr_scpi_read_data(sdi->conn, devc->receive_buffer,
ac10a927 1097 RECEIVE_BUFFER_SIZE);
af3487ec
SA
1098 if (chunk_len < 0) {
1099 sr_err("Error while reading data: %d", chunk_len);
1100 goto fail;
1101 }
1102 g_array_append_vals(data, devc->receive_buffer, chunk_len);
8ab929d6 1103
af3487ec
SA
1104 /* Read the entire query response before processing. */
1105 if (!sr_scpi_read_complete(sdi->conn))
1106 return TRUE;
8ab929d6 1107
af3487ec
SA
1108 /* We finished reading and are no longer waiting for data. */
1109 devc->data_pending = FALSE;
8ab929d6 1110
af3487ec
SA
1111 /* Signal the beginning of a new frame if this is the first channel. */
1112 if (devc->current_channel == devc->enabled_channels) {
1113 packet.type = SR_DF_FRAME_BEGIN;
1114 sr_session_send(sdi, &packet);
1115 }
8ab929d6 1116
af3487ec
SA
1117 if (dlm_block_data_header_process(data, &num_bytes) != SR_OK) {
1118 sr_err("Encountered malformed block data header.");
1119 goto fail;
1120 }
8ab929d6 1121
af3487ec
SA
1122 if (num_bytes == 0) {
1123 sr_warn("Zero-length waveform data packet received. " \
ac10a927
SA
1124 "Live mode not supported yet, stopping " \
1125 "acquisition and retrying.");
af3487ec
SA
1126 /* Don't care about return value here. */
1127 dlm_acquisition_stop(sdi->conn);
1128 g_array_free(data, TRUE);
0028d5a1 1129 dlm_channel_data_request(sdi);
af3487ec
SA
1130 return TRUE;
1131 }
8ab929d6 1132
af3487ec
SA
1133 ch = devc->current_channel->data;
1134 switch (ch->type) {
1135 case SR_CHANNEL_ANALOG:
1136 if (dlm_analog_samples_send(data,
1137 &model_state->analog_states[ch->index],
1138 sdi) != SR_OK)
8ab929d6 1139 goto fail;
af3487ec
SA
1140 break;
1141 case SR_CHANNEL_LOGIC:
1142 if (dlm_digital_samples_send(data, sdi) != SR_OK)
1143 goto fail;
1144 break;
1145 default:
1146 sr_err("Invalid channel type encountered.");
1147 break;
1148 }
8ab929d6 1149
af3487ec
SA
1150 g_array_free(data, TRUE);
1151 data = NULL;
8ab929d6 1152
a9308652
UH
1153 /*
1154 * Signal the end of this frame if this was the last enabled channel
af3487ec
SA
1155 * and set the next enabled channel. Then, request its data.
1156 */
1157 if (!devc->current_channel->next) {
1158 packet.type = SR_DF_FRAME_END;
1159 sr_session_send(sdi, &packet);
1160 devc->current_channel = devc->enabled_channels;
1161
a9308652
UH
1162 /*
1163 * As of now we only support importing the current acquisition
af3487ec
SA
1164 * data so we're going to stop at this point.
1165 */
d2f7c417 1166 sr_dev_acquisition_stop(sdi);
af3487ec
SA
1167 return TRUE;
1168 } else
1169 devc->current_channel = devc->current_channel->next;
8ab929d6 1170
af3487ec 1171 if (dlm_channel_data_request(sdi) != SR_OK) {
f3f19d11 1172 sr_err("Failed to request acquisition data.");
af3487ec 1173 goto fail;
8ab929d6
SA
1174 }
1175
8ab929d6
SA
1176 return TRUE;
1177
1178fail:
af3487ec 1179 if (data) {
8ab929d6 1180 g_array_free(data, TRUE);
af3487ec
SA
1181 data = NULL;
1182 }
8ab929d6 1183
af3487ec 1184 return FALSE;
8ab929d6 1185}