+ return SR_OK;
+}
+
+/* Wait for enough data becoming available in scope output buffer */
+static int rigol_ds_block_wait(const struct sr_dev_inst *sdi)
+{
+ char *buf;
+ struct dev_context *devc;
+ time_t start;
+ int len;
+
+ if (!(devc = sdi->priv))
+ return SR_ERR;
+
+ if (devc->model->series->protocol >= PROTOCOL_V3) {
+
+ start = time(NULL);
+
+ do {
+ if (time(NULL) - start >= 3) {
+ sr_dbg("Timeout waiting for data block");
+ return SR_ERR_TIMEOUT;
+ }
+
+ /*
+ * The scope copies data really slowly from sample
+ * memory to its output buffer, so try not to bother
+ * it too much with SCPI requests but don't wait too
+ * long for short sample frame sizes.
+ */
+ g_usleep(devc->analog_frame_size < 15000 ? 100000 : 1000000);
+
+ /* "READ,nnnn" (still working) or "IDLE,nnnn" (finished) */
+ if (sr_scpi_get_string(sdi->conn, ":WAV:STAT?", &buf) != SR_OK)
+ return SR_ERR;
+
+ if (parse_int(buf + 5, &len) != SR_OK)
+ return SR_ERR;
+ } while (buf[0] == 'R' && len < 1000000);
+ }
+
+ rigol_ds_set_wait_event(devc, WAIT_NONE);
+
+ return SR_OK;
+}
+
+/* Send a configuration setting. */
+SR_PRIV int rigol_ds_config_set(const struct sr_dev_inst *sdi, const char *format, ...)
+{
+ struct dev_context *devc = sdi->priv;
+ va_list args;
+ int ret;
+
+ va_start(args, format);
+ ret = sr_scpi_send_variadic(sdi->conn, format, args);
+ va_end(args);
+
+ if (ret != SR_OK)
+ return SR_ERR;
+
+ if (devc->model->series->protocol == PROTOCOL_V2) {
+ /* The DS1000 series needs this stupid delay, *OPC? doesn't work. */
+ sr_spew("delay %dms", 100);
+ g_usleep(100000);
+ return SR_OK;
+ } else {
+ return sr_scpi_get_opc(sdi->conn);
+ }
+}
+
+/* Start capturing a new frameset */
+SR_PRIV int rigol_ds_capture_start(const struct sr_dev_inst *sdi)
+{
+ struct dev_context *devc;
+ gchar *trig_mode;
+
+ if (!(devc = sdi->priv))
+ return SR_ERR;
+
+ sr_dbg("Starting data capture for frameset %lu of %lu",
+ devc->num_frames + 1, devc->limit_frames);
+
+ switch (devc->model->series->protocol) {
+ case PROTOCOL_V1:
+ rigol_ds_set_wait_event(devc, WAIT_TRIGGER);
+ break;
+ case PROTOCOL_V2:
+ if (devc->data_source == DATA_SOURCE_LIVE) {
+ if (rigol_ds_config_set(sdi, ":WAV:POIN:MODE NORMAL") != SR_OK)
+ return SR_ERR;
+ rigol_ds_set_wait_event(devc, WAIT_TRIGGER);
+ } else {
+ if (rigol_ds_config_set(sdi, ":STOP") != SR_OK)
+ return SR_ERR;
+ if (rigol_ds_config_set(sdi, ":WAV:POIN:MODE RAW") != SR_OK)
+ return SR_ERR;
+ if (sr_scpi_get_string(sdi->conn, ":TRIG:MODE?", &trig_mode) != SR_OK)
+ return SR_ERR;
+ if (rigol_ds_config_set(sdi, ":TRIG:%s:SWE SING", trig_mode) != SR_OK)
+ return SR_ERR;
+ if (rigol_ds_config_set(sdi, ":RUN") != SR_OK)
+ return SR_ERR;
+ rigol_ds_set_wait_event(devc, WAIT_STOP);
+ }
+ break;
+ case PROTOCOL_V3:
+ if (rigol_ds_config_set(sdi, ":WAV:FORM BYTE") != SR_OK)
+ return SR_ERR;
+ if (devc->data_source == DATA_SOURCE_LIVE) {
+ if (rigol_ds_config_set(sdi, ":WAV:MODE NORM") != SR_OK)
+ return SR_ERR;
+ rigol_ds_set_wait_event(devc, WAIT_TRIGGER);
+ } else {
+ if (rigol_ds_config_set(sdi, ":WAV:MODE RAW") != SR_OK)
+ return SR_ERR;
+ if (rigol_ds_config_set(sdi, ":SING") != SR_OK)
+ return SR_ERR;
+ rigol_ds_set_wait_event(devc, WAIT_STOP);
+ }
+ break;
+ }
+
+ return SR_OK;
+}
+
+/* Start reading data from the current channel */
+SR_PRIV int rigol_ds_channel_start(const struct sr_dev_inst *sdi)
+{
+ struct dev_context *devc;
+ struct sr_channel *ch;
+
+ if (!(devc = sdi->priv))
+ return SR_ERR;
+
+ ch = devc->channel_entry->data;
+
+ sr_dbg("Starting reading data from channel %d", ch->index + 1);