X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fhardware%2Flecroy-xstream%2Fapi.c;h=8c034944eb3b435301cbe0c7dc7bde3dd11af9d8;hb=f62c2ad65d3c2e20eba512d6460c9c48e17cca08;hp=6b4842ba3b6786441b216fea0e5649ec410bda1c;hpb=5000c12f573ecbb1b528150b82a00643608a9153;p=libsigrok.git diff --git a/src/hardware/lecroy-xstream/api.c b/src/hardware/lecroy-xstream/api.c index 6b4842ba..8c034944 100644 --- a/src/hardware/lecroy-xstream/api.c +++ b/src/hardware/lecroy-xstream/api.c @@ -204,7 +204,6 @@ static int config_set(uint32_t key, GVariant *data, const struct scope_config *model; struct scope_state *state; double tmp_d; - gboolean update_sample_rate; if (!sdi) return SR_ERR_ARG; @@ -213,9 +212,6 @@ static int config_set(uint32_t key, GVariant *data, model = devc->model_config; state = devc->model_state; - update_sample_rate = FALSE; - - ret = SR_ERR_NA; switch (key) { case SR_CONF_LIMIT_FRAMES: @@ -249,7 +245,6 @@ static int config_set(uint32_t key, GVariant *data, g_snprintf(command, sizeof(command), "TIME_DIV %E", (float) (*model->timebases)[idx][0] / (*model->timebases)[idx][1]); ret = sr_scpi_send(sdi->conn, command); - update_sample_rate = TRUE; break; case SR_CONF_HORIZ_TRIGGERPOS: tmp_d = g_variant_get_double(data); @@ -296,12 +291,19 @@ static int config_set(uint32_t key, GVariant *data, if (ret == SR_OK) ret = sr_scpi_get_opc(sdi->conn); - if (ret == SR_OK && update_sample_rate) - ret = lecroy_xstream_update_sample_rate(sdi); - return ret; } +static int config_channel_set(const struct sr_dev_inst *sdi, + struct sr_channel *ch, unsigned int changes) +{ + /* Currently we only handle SR_CHANNEL_SET_ENABLED. */ + if (changes != SR_CHANNEL_SET_ENABLED) + return SR_ERR_NA; + + return lecroy_xstream_channel_state_set(sdi, ch->index, ch->enabled); +} + static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { @@ -320,6 +322,8 @@ static int config_list(uint32_t key, GVariant **data, *data = std_gvar_array_u32(ARRAY_AND_SIZE(devopts_cg_analog)); break; case SR_CONF_COUPLING: + if (!model) + return SR_ERR_ARG; *data = g_variant_new_strv(*model->coupling_options, model->num_coupling_options); break; case SR_CONF_TRIGGER_SOURCE: @@ -356,6 +360,14 @@ SR_PRIV int lecroy_xstream_request_data(const struct sr_dev_inst *sdi) struct dev_context *devc; devc = sdi->priv; + + /* + * We may be left with an invalid current_channel if acquisition was + * already stopped but we are processing the last pending events. + */ + if (!devc->current_channel) + return SR_ERR_NA; + ch = devc->current_channel->data; if (ch->type != SR_CHANNEL_ANALOG) @@ -368,7 +380,6 @@ SR_PRIV int lecroy_xstream_request_data(const struct sr_dev_inst *sdi) static int setup_channels(const struct sr_dev_inst *sdi) { GSList *l; - gboolean setup_changed; char command[MAX_COMMAND_SIZE]; struct scope_state *state; struct sr_channel *ch; @@ -378,7 +389,6 @@ static int setup_channels(const struct sr_dev_inst *sdi) devc = sdi->priv; scpi = sdi->conn; state = devc->model_state; - setup_changed = FALSE; for (l = sdi->channels; l; l = l->next) { ch = l->data; @@ -393,16 +403,12 @@ static int setup_channels(const struct sr_dev_inst *sdi) return SR_ERR; state->analog_channels[ch->index].state = ch->enabled; - setup_changed = TRUE; break; default: return SR_ERR; } } - if (setup_changed && lecroy_xstream_update_sample_rate(sdi) != SR_OK) - return SR_ERR; - return SR_OK; } @@ -411,6 +417,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) GSList *l; struct sr_channel *ch; struct dev_context *devc; + struct scope_state *state; int ret; struct sr_scpi_dev_inst *scpi; @@ -420,28 +427,22 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) /* Preset empty results. */ g_slist_free(devc->enabled_channels); devc->enabled_channels = NULL; + state = devc->model_state; + state->sample_rate = 0; - /* - * Contruct the list of enabled channels. Determine the highest - * number of digital pods involved in the acquisition. - */ - + /* Contruct the list of enabled channels. */ for (l = sdi->channels; l; l = l->next) { ch = l->data; if (!ch->enabled) continue; - /* Only add a single digital channel per group (pod). */ - devc->enabled_channels = g_slist_append( - devc->enabled_channels, ch); + + devc->enabled_channels = g_slist_append(devc->enabled_channels, ch); } if (!devc->enabled_channels) return SR_ERR; - /* - * Configure the analog channels and the - * corresponding digital pods. - */ + /* Configure the analog channels. */ if (setup_channels(sdi) != SR_OK) { sr_err("Failed to setup channel configuration!"); ret = SR_ERR; @@ -497,6 +498,7 @@ static struct sr_dev_driver lecroy_xstream_driver_info = { .dev_clear = dev_clear, .config_get = config_get, .config_set = config_set, + .config_channel_set = config_channel_set, .config_list = config_list, .dev_open = dev_open, .dev_close = dev_close,