]> sigrok.org Git - libsigrok.git/blame - src/hardware/hameg-hmo/protocol.c
hameg-hmo: Avoid bogus SCPI timeouts.
[libsigrok.git] / src / hardware / hameg-hmo / protocol.c
CommitLineData
06a3e78a
DJ
1/*
2 * This file is part of the libsigrok project.
3 *
4 * Copyright (C) 2013 poljar (Damir Jelić) <poljarinho@gmail.com>
e131be0a 5 * Copyright (C) 2018 Guido Trentalancia <guido@trentalancia.com>
06a3e78a
DJ
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>
650847e7
UH
22#include <math.h>
23#include <stdlib.h>
5a1afc09 24#include "scpi.h"
06a3e78a
DJ
25#include "protocol.h"
26
e06875b2
GS
27SR_PRIV void hmo_queue_logic_data(struct dev_context *devc,
28 size_t group, GByteArray *pod_data);
29SR_PRIV void hmo_send_logic_packet(struct sr_dev_inst *sdi,
30 struct dev_context *devc);
31SR_PRIV void hmo_cleanup_logic_data(struct dev_context *devc);
32
13f2b9d7 33static const char *hameg_scpi_dialect[] = {
e131be0a
GT
34 [SCPI_CMD_GET_DIG_DATA] = ":FORM UINT,8;:POD%d:DATA?",
35 [SCPI_CMD_GET_TIMEBASE] = ":TIM:SCAL?",
36 [SCPI_CMD_SET_TIMEBASE] = ":TIM:SCAL %s",
37 [SCPI_CMD_GET_COUPLING] = ":CHAN%d:COUP?",
38 [SCPI_CMD_SET_COUPLING] = ":CHAN%d:COUP %s",
39 [SCPI_CMD_GET_SAMPLE_RATE] = ":ACQ:SRAT?",
40 [SCPI_CMD_GET_SAMPLE_RATE_LIVE] = ":%s:DATA:POINTS?",
41 [SCPI_CMD_GET_ANALOG_DATA] = ":FORM:BORD %s;" \
42 ":FORM REAL,32;:CHAN%d:DATA?",
43 [SCPI_CMD_GET_VERTICAL_DIV] = ":CHAN%d:SCAL?",
44 [SCPI_CMD_SET_VERTICAL_DIV] = ":CHAN%d:SCAL %s",
45 [SCPI_CMD_GET_DIG_POD_STATE] = ":POD%d:STAT?",
46 [SCPI_CMD_SET_DIG_POD_STATE] = ":POD%d:STAT %d",
47 [SCPI_CMD_GET_TRIGGER_SLOPE] = ":TRIG:A:EDGE:SLOP?",
c8ecfa6e 48 [SCPI_CMD_SET_TRIGGER_SLOPE] = ":TRIG:A:TYPE EDGE;:TRIG:A:EDGE:SLOP %s",
4fa4db2c
GT
49 [SCPI_CMD_GET_TRIGGER_PATTERN] = ":TRIG:A:PATT:SOUR?",
50 [SCPI_CMD_SET_TRIGGER_PATTERN] = ":TRIG:A:TYPE LOGIC;" \
51 ":TRIG:A:PATT:FUNC AND;" \
52 ":TRIG:A:PATT:COND TRUE;" \
53 ":TRIG:A:PATT:MODE OFF;" \
54 ":TRIG:A:PATT:SOUR \"%s\"",
e131be0a
GT
55 [SCPI_CMD_GET_TRIGGER_SOURCE] = ":TRIG:A:SOUR?",
56 [SCPI_CMD_SET_TRIGGER_SOURCE] = ":TRIG:A:SOUR %s",
57 [SCPI_CMD_GET_DIG_CHAN_STATE] = ":LOG%d:STAT?",
58 [SCPI_CMD_SET_DIG_CHAN_STATE] = ":LOG%d:STAT %d",
59 [SCPI_CMD_GET_VERTICAL_OFFSET] = ":CHAN%d:POS?",
60 [SCPI_CMD_GET_HORIZ_TRIGGERPOS] = ":TIM:POS?",
61 [SCPI_CMD_SET_HORIZ_TRIGGERPOS] = ":TIM:POS %s",
62 [SCPI_CMD_GET_ANALOG_CHAN_STATE] = ":CHAN%d:STAT?",
63 [SCPI_CMD_SET_ANALOG_CHAN_STATE] = ":CHAN%d:STAT %d",
64 [SCPI_CMD_GET_PROBE_UNIT] = ":PROB%d:SET:ATT:UNIT?",
65 [SCPI_CMD_GET_DIG_POD_THRESHOLD] = ":POD%d:THR?",
66 [SCPI_CMD_SET_DIG_POD_THRESHOLD] = ":POD%d:THR %s",
67 [SCPI_CMD_GET_DIG_POD_USER_THRESHOLD] = ":POD%d:THR:UDL%d?",
68 [SCPI_CMD_SET_DIG_POD_USER_THRESHOLD] = ":POD%d:THR:UDL%d %s",
13f2b9d7
DJ
69};
70
4b25cbff 71static const uint32_t devopts[] = {
13f2b9d7 72 SR_CONF_OSCILLOSCOPE,
830e24b6
GT
73 SR_CONF_LIMIT_SAMPLES | SR_CONF_SET,
74 SR_CONF_LIMIT_FRAMES | SR_CONF_SET,
86621306 75 SR_CONF_SAMPLERATE | SR_CONF_GET,
5827f61b 76 SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
bf622e6d 77 SR_CONF_NUM_HDIV | SR_CONF_GET,
5827f61b 78 SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_GET | SR_CONF_SET,
86621306
UH
79 SR_CONF_TRIGGER_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
80 SR_CONF_TRIGGER_SLOPE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
4fa4db2c 81 SR_CONF_TRIGGER_PATTERN | SR_CONF_GET | SR_CONF_SET,
13f2b9d7
DJ
82};
83
6b82c3e5 84static const uint32_t devopts_cg_analog[] = {
5827f61b 85 SR_CONF_NUM_VDIV | SR_CONF_GET,
5827f61b 86 SR_CONF_VDIV | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
86621306 87 SR_CONF_COUPLING | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
13f2b9d7
DJ
88};
89
e131be0a
GT
90static const uint32_t devopts_cg_digital[] = {
91 SR_CONF_LOGIC_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
92 SR_CONF_LOGIC_THRESHOLD_CUSTOM | SR_CONF_GET | SR_CONF_SET,
93};
94
4b25cbff 95static const char *coupling_options[] = {
b05ab7d2
SB
96 "AC", // AC with 50 Ohm termination (152x, 202x, 30xx, 1202)
97 "ACL", // AC with 1 MOhm termination
98 "DC", // DC with 50 Ohm termination
99 "DCL", // DC with 1 MOhm termination
13f2b9d7 100 "GND",
13f2b9d7
DJ
101};
102
103static const char *scope_trigger_slopes[] = {
104 "POS",
105 "NEG",
356f64f8 106 "EITH",
13f2b9d7
DJ
107};
108
e131be0a
GT
109/* Predefined logic thresholds. */
110static const char *logic_threshold[] = {
111 "TTL",
112 "ECL",
113 "CMOS",
114 "USER1",
115 "USER2", // overwritten by logic_threshold_custom, use USER1 for permanent setting
116};
117
4cf90b86 118/* RTC1002, HMO Compact2 and HMO1002/HMO1202 */
6d0f3508 119static const char *an2_dig8_trigger_sources[] = {
f8195cb2
UH
120 "CH1", "CH2",
121 "LINE", "EXT", "PATT", "BUS1", "BUS2",
122 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
13f2b9d7
DJ
123};
124
4cf90b86 125/* HMO3xx2 */
6d0f3508
GT
126static const char *an2_dig16_trigger_sources[] = {
127 "CH1", "CH2",
128 "LINE", "EXT", "PATT", "BUS1", "BUS2",
129 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
130 "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
131};
132
4cf90b86 133/* HMO Compact4 */
6d0f3508 134static const char *an4_dig8_trigger_sources[] = {
f8195cb2
UH
135 "CH1", "CH2", "CH3", "CH4",
136 "LINE", "EXT", "PATT", "BUS1", "BUS2",
137 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
13f2b9d7
DJ
138};
139
4cf90b86 140/* HMO3xx4 and HMO2524 */
6d0f3508 141static const char *an4_dig16_trigger_sources[] = {
f8195cb2
UH
142 "CH1", "CH2", "CH3", "CH4",
143 "LINE", "EXT", "PATT", "BUS1", "BUS2",
144 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
145 "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
74413faf
GS
146};
147
4b25cbff 148static const uint64_t timebases[][2] = {
13f2b9d7
DJ
149 /* nanoseconds */
150 { 2, 1000000000 },
151 { 5, 1000000000 },
152 { 10, 1000000000 },
153 { 20, 1000000000 },
154 { 50, 1000000000 },
155 { 100, 1000000000 },
156 { 200, 1000000000 },
157 { 500, 1000000000 },
158 /* microseconds */
159 { 1, 1000000 },
160 { 2, 1000000 },
161 { 5, 1000000 },
162 { 10, 1000000 },
163 { 20, 1000000 },
164 { 50, 1000000 },
165 { 100, 1000000 },
166 { 200, 1000000 },
167 { 500, 1000000 },
168 /* milliseconds */
169 { 1, 1000 },
170 { 2, 1000 },
171 { 5, 1000 },
172 { 10, 1000 },
173 { 20, 1000 },
174 { 50, 1000 },
175 { 100, 1000 },
176 { 200, 1000 },
177 { 500, 1000 },
178 /* seconds */
179 { 1, 1 },
180 { 2, 1 },
181 { 5, 1 },
182 { 10, 1 },
183 { 20, 1 },
184 { 50, 1 },
185};
186
4b25cbff 187static const uint64_t vdivs[][2] = {
13f2b9d7
DJ
188 /* millivolts */
189 { 1, 1000 },
190 { 2, 1000 },
191 { 5, 1000 },
192 { 10, 1000 },
193 { 20, 1000 },
194 { 50, 1000 },
195 { 100, 1000 },
196 { 200, 1000 },
197 { 500, 1000 },
198 /* volts */
199 { 1, 1 },
200 { 2, 1 },
201 { 5, 1 },
202 { 10, 1 },
fe227d17
SA
203 { 20, 1 },
204 { 50, 1 },
13f2b9d7
DJ
205};
206
ba7dd8bb 207static const char *scope_analog_channel_names[] = {
f8195cb2 208 "CH1", "CH2", "CH3", "CH4",
13f2b9d7
DJ
209};
210
ba7dd8bb 211static const char *scope_digital_channel_names[] = {
f8195cb2
UH
212 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
213 "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
13f2b9d7
DJ
214};
215
329733d9 216static const struct scope_config scope_models[] = {
13f2b9d7 217 {
4cf90b86
GT
218 /* RTC1002 and HMO722/1002/1022/1202/1522/2022 support only 8 digital channels. */
219 .name = {"RTC1002", "HMO722", "HMO1002", "HMO1022", "HMO1202", "HMO1522", "HMO2022", NULL},
13f2b9d7
DJ
220 .analog_channels = 2,
221 .digital_channels = 8,
222 .digital_pods = 1,
223
ba7dd8bb
UH
224 .analog_names = &scope_analog_channel_names,
225 .digital_names = &scope_digital_channel_names,
13f2b9d7 226
4b25cbff
UH
227 .devopts = &devopts,
228 .num_devopts = ARRAY_SIZE(devopts),
13f2b9d7 229
6b82c3e5
UH
230 .devopts_cg_analog = &devopts_cg_analog,
231 .num_devopts_cg_analog = ARRAY_SIZE(devopts_cg_analog),
13f2b9d7 232
e131be0a
GT
233 .devopts_cg_digital = &devopts_cg_digital,
234 .num_devopts_cg_digital = ARRAY_SIZE(devopts_cg_digital),
235
4b25cbff 236 .coupling_options = &coupling_options,
692716f5
UH
237 .num_coupling_options = ARRAY_SIZE(coupling_options),
238
e131be0a
GT
239 .logic_threshold = &logic_threshold,
240 .num_logic_threshold = ARRAY_SIZE(logic_threshold),
241
6d0f3508
GT
242 .trigger_sources = &an2_dig8_trigger_sources,
243 .num_trigger_sources = ARRAY_SIZE(an2_dig8_trigger_sources),
244
245 .trigger_slopes = &scope_trigger_slopes,
246 .num_trigger_slopes = ARRAY_SIZE(scope_trigger_slopes),
247
248 .timebases = &timebases,
249 .num_timebases = ARRAY_SIZE(timebases),
250
251 .vdivs = &vdivs,
252 .num_vdivs = ARRAY_SIZE(vdivs),
253
254 .num_xdivs = 12,
255 .num_ydivs = 8,
256
257 .scpi_dialect = &hameg_scpi_dialect,
258 },
259 {
260 /* HMO3032/3042/3052/3522 support 16 digital channels. */
261 .name = {"HMO3032", "HMO3042", "HMO3052", "HMO3522", NULL},
262 .analog_channels = 2,
263 .digital_channels = 16,
264 .digital_pods = 2,
265
266 .analog_names = &scope_analog_channel_names,
267 .digital_names = &scope_digital_channel_names,
268
269 .devopts = &devopts,
270 .num_devopts = ARRAY_SIZE(devopts),
271
272 .devopts_cg_analog = &devopts_cg_analog,
273 .num_devopts_cg_analog = ARRAY_SIZE(devopts_cg_analog),
274
e131be0a
GT
275 .devopts_cg_digital = &devopts_cg_digital,
276 .num_devopts_cg_digital = ARRAY_SIZE(devopts_cg_digital),
277
6d0f3508
GT
278 .coupling_options = &coupling_options,
279 .num_coupling_options = ARRAY_SIZE(coupling_options),
280
e131be0a
GT
281 .logic_threshold = &logic_threshold,
282 .num_logic_threshold = ARRAY_SIZE(logic_threshold),
283
6d0f3508
GT
284 .trigger_sources = &an2_dig16_trigger_sources,
285 .num_trigger_sources = ARRAY_SIZE(an2_dig16_trigger_sources),
692716f5 286
13f2b9d7 287 .trigger_slopes = &scope_trigger_slopes,
692716f5 288 .num_trigger_slopes = ARRAY_SIZE(scope_trigger_slopes),
13f2b9d7 289
4b25cbff
UH
290 .timebases = &timebases,
291 .num_timebases = ARRAY_SIZE(timebases),
13f2b9d7 292
4b25cbff
UH
293 .vdivs = &vdivs,
294 .num_vdivs = ARRAY_SIZE(vdivs),
13f2b9d7
DJ
295
296 .num_xdivs = 12,
297 .num_ydivs = 8,
298
299 .scpi_dialect = &hameg_scpi_dialect,
300 },
301 {
74413faf 302 .name = {"HMO724", "HMO1024", "HMO1524", "HMO2024", NULL},
13f2b9d7
DJ
303 .analog_channels = 4,
304 .digital_channels = 8,
305 .digital_pods = 1,
306
ba7dd8bb
UH
307 .analog_names = &scope_analog_channel_names,
308 .digital_names = &scope_digital_channel_names,
13f2b9d7 309
4b25cbff
UH
310 .devopts = &devopts,
311 .num_devopts = ARRAY_SIZE(devopts),
13f2b9d7 312
6b82c3e5
UH
313 .devopts_cg_analog = &devopts_cg_analog,
314 .num_devopts_cg_analog = ARRAY_SIZE(devopts_cg_analog),
13f2b9d7 315
e131be0a
GT
316 .devopts_cg_digital = &devopts_cg_digital,
317 .num_devopts_cg_digital = ARRAY_SIZE(devopts_cg_digital),
318
4b25cbff 319 .coupling_options = &coupling_options,
692716f5
UH
320 .num_coupling_options = ARRAY_SIZE(coupling_options),
321
e131be0a
GT
322 .logic_threshold = &logic_threshold,
323 .num_logic_threshold = ARRAY_SIZE(logic_threshold),
324
6d0f3508
GT
325 .trigger_sources = &an4_dig8_trigger_sources,
326 .num_trigger_sources = ARRAY_SIZE(an4_dig8_trigger_sources),
692716f5 327
13f2b9d7 328 .trigger_slopes = &scope_trigger_slopes,
692716f5 329 .num_trigger_slopes = ARRAY_SIZE(scope_trigger_slopes),
13f2b9d7 330
4b25cbff
UH
331 .timebases = &timebases,
332 .num_timebases = ARRAY_SIZE(timebases),
13f2b9d7 333
4b25cbff
UH
334 .vdivs = &vdivs,
335 .num_vdivs = ARRAY_SIZE(vdivs),
13f2b9d7
DJ
336
337 .num_xdivs = 12,
338 .num_ydivs = 8,
339
74413faf
GS
340 .scpi_dialect = &hameg_scpi_dialect,
341 },
342 {
bf8a02b6 343 .name = {"HMO2524", "HMO3034", "HMO3044", "HMO3054", "HMO3524", NULL},
74413faf
GS
344 .analog_channels = 4,
345 .digital_channels = 16,
346 .digital_pods = 2,
347
348 .analog_names = &scope_analog_channel_names,
349 .digital_names = &scope_digital_channel_names,
350
4b25cbff
UH
351 .devopts = &devopts,
352 .num_devopts = ARRAY_SIZE(devopts),
74413faf 353
6b82c3e5
UH
354 .devopts_cg_analog = &devopts_cg_analog,
355 .num_devopts_cg_analog = ARRAY_SIZE(devopts_cg_analog),
74413faf 356
e131be0a
GT
357 .devopts_cg_digital = &devopts_cg_digital,
358 .num_devopts_cg_digital = ARRAY_SIZE(devopts_cg_digital),
359
4b25cbff 360 .coupling_options = &coupling_options,
692716f5
UH
361 .num_coupling_options = ARRAY_SIZE(coupling_options),
362
e131be0a
GT
363 .logic_threshold = &logic_threshold,
364 .num_logic_threshold = ARRAY_SIZE(logic_threshold),
365
6d0f3508
GT
366 .trigger_sources = &an4_dig16_trigger_sources,
367 .num_trigger_sources = ARRAY_SIZE(an4_dig16_trigger_sources),
692716f5 368
74413faf 369 .trigger_slopes = &scope_trigger_slopes,
692716f5 370 .num_trigger_slopes = ARRAY_SIZE(scope_trigger_slopes),
74413faf 371
4b25cbff
UH
372 .timebases = &timebases,
373 .num_timebases = ARRAY_SIZE(timebases),
74413faf 374
4b25cbff
UH
375 .vdivs = &vdivs,
376 .num_vdivs = ARRAY_SIZE(vdivs),
74413faf
GS
377
378 .num_xdivs = 12,
379 .num_ydivs = 8,
380
13f2b9d7
DJ
381 .scpi_dialect = &hameg_scpi_dialect,
382 },
383};
384
329733d9 385static void scope_state_dump(const struct scope_config *config,
13f2b9d7
DJ
386 struct scope_state *state)
387{
388 unsigned int i;
8de2dc3b 389 char *tmp;
13f2b9d7 390
0a1f7b09 391 for (i = 0; i < config->analog_channels; i++) {
8de2dc3b
DJ
392 tmp = sr_voltage_string((*config->vdivs)[state->analog_channels[i].vdiv][0],
393 (*config->vdivs)[state->analog_channels[i].vdiv][1]);
d9251a2c 394 sr_info("State of analog channel %d -> %s : %s (coupling) %s (vdiv) %2.2e (offset)",
8de2dc3b 395 i + 1, state->analog_channels[i].state ? "On" : "Off",
13f2b9d7 396 (*config->coupling_options)[state->analog_channels[i].coupling],
8de2dc3b 397 tmp, state->analog_channels[i].vertical_offset);
13f2b9d7
DJ
398 }
399
0a1f7b09 400 for (i = 0; i < config->digital_channels; i++) {
13f2b9d7
DJ
401 sr_info("State of digital channel %d -> %s", i,
402 state->digital_channels[i] ? "On" : "Off");
403 }
404
0a1f7b09 405 for (i = 0; i < config->digital_pods; i++) {
e131be0a 406 if (strncmp("USER", (*config->logic_threshold)[state->digital_pods[i].threshold], 4))
262061ff 407 sr_info("State of digital POD %d -> %s : %s (threshold)", i + 1,
e131be0a
GT
408 state->digital_pods[i].state ? "On" : "Off",
409 (*config->logic_threshold)[state->digital_pods[i].threshold]);
410 else // user-defined or custom logic threshold
262061ff 411 sr_info("State of digital POD %d -> %s : %E (threshold)", i + 1,
e131be0a
GT
412 state->digital_pods[i].state ? "On" : "Off",
413 state->digital_pods[i].user_threshold);
13f2b9d7
DJ
414 }
415
6984cfb2
SA
416 tmp = sr_period_string((*config->timebases)[state->timebase][0],
417 (*config->timebases)[state->timebase][1]);
8de2dc3b
DJ
418 sr_info("Current timebase: %s", tmp);
419 g_free(tmp);
420
14a2f74d
DJ
421 tmp = sr_samplerate_string(state->sample_rate);
422 sr_info("Current samplerate: %s", tmp);
423 g_free(tmp);
424
4fa4db2c
GT
425 if (!strcmp("PATT", (*config->trigger_sources)[state->trigger_source]))
426 sr_info("Current trigger: %s (pattern), %.2f (offset)",
427 state->trigger_pattern,
428 state->horiz_triggerpos);
429 else // Edge (slope) trigger
430 sr_info("Current trigger: %s (source), %s (slope) %.2f (offset)",
431 (*config->trigger_sources)[state->trigger_source],
432 (*config->trigger_slopes)[state->trigger_slope],
433 state->horiz_triggerpos);
13f2b9d7
DJ
434}
435
23f43dff 436static int scope_state_get_array_option(struct sr_scpi_dev_inst *scpi,
692716f5 437 const char *command, const char *(*array)[], unsigned int n, int *result)
13f2b9d7
DJ
438{
439 char *tmp;
bd633efa 440 int idx;
13f2b9d7 441
67398969 442 if (sr_scpi_get_string(scpi, command, &tmp) != SR_OK)
13f2b9d7 443 return SR_ERR;
13f2b9d7 444
bd633efa 445 if ((idx = std_str_idx_s(tmp, *array, n)) < 0) {
13f2b9d7 446 g_free(tmp);
bd633efa 447 return SR_ERR_ARG;
13f2b9d7
DJ
448 }
449
bd633efa
UH
450 *result = idx;
451
452 g_free(tmp);
453
13f2b9d7
DJ
454 return SR_OK;
455}
456
8fff7519 457/**
a53acd7d
SB
458 * This function takes a value of the form "2.000E-03" and returns the index
459 * of an array where a matching pair was found.
8fff7519
SA
460 *
461 * @param value The string to be parsed.
462 * @param array The array of s/f pairs.
463 * @param array_len The number of pairs in the array.
464 * @param result The index at which a matching pair was found.
465 *
466 * @return SR_ERR on any parsing error, SR_OK otherwise.
467 */
468static int array_float_get(gchar *value, const uint64_t array[][2],
650847e7 469 int array_len, unsigned int *result)
8fff7519 470{
a53acd7d
SB
471 struct sr_rational rval;
472 struct sr_rational aval;
8cccbac8 473
a53acd7d 474 if (sr_parse_rational(value, &rval) != SR_OK)
8fff7519
SA
475 return SR_ERR;
476
a53acd7d
SB
477 for (int i = 0; i < array_len; i++) {
478 sr_rational_set(&aval, array[i][0], array[i][1]);
479 if (sr_rational_eq(&rval, &aval)) {
8fff7519
SA
480 *result = i;
481 return SR_OK;
482 }
483 }
484
485 return SR_ERR;
486}
487
bd70ec4b
SB
488static struct sr_channel *get_channel_by_index_and_type(GSList *channel_lhead,
489 int index, int type)
490{
491 while (channel_lhead) {
492 struct sr_channel *ch = channel_lhead->data;
493 if (ch->index == index && ch->type == type)
494 return ch;
495
496 channel_lhead = channel_lhead->next;
497 }
498
499 return 0;
500}
501
502static int analog_channel_state_get(struct sr_dev_inst *sdi,
329733d9 503 const struct scope_config *config,
13f2b9d7
DJ
504 struct scope_state *state)
505{
8de2dc3b 506 unsigned int i, j;
13f2b9d7 507 char command[MAX_COMMAND_SIZE];
8fff7519 508 char *tmp_str;
bd70ec4b
SB
509 struct sr_channel *ch;
510 struct sr_scpi_dev_inst *scpi = sdi->conn;
13f2b9d7 511
0a1f7b09 512 for (i = 0; i < config->analog_channels; i++) {
13f2b9d7
DJ
513 g_snprintf(command, sizeof(command),
514 (*config->scpi_dialect)[SCPI_CMD_GET_ANALOG_CHAN_STATE],
515 i + 1);
516
23f43dff 517 if (sr_scpi_get_bool(scpi, command,
13f2b9d7
DJ
518 &state->analog_channels[i].state) != SR_OK)
519 return SR_ERR;
520
bd70ec4b
SB
521 ch = get_channel_by_index_and_type(sdi->channels, i, SR_CHANNEL_ANALOG);
522 if (ch)
523 ch->enabled = state->analog_channels[i].state;
524
13f2b9d7
DJ
525 g_snprintf(command, sizeof(command),
526 (*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_DIV],
527 i + 1);
528
8fff7519 529 if (sr_scpi_get_string(scpi, command, &tmp_str) != SR_OK)
8de2dc3b 530 return SR_ERR;
8fff7519 531
53012da6 532 if (array_float_get(tmp_str, ARRAY_AND_SIZE(vdivs), &j) != SR_OK) {
8fff7519 533 g_free(tmp_str);
b4e31d2a 534 sr_err("Could not determine array index for vertical div scale.");
13f2b9d7 535 return SR_ERR;
b4e31d2a 536 }
13f2b9d7 537
8fff7519
SA
538 g_free(tmp_str);
539 state->analog_channels[i].vdiv = j;
540
13f2b9d7
DJ
541 g_snprintf(command, sizeof(command),
542 (*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_OFFSET],
543 i + 1);
544
23f43dff 545 if (sr_scpi_get_float(scpi, command,
13f2b9d7
DJ
546 &state->analog_channels[i].vertical_offset) != SR_OK)
547 return SR_ERR;
548
549 g_snprintf(command, sizeof(command),
550 (*config->scpi_dialect)[SCPI_CMD_GET_COUPLING],
551 i + 1);
552
23f43dff 553 if (scope_state_get_array_option(scpi, command, config->coupling_options,
692716f5 554 config->num_coupling_options,
13f2b9d7
DJ
555 &state->analog_channels[i].coupling) != SR_OK)
556 return SR_ERR;
448e81b1
SB
557
558 g_snprintf(command, sizeof(command),
559 (*config->scpi_dialect)[SCPI_CMD_GET_PROBE_UNIT],
560 i + 1);
561
562 if (sr_scpi_get_string(scpi, command, &tmp_str) != SR_OK)
563 return SR_ERR;
564
565 if (tmp_str[0] == 'A')
566 state->analog_channels[i].probe_unit = 'A';
567 else
568 state->analog_channels[i].probe_unit = 'V';
569 g_free(tmp_str);
13f2b9d7
DJ
570 }
571
572 return SR_OK;
573}
574
bd70ec4b 575static int digital_channel_state_get(struct sr_dev_inst *sdi,
329733d9 576 const struct scope_config *config,
13f2b9d7
DJ
577 struct scope_state *state)
578{
579 unsigned int i;
e131be0a
GT
580 int result = SR_ERR;
581 static char *logic_threshold_short[] = {};
13f2b9d7 582 char command[MAX_COMMAND_SIZE];
bd70ec4b
SB
583 struct sr_channel *ch;
584 struct sr_scpi_dev_inst *scpi = sdi->conn;
13f2b9d7 585
0a1f7b09 586 for (i = 0; i < config->digital_channels; i++) {
13f2b9d7
DJ
587 g_snprintf(command, sizeof(command),
588 (*config->scpi_dialect)[SCPI_CMD_GET_DIG_CHAN_STATE],
589 i);
590
23f43dff 591 if (sr_scpi_get_bool(scpi, command,
13f2b9d7
DJ
592 &state->digital_channels[i]) != SR_OK)
593 return SR_ERR;
bd70ec4b
SB
594
595 ch = get_channel_by_index_and_type(sdi->channels, i, SR_CHANNEL_LOGIC);
596 if (ch)
597 ch->enabled = state->digital_channels[i];
13f2b9d7
DJ
598 }
599
e131be0a
GT
600 /* According to the SCPI standard, the response to the command
601 * SCPI_CMD_GET_DIG_POD_THRESHOLD might return "USER" instead of
602 * "USER1".
603 *
604 * This makes more difficult to validate the response when the logic
605 * threshold is set to "USER1" and therefore we need to prevent device
606 * opening failures in such configuration case...
607 */
608 for (i = 0; i < config->num_logic_threshold; i++) {
609 logic_threshold_short[i] = g_strdup((*config->logic_threshold)[i]);
610 if (!strcmp("USER1", (*config->logic_threshold)[i]))
611 g_strlcpy(logic_threshold_short[i],
612 (*config->logic_threshold)[i], strlen((*config->logic_threshold)[i]));
613 }
614
0a1f7b09 615 for (i = 0; i < config->digital_pods; i++) {
13f2b9d7
DJ
616 g_snprintf(command, sizeof(command),
617 (*config->scpi_dialect)[SCPI_CMD_GET_DIG_POD_STATE],
618 i + 1);
619
23f43dff 620 if (sr_scpi_get_bool(scpi, command,
e131be0a
GT
621 &state->digital_pods[i].state) != SR_OK)
622 goto exit;
623
624 g_snprintf(command, sizeof(command),
625 (*config->scpi_dialect)[SCPI_CMD_GET_DIG_POD_THRESHOLD],
626 i + 1);
627
628 /* Check for both standard and shortened responses. */
629 if (scope_state_get_array_option(scpi, command, config->logic_threshold,
630 config->num_logic_threshold,
631 &state->digital_pods[i].threshold) != SR_OK)
632 if (scope_state_get_array_option(scpi, command, (const char * (*)[]) &logic_threshold_short,
633 config->num_logic_threshold,
634 &state->digital_pods[i].threshold) != SR_OK)
635 goto exit;
636
637 if (!strcmp("USER1", (*config->logic_threshold)[state->digital_pods[i].threshold]))
638 g_snprintf(command, sizeof(command),
639 (*config->scpi_dialect)[SCPI_CMD_GET_DIG_POD_USER_THRESHOLD],
640 i + 1, 1); // USER1 logic threshold setting
641
642 if (!strcmp("USER2", (*config->logic_threshold)[state->digital_pods[i].threshold]))
643 g_snprintf(command, sizeof(command),
644 (*config->scpi_dialect)[SCPI_CMD_GET_DIG_POD_USER_THRESHOLD],
645 i + 1, 2); // USER2 for custom logic_threshold setting
646
647 if (!strcmp("USER1", (*config->logic_threshold)[state->digital_pods[i].threshold]) ||
648 !strcmp("USER2", (*config->logic_threshold)[state->digital_pods[i].threshold]))
649 if (sr_scpi_get_float(scpi, command,
650 &state->digital_pods[i].user_threshold) != SR_OK)
651 goto exit;
13f2b9d7
DJ
652 }
653
e131be0a
GT
654 result = SR_OK;
655
656exit:
657 for (i = 0; i < config->num_logic_threshold; i++)
658 g_free(logic_threshold_short[i]);
659
660 return result;
13f2b9d7
DJ
661}
662
14a2f74d
DJ
663SR_PRIV int hmo_update_sample_rate(const struct sr_dev_inst *sdi)
664{
665 struct dev_context *devc;
666 struct scope_state *state;
329733d9 667 const struct scope_config *config;
14a2f74d
DJ
668 int tmp;
669 unsigned int i;
670 float tmp_float;
671 gboolean channel_found;
672 char tmp_str[MAX_COMMAND_SIZE];
673 char chan_name[20];
674
675 devc = sdi->priv;
676 config = devc->model_config;
677 state = devc->model_state;
678 channel_found = FALSE;
679
0a1f7b09 680 for (i = 0; i < config->analog_channels; i++) {
3782e571
UH
681 if (!state->analog_channels[i].state)
682 continue;
683 g_snprintf(chan_name, sizeof(chan_name), "CHAN%d", i + 1);
684 g_snprintf(tmp_str, sizeof(tmp_str),
685 (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE],
686 chan_name);
687 channel_found = TRUE;
688 break;
689 }
690
691 if (!channel_found) {
692 for (i = 0; i < config->digital_pods; i++) {
e131be0a 693 if (!state->digital_pods[i].state)
3782e571
UH
694 continue;
695 g_snprintf(chan_name, sizeof(chan_name), "POD%d", i);
14a2f74d
DJ
696 g_snprintf(tmp_str, sizeof(tmp_str),
697 (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE],
698 chan_name);
699 channel_found = TRUE;
700 break;
701 }
702 }
703
14a2f74d
DJ
704 /* No channel is active, ask the instrument for the sample rate
705 * in single shot mode */
706 if (!channel_found) {
c06c24d2
DJ
707 if (sr_scpi_get_float(sdi->conn,
708 (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE],
709 &tmp_float) != SR_OK)
14a2f74d 710 return SR_ERR;
c06c24d2 711
14a2f74d
DJ
712 state->sample_rate = tmp_float;
713 } else {
714 if (sr_scpi_get_int(sdi->conn, tmp_str, &tmp) != SR_OK)
715 return SR_ERR;
716 state->sample_rate = tmp / (((float) (*config->timebases)[state->timebase][0] /
717 (*config->timebases)[state->timebase][1]) *
718 config->num_xdivs);
719 }
720
721 return SR_OK;
722}
723
719eff68 724SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi)
13f2b9d7
DJ
725{
726 struct dev_context *devc;
727 struct scope_state *state;
329733d9 728 const struct scope_config *config;
8de2dc3b
DJ
729 float tmp_float;
730 unsigned int i;
8cccbac8 731 char *tmp_str;
13f2b9d7
DJ
732
733 devc = sdi->priv;
734 config = devc->model_config;
735 state = devc->model_state;
736
8de2dc3b
DJ
737 sr_info("Fetching scope state");
738
bd70ec4b 739 if (analog_channel_state_get(sdi, config, state) != SR_OK)
13f2b9d7
DJ
740 return SR_ERR;
741
bd70ec4b 742 if (digital_channel_state_get(sdi, config, state) != SR_OK)
13f2b9d7
DJ
743 return SR_ERR;
744
89280b1a
UH
745 if (sr_scpi_get_float(sdi->conn,
746 (*config->scpi_dialect)[SCPI_CMD_GET_TIMEBASE],
8de2dc3b
DJ
747 &tmp_float) != SR_OK)
748 return SR_ERR;
749
8cccbac8
SA
750 if (sr_scpi_get_string(sdi->conn,
751 (*config->scpi_dialect)[SCPI_CMD_GET_TIMEBASE],
752 &tmp_str) != SR_OK)
753 return SR_ERR;
754
53012da6 755 if (array_float_get(tmp_str, ARRAY_AND_SIZE(timebases), &i) != SR_OK) {
8cccbac8 756 g_free(tmp_str);
b4e31d2a 757 sr_err("Could not determine array index for time base.");
13f2b9d7 758 return SR_ERR;
b4e31d2a 759 }
e5b7eef7 760 g_free(tmp_str);
13f2b9d7 761
8cccbac8
SA
762 state->timebase = i;
763
89280b1a
UH
764 if (sr_scpi_get_float(sdi->conn,
765 (*config->scpi_dialect)[SCPI_CMD_GET_HORIZ_TRIGGERPOS],
422a1c0d 766 &tmp_float) != SR_OK)
13f2b9d7 767 return SR_ERR;
422a1c0d
DJ
768 state->horiz_triggerpos = tmp_float /
769 (((double) (*config->timebases)[state->timebase][0] /
770 (*config->timebases)[state->timebase][1]) * config->num_xdivs);
771 state->horiz_triggerpos -= 0.5;
772 state->horiz_triggerpos *= -1;
13f2b9d7 773
89280b1a
UH
774 if (scope_state_get_array_option(sdi->conn,
775 (*config->scpi_dialect)[SCPI_CMD_GET_TRIGGER_SOURCE],
692716f5
UH
776 config->trigger_sources, config->num_trigger_sources,
777 &state->trigger_source) != SR_OK)
13f2b9d7
DJ
778 return SR_ERR;
779
89280b1a 780 if (scope_state_get_array_option(sdi->conn,
692716f5
UH
781 (*config->scpi_dialect)[SCPI_CMD_GET_TRIGGER_SLOPE],
782 config->trigger_slopes, config->num_trigger_slopes,
783 &state->trigger_slope) != SR_OK)
13f2b9d7
DJ
784 return SR_ERR;
785
4fa4db2c
GT
786 if (sr_scpi_get_string(sdi->conn,
787 (*config->scpi_dialect)[SCPI_CMD_GET_TRIGGER_PATTERN],
788 &state->trigger_pattern) != SR_OK)
789 return SR_ERR;
790
14a2f74d
DJ
791 if (hmo_update_sample_rate(sdi) != SR_OK)
792 return SR_ERR;
793
8de2dc3b
DJ
794 sr_info("Fetching finished.");
795
13f2b9d7
DJ
796 scope_state_dump(config, state);
797
798 return SR_OK;
799}
800
329733d9 801static struct scope_state *scope_state_new(const struct scope_config *config)
13f2b9d7
DJ
802{
803 struct scope_state *state;
804
a95f142e
UH
805 state = g_malloc0(sizeof(struct scope_state));
806 state->analog_channels = g_malloc0_n(config->analog_channels,
807 sizeof(struct analog_channel_state));
808 state->digital_channels = g_malloc0_n(
809 config->digital_channels, sizeof(gboolean));
810 state->digital_pods = g_malloc0_n(config->digital_pods,
e131be0a 811 sizeof(struct digital_pod_state));
13f2b9d7
DJ
812
813 return state;
13f2b9d7
DJ
814}
815
719eff68 816SR_PRIV void hmo_scope_state_free(struct scope_state *state)
13f2b9d7
DJ
817{
818 g_free(state->analog_channels);
819 g_free(state->digital_channels);
820 g_free(state->digital_pods);
821 g_free(state);
822}
823
824SR_PRIV int hmo_init_device(struct sr_dev_inst *sdi)
825{
13f2b9d7 826 int model_index;
2d224dba 827 unsigned int i, j, group;
ba7dd8bb 828 struct sr_channel *ch;
13f2b9d7 829 struct dev_context *devc;
eac9fcd2 830 int ret;
13f2b9d7
DJ
831
832 devc = sdi->priv;
833 model_index = -1;
834
89280b1a 835 /* Find the exact model. */
13f2b9d7
DJ
836 for (i = 0; i < ARRAY_SIZE(scope_models); i++) {
837 for (j = 0; scope_models[i].name[j]; j++) {
838 if (!strcmp(sdi->model, scope_models[i].name[j])) {
839 model_index = i;
840 break;
841 }
842 }
843 if (model_index != -1)
844 break;
845 }
846
847 if (model_index == -1) {
e35ebc6a 848 sr_dbg("Unsupported device.");
13f2b9d7
DJ
849 return SR_ERR_NA;
850 }
851
562b7ae5
SA
852 devc->analog_groups = g_malloc0(sizeof(struct sr_channel_group*) *
853 scope_models[model_index].analog_channels);
562b7ae5
SA
854 devc->digital_groups = g_malloc0(sizeof(struct sr_channel_group*) *
855 scope_models[model_index].digital_pods);
b0e80e9a
GS
856 if (!devc->analog_groups || !devc->digital_groups) {
857 g_free(devc->analog_groups);
858 g_free(devc->digital_groups);
859 return SR_ERR_MALLOC;
860 }
13f2b9d7 861
89280b1a 862 /* Add analog channels. */
13f2b9d7 863 for (i = 0; i < scope_models[model_index].analog_channels; i++) {
5e23fcab 864 ch = sr_channel_new(sdi, i, SR_CHANNEL_ANALOG, TRUE,
c368e6f3 865 (*scope_models[model_index].analog_names)[i]);
13f2b9d7 866
562b7ae5
SA
867 devc->analog_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
868
869 devc->analog_groups[i]->name = g_strdup(
870 (char *)(*scope_models[model_index].analog_names)[i]);
871 devc->analog_groups[i]->channels = g_slist_append(NULL, ch);
13f2b9d7 872
660e398f 873 sdi->channel_groups = g_slist_append(sdi->channel_groups,
562b7ae5 874 devc->analog_groups[i]);
13f2b9d7
DJ
875 }
876
660e398f 877 /* Add digital channel groups. */
eac9fcd2 878 ret = SR_OK;
0a1f7b09 879 for (i = 0; i < scope_models[model_index].digital_pods; i++) {
562b7ae5 880 devc->digital_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
eac9fcd2
GS
881 if (!devc->digital_groups[i]) {
882 ret = SR_ERR_MALLOC;
883 break;
884 }
262061ff 885 devc->digital_groups[i]->name = g_strdup_printf("POD%d", i + 1);
660e398f 886 sdi->channel_groups = g_slist_append(sdi->channel_groups,
2d224dba 887 devc->digital_groups[i]);
13f2b9d7 888 }
eac9fcd2
GS
889 if (ret != SR_OK)
890 return ret;
13f2b9d7 891
89280b1a 892 /* Add digital channels. */
13f2b9d7 893 for (i = 0; i < scope_models[model_index].digital_channels; i++) {
5e23fcab 894 ch = sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE,
c368e6f3 895 (*scope_models[model_index].digital_names)[i]);
13f2b9d7 896
2d224dba
GS
897 group = i / 8;
898 devc->digital_groups[group]->channels = g_slist_append(
899 devc->digital_groups[group]->channels, ch);
13f2b9d7
DJ
900 }
901
902 devc->model_config = &scope_models[model_index];
d779dcac 903 devc->samples_limit = 0;
13f2b9d7
DJ
904 devc->frame_limit = 0;
905
906 if (!(devc->model_state = scope_state_new(devc->model_config)))
907 return SR_ERR_MALLOC;
908
909 return SR_OK;
910}
911
e06875b2
GS
912/* Queue data of one channel group, for later submission. */
913SR_PRIV void hmo_queue_logic_data(struct dev_context *devc,
914 size_t group, GByteArray *pod_data)
915{
916 size_t size;
917 GByteArray *store;
918 uint8_t *logic_data;
919 size_t idx, logic_step;
920
921 /*
922 * Upon first invocation, allocate the array which can hold the
923 * combined logic data for all channels. Assume that each channel
924 * will yield an identical number of samples per receive call.
925 *
926 * As a poor man's safety measure: (Silently) skip processing
927 * for unexpected sample counts, and ignore samples for
928 * unexpected channel groups. Don't bother with complicated
929 * resize logic, considering that many models only support one
930 * pod, and the most capable supported models have two pods of
931 * identical size. We haven't yet seen any "odd" configuration.
932 */
933 if (!devc->logic_data) {
934 size = pod_data->len * devc->pod_count;
935 store = g_byte_array_sized_new(size);
936 memset(store->data, 0, size);
937 store = g_byte_array_set_size(store, size);
938 devc->logic_data = store;
939 } else {
940 store = devc->logic_data;
941 size = store->len / devc->pod_count;
e06875b2
GS
942 if (group >= devc->pod_count)
943 return;
944 }
945
946 /*
947 * Fold the data of the most recently received channel group into
948 * the storage, where data resides for all channels combined.
949 */
950 logic_data = store->data;
951 logic_data += group;
952 logic_step = devc->pod_count;
953 for (idx = 0; idx < pod_data->len; idx++) {
954 *logic_data = pod_data->data[idx];
955 logic_data += logic_step;
956 }
d779dcac
GT
957
958 /* Truncate acquisition if a smaller number of samples has been requested. */
959 if (devc->samples_limit > 0 && devc->logic_data->len > devc->samples_limit * devc->pod_count)
960 devc->logic_data->len = devc->samples_limit * devc->pod_count;
e06875b2
GS
961}
962
963/* Submit data for all channels, after the individual groups got collected. */
964SR_PRIV void hmo_send_logic_packet(struct sr_dev_inst *sdi,
965 struct dev_context *devc)
966{
967 struct sr_datafeed_packet packet;
968 struct sr_datafeed_logic logic;
969
970 if (!devc->logic_data)
971 return;
972
973 logic.data = devc->logic_data->data;
974 logic.length = devc->logic_data->len;
975 logic.unitsize = devc->pod_count;
976
977 packet.type = SR_DF_LOGIC;
978 packet.payload = &logic;
979
980 sr_session_send(sdi, &packet);
981}
982
983/* Undo previous resource allocation. */
984SR_PRIV void hmo_cleanup_logic_data(struct dev_context *devc)
985{
986
987 if (devc->logic_data) {
988 g_byte_array_free(devc->logic_data, TRUE);
989 devc->logic_data = NULL;
990 }
991 /*
992 * Keep 'pod_count'! It's required when more frames will be
993 * received, and does not harm when kept after acquisition.
994 */
995}
996
719eff68 997SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
06a3e78a 998{
ba7dd8bb 999 struct sr_channel *ch;
13f2b9d7 1000 struct sr_dev_inst *sdi;
06a3e78a 1001 struct dev_context *devc;
401b83a1 1002 struct scope_state *state;
13f2b9d7 1003 struct sr_datafeed_packet packet;
401b83a1
SB
1004 GByteArray *data;
1005 struct sr_datafeed_analog analog;
1006 struct sr_analog_encoding encoding;
1007 struct sr_analog_meaning meaning;
1008 struct sr_analog_spec spec;
89280b1a 1009 struct sr_datafeed_logic logic;
e06875b2 1010 size_t group;
06a3e78a
DJ
1011
1012 (void)fd;
f0729866 1013 (void)revents;
06a3e78a 1014
f62f595b
MK
1015 data = NULL;
1016
06a3e78a
DJ
1017 if (!(sdi = cb_data))
1018 return TRUE;
1019
1020 if (!(devc = sdi->priv))
1021 return TRUE;
1022
f4f273ce
SB
1023 /* Although this is correct in general, the USBTMC libusb implementation
1024 * currently does not generate an event prior to the first read. Often
1025 * it is ok to start reading just after the 50ms timeout. See bug #785.
dc89faea
UH
1026 if (revents != G_IO_IN)
1027 return TRUE;
f4f273ce 1028 */
13f2b9d7 1029
dc89faea 1030 ch = devc->current_channel->data;
401b83a1 1031 state = devc->model_state;
13f2b9d7 1032
b23eb1d4
GS
1033 /*
1034 * Send "frame begin" packet upon reception of data for the
1035 * first enabled channel.
1036 */
1037 if (devc->current_channel == devc->enabled_channels) {
1038 packet.type = SR_DF_FRAME_BEGIN;
1039 sr_session_send(sdi, &packet);
1040 }
1041
1042 /*
1043 * Pass on the received data of the channel(s).
1044 */
dc89faea
UH
1045 switch (ch->type) {
1046 case SR_CHANNEL_ANALOG:
401b83a1 1047 if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
dc89faea 1048 if (data)
401b83a1 1049 g_byte_array_free(data, TRUE);
dc89faea 1050 return TRUE;
13f2b9d7
DJ
1051 }
1052
401b83a1
SB
1053 packet.type = SR_DF_ANALOG;
1054
1055 analog.data = data->data;
1056 analog.num_samples = data->len / sizeof(float);
d779dcac
GT
1057 /* Truncate acquisition if a smaller number of samples has been requested. */
1058 if (devc->samples_limit > 0 && analog.num_samples > devc->samples_limit)
1059 analog.num_samples = devc->samples_limit;
401b83a1
SB
1060 analog.encoding = &encoding;
1061 analog.meaning = &meaning;
1062 analog.spec = &spec;
1063
1064 encoding.unitsize = sizeof(float);
1065 encoding.is_signed = TRUE;
1066 encoding.is_float = TRUE;
65a6794e
GS
1067#ifdef WORDS_BIGENDIAN
1068 encoding.is_bigendian = TRUE;
1069#else
d1ad8b10 1070 encoding.is_bigendian = FALSE;
65a6794e 1071#endif
7dcaddd3
UH
1072 /* TODO: Use proper 'digits' value for this device (and its modes). */
1073 encoding.digits = 2;
401b83a1
SB
1074 encoding.is_digits_decimal = FALSE;
1075 encoding.scale.p = 1;
1076 encoding.scale.q = 1;
1077 encoding.offset.p = 0;
1078 encoding.offset.q = 1;
1079 if (state->analog_channels[ch->index].probe_unit == 'V') {
1080 meaning.mq = SR_MQ_VOLTAGE;
1081 meaning.unit = SR_UNIT_VOLT;
1082 } else {
1083 meaning.mq = SR_MQ_CURRENT;
1084 meaning.unit = SR_UNIT_AMPERE;
1085 }
1086 meaning.mqflags = 0;
1087 meaning.channels = g_slist_append(NULL, ch);
7dcaddd3
UH
1088 /* TODO: Use proper 'digits' value for this device (and its modes). */
1089 spec.spec_digits = 2;
dc89faea 1090 packet.payload = &analog;
695dc859 1091 sr_session_send(sdi, &packet);
d779dcac 1092 devc->num_samples = data->len / sizeof(float);
401b83a1
SB
1093 g_slist_free(meaning.channels);
1094 g_byte_array_free(data, TRUE);
dc89faea
UH
1095 data = NULL;
1096 break;
1097 case SR_CHANNEL_LOGIC:
401b83a1 1098 if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
14cb6aa4
GT
1099 if (data)
1100 g_byte_array_free(data, TRUE);
dc89faea 1101 return TRUE;
13f2b9d7 1102 }
dc89faea 1103
e06875b2
GS
1104 /*
1105 * If only data from the first pod is involved in the
1106 * acquisition, then the raw input bytes can get passed
1107 * forward for performance reasons. When the second pod
1108 * is involved (either alone, or in combination with the
1109 * first pod), then the received bytes need to be put
1110 * into memory in such a layout that all channel groups
1111 * get combined, and a unitsize larger than a single byte
1112 * applies. The "queue" logic transparently copes with
1113 * any such configuration. This works around the lack
1114 * of support for "meaning" to logic data, which is used
1115 * above for analog data.
1116 */
1117 if (devc->pod_count == 1) {
1118 packet.type = SR_DF_LOGIC;
1119 logic.data = data->data;
1120 logic.length = data->len;
d779dcac
GT
1121 /* Truncate acquisition if a smaller number of samples has been requested. */
1122 if (devc->samples_limit > 0 && logic.length > devc->samples_limit)
1123 logic.length = devc->samples_limit;
e06875b2
GS
1124 logic.unitsize = 1;
1125 packet.payload = &logic;
1126 sr_session_send(sdi, &packet);
1127 } else {
1128 group = ch->index / 8;
1129 hmo_queue_logic_data(devc, group, data);
1130 }
dc89faea 1131
d779dcac 1132 devc->num_samples = data->len / devc->pod_count;
401b83a1 1133 g_byte_array_free(data, TRUE);
dc89faea
UH
1134 data = NULL;
1135 break;
1136 default:
1137 sr_err("Invalid channel type.");
1138 break;
1139 }
1140
b23eb1d4
GS
1141 /*
1142 * Advance to the next enabled channel. When data for all enabled
e06875b2
GS
1143 * channels was received, then flush potentially queued logic data,
1144 * and send the "frame end" packet.
b23eb1d4 1145 */
dc89faea
UH
1146 if (devc->current_channel->next) {
1147 devc->current_channel = devc->current_channel->next;
1148 hmo_request_data(sdi);
b23eb1d4
GS
1149 return TRUE;
1150 }
e06875b2
GS
1151 hmo_send_logic_packet(sdi, devc);
1152
1153 /*
1154 * Release the logic data storage after each frame. This copes
1155 * with sample counts that differ in length per frame. -- Is
1156 * this a real constraint when acquiring multiple frames with
1157 * identical device settings?
1158 */
1159 hmo_cleanup_logic_data(devc);
1160
b23eb1d4
GS
1161 packet.type = SR_DF_FRAME_END;
1162 sr_session_send(sdi, &packet);
1163
1164 /*
1165 * End of frame was reached. Stop acquisition after the specified
d779dcac
GT
1166 * number of frames or after the specified number of samples, or
1167 * continue reception by starting over at the first enabled channel.
b23eb1d4 1168 */
d779dcac 1169 if (++devc->num_frames >= devc->frame_limit || devc->num_samples >= devc->samples_limit) {
d2f7c417 1170 sr_dev_acquisition_stop(sdi);
e06875b2 1171 hmo_cleanup_logic_data(devc);
dc89faea
UH
1172 } else {
1173 devc->current_channel = devc->enabled_channels;
1174 hmo_request_data(sdi);
06a3e78a
DJ
1175 }
1176
1177 return TRUE;
1178}