X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fscpi-dmm%2Fapi.c;h=b6a568211b7fea1a899c7b0b56eb9c1f95d65bf7;hb=f1a37f39244d97bcd3abb1c29d6a71e9b9edfefe;hp=3098a95f31543fbd5ee8fd78fc62fe6316e89f9b;hpb=d0b602f00f68e10c52eb5204017e44acf58037f7;p=libsigrok.git diff --git a/src/hardware/scpi-dmm/api.c b/src/hardware/scpi-dmm/api.c index 3098a95f..b6a56821 100644 --- a/src/hardware/scpi-dmm/api.c +++ b/src/hardware/scpi-dmm/api.c @@ -82,10 +82,22 @@ static const struct scpi_command cmdset_hp[] = { static const struct scpi_command cmdset_gwinstek[] = { { DMM_CMD_SETUP_REMOTE, "SYST:REM", }, + { DMM_CMD_SETUP_LOCAL, "SYST:LOC", }, { DMM_CMD_SETUP_FUNC, "CONF:%s", }, { DMM_CMD_QUERY_FUNC, "CONF:STAT:FUNC?", }, { DMM_CMD_START_ACQ, "*CLS;SYST:REM", }, - { DMM_CMD_STOP_ACQ, "SYST:LOC", }, + { DMM_CMD_QUERY_VALUE, "VAL1?", }, + { DMM_CMD_QUERY_PREC, "SENS:DET:RATE?", }, + ALL_ZERO, +}; + +static const struct scpi_command cmdset_gwinstek_906x[] = { + { DMM_CMD_SETUP_REMOTE, "SYST:REM", }, + { DMM_CMD_SETUP_LOCAL, "SYST:LOC", }, + { DMM_CMD_SETUP_FUNC, "CONF:%s", }, + { DMM_CMD_QUERY_FUNC, "CONF?", }, + { DMM_CMD_START_ACQ, "INIT", }, + { DMM_CMD_STOP_ACQ, "ABORT", }, { DMM_CMD_QUERY_VALUE, "VAL1?", }, { DMM_CMD_QUERY_PREC, "SENS:DET:RATE?", }, ALL_ZERO, @@ -134,6 +146,21 @@ static const struct mqopt_item mqopts_gwinstek_gdm8200a[] = { { SR_MQ_TIME, 0, "PER", "14", NO_DFLT_PREC, }, }; +static const struct mqopt_item mqopts_gwinstek_gdm906x[] = { + { SR_MQ_VOLTAGE, SR_MQFLAG_DC, "VOLT:DC", "VOLT ", NO_DFLT_PREC, }, + { SR_MQ_VOLTAGE, SR_MQFLAG_AC, "VOLT:AC", "VOLT:AC", NO_DFLT_PREC, }, + { SR_MQ_CURRENT, SR_MQFLAG_DC, "CURR:DC", "CURR ", NO_DFLT_PREC, }, + { SR_MQ_CURRENT, SR_MQFLAG_AC, "CURR:AC", "CURR:AC", NO_DFLT_PREC, }, + { SR_MQ_RESISTANCE, 0, "RES", "RES", NO_DFLT_PREC, }, + { SR_MQ_RESISTANCE, SR_MQFLAG_FOUR_WIRE, "FRES", "FRES", NO_DFLT_PREC, }, + { SR_MQ_CONTINUITY, 0, "CONT", "CONT", -1, }, + { SR_MQ_VOLTAGE, SR_MQFLAG_DC | SR_MQFLAG_DIODE, "DIOD", "DIOD", -4, }, + { SR_MQ_TEMPERATURE, 0, "TEMP", "TEMP", NO_DFLT_PREC, }, + { SR_MQ_FREQUENCY, 0, "FREQ", "FREQ", NO_DFLT_PREC, }, + { SR_MQ_TIME, 0, "PER", "PER", NO_DFLT_PREC, }, + { SR_MQ_CAPACITANCE, 0, "CAP", "CAP", NO_DFLT_PREC, }, +}; + SR_PRIV const struct scpi_dmm_model models[] = { { "Agilent", "34405A", @@ -150,8 +177,29 @@ SR_PRIV const struct scpi_dmm_model models[] = { 0, }, { - "Keysight", "34465A", - 1, 5, cmdset_agilent, ARRAY_AND_SIZE(mqopts_agilent_34405a), + "GW", "GDM8251A", + 1, 6, cmdset_gwinstek, ARRAY_AND_SIZE(mqopts_gwinstek_gdm8200a), + scpi_dmm_get_meas_gwinstek, + ARRAY_AND_SIZE(devopts_generic), + 1000 * 2500, + }, + { + "GW", "GDM8255A", + 1, 6, cmdset_gwinstek, ARRAY_AND_SIZE(mqopts_gwinstek_gdm8200a), + scpi_dmm_get_meas_gwinstek, + ARRAY_AND_SIZE(devopts_generic), + 1000 * 2500, + }, + { + "GWInstek", "GDM9060", + 1, 6, cmdset_gwinstek_906x, ARRAY_AND_SIZE(mqopts_gwinstek_gdm906x), + scpi_dmm_get_meas_agilent, + ARRAY_AND_SIZE(devopts_generic), + 0, + }, + { + "GWInstek", "GDM9061", + 1, 6, cmdset_gwinstek_906x, ARRAY_AND_SIZE(mqopts_gwinstek_gdm906x), scpi_dmm_get_meas_agilent, ARRAY_AND_SIZE(devopts_generic), 0, @@ -165,18 +213,11 @@ SR_PRIV const struct scpi_dmm_model models[] = { 1000 * 1500, }, { - "GW", "GDM8251A", - 1, 6, cmdset_gwinstek, ARRAY_AND_SIZE(mqopts_gwinstek_gdm8200a), - scpi_dmm_get_meas_gwinstek, - ARRAY_AND_SIZE(devopts_generic), - 1000 * 2500, - }, - { - "GW", "GDM8255A", - 1, 6, cmdset_gwinstek, ARRAY_AND_SIZE(mqopts_gwinstek_gdm8200a), - scpi_dmm_get_meas_gwinstek, + "Keysight", "34465A", + 1, 5, cmdset_agilent, ARRAY_AND_SIZE(mqopts_agilent_34405a), + scpi_dmm_get_meas_agilent, ARRAY_AND_SIZE(devopts_generic), - 1000 * 2500, + 0, }, }; @@ -209,6 +250,7 @@ static struct sr_dev_inst *probe_device(struct sr_scpi_dev_inst *scpi) struct dev_context *devc; size_t i; gchar *channel_name; + const char *command; scpi_dmm_cmd_delay(scpi); ret = sr_scpi_get_hw_id(scpi, &hw_info); @@ -239,13 +281,22 @@ static struct sr_dev_inst *probe_device(struct sr_scpi_dev_inst *scpi) devc->num_channels = model->num_channels; devc->cmdset = model->cmdset; devc->model = model; - devc->precision = NULL; for (i = 0; i < devc->num_channels; i++) { channel_name = g_strdup_printf("P%zu", i + 1); sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, channel_name); } + /* + * If device has DMM_CMD_SETUP_LOCAL command, send it now. To avoid + * leaving device in remote mode (if only a "scan" is run). + */ + command = sr_scpi_cmd_get(devc->cmdset, DMM_CMD_SETUP_LOCAL); + if (command && *command) { + scpi_dmm_cmd_delay(scpi); + sr_scpi_send(scpi, command); + } + return sdi; } @@ -271,8 +322,11 @@ static int dev_open(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi) { + struct dev_context *devc; struct sr_scpi_dev_inst *scpi; + const char *command; + devc = sdi->priv; scpi = sdi->conn; if (!scpi) return SR_ERR_BUG; @@ -281,6 +335,16 @@ static int dev_close(struct sr_dev_inst *sdi) if (sdi->status <= SR_ST_INACTIVE) return SR_OK; + /* + * If device has DMM_CMD_SETUP_LOCAL command, send it now + * to avoid leaving device in remote mode. + */ + command = sr_scpi_cmd_get(devc->cmdset, DMM_CMD_SETUP_LOCAL); + if (command && *command) { + scpi_dmm_cmd_delay(scpi); + sr_scpi_send(scpi, command); + } + return sr_scpi_close(scpi); } @@ -409,14 +473,13 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) ret = sr_scpi_get_string(scpi, command, &response); if (ret == SR_OK) { g_strstrip(response); - if (devc->precision) - g_free(devc->precision); - devc->precision=g_strdup(response); + g_free(devc->precision); + devc->precision = g_strdup(response); g_free(response); sr_dbg("%s: Precision: '%s'", __func__, devc->precision); } else { - sr_info("%s: Precision query ('%s') failed: %d", - __func__, command, ret); + sr_info("Precision query ('%s') failed: %d", + command, ret); } } @@ -459,10 +522,8 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi) std_session_send_df_end(sdi); - if (devc->precision) { - g_free(devc->precision); - devc->precision = NULL; - } + g_free(devc->precision); + devc->precision = NULL; return SR_OK; }