static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi, const struct scope_config *config, struct scope_state *state) { unsigned int i, j; float tmp_float; char command[MAX_COMMAND_SIZE]; for (i = 0; i < config->analog_channels; ++i) { g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_ANALOG_CHAN_STATE], i + 1); if (sr_scpi_get_bool(scpi, command, &state->analog_channels[i].state) != SR_OK) return SR_ERR; g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_DIV], i + 1); if (sr_scpi_get_float(scpi, command, &tmp_float) != SR_OK) return SR_ERR; for (j = 0; j < config->num_vdivs; j++) { if (tmp_float == ((float) (*config->vdivs)[j][0] / (*config->vdivs)[j][1])) { state->analog_channels[i].vdiv = j; break; } } if (j == config->num_vdivs) { sr_err("Could not determine array index for vertical div scale."); return SR_ERR; } g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_OFFSET], i + 1); if (sr_scpi_get_float(scpi, command, &state->analog_channels[i].vertical_offset) != SR_OK) return SR_ERR; g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_COUPLING], i + 1); if (scope_state_get_array_option(scpi, command, config->coupling_options, &state->analog_channels[i].coupling) != SR_OK) return SR_ERR; } return SR_OK; }
SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi) { struct dev_context *devc; struct scope_state *state; const struct scope_config *config; float tmp_float; unsigned int i; devc = sdi->priv; config = devc->model_config; state = devc->model_state; sr_info("Fetching scope state"); if (analog_channel_state_get(sdi->conn, config, state) != SR_OK) return SR_ERR; if (digital_channel_state_get(sdi->conn, config, state) != SR_OK) return SR_ERR; if (sr_scpi_get_float(sdi->conn, (*config->scpi_dialect)[SCPI_CMD_GET_TIMEBASE], &tmp_float) != SR_OK) return SR_ERR; for (i = 0; i < config->num_timebases; i++) { if (tmp_float == ((float) (*config->timebases)[i][0] / (*config->timebases)[i][1])) { state->timebase = i; break; } } if (i == config->num_timebases) { sr_err("Could not determine array index for time base."); return SR_ERR; } if (sr_scpi_get_float(sdi->conn, (*config->scpi_dialect)[SCPI_CMD_GET_HORIZ_TRIGGERPOS], &tmp_float) != SR_OK) return SR_ERR; state->horiz_triggerpos = tmp_float / (((double) (*config->timebases)[state->timebase][0] / (*config->timebases)[state->timebase][1]) * config->num_xdivs); state->horiz_triggerpos -= 0.5; state->horiz_triggerpos *= -1; if (scope_state_get_array_option(sdi->conn, (*config->scpi_dialect)[SCPI_CMD_GET_TRIGGER_SOURCE], config->trigger_sources, &state->trigger_source) != SR_OK) return SR_ERR; if (scope_state_get_array_option(sdi->conn, (*config->scpi_dialect)[SCPI_CMD_GET_TRIGGER_SLOPE], config->trigger_slopes, &state->trigger_slope) != SR_OK) return SR_ERR; if (hmo_update_sample_rate(sdi) != SR_OK) return SR_ERR; sr_info("Fetching finished."); scope_state_dump(config, state); return SR_OK; }
static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi, const struct scope_config *config, struct scope_state *state) { unsigned int i, j; char command[MAX_COMMAND_SIZE]; char *tmp_str; for (i = 0; i < config->analog_channels; i++) { g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_ANALOG_CHAN_STATE], i + 1); if (sr_scpi_get_bool(scpi, command, &state->analog_channels[i].state) != SR_OK) return SR_ERR; g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_DIV], i + 1); if (sr_scpi_get_string(scpi, command, &tmp_str) != SR_OK) return SR_ERR; if (array_float_get(tmp_str, hmo_vdivs, ARRAY_SIZE(hmo_vdivs), &j) != SR_OK) { g_free(tmp_str); sr_err("Could not determine array index for vertical div scale."); return SR_ERR; } g_free(tmp_str); state->analog_channels[i].vdiv = j; g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_VERTICAL_OFFSET], i + 1); if (sr_scpi_get_float(scpi, command, &state->analog_channels[i].vertical_offset) != SR_OK) return SR_ERR; g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_COUPLING], i + 1); if (scope_state_get_array_option(scpi, command, config->coupling_options, &state->analog_channels[i].coupling) != SR_OK) return SR_ERR; g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_PROBE_UNIT], i + 1); if (sr_scpi_get_string(scpi, command, &tmp_str) != SR_OK) return SR_ERR; if (tmp_str[0] == 'A') state->analog_channels[i].probe_unit = 'A'; else state->analog_channels[i].probe_unit = 'V'; g_free(tmp_str); } return SR_OK; }