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