scpi-pps: Move non-standard data type processing to SCPI parser.
This commit is contained in:
parent
4a471029c2
commit
c1d56d2013
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue