/** * Send a SCPI command. * * @param scpi Previously initialized SCPI device structure. * @param format Format string, to be followed by any necessary arguments. * * @return SR_OK on success, SR_ERR on failure. */ SR_PRIV int sr_scpi_send(struct sr_scpi_dev_inst *scpi, const char *format, ...) { va_list args; int ret; va_start(args, format); ret = sr_scpi_send_variadic(scpi, format, args); va_end(args); return ret; }
SR_PRIV int scpi_cmd_resp(const struct sr_dev_inst *sdi, const struct scpi_command *cmdtable, GVariant **gvar, const GVariantType *gvtype, int command, ...) { struct sr_scpi_dev_inst *scpi; va_list args; double d; int ret; char *s; const char *cmd; if (!(cmd = scpi_cmd_get(cmdtable, command))) { /* Device does not implement this command, that's OK. */ return SR_OK; } scpi = sdi->conn; va_start(args, command); ret = sr_scpi_send_variadic(scpi, cmd, args); va_end(args); if (ret != SR_OK) return ret; /* Straight SCPI getters to GVariant types. */ if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_BOOLEAN)) { if ((ret = sr_scpi_get_string(scpi, NULL, &s)) != SR_OK) return ret; if (!g_ascii_strcasecmp(s, "ON") || !g_ascii_strcasecmp(s, "1") || !g_ascii_strcasecmp(s, "YES")) *gvar = g_variant_new_boolean(TRUE); else if (!g_ascii_strcasecmp(s, "OFF") || !g_ascii_strcasecmp(s, "0") || !g_ascii_strcasecmp(s, "NO")) *gvar = g_variant_new_boolean(FALSE); else ret = SR_ERR; g_free(s); } if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_DOUBLE)) { if ((ret = sr_scpi_get_double(scpi, NULL, &d)) == SR_OK) *gvar = g_variant_new_double(d); } if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_STRING)) { if ((ret = sr_scpi_get_string(scpi, NULL, &s)) == SR_OK) *gvar = g_variant_new_string(s); } else { sr_err("Unable to convert to desired GVariant type."); ret = SR_ERR_NA; } return ret; }
SR_PRIV int scpi_cmd(const struct sr_dev_inst *sdi, int command, ...) { struct sr_scpi_dev_inst *scpi; va_list args; int ret; const char *cmd; if (!(cmd = scpi_cmd_get(sdi, command))) { /* Device does not implement this command, that's OK. */ return SR_OK_CONTINUE; } scpi = sdi->conn; va_start(args, command); ret = sr_scpi_send_variadic(scpi, cmd, args); va_end(args); return ret; }
/* 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(100 * 1000); return SR_OK; } else { return sr_scpi_get_opc(sdi->conn); } }
SR_PRIV int scpi_cmd_resp(const struct sr_dev_inst *sdi, GVariant **gvar, const GVariantType *gvtype, int command, ...) { struct sr_scpi_dev_inst *scpi; va_list args; double d; int ret; char *s; const char *cmd; if (!(cmd = scpi_cmd_get(sdi, command))) { /* Device does not implement this command, that's OK. */ return SR_OK_CONTINUE; } scpi = sdi->conn; va_start(args, command); ret = sr_scpi_send_variadic(scpi, cmd, args); va_end(args); if (ret != SR_OK) return ret; /* Non-standard data type responses. */ if (command == SCPI_CMD_GET_OUTPUT_REGULATION) { /* * The Rigol DP800 series return CV/CC/UR, Philips PM2800 * return VOLT/CURR. We always return a GVariant string in * the Rigol notation. */ if ((ret = sr_scpi_get_string(scpi, NULL, &s)) != SR_OK) return ret; if (!strcmp(s, "CV") || !strcmp(s, "VOLT")) { *gvar = g_variant_new_string("CV"); } else if (!strcmp(s, "CC") || !strcmp(s, "CURR")) { *gvar = g_variant_new_string("CC"); } else if (!strcmp(s, "UR")) { *gvar = g_variant_new_string("UR"); } else { sr_dbg("Unknown response to SCPI_CMD_GET_OUTPUT_REGULATION: %s", s); ret = SR_ERR_DATA; } g_free(s); } else { /* Straight SCPI getters to GVariant types. */ if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_BOOLEAN)) { if ((ret = sr_scpi_get_string(scpi, NULL, &s)) != SR_OK) return ret; if (!strcasecmp(s, "ON") || !strcasecmp(s, "1") || !strcasecmp(s, "YES")) *gvar = g_variant_new_boolean(TRUE); else if (!strcasecmp(s, "OFF") || !strcasecmp(s, "0") || !strcasecmp(s, "NO")) *gvar = g_variant_new_boolean(FALSE); else ret = SR_ERR; g_free(s); } if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_DOUBLE)) { if ((ret = sr_scpi_get_double(scpi, NULL, &d)) == SR_OK) *gvar = g_variant_new_double(d); } if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_STRING)) { if ((ret = sr_scpi_get_string(scpi, NULL, &s)) == SR_OK) *gvar = g_variant_new_string(s); } } return ret; }