]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/gwinstek-gds-800/protocol.c
Add sr_dev_acquisition_stop(), factor out SR_ERR_DEV_CLOSED check.
[libsigrok.git] / src / hardware / gwinstek-gds-800 / protocol.c
index 482d46045ec63d8c93ec253f8e2e9a28ebd8ae9e..962bfe05467222431049bbcb178bc47318d5c5e0 100644 (file)
@@ -18,6 +18,7 @@
  */
 
 #include "protocol.h"
+#include <math.h>
 #include <string.h>
 
 #define ANALOG_CHANNELS 2
@@ -34,7 +35,7 @@ static int read_data(struct sr_dev_inst *sdi,
                data_size - devc->cur_rcv_buffer_position);
        if (len < 0) {
                sr_err("Read data error.");
-               sdi->driver->dev_acquisition_stop(sdi);
+               sr_dev_acquisition_stop(sdi);
                devc->cur_rcv_buffer_position = 0;
                return SR_ERR;
        }
@@ -54,7 +55,7 @@ static int read_data(struct sr_dev_inst *sdi,
                return SR_OK;
        } else {
                sr_err("Too many bytes read.");
-               sdi->driver->dev_acquisition_stop(sdi);
+               sr_dev_acquisition_stop(sdi);
                devc->cur_rcv_buffer_position = 0;
                return SR_ERR;
        }
@@ -95,17 +96,17 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data)
        case START_ACQUISITION:
                if (sr_scpi_send(scpi, ":TRIG:MOD 3") != SR_OK) {
                        sr_err("Failed to set trigger mode to SINGLE.");
-                       sdi->driver->dev_acquisition_stop(sdi);
+                       sr_dev_acquisition_stop(sdi);
                        return TRUE;
                }
                if (sr_scpi_send(scpi, ":STOP") != SR_OK) {
                        sr_err("Failed to put the trigger system into STOP state.");
-                       sdi->driver->dev_acquisition_stop(sdi);
+                       sr_dev_acquisition_stop(sdi);
                        return TRUE;
                }
                if (sr_scpi_send(scpi, ":RUN") != SR_OK) {
                        sr_err("Failed to put the trigger system into RUN state.");
-                       sdi->driver->dev_acquisition_stop(sdi);
+                       sr_dev_acquisition_stop(sdi);
                        return TRUE;
                }
 
@@ -116,12 +117,12 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data)
                if (((struct sr_channel *)g_slist_nth_data(sdi->channels, devc->cur_acq_channel))->enabled) {
                        if (sr_scpi_send(scpi, ":ACQ%d:MEM?", devc->cur_acq_channel+1) != SR_OK) {
                                sr_err("Failed to acquire memory.");
-                               sdi->driver->dev_acquisition_stop(sdi);
+                               sr_dev_acquisition_stop(sdi);
                                return TRUE;
                        }
                        if (sr_scpi_read_begin(scpi) != SR_OK) {
                                sr_err("Could not begin reading SCPI response.");
-                               sdi->driver->dev_acquisition_stop(sdi);
+                               sr_dev_acquisition_stop(sdi);
                                return TRUE;
                        }
                        devc->state = WAIT_FOR_TRANSFER_OF_BEGIN_TRANSMISSION_COMPLETE;
@@ -134,15 +135,15 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data)
                                if (devc->cur_acq_frame == devc->frame_limit - 1) {
                                        /* All frames accquired. */
                                        sr_spew("All frames acquired.");
-                                       
-                                       sdi->driver->dev_acquisition_stop(sdi);
+
+                                       sr_dev_acquisition_stop(sdi);
                                        return TRUE;
                                } else {
                                        /* Start acquiring next frame. */
                                        if (devc->df_started) {
                                                packet.type = SR_DF_FRAME_END;
                                                sr_session_send(sdi, &packet);
-                                               
+
                                                packet.type = SR_DF_FRAME_BEGIN;
                                                sr_session_send(sdi, &packet);
                                        }
@@ -169,7 +170,7 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data)
                                devc->rcv_buffer[0] != '6') {
                                sr_err("Data size digits is not 4, 5 or 6 but "
                                       "'%c'.", devc->rcv_buffer[0]);
-                               sdi->driver->dev_acquisition_stop(sdi);
+                               sr_dev_acquisition_stop(sdi);
                                return TRUE;
                        } else {
                                devc->data_size_digits = devc->rcv_buffer[0] - '0';
@@ -182,7 +183,7 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data)
                        devc->rcv_buffer[devc->data_size_digits] = 0;
                        if (sr_atoi(devc->rcv_buffer, &devc->data_size) != SR_OK) {
                                sr_err("Could not parse data size '%s'", devc->rcv_buffer);
-                               sdi->driver->dev_acquisition_stop(sdi);
+                               sr_dev_acquisition_stop(sdi);
                                return TRUE;
                        } else
                                devc->state = WAIT_FOR_TRANSFER_OF_SAMPLE_RATE_COMPLETE;
@@ -223,7 +224,7 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data)
                                        devc->cur_acq_channel + 1);
                        if (sr_scpi_get_string(scpi, command, &response) != SR_OK) {
                                sr_err("Failed to get volts per division.");
-                               sdi->driver->dev_acquisition_stop(sdi);
+                               sr_dev_acquisition_stop(sdi);
                                return TRUE;
                        }
                        volts_per_division = g_ascii_strtod(response, &end_ptr);
@@ -235,12 +236,16 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data)
                        sr_spew("Received %d number of samples from channel "
                                "%d.", num_samples, devc->cur_acq_channel + 1);
 
+                       float vbit = volts_per_division * VERTICAL_DIVISIONS / 256.0;
+                       float vbitlog = log10f(vbit);
+                       int digits = -(int)vbitlog + (vbitlog < 0.0);
+
                        /* Convert data. */
                        for (i = 0; i < num_samples; i++)
-                               samples[i] = ((float) ((int16_t) (RB16(&devc->rcv_buffer[i*2])))) / 256. * VERTICAL_DIVISIONS * volts_per_division;
+                               samples[i] = ((float) ((int16_t) (RB16(&devc->rcv_buffer[i*2])))) * vbit;
 
                        /* Fill frame. */
-                       sr_analog_init(&analog, &encoding, &meaning, &spec, 0);
+                       sr_analog_init(&analog, &encoding, &meaning, &spec, digits);
                        analog.meaning->channels = g_slist_append(NULL, g_slist_nth_data(sdi->channels, devc->cur_acq_channel));
                        analog.num_samples = num_samples;
                        analog.data = samples;
@@ -259,14 +264,14 @@ SR_PRIV int gwinstek_gds_800_receive_data(int fd, int revents, void *cb_data)
                                if (devc->cur_acq_frame == devc->frame_limit - 1) {
                                        /* All frames acquired. */
                                        sr_spew("All frames acquired.");
-                                       sdi->driver->dev_acquisition_stop(sdi);
+                                       sr_dev_acquisition_stop(sdi);
                                        return TRUE;
                                } else {
                                        /* Start acquiring next frame. */
                                        if (devc->df_started) {
                                                packet.type = SR_DF_FRAME_END;
                                                sr_session_send(sdi, &packet);
-                                               
+
                                                packet.type = SR_DF_FRAME_BEGIN;
                                                sr_session_send(sdi, &packet);
                                        }