scpi-dmm: Gracefully handle meters that lack OPC command.

The SCPI standard requires OPeration Complete command,
but some Owon meters do not implement it. This commit
makes the probe try OPC once, and if it gets no reply
it assumes it is not supported.
This commit is contained in:
Petteri Aimonen 2021-02-28 15:32:08 +02:00 committed by Gerhard Sittig
parent 33306b13ac
commit ddeaa49d43
3 changed files with 26 additions and 1 deletions

View File

@ -241,6 +241,25 @@ static const struct scpi_dmm_model *is_compatible(const char *vendor, const char
return NULL;
}
/*
* Some devices (such as Owon XDM2041) do not support the standard
* OPeration Complete? command. This function tests the command with
* a short timeout, and returns TRUE if any reply (busy or not) is received.
*/
static gboolean probe_opc_support(struct sr_scpi_dev_inst *scpi)
{
gboolean result;
GString *response;
response = g_string_sized_new(128);
result = TRUE;
if (sr_scpi_get_data(scpi, SCPI_CMD_OPC, &response) != SR_OK)
result = FALSE;
g_string_free(response, TRUE);
return result;
}
static struct sr_dev_inst *probe_device(struct sr_scpi_dev_inst *scpi)
{
struct sr_scpi_hw_info *hw_info;
@ -253,6 +272,9 @@ static struct sr_dev_inst *probe_device(struct sr_scpi_dev_inst *scpi)
gchar *channel_name;
const char *command;
if (!probe_opc_support(scpi))
scpi->no_opc_command = TRUE;
scpi_dmm_cmd_delay(scpi);
ret = sr_scpi_get_hw_id(scpi, &hw_info);
if (ret != SR_OK) {

View File

@ -28,7 +28,9 @@ SR_PRIV void scpi_dmm_cmd_delay(struct sr_scpi_dev_inst *scpi)
{
if (WITH_CMD_DELAY)
g_usleep(WITH_CMD_DELAY * 1000);
sr_scpi_get_opc(scpi);
if (!scpi->no_opc_command)
sr_scpi_get_opc(scpi);
}
SR_PRIV const struct mqopt_item *scpi_dmm_lookup_mq_number(

View File

@ -113,6 +113,7 @@ struct sr_scpi_dev_inst {
uint64_t firmware_version;
GMutex scpi_mutex;
char *actual_channel_name;
gboolean no_opc_command;
};
SR_PRIV GSList *sr_scpi_scan(struct drv_context *drvc, GSList *options,