2 * This file is part of the libsigrok project.
4 * Copyright (C) 2013 poljar (Damir Jelić) <poljarinho@gmail.com>
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.
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.
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/>.
26 SR_PRIV void hmo_queue_logic_data(struct dev_context *devc,
27 size_t group, GByteArray *pod_data);
28 SR_PRIV void hmo_send_logic_packet(struct sr_dev_inst *sdi,
29 struct dev_context *devc);
30 SR_PRIV void hmo_cleanup_logic_data(struct dev_context *devc);
32 static const char *hameg_scpi_dialect[] = {
33 [SCPI_CMD_GET_DIG_DATA] = ":FORM UINT,8;:POD%d:DATA?",
34 [SCPI_CMD_GET_TIMEBASE] = ":TIM:SCAL?",
35 [SCPI_CMD_SET_TIMEBASE] = ":TIM:SCAL %s",
36 [SCPI_CMD_GET_COUPLING] = ":CHAN%d:COUP?",
37 [SCPI_CMD_SET_COUPLING] = ":CHAN%d:COUP %s",
38 [SCPI_CMD_GET_SAMPLE_RATE] = ":ACQ:SRAT?",
39 [SCPI_CMD_GET_SAMPLE_RATE_LIVE] = ":%s:DATA:POINTS?",
40 [SCPI_CMD_GET_ANALOG_DATA] = ":FORM:BORD %s;" \
41 ":FORM REAL,32;:CHAN%d:DATA?",
42 [SCPI_CMD_GET_VERTICAL_DIV] = ":CHAN%d:SCAL?",
43 [SCPI_CMD_SET_VERTICAL_DIV] = ":CHAN%d:SCAL %s",
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?",
54 [SCPI_CMD_SET_HORIZ_TRIGGERPOS] = ":TIM:POS %s",
55 [SCPI_CMD_GET_ANALOG_CHAN_STATE] = ":CHAN%d:STAT?",
56 [SCPI_CMD_SET_ANALOG_CHAN_STATE] = ":CHAN%d:STAT %d",
57 [SCPI_CMD_GET_PROBE_UNIT] = ":PROB%d:SET:ATT:UNIT?",
60 static const uint32_t devopts[] = {
62 SR_CONF_LIMIT_FRAMES | SR_CONF_GET | SR_CONF_SET,
63 SR_CONF_SAMPLERATE | SR_CONF_GET,
64 SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
65 SR_CONF_NUM_HDIV | SR_CONF_GET,
66 SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_GET | SR_CONF_SET,
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,
71 static const uint32_t devopts_cg_analog[] = {
72 SR_CONF_NUM_VDIV | SR_CONF_GET,
73 SR_CONF_VDIV | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
74 SR_CONF_COUPLING | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
77 static const char *coupling_options[] = {
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
86 static const char *scope_trigger_slopes[] = {
93 static const char *compact2_trigger_sources[] = {
95 "LINE", "EXT", "PATT", "BUS1", "BUS2",
96 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
100 static const char *compact4_trigger_sources[] = {
101 "CH1", "CH2", "CH3", "CH4",
102 "LINE", "EXT", "PATT", "BUS1", "BUS2",
103 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
107 static const char *compact4_dig16_trigger_sources[] = {
108 "CH1", "CH2", "CH3", "CH4",
109 "LINE", "EXT", "PATT", "BUS1", "BUS2",
110 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
111 "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
115 static const uint64_t timebases[][2] = {
154 static const uint64_t vdivs[][2] = {
174 static const char *scope_analog_channel_names[] = {
175 "CH1", "CH2", "CH3", "CH4",
178 static const char *scope_digital_channel_names[] = {
179 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
180 "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
183 static const struct scope_config scope_models[] = {
185 /* HMO2522/3032/3042/3052 support 16 digital channels but they're not supported yet. */
186 .name = {"HMO1002", "HMO722", "HMO1022", "HMO1522", "HMO2022", "HMO2522",
187 "HMO3032", "HMO3042", "HMO3052", NULL},
188 .analog_channels = 2,
189 .digital_channels = 8,
192 .analog_names = &scope_analog_channel_names,
193 .digital_names = &scope_digital_channel_names,
196 .num_devopts = ARRAY_SIZE(devopts),
198 .devopts_cg_analog = &devopts_cg_analog,
199 .num_devopts_cg_analog = ARRAY_SIZE(devopts_cg_analog),
201 .coupling_options = &coupling_options,
202 .trigger_sources = &compact2_trigger_sources,
203 .trigger_slopes = &scope_trigger_slopes,
205 .timebases = &timebases,
206 .num_timebases = ARRAY_SIZE(timebases),
209 .num_vdivs = ARRAY_SIZE(vdivs),
214 .scpi_dialect = &hameg_scpi_dialect,
217 .name = {"HMO724", "HMO1024", "HMO1524", "HMO2024", NULL},
218 .analog_channels = 4,
219 .digital_channels = 8,
222 .analog_names = &scope_analog_channel_names,
223 .digital_names = &scope_digital_channel_names,
226 .num_devopts = ARRAY_SIZE(devopts),
228 .devopts_cg_analog = &devopts_cg_analog,
229 .num_devopts_cg_analog = ARRAY_SIZE(devopts_cg_analog),
231 .coupling_options = &coupling_options,
232 .trigger_sources = &compact4_trigger_sources,
233 .trigger_slopes = &scope_trigger_slopes,
235 .timebases = &timebases,
236 .num_timebases = ARRAY_SIZE(timebases),
239 .num_vdivs = ARRAY_SIZE(vdivs),
244 .scpi_dialect = &hameg_scpi_dialect,
247 .name = {"HMO2524", "HMO3034", "HMO3044", "HMO3054", "HMO3524", NULL},
248 .analog_channels = 4,
249 .digital_channels = 16,
252 .analog_names = &scope_analog_channel_names,
253 .digital_names = &scope_digital_channel_names,
256 .num_devopts = ARRAY_SIZE(devopts),
258 .devopts_cg_analog = &devopts_cg_analog,
259 .num_devopts_cg_analog = ARRAY_SIZE(devopts_cg_analog),
261 .coupling_options = &coupling_options,
262 .trigger_sources = &compact4_dig16_trigger_sources,
263 .trigger_slopes = &scope_trigger_slopes,
265 .timebases = &timebases,
266 .num_timebases = ARRAY_SIZE(timebases),
269 .num_vdivs = ARRAY_SIZE(vdivs),
274 .scpi_dialect = &hameg_scpi_dialect,
278 static void scope_state_dump(const struct scope_config *config,
279 struct scope_state *state)
284 for (i = 0; i < config->analog_channels; i++) {
285 tmp = sr_voltage_string((*config->vdivs)[state->analog_channels[i].vdiv][0],
286 (*config->vdivs)[state->analog_channels[i].vdiv][1]);
287 sr_info("State of analog channel %d -> %s : %s (coupling) %s (vdiv) %2.2e (offset)",
288 i + 1, state->analog_channels[i].state ? "On" : "Off",
289 (*config->coupling_options)[state->analog_channels[i].coupling],
290 tmp, state->analog_channels[i].vertical_offset);
293 for (i = 0; i < config->digital_channels; i++) {
294 sr_info("State of digital channel %d -> %s", i,
295 state->digital_channels[i] ? "On" : "Off");
298 for (i = 0; i < config->digital_pods; i++) {
299 sr_info("State of digital POD %d -> %s", i,
300 state->digital_pods[i] ? "On" : "Off");
303 tmp = sr_period_string((*config->timebases)[state->timebase][0],
304 (*config->timebases)[state->timebase][1]);
305 sr_info("Current timebase: %s", tmp);
308 tmp = sr_samplerate_string(state->sample_rate);
309 sr_info("Current samplerate: %s", tmp);
312 sr_info("Current trigger: %s (source), %s (slope) %.2f (offset)",
313 (*config->trigger_sources)[state->trigger_source],
314 (*config->trigger_slopes)[state->trigger_slope],
315 state->horiz_triggerpos);
318 static int scope_state_get_array_option(struct sr_scpi_dev_inst *scpi,
319 const char *command, const char *(*array)[], int *result)
324 if (sr_scpi_get_string(scpi, command, &tmp) != SR_OK) {
329 for (i = 0; (*array)[i]; i++) {
330 if (!g_strcmp0(tmp, (*array)[i])) {
347 * This function takes a value of the form "2.000E-03" and returns the index
348 * of an array where a matching pair was found.
350 * @param value The string to be parsed.
351 * @param array The array of s/f pairs.
352 * @param array_len The number of pairs in the array.
353 * @param result The index at which a matching pair was found.
355 * @return SR_ERR on any parsing error, SR_OK otherwise.
357 static int array_float_get(gchar *value, const uint64_t array[][2],
358 int array_len, unsigned int *result)
360 struct sr_rational rval;
361 struct sr_rational aval;
363 if (sr_parse_rational(value, &rval) != SR_OK)
366 for (int i = 0; i < array_len; i++) {
367 sr_rational_set(&aval, array[i][0], array[i][1]);
368 if (sr_rational_eq(&rval, &aval)) {
377 static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi,
378 const struct scope_config *config,
379 struct scope_state *state)
382 char command[MAX_COMMAND_SIZE];
385 for (i = 0; i < config->analog_channels; i++) {
386 g_snprintf(command, sizeof(command),
387 (*config->scpi_dialect)[SCPI_CMD_GET_ANALOG_CHAN_STATE],
390 if (sr_scpi_get_bool(scpi, command,
391 &state->analog_channels[i].state) != SR_OK)
394 g_snprintf(command, sizeof(command),
395 (*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_DIV],
398 if (sr_scpi_get_string(scpi, command, &tmp_str) != SR_OK)
401 if (array_float_get(tmp_str, ARRAY_AND_SIZE(vdivs), &j) != SR_OK) {
403 sr_err("Could not determine array index for vertical div scale.");
408 state->analog_channels[i].vdiv = j;
410 g_snprintf(command, sizeof(command),
411 (*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_OFFSET],
414 if (sr_scpi_get_float(scpi, command,
415 &state->analog_channels[i].vertical_offset) != SR_OK)
418 g_snprintf(command, sizeof(command),
419 (*config->scpi_dialect)[SCPI_CMD_GET_COUPLING],
422 if (scope_state_get_array_option(scpi, command, config->coupling_options,
423 &state->analog_channels[i].coupling) != SR_OK)
426 g_snprintf(command, sizeof(command),
427 (*config->scpi_dialect)[SCPI_CMD_GET_PROBE_UNIT],
430 if (sr_scpi_get_string(scpi, command, &tmp_str) != SR_OK)
433 if (tmp_str[0] == 'A')
434 state->analog_channels[i].probe_unit = 'A';
436 state->analog_channels[i].probe_unit = 'V';
443 static int digital_channel_state_get(struct sr_scpi_dev_inst *scpi,
444 const struct scope_config *config,
445 struct scope_state *state)
448 char command[MAX_COMMAND_SIZE];
450 for (i = 0; i < config->digital_channels; i++) {
451 g_snprintf(command, sizeof(command),
452 (*config->scpi_dialect)[SCPI_CMD_GET_DIG_CHAN_STATE],
455 if (sr_scpi_get_bool(scpi, command,
456 &state->digital_channels[i]) != SR_OK)
460 for (i = 0; i < config->digital_pods; i++) {
461 g_snprintf(command, sizeof(command),
462 (*config->scpi_dialect)[SCPI_CMD_GET_DIG_POD_STATE],
465 if (sr_scpi_get_bool(scpi, command,
466 &state->digital_pods[i]) != SR_OK)
473 SR_PRIV int hmo_update_sample_rate(const struct sr_dev_inst *sdi)
475 struct dev_context *devc;
476 struct scope_state *state;
477 const struct scope_config *config;
482 gboolean channel_found;
483 char tmp_str[MAX_COMMAND_SIZE];
487 config = devc->model_config;
488 state = devc->model_state;
489 channel_found = FALSE;
491 for (i = 0; i < config->analog_channels; i++) {
492 if (state->analog_channels[i].state) {
493 g_snprintf(chan_name, sizeof(chan_name), "CHAN%d", i + 1);
494 g_snprintf(tmp_str, sizeof(tmp_str),
495 (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE],
497 channel_found = TRUE;
502 if (!channel_found) {
503 for (i = 0; i < config->digital_pods; i++) {
504 if (state->digital_pods[i]) {
505 g_snprintf(chan_name, sizeof(chan_name), "POD%d", i);
506 g_snprintf(tmp_str, sizeof(tmp_str),
507 (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE],
509 channel_found = TRUE;
515 /* No channel is active, ask the instrument for the sample rate
516 * in single shot mode */
517 if (!channel_found) {
518 if (sr_scpi_get_float(sdi->conn,
519 (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE],
520 &tmp_float) != SR_OK)
523 state->sample_rate = tmp_float;
525 if (sr_scpi_get_int(sdi->conn, tmp_str, &tmp) != SR_OK)
527 state->sample_rate = tmp / (((float) (*config->timebases)[state->timebase][0] /
528 (*config->timebases)[state->timebase][1]) *
535 SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi)
537 struct dev_context *devc;
538 struct scope_state *state;
539 const struct scope_config *config;
545 config = devc->model_config;
546 state = devc->model_state;
548 sr_info("Fetching scope state");
550 if (analog_channel_state_get(sdi->conn, config, state) != SR_OK)
553 if (digital_channel_state_get(sdi->conn, config, state) != SR_OK)
556 if (sr_scpi_get_float(sdi->conn,
557 (*config->scpi_dialect)[SCPI_CMD_GET_TIMEBASE],
558 &tmp_float) != SR_OK)
561 if (sr_scpi_get_string(sdi->conn,
562 (*config->scpi_dialect)[SCPI_CMD_GET_TIMEBASE],
566 if (array_float_get(tmp_str, ARRAY_AND_SIZE(timebases), &i) != SR_OK) {
568 sr_err("Could not determine array index for time base.");
575 if (sr_scpi_get_float(sdi->conn,
576 (*config->scpi_dialect)[SCPI_CMD_GET_HORIZ_TRIGGERPOS],
577 &tmp_float) != SR_OK)
579 state->horiz_triggerpos = tmp_float /
580 (((double) (*config->timebases)[state->timebase][0] /
581 (*config->timebases)[state->timebase][1]) * config->num_xdivs);
582 state->horiz_triggerpos -= 0.5;
583 state->horiz_triggerpos *= -1;
585 if (scope_state_get_array_option(sdi->conn,
586 (*config->scpi_dialect)[SCPI_CMD_GET_TRIGGER_SOURCE],
587 config->trigger_sources, &state->trigger_source) != SR_OK)
590 if (scope_state_get_array_option(sdi->conn,
591 (*config->scpi_dialect)[SCPI_CMD_GET_TRIGGER_SLOPE],
592 config->trigger_slopes, &state->trigger_slope) != SR_OK)
595 if (hmo_update_sample_rate(sdi) != SR_OK)
598 sr_info("Fetching finished.");
600 scope_state_dump(config, state);
605 static struct scope_state *scope_state_new(const struct scope_config *config)
607 struct scope_state *state;
609 state = g_malloc0(sizeof(struct scope_state));
610 state->analog_channels = g_malloc0_n(config->analog_channels,
611 sizeof(struct analog_channel_state));
612 state->digital_channels = g_malloc0_n(
613 config->digital_channels, sizeof(gboolean));
614 state->digital_pods = g_malloc0_n(config->digital_pods,
620 SR_PRIV void hmo_scope_state_free(struct scope_state *state)
622 g_free(state->analog_channels);
623 g_free(state->digital_channels);
624 g_free(state->digital_pods);
628 SR_PRIV int hmo_init_device(struct sr_dev_inst *sdi)
632 unsigned int i, j, group;
633 struct sr_channel *ch;
634 struct dev_context *devc;
639 /* Find the exact model. */
640 for (i = 0; i < ARRAY_SIZE(scope_models); i++) {
641 for (j = 0; scope_models[i].name[j]; j++) {
642 if (!strcmp(sdi->model, scope_models[i].name[j])) {
647 if (model_index != -1)
651 if (model_index == -1) {
652 sr_dbg("Unsupported HMO device.");
656 devc->analog_groups = g_malloc0(sizeof(struct sr_channel_group*) *
657 scope_models[model_index].analog_channels);
659 devc->digital_groups = g_malloc0(sizeof(struct sr_channel_group*) *
660 scope_models[model_index].digital_pods);
662 /* Add analog channels. */
663 for (i = 0; i < scope_models[model_index].analog_channels; i++) {
664 ch = sr_channel_new(sdi, i, SR_CHANNEL_ANALOG, TRUE,
665 (*scope_models[model_index].analog_names)[i]);
667 devc->analog_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
669 devc->analog_groups[i]->name = g_strdup(
670 (char *)(*scope_models[model_index].analog_names)[i]);
671 devc->analog_groups[i]->channels = g_slist_append(NULL, ch);
673 sdi->channel_groups = g_slist_append(sdi->channel_groups,
674 devc->analog_groups[i]);
677 /* Add digital channel groups. */
678 for (i = 0; i < scope_models[model_index].digital_pods; i++) {
679 g_snprintf(tmp, 25, "POD%d", i);
681 devc->digital_groups[i] = g_malloc0(sizeof(struct sr_channel_group));
683 devc->digital_groups[i]->name = g_strdup(tmp);
684 sdi->channel_groups = g_slist_append(sdi->channel_groups,
685 devc->digital_groups[i]);
688 /* Add digital channels. */
689 for (i = 0; i < scope_models[model_index].digital_channels; i++) {
690 ch = sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE,
691 (*scope_models[model_index].digital_names)[i]);
694 devc->digital_groups[group]->channels = g_slist_append(
695 devc->digital_groups[group]->channels, ch);
698 devc->model_config = &scope_models[model_index];
699 devc->frame_limit = 0;
701 if (!(devc->model_state = scope_state_new(devc->model_config)))
702 return SR_ERR_MALLOC;
707 /* Queue data of one channel group, for later submission. */
708 SR_PRIV void hmo_queue_logic_data(struct dev_context *devc,
709 size_t group, GByteArray *pod_data)
714 size_t idx, logic_step;
717 * Upon first invocation, allocate the array which can hold the
718 * combined logic data for all channels. Assume that each channel
719 * will yield an identical number of samples per receive call.
721 * As a poor man's safety measure: (Silently) skip processing
722 * for unexpected sample counts, and ignore samples for
723 * unexpected channel groups. Don't bother with complicated
724 * resize logic, considering that many models only support one
725 * pod, and the most capable supported models have two pods of
726 * identical size. We haven't yet seen any "odd" configuration.
728 if (!devc->logic_data) {
729 size = pod_data->len * devc->pod_count;
730 store = g_byte_array_sized_new(size);
731 memset(store->data, 0, size);
732 store = g_byte_array_set_size(store, size);
733 devc->logic_data = store;
735 store = devc->logic_data;
736 size = store->len / devc->pod_count;
737 if (size != pod_data->len)
739 if (group >= devc->pod_count)
744 * Fold the data of the most recently received channel group into
745 * the storage, where data resides for all channels combined.
747 logic_data = store->data;
749 logic_step = devc->pod_count;
750 for (idx = 0; idx < pod_data->len; idx++) {
751 *logic_data = pod_data->data[idx];
752 logic_data += logic_step;
756 /* Submit data for all channels, after the individual groups got collected. */
757 SR_PRIV void hmo_send_logic_packet(struct sr_dev_inst *sdi,
758 struct dev_context *devc)
760 struct sr_datafeed_packet packet;
761 struct sr_datafeed_logic logic;
763 if (!devc->logic_data)
766 logic.data = devc->logic_data->data;
767 logic.length = devc->logic_data->len;
768 logic.unitsize = devc->pod_count;
770 packet.type = SR_DF_LOGIC;
771 packet.payload = &logic;
773 sr_session_send(sdi, &packet);
776 /* Undo previous resource allocation. */
777 SR_PRIV void hmo_cleanup_logic_data(struct dev_context *devc)
780 if (devc->logic_data) {
781 g_byte_array_free(devc->logic_data, TRUE);
782 devc->logic_data = NULL;
785 * Keep 'pod_count'! It's required when more frames will be
786 * received, and does not harm when kept after acquisition.
790 SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data)
792 struct sr_channel *ch;
793 struct sr_dev_inst *sdi;
794 struct dev_context *devc;
795 struct scope_state *state;
796 struct sr_datafeed_packet packet;
798 struct sr_datafeed_analog analog;
799 struct sr_analog_encoding encoding;
800 struct sr_analog_meaning meaning;
801 struct sr_analog_spec spec;
802 struct sr_datafeed_logic logic;
810 if (!(sdi = cb_data))
813 if (!(devc = sdi->priv))
816 /* Although this is correct in general, the USBTMC libusb implementation
817 * currently does not generate an event prior to the first read. Often
818 * it is ok to start reading just after the 50ms timeout. See bug #785.
819 if (revents != G_IO_IN)
823 ch = devc->current_channel->data;
824 state = devc->model_state;
827 * Send "frame begin" packet upon reception of data for the
828 * first enabled channel.
830 if (devc->current_channel == devc->enabled_channels) {
831 packet.type = SR_DF_FRAME_BEGIN;
832 sr_session_send(sdi, &packet);
836 * Pass on the received data of the channel(s).
839 case SR_CHANNEL_ANALOG:
840 if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
842 g_byte_array_free(data, TRUE);
847 packet.type = SR_DF_ANALOG;
849 analog.data = data->data;
850 analog.num_samples = data->len / sizeof(float);
851 analog.encoding = &encoding;
852 analog.meaning = &meaning;
855 encoding.unitsize = sizeof(float);
856 encoding.is_signed = TRUE;
857 encoding.is_float = TRUE;
858 #ifdef WORDS_BIGENDIAN
859 encoding.is_bigendian = TRUE;
861 encoding.is_bigendian = FALSE;
863 /* TODO: Use proper 'digits' value for this device (and its modes). */
865 encoding.is_digits_decimal = FALSE;
866 encoding.scale.p = 1;
867 encoding.scale.q = 1;
868 encoding.offset.p = 0;
869 encoding.offset.q = 1;
870 if (state->analog_channels[ch->index].probe_unit == 'V') {
871 meaning.mq = SR_MQ_VOLTAGE;
872 meaning.unit = SR_UNIT_VOLT;
874 meaning.mq = SR_MQ_CURRENT;
875 meaning.unit = SR_UNIT_AMPERE;
878 meaning.channels = g_slist_append(NULL, ch);
879 /* TODO: Use proper 'digits' value for this device (and its modes). */
880 spec.spec_digits = 2;
881 packet.payload = &analog;
882 sr_session_send(sdi, &packet);
883 g_slist_free(meaning.channels);
884 g_byte_array_free(data, TRUE);
887 case SR_CHANNEL_LOGIC:
888 if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) {
894 * If only data from the first pod is involved in the
895 * acquisition, then the raw input bytes can get passed
896 * forward for performance reasons. When the second pod
897 * is involved (either alone, or in combination with the
898 * first pod), then the received bytes need to be put
899 * into memory in such a layout that all channel groups
900 * get combined, and a unitsize larger than a single byte
901 * applies. The "queue" logic transparently copes with
902 * any such configuration. This works around the lack
903 * of support for "meaning" to logic data, which is used
904 * above for analog data.
906 if (devc->pod_count == 1) {
907 packet.type = SR_DF_LOGIC;
908 logic.data = data->data;
909 logic.length = data->len;
911 packet.payload = &logic;
912 sr_session_send(sdi, &packet);
914 group = ch->index / 8;
915 hmo_queue_logic_data(devc, group, data);
918 g_byte_array_free(data, TRUE);
922 sr_err("Invalid channel type.");
927 * Advance to the next enabled channel. When data for all enabled
928 * channels was received, then flush potentially queued logic data,
929 * and send the "frame end" packet.
931 if (devc->current_channel->next) {
932 devc->current_channel = devc->current_channel->next;
933 hmo_request_data(sdi);
936 hmo_send_logic_packet(sdi, devc);
939 * Release the logic data storage after each frame. This copes
940 * with sample counts that differ in length per frame. -- Is
941 * this a real constraint when acquiring multiple frames with
942 * identical device settings?
944 hmo_cleanup_logic_data(devc);
946 packet.type = SR_DF_FRAME_END;
947 sr_session_send(sdi, &packet);
950 * End of frame was reached. Stop acquisition after the specified
951 * number of frames, or continue reception by starting over at
952 * the first enabled channel.
954 if (++devc->num_frames == devc->frame_limit) {
955 sr_dev_acquisition_stop(sdi);
956 hmo_cleanup_logic_data(devc);
958 devc->current_channel = devc->enabled_channels;
959 hmo_request_data(sdi);