scpi-dmm: return MQ table entry to "get MQ" routine callers

The "get MQ" helper routine communicates SCPI responses and translates
them to internal "MQ and flag" values. Optionally return the MQ table
entry reference to callers, so they don't have to repeat the table
lookup when the function's default precision is required, or should
future "start acquisition" requests need to refer to the meter's current
function.
This commit is contained in:
Gerhard Sittig 2018-11-17 19:43:38 +01:00
parent 64d03de1c2
commit 08f3b427b6
3 changed files with 19 additions and 15 deletions

View File

@ -191,7 +191,7 @@ static int config_get(uint32_t key, GVariant **data,
case SR_CONF_LIMIT_MSEC:
return sr_sw_limits_config_get(&devc->limits, key, data);
case SR_CONF_MEASURED_QUANTITY:
ret = scpi_dmm_get_mq(sdi, &mq, &mqflag, NULL);
ret = scpi_dmm_get_mq(sdi, &mq, &mqflag, NULL, NULL);
if (ret != SR_OK)
return ret;
arr[0] = g_variant_new_uint32(mq);
@ -276,13 +276,14 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
struct sr_scpi_dev_inst *scpi;
struct dev_context *devc;
int ret;
const struct mqopt_item *item;
const char *command;
scpi = sdi->conn;
devc = sdi->priv;
ret = scpi_dmm_get_mq(sdi, &devc->start_acq_mq.curr_mq,
&devc->start_acq_mq.curr_mqflag, NULL);
&devc->start_acq_mq.curr_mqflag, NULL, &item);
if (ret != SR_OK)
return ret;

View File

@ -70,7 +70,8 @@ SR_PRIV const struct mqopt_item *scpi_dmm_lookup_mq_text(
}
SR_PRIV int scpi_dmm_get_mq(const struct sr_dev_inst *sdi,
enum sr_mq *mq, enum sr_mqflag *flag, char **rsp)
enum sr_mq *mq, enum sr_mqflag *flag, char **rsp,
const struct mqopt_item **mqitem)
{
struct dev_context *devc;
const char *command;
@ -86,6 +87,8 @@ SR_PRIV int scpi_dmm_get_mq(const struct sr_dev_inst *sdi,
*flag = 0;
if (rsp)
*rsp = NULL;
if (mqitem)
*mqitem = NULL;
command = sr_scpi_cmd_get(devc->cmdset, DMM_CMD_QUERY_FUNC);
if (!command || !*command)
@ -108,6 +111,8 @@ SR_PRIV int scpi_dmm_get_mq(const struct sr_dev_inst *sdi,
*mq = item->mq;
if (flag)
*flag = item->mqflag;
if (mqitem)
*mqitem = item;
ret = SR_OK;
}
@ -173,7 +178,7 @@ SR_PRIV int scpi_dmm_get_meas_agilent(const struct sr_dev_inst *sdi, size_t ch)
* Get the meter's current mode, keep the response around.
* Skip the measurement if the mode is uncertain.
*/
ret = scpi_dmm_get_mq(sdi, &mq, &mqflag, &mode_response);
ret = scpi_dmm_get_mq(sdi, &mq, &mqflag, &mode_response, &item);
if (ret != SR_OK) {
g_free(mode_response);
return ret;
@ -200,17 +205,14 @@ SR_PRIV int scpi_dmm_get_meas_agilent(const struct sr_dev_inst *sdi, size_t ch)
snprintf(prec_text, sizeof(prec_text),
"%s", fields[count - 1]);
p = prec_text;
} else if (!item) {
p = NULL;
} else if (item->default_precision == NO_DFLT_PREC) {
p = NULL;
} else {
item = scpi_dmm_lookup_mq_number(sdi, mq, mqflag);
if (!item) {
p = NULL;
} else if (item->default_precision == NO_DFLT_PREC) {
p = NULL;
} else {
snprintf(prec_text, sizeof(prec_text),
"1e%d", item->default_precision);
p = prec_text;
}
snprintf(prec_text, sizeof(prec_text),
"1e%d", item->default_precision);
p = prec_text;
}
g_strfreev(fields);

View File

@ -90,7 +90,8 @@ SR_PRIV const struct mqopt_item *scpi_dmm_lookup_mq_number(
SR_PRIV const struct mqopt_item *scpi_dmm_lookup_mq_text(
const struct sr_dev_inst *sdi, const char *text);
SR_PRIV int scpi_dmm_get_mq(const struct sr_dev_inst *sdi,
enum sr_mq *mq, enum sr_mqflag *flag, char **rsp);
enum sr_mq *mq, enum sr_mqflag *flag, char **rsp,
const struct mqopt_item **mqitem);
SR_PRIV int scpi_dmm_set_mq(const struct sr_dev_inst *sdi,
enum sr_mq mq, enum sr_mqflag flag);
SR_PRIV int scpi_dmm_get_meas_agilent(const struct sr_dev_inst *sdi, size_t ch);