scpi-pps: Move non-standard data type processing to SCPI parser.

This commit is contained in:
Bert Vermeulen 2014-10-18 23:18:48 +02:00
parent 4a471029c2
commit c1d56d2013
2 changed files with 37 additions and 33 deletions

View File

@ -252,7 +252,6 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s
const GVariantType *gvtype; const GVariantType *gvtype;
unsigned int i; unsigned int i;
int cmd, ret; int cmd, ret;
const char *s;
if (!sdi) if (!sdi)
return SR_ERR_ARG; return SR_ERR_ARG;
@ -338,25 +337,6 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s
if (cg) if (cg)
select_channel(sdi, cg->channels->data); select_channel(sdi, cg->channels->data);
ret = scpi_cmd_resp(sdi, data, gvtype, cmd); ret = scpi_cmd_resp(sdi, data, gvtype, cmd);
if (gvtype == G_VARIANT_TYPE_STRING && ret == SR_OK) {
/* Non-standard data type responses. */
switch (key) {
case SCPI_CMD_GET_OUTPUT_REGULATION:
/*
* This is specific to the Rigol DP800 series.
* We return the same string for now until more
* models with this key are supported. Do a check
* just for the hell of it.
*/
s = g_variant_get_string(*data, NULL);
if (strcmp(s, "CC") && strcmp(s, "CV") && strcmp(s, "UR")) {
sr_dbg("Unknown response to SCPI_CMD_GET_OUTPUT_REGULATION: %s", s);
ret = SR_ERR_DATA;
}
break;
}
}
} else } else
ret = SR_ERR_NA; ret = SR_ERR_NA;

View File

@ -80,21 +80,45 @@ SR_PRIV int scpi_cmd_resp(const struct sr_dev_inst *sdi, GVariant **gvar,
if (ret != SR_OK) if (ret != SR_OK)
return ret; return ret;
if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_BOOLEAN)) { /* 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) if ((ret = sr_scpi_get_string(scpi, NULL, &s)) != SR_OK)
return ret; return ret;
if (!strcasecmp(s, "ON") || !strcasecmp(s, "1") || !strcasecmp(s, "YES")) if (!strcmp(s, "CV") || !strcmp(s, "VOLT")) {
*gvar = g_variant_new_boolean(TRUE); *gvar = g_variant_new_string("CV");
else if (!strcasecmp(s, "OFF") || !strcasecmp(s, "0") || !strcasecmp(s, "NO")) } else if (!strcmp(s, "CC") || !strcmp(s, "CURR")) {
*gvar = g_variant_new_boolean(FALSE); *gvar = g_variant_new_string("CC");
else } else if (!strcmp(s, "UR")) {
ret = SR_ERR; *gvar = g_variant_new_string("UR");
} if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_DOUBLE)) { } else {
if ((ret = sr_scpi_get_double(scpi, NULL, &d)) == SR_OK) sr_dbg("Unknown response to SCPI_CMD_GET_OUTPUT_REGULATION: %s", s);
*gvar = g_variant_new_double(d); ret = SR_ERR_DATA;
} if (g_variant_type_equal(gvtype, G_VARIANT_TYPE_STRING)) { }
if ((ret = sr_scpi_get_string(scpi, NULL, &s)) == SR_OK) g_free(s);
*gvar = g_variant_new_string(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; return ret;