From: Soeren Apel Date: Mon, 9 Oct 2017 05:32:31 +0000 (+0200) Subject: lecroy-xstream: Fix sample rate X-Git-Url: http://sigrok.org/gitweb/?a=commitdiff_plain;h=e0b6855bd4daca9f1a27b8e4e0d16b019d5d54e4;hp=86f76e6cae622673b65823fa6bfc31365fd9487b;p=libsigrok.git lecroy-xstream: Fix sample rate We can't use the memory size command because it returns the *maximum* memory used, not the *actual* memory used. Hence, we only know the number of samples per div once sample data actually comes in. --- diff --git a/src/hardware/lecroy-xstream/api.c b/src/hardware/lecroy-xstream/api.c index 504dde3b..533275a2 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,7 +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; @@ -249,7 +247,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,9 +293,6 @@ 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; } @@ -378,7 +372,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; @@ -388,7 +381,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; @@ -403,16 +395,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; } @@ -421,6 +409,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; @@ -430,6 +419,8 @@ 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. */ for (l = sdi->channels; l; l = l->next) { diff --git a/src/hardware/lecroy-xstream/protocol.c b/src/hardware/lecroy-xstream/protocol.c index 1f421913..5fa1b44a 100644 --- a/src/hardware/lecroy-xstream/protocol.c +++ b/src/hardware/lecroy-xstream/protocol.c @@ -366,24 +366,22 @@ SR_PRIV int lecroy_xstream_channel_state_set(const struct sr_dev_inst *sdi, return result; } -SR_PRIV int lecroy_xstream_update_sample_rate(const struct sr_dev_inst *sdi) +SR_PRIV int lecroy_xstream_update_sample_rate(const struct sr_dev_inst *sdi, + int num_of_samples) { struct dev_context *devc; struct scope_state *state; const struct scope_config *config; - float memsize, timediv; + double time_div; devc = sdi->priv; - state = devc->model_state; config = devc->model_config; + state = devc->model_state; - if (sr_scpi_get_float(sdi->conn, "MEMORY_SIZE?", &memsize) != SR_OK) - return SR_ERR; - - if (sr_scpi_get_float(sdi->conn, "TIME_DIV?", &timediv) != SR_OK) + if (sr_scpi_get_double(sdi->conn, "TIME_DIV?", &time_div) != SR_OK) return SR_ERR; - state->sample_rate = 1 / ((timediv * config->num_xdivs) / memsize); + state->sample_rate = num_of_samples / (time_div * config->num_xdivs); return SR_OK; } @@ -454,9 +452,6 @@ SR_PRIV int lecroy_xstream_state_get(struct sr_dev_inst *sdi) if (sr_scpi_get_float(sdi->conn, "TRIG_DELAY?", &state->horiz_triggerpos) != SR_OK) return SR_ERR; - if (lecroy_xstream_update_sample_rate(sdi) != SR_OK) - return SR_ERR; - sr_info("Fetching finished."); scope_state_dump(config, state); @@ -624,6 +619,7 @@ SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data) struct sr_channel *ch; struct sr_dev_inst *sdi; struct dev_context *devc; + struct scope_state *state; struct sr_datafeed_packet packet; GByteArray *data; struct sr_datafeed_analog analog; @@ -644,6 +640,7 @@ SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data) return TRUE; ch = devc->current_channel->data; + state = devc->model_state; if (ch->type != SR_CHANNEL_ANALOG) return SR_ERR; @@ -671,7 +668,14 @@ SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data) /* No data available, we have to acquire data first. */ g_snprintf(command, sizeof(command), "ARM;WAIT;*OPC;C%d:WAVEFORM?", ch->index + 1); sr_scpi_send(sdi->conn, command); + + state->sample_rate = 0; return TRUE; + } else { + /* Update sample rate if needed. */ + if (state->sample_rate == 0) + if (lecroy_xstream_update_sample_rate(sdi, analog.num_samples) != SR_OK) + return SR_ERR; } /* diff --git a/src/hardware/lecroy-xstream/protocol.h b/src/hardware/lecroy-xstream/protocol.h index 0b8d9e59..f639dfff 100644 --- a/src/hardware/lecroy-xstream/protocol.h +++ b/src/hardware/lecroy-xstream/protocol.h @@ -98,6 +98,7 @@ SR_PRIV void lecroy_xstream_state_free(struct scope_state *state); SR_PRIV int lecroy_xstream_state_get(struct sr_dev_inst *sdi); SR_PRIV int lecroy_xstream_channel_state_set(const struct sr_dev_inst *sdi, const int ch_index, gboolean ch_state); -SR_PRIV int lecroy_xstream_update_sample_rate(const struct sr_dev_inst *sdi); +SR_PRIV int lecroy_xstream_update_sample_rate(const struct sr_dev_inst *sdi, + int num_of_samples); #endif