X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fhardware%2Fhameg-hmo%2Fprotocol.c;h=e79901caaf37ee447f53119ae87d759005b14543;hb=b0e80e9aa9a7398fa01a7949deb17640ca3c7d47;hp=0c4d57f3f6cf465ba34ff17b590a2924192e944c;hpb=bd633efa3215c1bb8600a5728e5b3a692940c679;p=libsigrok.git diff --git a/src/hardware/hameg-hmo/protocol.c b/src/hardware/hameg-hmo/protocol.c index 0c4d57f3..e79901ca 100644 --- a/src/hardware/hameg-hmo/protocol.c +++ b/src/hardware/hameg-hmo/protocol.c @@ -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++) { @@ -481,7 +507,6 @@ SR_PRIV int hmo_update_sample_rate(const struct sr_dev_inst *sdi) struct dev_context *devc; struct scope_state *state; const struct scope_config *config; - int tmp; unsigned int i; float tmp_float; @@ -495,8 +520,21 @@ SR_PRIV int hmo_update_sample_rate(const struct sr_dev_inst *sdi) channel_found = FALSE; for (i = 0; i < config->analog_channels; i++) { - if (state->analog_channels[i].state) { - g_snprintf(chan_name, sizeof(chan_name), "CHAN%d", i + 1); + if (!state->analog_channels[i].state) + continue; + g_snprintf(chan_name, sizeof(chan_name), "CHAN%d", i + 1); + g_snprintf(tmp_str, sizeof(tmp_str), + (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE], + chan_name); + channel_found = TRUE; + break; + } + + if (!channel_found) { + for (i = 0; i < config->digital_pods; i++) { + if (!state->digital_pods[i]) + continue; + g_snprintf(chan_name, sizeof(chan_name), "POD%d", i); g_snprintf(tmp_str, sizeof(tmp_str), (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE], chan_name); @@ -505,19 +543,6 @@ SR_PRIV int hmo_update_sample_rate(const struct sr_dev_inst *sdi) } } - if (!channel_found) { - for (i = 0; i < config->digital_pods; i++) { - if (state->digital_pods[i]) { - g_snprintf(chan_name, sizeof(chan_name), "POD%d", i); - g_snprintf(tmp_str, sizeof(tmp_str), - (*config->scpi_dialect)[SCPI_CMD_GET_SAMPLE_RATE_LIVE], - chan_name); - channel_found = TRUE; - break; - } - } - } - /* No channel is active, ask the instrument for the sample rate * in single shot mode */ if (!channel_found) { @@ -553,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, @@ -635,7 +660,6 @@ SR_PRIV void hmo_scope_state_free(struct scope_state *state) SR_PRIV int hmo_init_device(struct sr_dev_inst *sdi) { - char tmp[25]; int model_index; unsigned int i, j, group; struct sr_channel *ch; @@ -663,9 +687,13 @@ SR_PRIV int hmo_init_device(struct sr_dev_inst *sdi) devc->analog_groups = g_malloc0(sizeof(struct sr_channel_group*) * scope_models[model_index].analog_channels); - devc->digital_groups = g_malloc0(sizeof(struct sr_channel_group*) * scope_models[model_index].digital_pods); + if (!devc->analog_groups || !devc->digital_groups) { + g_free(devc->analog_groups); + g_free(devc->digital_groups); + return SR_ERR_MALLOC; + } /* Add analog channels. */ for (i = 0; i < scope_models[model_index].analog_channels; i++) { @@ -684,11 +712,8 @@ SR_PRIV int hmo_init_device(struct sr_dev_inst *sdi) /* Add digital channel groups. */ for (i = 0; i < scope_models[model_index].digital_pods; i++) { - g_snprintf(tmp, 25, "POD%d", i); - devc->digital_groups[i] = g_malloc0(sizeof(struct sr_channel_group)); - - devc->digital_groups[i]->name = g_strdup(tmp); + devc->digital_groups[i]->name = g_strdup_printf("POD%d", i); sdi->channel_groups = g_slist_append(sdi->channel_groups, devc->digital_groups[i]); }