2 * This file is part of the libsigrok project.
4 * Copyright (C) 2014 abraxa (Soeren Apel) <soeren@apelpie.net>
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "protocol_wrappers.h"
22 #define MAX_COMMAND_SIZE 64
26 * https://www.yokogawa.com/pdf/provide/E/GW/IM/0000022842/0/IM710105-17E.pdf
29 int dlm_timebase_get(struct sr_scpi_dev_inst *scpi,
32 return sr_scpi_get_string(scpi, ":TIMEBASE:TDIV?", response);
35 int dlm_timebase_set(struct sr_scpi_dev_inst *scpi,
38 gchar cmd[MAX_COMMAND_SIZE];
39 g_snprintf(cmd, sizeof(cmd), ":TIMEBASE:TDIV %s", value);
40 return sr_scpi_send(scpi, cmd);
43 int dlm_horiz_trigger_pos_get(struct sr_scpi_dev_inst *scpi,
46 return sr_scpi_get_float(scpi, ":TRIGGER:DELAY:TIME?", response);
49 int dlm_horiz_trigger_pos_set(struct sr_scpi_dev_inst *scpi,
52 gchar cmd[MAX_COMMAND_SIZE];
53 g_snprintf(cmd, sizeof(cmd), ":TRIGGER:DELAY:TIME %s", value);
54 return sr_scpi_send(scpi, cmd);
57 int dlm_trigger_source_get(struct sr_scpi_dev_inst *scpi,
60 return sr_scpi_get_string(scpi, ":TRIGGER:ATRIGGER:SIMPLE:SOURCE?", response);
63 int dlm_trigger_source_set(struct sr_scpi_dev_inst *scpi,
66 gchar cmd[MAX_COMMAND_SIZE];
67 g_snprintf(cmd, sizeof(cmd), ":TRIGGER:ATRIGGER:SIMPLE:SOURCE %s", value);
68 return sr_scpi_send(scpi, cmd);
71 int dlm_trigger_slope_get(struct sr_scpi_dev_inst *scpi,
79 if (sr_scpi_get_string(scpi, ":TRIGGER:ATRIGGER:SIMPLE:SLOPE?", &resp) != SR_OK) {
84 if (strcmp("RISE", resp) == 0) {
85 *response = SLOPE_POSITIVE;
89 if (strcmp("FALL", resp) == 0) {
90 *response = SLOPE_NEGATIVE;
99 int dlm_trigger_slope_set(struct sr_scpi_dev_inst *scpi,
102 if (value == SLOPE_POSITIVE)
103 return sr_scpi_send(scpi, ":TRIGGER:ATRIGGER:SIMPLE:SLOPE RISE");
105 if (value == SLOPE_NEGATIVE)
106 return sr_scpi_send(scpi, ":TRIGGER:ATRIGGER:SIMPLE:SLOPE FALL");
111 int dlm_analog_chan_state_get(struct sr_scpi_dev_inst *scpi, int channel,
114 gchar cmd[MAX_COMMAND_SIZE];
115 g_snprintf(cmd, sizeof(cmd), ":CHANNEL%d:DISPLAY?", channel);
116 return sr_scpi_get_bool(scpi, cmd, response);
119 int dlm_analog_chan_state_set(struct sr_scpi_dev_inst *scpi, int channel,
120 const gboolean value)
122 gchar cmd[MAX_COMMAND_SIZE];
125 g_snprintf(cmd, sizeof(cmd), ":CHANNEL%d:DISPLAY ON", channel);
127 g_snprintf(cmd, sizeof(cmd), ":CHANNEL%d:DISPLAY OFF", channel);
129 return sr_scpi_send(scpi, cmd);
132 int dlm_analog_chan_vdiv_get(struct sr_scpi_dev_inst *scpi, int channel,
135 gchar cmd[MAX_COMMAND_SIZE];
136 g_snprintf(cmd, sizeof(cmd), ":CHANNEL%d:VDIV?", channel);
137 return sr_scpi_get_string(scpi, cmd, response);
140 int dlm_analog_chan_vdiv_set(struct sr_scpi_dev_inst *scpi, int channel,
143 gchar cmd[MAX_COMMAND_SIZE];
144 g_snprintf(cmd, sizeof(cmd), ":CHANNEL%d:VDIV %s", channel, value);
145 return sr_scpi_send(scpi, cmd);
148 int dlm_analog_chan_voffs_get(struct sr_scpi_dev_inst *scpi, int channel,
151 gchar cmd[MAX_COMMAND_SIZE];
152 g_snprintf(cmd, sizeof(cmd), ":CHANNEL%d:POSITION?", channel);
153 return sr_scpi_get_float(scpi, cmd, response);
156 int dlm_analog_chan_srate_get(struct sr_scpi_dev_inst *scpi, int channel,
159 gchar cmd[MAX_COMMAND_SIZE];
160 g_snprintf(cmd, sizeof(cmd), ":WAVEFORM:TRACE %d", channel);
162 if (sr_scpi_send(scpi, cmd) != SR_OK)
165 g_snprintf(cmd, sizeof(cmd), ":WAVEFORM:RECORD 0");
166 if (sr_scpi_send(scpi, cmd) != SR_OK)
169 return sr_scpi_get_float(scpi, ":WAVEFORM:SRATE?", response);
172 int dlm_analog_chan_coupl_get(struct sr_scpi_dev_inst *scpi, int channel,
175 gchar cmd[MAX_COMMAND_SIZE];
176 g_snprintf(cmd, sizeof(cmd), ":CHANNEL%d:COUPLING?", channel);
177 return sr_scpi_get_string(scpi, cmd, response);
180 int dlm_analog_chan_coupl_set(struct sr_scpi_dev_inst *scpi, int channel,
183 gchar cmd[MAX_COMMAND_SIZE];
184 g_snprintf(cmd, sizeof(cmd), ":CHANNEL%d:COUPLING %s", channel, value);
185 return sr_scpi_send(scpi, cmd);
188 int dlm_analog_chan_wrange_get(struct sr_scpi_dev_inst *scpi, int channel,
191 gchar cmd[MAX_COMMAND_SIZE];
194 g_snprintf(cmd, sizeof(cmd), ":WAVEFORM:TRACE %d", channel);
195 result = sr_scpi_send(scpi, cmd);
196 result &= sr_scpi_get_float(scpi, ":WAVEFORM:RANGE?", response);
200 int dlm_analog_chan_woffs_get(struct sr_scpi_dev_inst *scpi, int channel,
203 gchar cmd[MAX_COMMAND_SIZE];
206 g_snprintf(cmd, sizeof(cmd), ":WAVEFORM:TRACE %d", channel);
207 result = sr_scpi_send(scpi, cmd);
208 result &= sr_scpi_get_float(scpi, ":WAVEFORM:OFFSET?", response);
212 int dlm_digital_chan_state_get(struct sr_scpi_dev_inst *scpi, int channel,
215 gchar cmd[MAX_COMMAND_SIZE];
216 g_snprintf(cmd, sizeof(cmd), ":LOGIC:PODA:BIT%d:DISPLAY?", channel);
217 return sr_scpi_get_bool(scpi, cmd, response);
220 int dlm_digital_chan_state_set(struct sr_scpi_dev_inst *scpi, int channel,
221 const gboolean value)
223 gchar cmd[MAX_COMMAND_SIZE];
226 g_snprintf(cmd, sizeof(cmd), ":LOGIC:PODA:BIT%d:DISPLAY ON", channel);
228 g_snprintf(cmd, sizeof(cmd), ":LOGIC:PODA:BIT%d:DISPLAY OFF", channel);
230 return sr_scpi_send(scpi, cmd);
233 int dlm_digital_pod_state_get(struct sr_scpi_dev_inst *scpi, int pod,
236 gchar cmd[MAX_COMMAND_SIZE];
238 /* TODO: pod currently ignored as DLM2000 only has pod A. */
241 g_snprintf(cmd, sizeof(cmd), ":LOGIC:MODE?");
242 return sr_scpi_get_bool(scpi, cmd, response);
245 int dlm_digital_pod_state_set(struct sr_scpi_dev_inst *scpi, int pod,
246 const gboolean value)
248 /* TODO: pod currently ignored as DLM2000 only has pod A. */
252 return sr_scpi_send(scpi, ":LOGIC:MODE ON");
254 return sr_scpi_send(scpi, ":LOGIC:MODE OFF");
257 int dlm_response_headers_set(struct sr_scpi_dev_inst *scpi,
258 const gboolean value)
261 return sr_scpi_send(scpi, ":COMMUNICATE:HEADER ON");
263 return sr_scpi_send(scpi, ":COMMUNICATE:HEADER OFF");
266 int dlm_acquisition_stop(struct sr_scpi_dev_inst *scpi)
268 return sr_scpi_send(scpi, ":STOP");
271 int dlm_acq_length_get(struct sr_scpi_dev_inst *scpi,
278 if (sr_scpi_get_string(scpi, ":WAVEFORM:LENGTH?", &s) != SR_OK)
282 if (sr_atol(s, &tmp) == SR_OK)
293 int dlm_chunks_per_acq_get(struct sr_scpi_dev_inst *scpi, int *response)
297 /* Data retrieval queries such as :WAVEFORM:SEND? will only return
298 * up to 12500 samples at a time. If the oscilloscope operates in a
299 * mode where more than 12500 samples fit on screen (i.e. in one
300 * acquisition), data needs to be retrieved multiple times.
303 result = sr_scpi_get_int(scpi, ":WAVEFORM:LENGTH?", &acq_len);
304 *response = MAX(acq_len / DLM_MAX_FRAME_LENGTH, 1);
309 int dlm_start_frame_set(struct sr_scpi_dev_inst *scpi, int value)
311 gchar cmd[MAX_COMMAND_SIZE];
313 g_snprintf(cmd, sizeof(cmd), ":WAVEFORM:START %d",
314 value * DLM_MAX_FRAME_LENGTH);
316 return sr_scpi_send(scpi, cmd);
319 int dlm_data_get(struct sr_scpi_dev_inst *scpi, int acquisition_num)
321 gchar cmd[MAX_COMMAND_SIZE];
323 g_snprintf(cmd, sizeof(cmd), ":WAVEFORM:ALL:SEND? %d", acquisition_num);
324 return sr_scpi_send(scpi, cmd);
327 int dlm_analog_data_get(struct sr_scpi_dev_inst *scpi, int channel)
329 gchar cmd[MAX_COMMAND_SIZE];
332 result = sr_scpi_send(scpi, ":WAVEFORM:FORMAT BYTE");
333 if (result == SR_OK) result = sr_scpi_send(scpi, ":WAVEFORM:RECORD 0");
334 if (result == SR_OK) result = sr_scpi_send(scpi, ":WAVEFORM:START 0");
335 if (result == SR_OK) result = sr_scpi_send(scpi, ":WAVEFORM:END 124999999");
337 g_snprintf(cmd, sizeof(cmd), ":WAVEFORM:TRACE %d", channel);
338 if (result == SR_OK) result = sr_scpi_send(scpi, cmd);
340 if (result == SR_OK) result = sr_scpi_send(scpi, ":WAVEFORM:SEND? 1");
345 int dlm_digital_data_get(struct sr_scpi_dev_inst *scpi)
349 result = sr_scpi_send(scpi, ":WAVEFORM:FORMAT BYTE");
350 if (result == SR_OK) result = sr_scpi_send(scpi, ":WAVEFORM:RECORD 0");
351 if (result == SR_OK) result = sr_scpi_send(scpi, ":WAVEFORM:START 0");
352 if (result == SR_OK) result = sr_scpi_send(scpi, ":WAVEFORM:END 124999999");
353 if (result == SR_OK) result = sr_scpi_send(scpi, ":WAVEFORM:TRACE LOGIC");
354 if (result == SR_OK) result = sr_scpi_send(scpi, ":WAVEFORM:SEND? 1");