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