]> sigrok.org Git - libsigrok.git/blame - src/hardware/hameg-hmo/protocol.c
hameg-hmo: Use g_byte_array_free() instead of g_free().
[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
bd70ec4b
SB
382static struct sr_channel *get_channel_by_index_and_type(GSList *channel_lhead,
383 int index, int type)
384{
385 while (channel_lhead) {
386 struct sr_channel *ch = channel_lhead->data;
387 if (ch->index == index && ch->type == type)
388 return ch;
389
390 channel_lhead = channel_lhead->next;
391 }
392
393 return 0;
394}
395
396static int analog_channel_state_get(struct sr_dev_inst *sdi,
329733d9 397 const struct scope_config *config,
13f2b9d7
DJ
398 struct scope_state *state)
399{
8de2dc3b 400 unsigned int i, j;
13f2b9d7 401 char command[MAX_COMMAND_SIZE];
8fff7519 402 char *tmp_str;
bd70ec4b
SB
403 struct sr_channel *ch;
404 struct sr_scpi_dev_inst *scpi = sdi->conn;
13f2b9d7 405
0a1f7b09 406 for (i = 0; i < config->analog_channels; i++) {
13f2b9d7
DJ
407 g_snprintf(command, sizeof(command),
408 (*config->scpi_dialect)[SCPI_CMD_GET_ANALOG_CHAN_STATE],
409 i + 1);
410
23f43dff 411 if (sr_scpi_get_bool(scpi, command,
13f2b9d7
DJ
412 &state->analog_channels[i].state) != SR_OK)
413 return SR_ERR;
414
bd70ec4b
SB
415 ch = get_channel_by_index_and_type(sdi->channels, i, SR_CHANNEL_ANALOG);
416 if (ch)
417 ch->enabled = state->analog_channels[i].state;
418
13f2b9d7
DJ
419 g_snprintf(command, sizeof(command),
420 (*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_DIV],
421 i + 1);
422
8fff7519 423 if (sr_scpi_get_string(scpi, command, &tmp_str) != SR_OK)
8de2dc3b 424 return SR_ERR;
8fff7519 425
53012da6 426 if (array_float_get(tmp_str, ARRAY_AND_SIZE(vdivs), &j) != SR_OK) {
8fff7519 427 g_free(tmp_str);
b4e31d2a 428 sr_err("Could not determine array index for vertical div scale.");
13f2b9d7 429 return SR_ERR;
b4e31d2a 430 }
13f2b9d7 431
8fff7519
SA
432 g_free(tmp_str);
433 state->analog_channels[i].vdiv = j;
434
13f2b9d7
DJ
435 g_snprintf(command, sizeof(command),
436 (*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_OFFSET],
437 i + 1);
438
23f43dff 439 if (sr_scpi_get_float(scpi, command,
13f2b9d7
DJ
440 &state->analog_channels[i].vertical_offset) != SR_OK)
441 return SR_ERR;
442
443 g_snprintf(command, sizeof(command),
444 (*config->scpi_dialect)[SCPI_CMD_GET_COUPLING],
445 i + 1);
446
23f43dff 447 if (scope_state_get_array_option(scpi, command, config->coupling_options,
692716f5 448 config->num_coupling_options,
13f2b9d7
DJ
449 &state->analog_channels[i].coupling) != SR_OK)
450 return SR_ERR;
448e81b1
SB
451
452 g_snprintf(command, sizeof(command),
453 (*config->scpi_dialect)[SCPI_CMD_GET_PROBE_UNIT],
454 i + 1);
455
456 if (sr_scpi_get_string(scpi, command, &tmp_str) != SR_OK)
457 return SR_ERR;
458
459 if (tmp_str[0] == 'A')
460 state->analog_channels[i].probe_unit = 'A';
461 else
462 state->analog_channels[i].probe_unit = 'V';
463 g_free(tmp_str);
13f2b9d7
DJ
464 }
465
466 return SR_OK;
467}
468
bd70ec4b 469static int digital_channel_state_get(struct sr_dev_inst *sdi,
329733d9 470 const struct scope_config *config,
13f2b9d7
DJ
471 struct scope_state *state)
472{
473 unsigned int i;
474 char command[MAX_COMMAND_SIZE];
bd70ec4b
SB
475 struct sr_channel *ch;
476 struct sr_scpi_dev_inst *scpi = sdi->conn;
13f2b9d7 477
0a1f7b09 478 for (i = 0; i < config->digital_channels; i++) {
13f2b9d7
DJ
479 g_snprintf(command, sizeof(command),
480 (*config->scpi_dialect)[SCPI_CMD_GET_DIG_CHAN_STATE],
481 i);
482
23f43dff 483 if (sr_scpi_get_bool(scpi, command,
13f2b9d7
DJ
484 &state->digital_channels[i]) != SR_OK)
485 return SR_ERR;
bd70ec4b
SB
486
487 ch = get_channel_by_index_and_type(sdi->channels, i, SR_CHANNEL_LOGIC);
488 if (ch)
489 ch->enabled = state->digital_channels[i];
13f2b9d7
DJ
490 }
491
0a1f7b09 492 for (i = 0; i < config->digital_pods; i++) {
13f2b9d7
DJ
493 g_snprintf(command, sizeof(command),
494 (*config->scpi_dialect)[SCPI_CMD_GET_DIG_POD_STATE],
495 i + 1);
496
23f43dff 497 if (sr_scpi_get_bool(scpi, command,
13f2b9d7
DJ
498 &state->digital_pods[i]) != SR_OK)
499 return SR_ERR;
500 }
501
502 return SR_OK;
503}
504
14a2f74d
DJ
505SR_PRIV int hmo_update_sample_rate(const struct sr_dev_inst *sdi)
506{
507 struct dev_context *devc;
508 struct scope_state *state;
329733d9 509 const struct scope_config *config;
14a2f74d
DJ
510 int tmp;
511 unsigned int i;
512 float tmp_float;
513 gboolean channel_found;
514 char tmp_str[MAX_COMMAND_SIZE];
515 char chan_name[20];
516
517 devc = sdi->priv;
518 config = devc->model_config;
519 state = devc->model_state;
520 channel_found = FALSE;
521
0a1f7b09 522 for (i = 0; i < config->analog_channels; i++) {
3782e571
UH
523 if (!state->analog_channels[i].state)
524 continue;
525 g_snprintf(chan_name, sizeof(chan_name), "CHAN%d", i + 1);
526 g_snprintf(tmp_str, sizeof(tmp_str),
527 (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE],
528 chan_name);
529 channel_found = TRUE;
530 break;
531 }
532
533 if (!channel_found) {
534 for (i = 0; i < config->digital_pods; i++) {
535 if (!state->digital_pods[i])
536 continue;
537 g_snprintf(chan_name, sizeof(chan_name), "POD%d", i);
14a2f74d
DJ
538 g_snprintf(tmp_str, sizeof(tmp_str),
539 (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE],
540 chan_name);
541 channel_found = TRUE;
542 break;
543 }
544 }
545
14a2f74d
DJ
546 /* No channel is active, ask the instrument for the sample rate
547 * in single shot mode */
548 if (!channel_found) {
c06c24d2
DJ
549 if (sr_scpi_get_float(sdi->conn,
550 (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE],
551 &tmp_float) != SR_OK)
14a2f74d 552 return SR_ERR;
c06c24d2 553
14a2f74d
DJ
554 state->sample_rate = tmp_float;
555 } else {
556 if (sr_scpi_get_int(sdi->conn, tmp_str, &tmp) != SR_OK)
557 return SR_ERR;
558 state->sample_rate = tmp / (((float) (*config->timebases)[state->timebase][0] /
559 (*config->timebases)[state->timebase][1]) *
560 config->num_xdivs);
561 }
562
563 return SR_OK;
564}
565
719eff68 566SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi)
13f2b9d7
DJ
567{
568 struct dev_context *devc;
569 struct scope_state *state;
329733d9 570 const struct scope_config *config;
8de2dc3b
DJ
571 float tmp_float;
572 unsigned int i;
8cccbac8 573 char *tmp_str;
13f2b9d7
DJ
574
575 devc = sdi->priv;
576 config = devc->model_config;
577 state = devc->model_state;
578
8de2dc3b
DJ
579 sr_info("Fetching scope state");
580
bd70ec4b 581 if (analog_channel_state_get(sdi, config, state) != SR_OK)
13f2b9d7
DJ
582 return SR_ERR;
583
bd70ec4b 584 if (digital_channel_state_get(sdi, config, state) != SR_OK)
13f2b9d7
DJ
585 return SR_ERR;
586
89280b1a
UH
587 if (sr_scpi_get_float(sdi->conn,
588 (*config->scpi_dialect)[SCPI_CMD_GET_TIMEBASE],
8de2dc3b
DJ
589 &tmp_float) != SR_OK)
590 return SR_ERR;
591
8cccbac8
SA
592 if (sr_scpi_get_string(sdi->conn,
593 (*config->scpi_dialect)[SCPI_CMD_GET_TIMEBASE],
594 &tmp_str) != SR_OK)
595 return SR_ERR;
596
53012da6 597 if (array_float_get(tmp_str, ARRAY_AND_SIZE(timebases), &i) != SR_OK) {
8cccbac8 598 g_free(tmp_str);
b4e31d2a 599 sr_err("Could not determine array index for time base.");
13f2b9d7 600 return SR_ERR;
b4e31d2a 601 }
e5b7eef7 602 g_free(tmp_str);
13f2b9d7 603
8cccbac8
SA
604 state->timebase = i;
605
89280b1a
UH
606 if (sr_scpi_get_float(sdi->conn,
607 (*config->scpi_dialect)[SCPI_CMD_GET_HORIZ_TRIGGERPOS],
422a1c0d 608 &tmp_float) != SR_OK)
13f2b9d7 609 return SR_ERR;
422a1c0d
DJ
610 state->horiz_triggerpos = tmp_float /
611 (((double) (*config->timebases)[state->timebase][0] /
612 (*config->timebases)[state->timebase][1]) * config->num_xdivs);
613 state->horiz_triggerpos -= 0.5;
614 state->horiz_triggerpos *= -1;
13f2b9d7 615
89280b1a
UH
616 if (scope_state_get_array_option(sdi->conn,
617 (*config->scpi_dialect)[SCPI_CMD_GET_TRIGGER_SOURCE],
692716f5
UH
618 config->trigger_sources, config->num_trigger_sources,
619 &state->trigger_source) != SR_OK)
13f2b9d7
DJ
620 return SR_ERR;
621
89280b1a 622 if (scope_state_get_array_option(sdi->conn,
692716f5
UH
623 (*config->scpi_dialect)[SCPI_CMD_GET_TRIGGER_SLOPE],
624 config->trigger_slopes, config->num_trigger_slopes,
625 &state->trigger_slope) != SR_OK)
13f2b9d7
DJ
626 return SR_ERR;
627
14a2f74d
DJ
628 if (hmo_update_sample_rate(sdi) != SR_OK)
629 return SR_ERR;
630
8de2dc3b
DJ
631 sr_info("Fetching finished.");
632
13f2b9d7
DJ
633 scope_state_dump(config, state);
634
635 return SR_OK;
636}
637
329733d9 638static struct scope_state *scope_state_new(const struct scope_config *config)
13f2b9d7
DJ
639{
640 struct scope_state *state;
641
a95f142e
UH
642 state = g_malloc0(sizeof(struct scope_state));
643 state->analog_channels = g_malloc0_n(config->analog_channels,
644 sizeof(struct analog_channel_state));
645 state->digital_channels = g_malloc0_n(
646 config->digital_channels, sizeof(gboolean));
647 state->digital_pods = g_malloc0_n(config->digital_pods,
648 sizeof(gboolean));
13f2b9d7
DJ
649
650 return state;
13f2b9d7
DJ
651}
652
719eff68 653SR_PRIV void hmo_scope_state_free(struct scope_state *state)
13f2b9d7
DJ
654{
655 g_free(state->analog_channels);
656 g_free(state->digital_channels);
657 g_free(state->digital_pods);
658 g_free(state);
659}
660
661SR_PRIV int hmo_init_device(struct sr_dev_inst *sdi)
662{
13f2b9d7 663 int model_index;
2d224dba 664 unsigned int i, j, group;
ba7dd8bb 665 struct sr_channel *ch;
13f2b9d7 666 struct dev_context *devc;
eac9fcd2 667 int ret;
13f2b9d7
DJ
668
669 devc = sdi->priv;
670 model_index = -1;
671
89280b1a 672 /* Find the exact model. */
13f2b9d7
DJ
673 for (i = 0; i < ARRAY_SIZE(scope_models); i++) {
674 for (j = 0; scope_models[i].name[j]; j++) {
675 if (!strcmp(sdi->model, scope_models[i].name[j])) {
676 model_index = i;
677 break;
678 }
679 }
680 if (model_index != -1)
681 break;
682 }
683
684 if (model_index == -1) {
89280b1a 685 sr_dbg("Unsupported HMO device.");
13f2b9d7
DJ
686 return SR_ERR_NA;
687 }
688
562b7ae5
SA
689 devc->analog_groups = g_malloc0(sizeof(struct sr_channel_group*) *
690 scope_models[model_index].analog_channels);
562b7ae5
SA
691 devc->digital_groups = g_malloc0(sizeof(struct sr_channel_group*) *
692 scope_models[model_index].digital_pods);
b0e80e9a
GS
693 if (!devc->analog_groups || !devc->digital_groups) {
694 g_free(devc->analog_groups);
695 g_free(devc->digital_groups);
696 return SR_ERR_MALLOC;
697 }
13f2b9d7 698
89280b1a 699 /* Add analog channels. */
13f2b9d7 700 for (i = 0; i < scope_models[model_index].analog_channels; i++) {
5e23fcab 701 ch = sr_channel_new(sdi, i, SR_CHANNEL_ANALOG, TRUE,
c368e6f3 702 (*scope_models[model_index].analog_names)[i]);
13f2b9d7 703
562b7ae5
SA
704 devc->analog_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
705
706 devc->analog_groups[i]->name = g_strdup(
707 (char *)(*scope_models[model_index].analog_names)[i]);
708 devc->analog_groups[i]->channels = g_slist_append(NULL, ch);
13f2b9d7 709
660e398f 710 sdi->channel_groups = g_slist_append(sdi->channel_groups,
562b7ae5 711 devc->analog_groups[i]);
13f2b9d7
DJ
712 }
713
660e398f 714 /* Add digital channel groups. */
eac9fcd2 715 ret = SR_OK;
0a1f7b09 716 for (i = 0; i < scope_models[model_index].digital_pods; i++) {
562b7ae5 717 devc->digital_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
eac9fcd2
GS
718 if (!devc->digital_groups[i]) {
719 ret = SR_ERR_MALLOC;
720 break;
721 }
d2391b54 722 devc->digital_groups[i]->name = g_strdup_printf("POD%d", i);
660e398f 723 sdi->channel_groups = g_slist_append(sdi->channel_groups,
2d224dba 724 devc->digital_groups[i]);
13f2b9d7 725 }
eac9fcd2
GS
726 if (ret != SR_OK)
727 return ret;
13f2b9d7 728
89280b1a 729 /* Add digital channels. */
13f2b9d7 730 for (i = 0; i < scope_models[model_index].digital_channels; i++) {
5e23fcab 731 ch = sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE,
c368e6f3 732 (*scope_models[model_index].digital_names)[i]);
13f2b9d7 733
2d224dba
GS
734 group = i / 8;
735 devc->digital_groups[group]->channels = g_slist_append(
736 devc->digital_groups[group]->channels, ch);
13f2b9d7
DJ
737 }
738
739 devc->model_config = &scope_models[model_index];
740 devc->frame_limit = 0;
741
742 if (!(devc->model_state = scope_state_new(devc->model_config)))
743 return SR_ERR_MALLOC;
744
745 return SR_OK;
746}
747
e06875b2
GS
748/* Queue data of one channel group, for later submission. */
749SR_PRIV void hmo_queue_logic_data(struct dev_context *devc,
750 size_t group, GByteArray *pod_data)
751{
752 size_t size;
753 GByteArray *store;
754 uint8_t *logic_data;
755 size_t idx, logic_step;
756
757 /*
758 * Upon first invocation, allocate the array which can hold the
759 * combined logic data for all channels. Assume that each channel
760 * will yield an identical number of samples per receive call.
761 *
762 * As a poor man's safety measure: (Silently) skip processing
763 * for unexpected sample counts, and ignore samples for
764 * unexpected channel groups. Don't bother with complicated
765 * resize logic, considering that many models only support one
766 * pod, and the most capable supported models have two pods of
767 * identical size. We haven't yet seen any "odd" configuration.
768 */
769 if (!devc->logic_data) {
770 size = pod_data->len * devc->pod_count;
771 store = g_byte_array_sized_new(size);
772 memset(store->data, 0, size);
773 store = g_byte_array_set_size(store, size);
774 devc->logic_data = store;
775 } else {
776 store = devc->logic_data;
777 size = store->len / devc->pod_count;
778 if (size != pod_data->len)
779 return;
780 if (group >= devc->pod_count)
781 return;
782 }
783
784 /*
785 * Fold the data of the most recently received channel group into
786 * the storage, where data resides for all channels combined.
787 */
788 logic_data = store->data;
789 logic_data += group;
790 logic_step = devc->pod_count;
791 for (idx = 0; idx < pod_data->len; idx++) {
792 *logic_data = pod_data->data[idx];
793 logic_data += logic_step;
794 }
795}
796
797/* Submit data for all channels, after the individual groups got collected. */
798SR_PRIV void hmo_send_logic_packet(struct sr_dev_inst *sdi,
799 struct dev_context *devc)
800{
801 struct sr_datafeed_packet packet;
802 struct sr_datafeed_logic logic;
803
804 if (!devc->logic_data)
805 return;
806
807 logic.data = devc->logic_data->data;
808 logic.length = devc->logic_data->len;
809 logic.unitsize = devc->pod_count;
810
811 packet.type = SR_DF_LOGIC;
812 packet.payload = &logic;
813
814 sr_session_send(sdi, &packet);
815}
816
817/* Undo previous resource allocation. */
818SR_PRIV void hmo_cleanup_logic_data(struct dev_context *devc)
819{
820
821 if (devc->logic_data) {
822 g_byte_array_free(devc->logic_data, TRUE);
823 devc->logic_data = NULL;
824 }
825 /*
826 * Keep 'pod_count'! It's required when more frames will be
827 * received, and does not harm when kept after acquisition.
828 */
829}
830
719eff68 831SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
06a3e78a 832{
ba7dd8bb 833 struct sr_channel *ch;
13f2b9d7 834 struct sr_dev_inst *sdi;
06a3e78a 835 struct dev_context *devc;
401b83a1 836 struct scope_state *state;
13f2b9d7 837 struct sr_datafeed_packet packet;
401b83a1
SB
838 GByteArray *data;
839 struct sr_datafeed_analog analog;
840 struct sr_analog_encoding encoding;
841 struct sr_analog_meaning meaning;
842 struct sr_analog_spec spec;
89280b1a 843 struct sr_datafeed_logic logic;
e06875b2 844 size_t group;
06a3e78a
DJ
845
846 (void)fd;
f0729866 847 (void)revents;
06a3e78a 848
f62f595b
MK
849 data = NULL;
850
06a3e78a
DJ
851 if (!(sdi = cb_data))
852 return TRUE;
853
854 if (!(devc = sdi->priv))
855 return TRUE;
856
f4f273ce
SB
857 /* Although this is correct in general, the USBTMC libusb implementation
858 * currently does not generate an event prior to the first read. Often
859 * it is ok to start reading just after the 50ms timeout. See bug #785.
dc89faea
UH
860 if (revents != G_IO_IN)
861 return TRUE;
f4f273ce 862 */
13f2b9d7 863
dc89faea 864 ch = devc->current_channel->data;
401b83a1 865 state = devc->model_state;
13f2b9d7 866
b23eb1d4
GS
867 /*
868 * Send "frame begin" packet upon reception of data for the
869 * first enabled channel.
870 */
871 if (devc->current_channel == devc->enabled_channels) {
872 packet.type = SR_DF_FRAME_BEGIN;
873 sr_session_send(sdi, &packet);
874 }
875
876 /*
877 * Pass on the received data of the channel(s).
878 */
dc89faea
UH
879 switch (ch->type) {
880 case SR_CHANNEL_ANALOG:
401b83a1 881 if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
dc89faea 882 if (data)
401b83a1 883 g_byte_array_free(data, TRUE);
dc89faea 884 return TRUE;
13f2b9d7
DJ
885 }
886
401b83a1
SB
887 packet.type = SR_DF_ANALOG;
888
889 analog.data = data->data;
890 analog.num_samples = data->len / sizeof(float);
891 analog.encoding = &encoding;
892 analog.meaning = &meaning;
893 analog.spec = &spec;
894
895 encoding.unitsize = sizeof(float);
896 encoding.is_signed = TRUE;
897 encoding.is_float = TRUE;
65a6794e
GS
898#ifdef WORDS_BIGENDIAN
899 encoding.is_bigendian = TRUE;
900#else
d1ad8b10 901 encoding.is_bigendian = FALSE;
65a6794e 902#endif
7dcaddd3
UH
903 /* TODO: Use proper 'digits' value for this device (and its modes). */
904 encoding.digits = 2;
401b83a1
SB
905 encoding.is_digits_decimal = FALSE;
906 encoding.scale.p = 1;
907 encoding.scale.q = 1;
908 encoding.offset.p = 0;
909 encoding.offset.q = 1;
910 if (state->analog_channels[ch->index].probe_unit == 'V') {
911 meaning.mq = SR_MQ_VOLTAGE;
912 meaning.unit = SR_UNIT_VOLT;
913 } else {
914 meaning.mq = SR_MQ_CURRENT;
915 meaning.unit = SR_UNIT_AMPERE;
916 }
917 meaning.mqflags = 0;
918 meaning.channels = g_slist_append(NULL, ch);
7dcaddd3
UH
919 /* TODO: Use proper 'digits' value for this device (and its modes). */
920 spec.spec_digits = 2;
dc89faea 921 packet.payload = &analog;
695dc859 922 sr_session_send(sdi, &packet);
401b83a1
SB
923 g_slist_free(meaning.channels);
924 g_byte_array_free(data, TRUE);
dc89faea
UH
925 data = NULL;
926 break;
927 case SR_CHANNEL_LOGIC:
401b83a1 928 if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
14cb6aa4
GT
929 if (data)
930 g_byte_array_free(data, TRUE);
dc89faea 931 return TRUE;
13f2b9d7 932 }
dc89faea 933
e06875b2
GS
934 /*
935 * If only data from the first pod is involved in the
936 * acquisition, then the raw input bytes can get passed
937 * forward for performance reasons. When the second pod
938 * is involved (either alone, or in combination with the
939 * first pod), then the received bytes need to be put
940 * into memory in such a layout that all channel groups
941 * get combined, and a unitsize larger than a single byte
942 * applies. The "queue" logic transparently copes with
943 * any such configuration. This works around the lack
944 * of support for "meaning" to logic data, which is used
945 * above for analog data.
946 */
947 if (devc->pod_count == 1) {
948 packet.type = SR_DF_LOGIC;
949 logic.data = data->data;
950 logic.length = data->len;
951 logic.unitsize = 1;
952 packet.payload = &logic;
953 sr_session_send(sdi, &packet);
954 } else {
955 group = ch->index / 8;
956 hmo_queue_logic_data(devc, group, data);
957 }
dc89faea 958
401b83a1 959 g_byte_array_free(data, TRUE);
dc89faea
UH
960 data = NULL;
961 break;
962 default:
963 sr_err("Invalid channel type.");
964 break;
965 }
966
b23eb1d4
GS
967 /*
968 * Advance to the next enabled channel. When data for all enabled
e06875b2
GS
969 * channels was received, then flush potentially queued logic data,
970 * and send the "frame end" packet.
b23eb1d4 971 */
dc89faea
UH
972 if (devc->current_channel->next) {
973 devc->current_channel = devc->current_channel->next;
974 hmo_request_data(sdi);
b23eb1d4
GS
975 return TRUE;
976 }
e06875b2
GS
977 hmo_send_logic_packet(sdi, devc);
978
979 /*
980 * Release the logic data storage after each frame. This copes
981 * with sample counts that differ in length per frame. -- Is
982 * this a real constraint when acquiring multiple frames with
983 * identical device settings?
984 */
985 hmo_cleanup_logic_data(devc);
986
b23eb1d4
GS
987 packet.type = SR_DF_FRAME_END;
988 sr_session_send(sdi, &packet);
989
990 /*
991 * End of frame was reached. Stop acquisition after the specified
992 * number of frames, or continue reception by starting over at
993 * the first enabled channel.
994 */
995 if (++devc->num_frames == devc->frame_limit) {
d2f7c417 996 sr_dev_acquisition_stop(sdi);
e06875b2 997 hmo_cleanup_logic_data(devc);
dc89faea
UH
998 } else {
999 devc->current_channel = devc->enabled_channels;
1000 hmo_request_data(sdi);
06a3e78a
DJ
1001 }
1002
1003 return TRUE;
1004}