X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fhardware%2Flecroy-xstream%2Fprotocol.c;h=a05ff618d5e4c8eeaa1877f6fc46b6ada7ac7875;hp=1f421913f3d48328360558965069bc1575f65114;hb=36165cf0f7a226f76d3e9832a70e06d9d0d634ec;hpb=86f76e6cae622673b65823fa6bfc31365fd9487b diff --git a/src/hardware/lecroy-xstream/protocol.c b/src/hardware/lecroy-xstream/protocol.c index 1f421913..a05ff618 100644 --- a/src/hardware/lecroy-xstream/protocol.c +++ b/src/hardware/lecroy-xstream/protocol.c @@ -92,11 +92,11 @@ static const char *trigger_sources[] = { static const uint64_t timebases[][2] = { /* picoseconds */ - { 20, 1000000000000 }, - { 50, 1000000000000 }, - { 100, 1000000000000 }, - { 200, 1000000000000 }, - { 500, 1000000000000 }, + { 20, UINT64_C(1000000000000) }, + { 50, UINT64_C(1000000000000) }, + { 100, UINT64_C(1000000000000) }, + { 200, UINT64_C(1000000000000) }, + { 500, UINT64_C(1000000000000) }, /* nanoseconds */ { 1, 1000000000 }, { 2, 1000000000 }, @@ -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; } @@ -437,6 +435,7 @@ SR_PRIV int lecroy_xstream_state_get(struct sr_dev_inst *sdi) } i++; } + g_free(tmp_str); if (!trig_source || scope_state_get_array_option(trig_source, config->trigger_sources, config->num_trigger_sources, @@ -450,13 +449,11 @@ SR_PRIV int lecroy_xstream_state_get(struct sr_dev_inst *sdi) if (scope_state_get_array_option(tmp_str, config->trigger_slopes, config->num_trigger_slopes, &state->trigger_slope) != SR_OK) return SR_ERR; + g_free(tmp_str); 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,19 +621,17 @@ 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; struct sr_analog_encoding encoding; struct sr_analog_meaning meaning; struct sr_analog_spec spec; - char buf[8]; (void)fd; (void)revents; - data = NULL; - if (!(sdi = cb_data)) return TRUE; @@ -644,16 +639,12 @@ 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; - /* Pass on the received data of the channel(s). */ - if (sr_scpi_read_data(sdi->conn, buf, 4) != 4) { - sr_err("Reading header failed, scope probably didn't send any data."); - return TRUE; - } - + data = NULL; if (sr_scpi_get_block(sdi->conn, NULL, &data) != SR_OK) { if (data) g_byte_array_free(data, TRUE); @@ -668,20 +659,31 @@ SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data) return SR_ERR; if (analog.num_samples == 0) { + g_free(analog.data); + g_byte_array_free(data, TRUE); + /* 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) { + g_free(analog.data); + g_byte_array_free(data, TRUE); + return SR_ERR; + } } /* * Send "frame begin" packet upon reception of data for the * first enabled channel. */ - if (devc->current_channel == devc->enabled_channels) { - packet.type = SR_DF_FRAME_BEGIN; - sr_session_send(sdi, &packet); - } + if (devc->current_channel == devc->enabled_channels) + std_session_send_df_frame_begin(sdi); meaning.channels = g_slist_append(NULL, ch); packet.payload = &analog; @@ -705,18 +707,23 @@ SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data) return TRUE; } - packet.type = SR_DF_FRAME_END; - sr_session_send(sdi, &packet); + std_session_send_df_frame_end(sdi); /* * End of frame was reached. Stop acquisition after the specified * number of frames, or continue reception by starting over at * the first enabled channel. */ - if (++devc->num_frames == devc->frame_limit) { + devc->num_frames++; + if (devc->frame_limit && (devc->num_frames == devc->frame_limit)) { sr_dev_acquisition_stop(sdi); } else { devc->current_channel = devc->enabled_channels; + + /* Wait for trigger, then begin fetching data. */ + g_snprintf(command, sizeof(command), "ARM;WAIT;*OPC"); + sr_scpi_send(sdi->conn, command); + lecroy_xstream_request_data(sdi); }