static int digital_channel_state_get(struct sr_scpi_dev_inst *scpi, const struct scope_config *config, struct scope_state *state) { unsigned int i; char command[MAX_COMMAND_SIZE]; for (i = 0; i < config->digital_channels; ++i) { g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_DIG_CHAN_STATE], i); if (sr_scpi_get_bool(scpi, command, &state->digital_channels[i]) != SR_OK) return SR_ERR; } for (i = 0; i < config->digital_pods; ++i) { g_snprintf(command, sizeof(command), (*config->scpi_dialect)[SCPI_CMD_GET_DIG_POD_STATE], i + 1); if (sr_scpi_get_bool(scpi, command, &state->digital_pods[i]) != SR_OK) return SR_ERR; } 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; 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; }
/** * Send a SCPI *OPC? command, read the reply and return the result of the * command. * * @param scpi Previously initialised SCPI device structure. * * @return SR_OK on success, SR_ERR* on failure. */ SR_PRIV int sr_scpi_get_opc(struct sr_scpi_dev_inst *scpi) { unsigned int i; gboolean opc; for (i = 0; i < SCPI_READ_RETRIES; ++i) { sr_scpi_get_bool(scpi, SCPI_CMD_OPC, &opc); if (opc) return SR_OK; g_usleep(SCPI_READ_RETRY_TIMEOUT_US); } return SR_ERR; }
SR_PRIV int rigol_ds_get_dev_cfg(const struct sr_dev_inst *sdi) { struct dev_context *devc; char *cmd; unsigned int i; int res; devc = sdi->priv; /* Analog channel state. */ for (i = 0; i < devc->model->analog_channels; i++) { cmd = g_strdup_printf(":CHAN%d:DISP?", i + 1); res = sr_scpi_get_bool(sdi->conn, cmd, &devc->analog_channels[i]); g_free(cmd); if (res != SR_OK) return SR_ERR; } sr_dbg("Current analog channel state:"); for (i = 0; i < devc->model->analog_channels; i++) sr_dbg("CH%d %s", i + 1, devc->analog_channels[i] ? "on" : "off"); /* Digital channel state. */ if (devc->model->has_digital) { if (sr_scpi_get_bool(sdi->conn, devc->model->series->protocol >= PROTOCOL_V4 ? ":LA:STAT?" : ":LA:DISP?", &devc->la_enabled) != SR_OK) return SR_ERR; sr_dbg("Logic analyzer %s, current digital channel state:", devc->la_enabled ? "enabled" : "disabled"); for (i = 0; i < ARRAY_SIZE(devc->digital_channels); i++) { cmd = g_strdup_printf( devc->model->series->protocol >= PROTOCOL_V4 ? ":LA:DIG%d:DISP?" : ":DIG%d:TURN?", i); res = sr_scpi_get_bool(sdi->conn, cmd, &devc->digital_channels[i]); g_free(cmd); if (res != SR_OK) return SR_ERR; sr_dbg("D%d: %s", i, devc->digital_channels[i] ? "on" : "off"); } } /* Timebase. */ if (sr_scpi_get_float(sdi->conn, ":TIM:SCAL?", &devc->timebase) != SR_OK) return SR_ERR; sr_dbg("Current timebase %g", devc->timebase); /* Vertical gain. */ for (i = 0; i < devc->model->analog_channels; i++) { cmd = g_strdup_printf(":CHAN%d:SCAL?", i + 1); res = sr_scpi_get_float(sdi->conn, cmd, &devc->vdiv[i]); g_free(cmd); if (res != SR_OK) return SR_ERR; } sr_dbg("Current vertical gain:"); for (i = 0; i < devc->model->analog_channels; i++) sr_dbg("CH%d %g", i + 1, devc->vdiv[i]); /* Vertical offset. */ for (i = 0; i < devc->model->analog_channels; i++) { cmd = g_strdup_printf(":CHAN%d:OFFS?", i + 1); res = sr_scpi_get_float(sdi->conn, cmd, &devc->vert_offset[i]); g_free(cmd); if (res != SR_OK) return SR_ERR; } sr_dbg("Current vertical offset:"); for (i = 0; i < devc->model->analog_channels; i++) sr_dbg("CH%d %g", i + 1, devc->vert_offset[i]); /* Coupling. */ for (i = 0; i < devc->model->analog_channels; i++) { cmd = g_strdup_printf(":CHAN%d:COUP?", i + 1); res = sr_scpi_get_string(sdi->conn, cmd, &devc->coupling[i]); g_free(cmd); if (res != SR_OK) return SR_ERR; } sr_dbg("Current coupling:"); for (i = 0; i < devc->model->analog_channels; i++) sr_dbg("CH%d %s", i + 1, devc->coupling[i]); /* Trigger source. */ if (sr_scpi_get_string(sdi->conn, ":TRIG:EDGE:SOUR?", &devc->trigger_source) != SR_OK) return SR_ERR; sr_dbg("Current trigger source %s", devc->trigger_source); /* Horizontal trigger position. */ if (sr_scpi_get_float(sdi->conn, ":TIM:OFFS?", &devc->horiz_triggerpos) != SR_OK) return SR_ERR; sr_dbg("Current horizontal trigger position %g", devc->horiz_triggerpos); /* Trigger slope. */ if (sr_scpi_get_string(sdi->conn, ":TRIG:EDGE:SLOP?", &devc->trigger_slope) != SR_OK) return SR_ERR; sr_dbg("Current trigger slope %s", devc->trigger_slope); 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; }