2 * This file is part of the libsigrok project.
4 * Copyright (C) 2015 Bert Vermeulen <bert@biot.com>
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/>.
21 #include <libsigrok/libsigrok.h>
22 #include "libsigrok-internal.h"
25 #define LOG_PREFIX "scpi/helpers"
27 static const char *scpi_vendors[][2] = {
28 { "HEWLETT-PACKARD", "HP" },
29 { "Agilent Technologies", "Agilent" },
30 { "RIGOL TECHNOLOGIES", "Rigol" },
31 { "PHILIPS", "Philips" },
32 { "CHROMA", "Chroma" },
33 { "Chroma ATE", "Chroma" },
36 SR_PRIV const char *sr_vendor_alias(const char *raw_vendor)
40 for (i = 0; i < ARRAY_SIZE(scpi_vendors); i++) {
41 if (!g_ascii_strcasecmp(raw_vendor, scpi_vendors[i][0]))
42 return scpi_vendors[i][1];
48 SR_PRIV const char *scpi_cmd_get(const struct scpi_command *cmdtable, int command)
57 for (i = 0; cmdtable[i].command; i++) {
58 if (cmdtable[i].command == command) {
59 cmd = cmdtable[i].string;
67 SR_PRIV int scpi_cmd(const struct sr_dev_inst *sdi, const struct scpi_command *cmdtable,
70 struct sr_scpi_dev_inst *scpi;
75 if (!(cmd = scpi_cmd_get(cmdtable, command))) {
76 /* Device does not implement this command, that's OK. */
81 va_start(args, command);
82 ret = sr_scpi_send_variadic(scpi, cmd, args);
88 SR_PRIV int scpi_cmd_resp(const struct sr_dev_inst *sdi, const struct scpi_command *cmdtable,
89 GVariant **gvar, const GVariantType *gvtype, int command, ...)
91 struct sr_scpi_dev_inst *scpi;
98 if (!(cmd = scpi_cmd_get(cmdtable, command))) {
99 /* Device does not implement this command, that's OK. */
104 va_start(args, command);
105 ret = sr_scpi_send_variadic(scpi, cmd, args);
110 /* Straight SCPI getters to GVariant types. */
111 if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_BOOLEAN)) {
112 if ((ret = sr_scpi_get_string(scpi, NULL, &s)) != SR_OK)
114 if (!g_ascii_strcasecmp(s, "ON") || !g_ascii_strcasecmp(s, "1")
115 || !g_ascii_strcasecmp(s, "YES"))
116 *gvar = g_variant_new_boolean(TRUE);
117 else if (!g_ascii_strcasecmp(s, "OFF") || !g_ascii_strcasecmp(s, "0")
118 || !g_ascii_strcasecmp(s, "NO"))
119 *gvar = g_variant_new_boolean(FALSE);
123 } if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_DOUBLE)) {
124 if ((ret = sr_scpi_get_double(scpi, NULL, &d)) == SR_OK)
125 *gvar = g_variant_new_double(d);
126 } if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_STRING)) {
127 if ((ret = sr_scpi_get_string(scpi, NULL, &s)) == SR_OK)
128 *gvar = g_variant_new_string(s);
130 sr_err("Unable to convert to desired GVariant type.");