* This file is part of the libsigrok project.
*
* Copyright (C) 2014 Bert Vermeulen <bert@biot.com>
- * Copyright (C) 2017 Frank Stettner <frank-stettner@gmx.net>
+ * Copyright (C) 2017,2019 Frank Stettner <frank-stettner@gmx.net>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
for (l = sdi->channels; l; l = l->next) {
ch = l->data;
pch = ch->priv;
+ /* Add mqflags from channel_group_spec only to voltage
+ * and current channels.
+ */
+ if (pch->mq == SR_MQ_VOLTAGE || pch->mq == SR_MQ_CURRENT)
+ pch->mqflags = cgs->mqflags;
+ else
+ pch->mqflags = 0;
if (pch->hw_output_idx == j)
cg->channels = g_slist_append(cg->channels, ch);
}
sr_scpi_hw_info_free(hw_info);
hw_info = NULL;
- sr_scpi_cmd(sdi, devc->device->commands, 0, NULL, SCPI_CMD_LOCAL);
+ /* Don't send SCPI_CMD_LOCAL for HP 66xxB using SCPI over GPIB. */
+ if (!(devc->device->dialect == SCPI_DIALECT_HP_66XXB &&
+ scpi->transport == SCPI_TRANSPORT_LIBGPIB))
+ sr_scpi_cmd(sdi, devc->device->commands, 0, NULL, SCPI_CMD_LOCAL);
return sdi;
}
return SR_ERR;
devc = sdi->priv;
- sr_scpi_cmd(sdi, devc->device->commands, 0, NULL, SCPI_CMD_REMOTE);
+
+ /* Don't send SCPI_CMD_REMOTE for HP 66xxB using SCPI over GPIB. */
+ if (!(devc->device->dialect == SCPI_DIALECT_HP_66XXB &&
+ scpi->transport == SCPI_TRANSPORT_LIBGPIB))
+ sr_scpi_cmd(sdi, devc->device->commands, 0, NULL, SCPI_CMD_REMOTE);
+
devc->beeper_was_set = FALSE;
if (sr_scpi_cmd_resp(sdi, devc->device->commands, 0, NULL,
&beeper, G_VARIANT_TYPE_BOOLEAN, SCPI_CMD_BEEPER) == SR_OK) {
if (devc->beeper_was_set)
sr_scpi_cmd(sdi, devc->device->commands,
0, NULL, SCPI_CMD_BEEPER_ENABLE);
- sr_scpi_cmd(sdi, devc->device->commands, 0, NULL, SCPI_CMD_LOCAL);
+
+ /* Don't send SCPI_CMD_LOCAL for HP 66xxB using SCPI over GPIB. */
+ if (!(devc->device->dialect == SCPI_DIALECT_HP_66XXB &&
+ scpi->transport == SCPI_TRANSPORT_LIBGPIB))
+ sr_scpi_cmd(sdi, devc->device->commands, 0, NULL, SCPI_CMD_LOCAL);
return sr_scpi_close(scpi);
}
cmd = SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_ENABLED;
break;
case SR_CONF_OVER_VOLTAGE_PROTECTION_ACTIVE:
- if (devc->device->dialect == SCPI_DIALECT_HP_66XXB)
+ if (devc->device->dialect == SCPI_DIALECT_HP_66XXB ||
+ devc->device->dialect == SCPI_DIALECT_HP_COMP)
gvtype = G_VARIANT_TYPE_STRING;
else
gvtype = G_VARIANT_TYPE_BOOLEAN;
cmd = SCPI_CMD_GET_OVER_CURRENT_PROTECTION_ENABLED;
break;
case SR_CONF_OVER_CURRENT_PROTECTION_ACTIVE:
- if (devc->device->dialect == SCPI_DIALECT_HP_66XXB)
+ if (devc->device->dialect == SCPI_DIALECT_HP_66XXB ||
+ devc->device->dialect == SCPI_DIALECT_HP_COMP)
gvtype = G_VARIANT_TYPE_STRING;
else
gvtype = G_VARIANT_TYPE_BOOLEAN;
cmd = SCPI_CMD_GET_OVER_TEMPERATURE_PROTECTION;
break;
case SR_CONF_OVER_TEMPERATURE_PROTECTION_ACTIVE:
- if (devc->device->dialect == SCPI_DIALECT_HP_66XXB)
+ if (devc->device->dialect == SCPI_DIALECT_HP_66XXB ||
+ devc->device->dialect == SCPI_DIALECT_HP_COMP)
gvtype = G_VARIANT_TYPE_STRING;
else
gvtype = G_VARIANT_TYPE_BOOLEAN;
*data = g_variant_new_string("CC");
}
}
+ if (devc->device->dialect == SCPI_DIALECT_HP_COMP) {
+ /* Evaluate Status Register from a HP 66xx in COMP mode. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ if (reg & (1 << 0))
+ *data = g_variant_new_string("CV");
+ else if (reg & (1 << 1))
+ *data = g_variant_new_string("CC");
+ else if (reg & (1 << 2))
+ *data = g_variant_new_string("UR");
+ else if (reg & (1 << 9))
+ *data = g_variant_new_string("CC-");
+ else
+ *data = g_variant_new_string("");
+ }
if (devc->device->dialect == SCPI_DIALECT_HP_66XXB) {
/* Evaluate Operational Status Register from a HP 66xxB. */
s = g_variant_get_string(*data, NULL);
}
s = g_variant_get_string(*data, NULL);
- if (g_strcmp0(s, "CV") && g_strcmp0(s, "CC") &&
- g_strcmp0(s, "CC-") && g_strcmp0(s, "UR")) {
+ if (g_strcmp0(s, "CV") && g_strcmp0(s, "CC") && g_strcmp0(s, "CC-") &&
+ g_strcmp0(s, "UR") && g_strcmp0(s, "")) {
sr_err("Unknown response to SCPI_CMD_GET_OUTPUT_REGULATION: %s", s);
ret = SR_ERR_DATA;
}
if (cmd == SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_ACTIVE) {
+ if (devc->device->dialect == SCPI_DIALECT_HP_COMP) {
+ /* Evaluate Status Register from a HP 66xx in COMP mode. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ *data = g_variant_new_boolean(reg & (1 << 3));
+ }
if (devc->device->dialect == SCPI_DIALECT_HP_66XXB) {
/* Evaluate Questionable Status Register bit 0 from a HP 66xxB. */
s = g_variant_get_string(*data, NULL);
}
if (cmd == SCPI_CMD_GET_OVER_CURRENT_PROTECTION_ACTIVE) {
+ if (devc->device->dialect == SCPI_DIALECT_HP_COMP) {
+ /* Evaluate Status Register from a HP 66xx in COMP mode. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ *data = g_variant_new_boolean(reg & (1 << 6));
+ }
if (devc->device->dialect == SCPI_DIALECT_HP_66XXB) {
/* Evaluate Questionable Status Register bit 1 from a HP 66xxB. */
s = g_variant_get_string(*data, NULL);
}
if (cmd == SCPI_CMD_GET_OVER_TEMPERATURE_PROTECTION_ACTIVE) {
+ if (devc->device->dialect == SCPI_DIALECT_HP_COMP) {
+ /* Evaluate Status Register from a HP 66xx in COMP mode. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ *data = g_variant_new_boolean(reg & (1 << 4));
+ }
if (devc->device->dialect == SCPI_DIALECT_HP_66XXB) {
/* Evaluate Questionable Status Register bit 4 from a HP 66xxB. */
s = g_variant_get_string(*data, NULL);
{
struct dev_context *devc;
struct sr_channel *ch;
+ struct pps_channel *pch;
const struct channel_spec *ch_spec;
int i;
const char *s[16];
* specification for use in series or parallel mode.
*/
ch = cg->channels->data;
+ pch = ch->priv;
if (!devc || !devc->device)
return SR_ERR_ARG;
- ch_spec = &(devc->device->channels[ch->index]);
+ ch_spec = &(devc->device->channels[pch->hw_output_idx]);
switch (key) {
case SR_CONF_DEVICE_OPTIONS:
/* Prime the pipe with the first channel. */
devc->cur_acquisition_channel = sr_next_enabled_channel(sdi, NULL);
+ /* Device specific initialization before acquisition starts. */
+ if (devc->device->init_acquisition)
+ devc->device->init_acquisition(sdi);
+
if ((ret = sr_scpi_source_add(sdi->session, scpi, G_IO_IN, 10,
scpi_pps_receive_data, (void *)sdi)) != SR_OK)
return ret;