hameg-hmo: Forward internal channel state to sigrok channel state

This fixes bug #883.
This commit is contained in:
Stefan Brüns 2017-12-09 22:19:30 +01:00 committed by Uwe Hermann
parent 41802ca4c0
commit bd70ec4b73
1 changed files with 30 additions and 4 deletions

View File

@ -379,13 +379,29 @@ static int array_float_get(gchar *value, const uint64_t array[][2],
return SR_ERR;
}
static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi,
static struct sr_channel *get_channel_by_index_and_type(GSList *channel_lhead,
int index, int type)
{
while (channel_lhead) {
struct sr_channel *ch = channel_lhead->data;
if (ch->index == index && ch->type == type)
return ch;
channel_lhead = channel_lhead->next;
}
return 0;
}
static int analog_channel_state_get(struct sr_dev_inst *sdi,
const struct scope_config *config,
struct scope_state *state)
{
unsigned int i, j;
char command[MAX_COMMAND_SIZE];
char *tmp_str;
struct sr_channel *ch;
struct sr_scpi_dev_inst *scpi = sdi->conn;
for (i = 0; i < config->analog_channels; i++) {
g_snprintf(command, sizeof(command),
@ -396,6 +412,10 @@ static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi,
&state->analog_channels[i].state) != SR_OK)
return SR_ERR;
ch = get_channel_by_index_and_type(sdi->channels, i, SR_CHANNEL_ANALOG);
if (ch)
ch->enabled = state->analog_channels[i].state;
g_snprintf(command, sizeof(command),
(*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_DIV],
i + 1);
@ -446,12 +466,14 @@ static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi,
return SR_OK;
}
static int digital_channel_state_get(struct sr_scpi_dev_inst *scpi,
static int digital_channel_state_get(struct sr_dev_inst *sdi,
const struct scope_config *config,
struct scope_state *state)
{
unsigned int i;
char command[MAX_COMMAND_SIZE];
struct sr_channel *ch;
struct sr_scpi_dev_inst *scpi = sdi->conn;
for (i = 0; i < config->digital_channels; i++) {
g_snprintf(command, sizeof(command),
@ -461,6 +483,10 @@ static int digital_channel_state_get(struct sr_scpi_dev_inst *scpi,
if (sr_scpi_get_bool(scpi, command,
&state->digital_channels[i]) != SR_OK)
return SR_ERR;
ch = get_channel_by_index_and_type(sdi->channels, i, SR_CHANNEL_LOGIC);
if (ch)
ch->enabled = state->digital_channels[i];
}
for (i = 0; i < config->digital_pods; i++) {
@ -552,10 +578,10 @@ SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi)
sr_info("Fetching scope state");
if (analog_channel_state_get(sdi->conn, config, state) != SR_OK)
if (analog_channel_state_get(sdi, config, state) != SR_OK)
return SR_ERR;
if (digital_channel_state_get(sdi->conn, config, state) != SR_OK)
if (digital_channel_state_get(sdi, config, state) != SR_OK)
return SR_ERR;
if (sr_scpi_get_float(sdi->conn,