]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/rigol-ds/protocol.c
rigol-ds: add PROBE_FACTOR support.
[libsigrok.git] / src / hardware / rigol-ds / protocol.c
index 4647966c21dfa8c2843241107d9f70ec813eac34..0a60957cf1eff338b3deeea18ee35e3ac8885e01 100644 (file)
@@ -19,6 +19,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <stdlib.h>
 #include <stdarg.h>
 #include <unistd.h>
@@ -539,6 +540,9 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
        struct dev_context *devc;
        struct sr_datafeed_packet packet;
        struct sr_datafeed_analog analog;
+       struct sr_analog_encoding encoding;
+       struct sr_analog_meaning meaning;
+       struct sr_analog_spec spec;
        struct sr_datafeed_logic logic;
        double vdiv, offset;
        int len, i, vref;
@@ -616,8 +620,8 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
                        if (len == -1) {
                                sr_err("Read error, aborting capture.");
                                packet.type = SR_DF_FRAME_END;
-                               sr_session_send(cb_data, &packet);
-                               sdi->driver->dev_acquisition_stop(sdi, cb_data);
+                               sr_session_send(sdi, &packet);
+                               sdi->driver->dev_acquisition_stop(sdi);
                                return TRUE;
                        }
                        /* At slow timebases in live capture the DS2072
@@ -649,8 +653,8 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
        if (len == -1) {
                sr_err("Read error, aborting capture.");
                packet.type = SR_DF_FRAME_END;
-               sr_session_send(cb_data, &packet);
-               sdi->driver->dev_acquisition_stop(sdi, cb_data);
+               sr_session_send(sdi, &packet);
+               sdi->driver->dev_acquisition_stop(sdi);
                return TRUE;
        }
 
@@ -668,16 +672,17 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
                else
                        for (i = 0; i < len; i++)
                                devc->data[i] = (128 - devc->buffer[i]) * vdiv - offset;
-               analog.channels = g_slist_append(NULL, ch);
+               sr_analog_init(&analog, &encoding, &meaning, &spec, 0);
+               analog.meaning->channels = g_slist_append(NULL, ch);
                analog.num_samples = len;
                analog.data = devc->data;
-               analog.mq = SR_MQ_VOLTAGE;
-               analog.unit = SR_UNIT_VOLT;
-               analog.mqflags = 0;
+               analog.meaning->mq = SR_MQ_VOLTAGE;
+               analog.meaning->unit = SR_UNIT_VOLT;
+               analog.meaning->mqflags = 0;
                packet.type = SR_DF_ANALOG;
                packet.payload = &analog;
-               sr_session_send(cb_data, &packet);
-               g_slist_free(analog.channels);
+               sr_session_send(sdi, &packet);
+               g_slist_free(analog.meaning->channels);
        } else {
                logic.length = len;
                // TODO: For the MSO1000Z series, we need a way to express that
@@ -687,7 +692,7 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
                logic.data = devc->buffer;
                packet.type = SR_DF_LOGIC;
                packet.payload = &logic;
-               sr_session_send(cb_data, &packet);
+               sr_session_send(sdi, &packet);
        }
 
        if (devc->num_block_read == devc->num_block_bytes) {
@@ -706,8 +711,8 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
                if (!sr_scpi_read_complete(scpi)) {
                        sr_err("Read should have been completed");
                        packet.type = SR_DF_FRAME_END;
-                       sr_session_send(cb_data, &packet);
-                       sdi->driver->dev_acquisition_stop(sdi, cb_data);
+                       sr_session_send(sdi, &packet);
+                       sdi->driver->dev_acquisition_stop(sdi);
                        return TRUE;
                }
                devc->num_block_read = 0;
@@ -741,11 +746,11 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
        } else {
                /* Done with this frame. */
                packet.type = SR_DF_FRAME_END;
-               sr_session_send(cb_data, &packet);
+               sr_session_send(sdi, &packet);
 
                if (++devc->num_frames == devc->limit_frames) {
                        /* Last frame, stop capture. */
-                       sdi->driver->dev_acquisition_stop(sdi, cb_data);
+                       sdi->driver->dev_acquisition_stop(sdi);
                } else {
                        /* Get the next frame, starting with the first channel. */
                        devc->channel_entry = devc->enabled_channels;
@@ -754,7 +759,7 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
 
                        /* Start of next frame. */
                        packet.type = SR_DF_FRAME_BEGIN;
-                       sr_session_send(cb_data, &packet);
+                       sr_session_send(sdi, &packet);
                }
        }
 
@@ -808,29 +813,21 @@ SR_PRIV int rigol_ds_get_dev_cfg(const struct sr_dev_inst *sdi)
                return SR_ERR;
        sr_dbg("Current timebase %g", devc->timebase);
 
-       /* Vertical gain. */
+       /* Probe attenuation. */
        for (i = 0; i < devc->model->analog_channels; i++) {
-               cmd = g_strdup_printf(":CHAN%d:SCAL?", i + 1);
-               res = sr_scpi_get_float(sdi->conn, cmd, &devc->vdiv[i]);
+               cmd = g_strdup_printf(":CHAN%d:PROB?", i + 1);
+               res = sr_scpi_get_float(sdi->conn, cmd, &devc->attenuation[i]);
                g_free(cmd);
                if (res != SR_OK)
                        return SR_ERR;
        }
-       sr_dbg("Current vertical gain:");
+       sr_dbg("Current probe attenuation:");
        for (i = 0; i < devc->model->analog_channels; i++)
-               sr_dbg("CH%d %g", i + 1, devc->vdiv[i]);
+               sr_dbg("CH%d %g", i + 1, devc->attenuation[i]);
 
-       /* Vertical offset. */
-       for (i = 0; i < devc->model->analog_channels; i++) {
-               cmd = g_strdup_printf(":CHAN%d:OFFS?", i + 1);
-               res = sr_scpi_get_float(sdi->conn, cmd, &devc->vert_offset[i]);
-               g_free(cmd);
-               if (res != SR_OK)
-                       return SR_ERR;
-       }
-       sr_dbg("Current vertical offset:");
-       for (i = 0; i < devc->model->analog_channels; i++)
-               sr_dbg("CH%d %g", i + 1, devc->vert_offset[i]);
+       /* Vertical gain and offset. */
+       if (rigol_ds_get_dev_cfg_vertical(sdi) != SR_OK)
+               return SR_ERR;
 
        /* Coupling. */
        for (i = 0; i < devc->model->analog_channels; i++) {
@@ -861,3 +858,39 @@ SR_PRIV int rigol_ds_get_dev_cfg(const struct sr_dev_inst *sdi)
 
        return SR_OK;
 }
+
+SR_PRIV int rigol_ds_get_dev_cfg_vertical(const struct sr_dev_inst *sdi)
+{
+       struct dev_context *devc;
+       char *cmd;
+       unsigned int i;
+       int res;
+
+       devc = sdi->priv;
+
+       /* Vertical gain. */
+       for (i = 0; i < devc->model->analog_channels; i++) {
+               cmd = g_strdup_printf(":CHAN%d:SCAL?", i + 1);
+               res = sr_scpi_get_float(sdi->conn, cmd, &devc->vdiv[i]);
+               g_free(cmd);
+               if (res != SR_OK)
+                       return SR_ERR;
+       }
+       sr_dbg("Current vertical gain:");
+       for (i = 0; i < devc->model->analog_channels; i++)
+               sr_dbg("CH%d %g", i + 1, devc->vdiv[i]);
+
+       /* Vertical offset. */
+       for (i = 0; i < devc->model->analog_channels; i++) {
+               cmd = g_strdup_printf(":CHAN%d:OFFS?", i + 1);
+               res = sr_scpi_get_float(sdi->conn, cmd, &devc->vert_offset[i]);
+               g_free(cmd);
+               if (res != SR_OK)
+                       return SR_ERR;
+       }
+       sr_dbg("Current vertical offset:");
+       for (i = 0; i < devc->model->analog_channels; i++)
+               sr_dbg("CH%d %g", i + 1, devc->vert_offset[i]);
+
+       return SR_OK;
+}