static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) { GSList *l; gboolean digital_added; struct sr_channel *ch; struct dev_context *devc; struct sr_scpi_dev_inst *scpi; if (sdi->status != SR_ST_ACTIVE) return SR_ERR_DEV_CLOSED; scpi = sdi->conn; devc = sdi->priv; digital_added = FALSE; g_slist_free(devc->enabled_channels); devc->enabled_channels = NULL; for (l = sdi->channels; l; l = l->next) { ch = l->data; if (!ch->enabled) continue; /* Only add a single digital channel. */ if (ch->type != SR_CHANNEL_LOGIC || !digital_added) { devc->enabled_channels = g_slist_append( devc->enabled_channels, ch); if (ch->type == SR_CHANNEL_LOGIC) digital_added = TRUE; } } if (!devc->enabled_channels) return SR_ERR; if (hmo_check_channels(devc->enabled_channels) != SR_OK) { sr_err("Invalid channel configuration specified!"); return SR_ERR_NA; } if (hmo_setup_channels(sdi) != SR_OK) { sr_err("Failed to setup channel configuration!"); return SR_ERR; } sr_scpi_source_add(sdi->session, scpi, G_IO_IN, 50, hmo_receive_data, (void *)sdi); /* Send header packet to the session bus. */ std_session_send_df_header(cb_data, LOG_PREFIX); devc->current_channel = devc->enabled_channels; return hmo_request_data(sdi); }
static int dev_acquisition_start(const struct sr_dev_inst *sdi) { GSList *l; gboolean digital_added[MAX_DIGITAL_GROUP_COUNT]; size_t group, pod_count; struct sr_channel *ch; struct dev_context *devc; struct sr_scpi_dev_inst *scpi; int ret; scpi = sdi->conn; devc = sdi->priv; /* Preset empty results. */ for (group = 0; group < ARRAY_SIZE(digital_added); group++) digital_added[group] = FALSE; g_slist_free(devc->enabled_channels); devc->enabled_channels = NULL; /* * Contruct the list of enabled channels. Determine the highest * number of digital pods involved in the acquisition. */ pod_count = 0; for (l = sdi->channels; l; l = l->next) { ch = l->data; if (!ch->enabled) continue; /* Only add a single digital channel per group (pod). */ group = ch->index / 8; if (ch->type != SR_CHANNEL_LOGIC || !digital_added[group]) { devc->enabled_channels = g_slist_append( devc->enabled_channels, ch); if (ch->type == SR_CHANNEL_LOGIC) { digital_added[group] = TRUE; if (pod_count < group + 1) pod_count = group + 1; } } } if (!devc->enabled_channels) return SR_ERR; devc->pod_count = pod_count; devc->logic_data = NULL; /* * Check constraints. Some channels can be either analog or * digital, but not both at the same time. */ if (hmo_check_channels(devc->enabled_channels) != SR_OK) { sr_err("Invalid channel configuration specified!"); ret = SR_ERR_NA; goto free_enabled; } /* * Configure the analog and digital channels and the * corresponding digital pods. */ if (hmo_setup_channels(sdi) != SR_OK) { sr_err("Failed to setup channel configuration!"); ret = SR_ERR; goto free_enabled; } /* * Start acquisition on the first enabled channel. The * receive routine will continue driving the acquisition. */ sr_scpi_source_add(sdi->session, scpi, G_IO_IN, 50, hmo_receive_data, (void *)sdi); std_session_send_df_header(sdi); devc->current_channel = devc->enabled_channels; return hmo_request_data(sdi); free_enabled: g_slist_free(devc->enabled_channels); devc->enabled_channels = NULL; return ret; }