From: Gerhard Sittig Date: Sat, 17 Nov 2018 18:43:38 +0000 (+0100) Subject: scpi-dmm: return MQ table entry to "get MQ" routine callers X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=08f3b427b620a7a0308b0ee2e61f443a00f3d49c;p=libsigrok.git 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. --- diff --git a/src/hardware/scpi-dmm/api.c b/src/hardware/scpi-dmm/api.c index 009cb2ec..0bb5bcba 100644 --- a/src/hardware/scpi-dmm/api.c +++ b/src/hardware/scpi-dmm/api.c @@ -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; diff --git a/src/hardware/scpi-dmm/protocol.c b/src/hardware/scpi-dmm/protocol.c index 08c79b4a..954e6c98 100644 --- a/src/hardware/scpi-dmm/protocol.c +++ b/src/hardware/scpi-dmm/protocol.c @@ -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); diff --git a/src/hardware/scpi-dmm/protocol.h b/src/hardware/scpi-dmm/protocol.h index dbca1bcf..531ca474 100644 --- a/src/hardware/scpi-dmm/protocol.h +++ b/src/hardware/scpi-dmm/protocol.h @@ -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);