SR_CONF_CONN,
};
+static const uint32_t drvopts[] = {
+ SR_CONF_OSCILLOSCOPE,
+};
+
+static const uint32_t devopts[] = {
+ SR_CONF_LIMIT_FRAMES | SR_CONF_GET | SR_CONF_SET,
+ SR_CONF_SAMPLERATE | SR_CONF_GET,
+ SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+ SR_CONF_NUM_HDIV | SR_CONF_GET,
+ SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_GET | SR_CONF_SET,
+ SR_CONF_TRIGGER_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+ SR_CONF_TRIGGER_SLOPE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+};
+
+static const uint32_t analog_devopts[] = {
+ SR_CONF_NUM_VDIV | SR_CONF_GET,
+ SR_CONF_VDIV | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+ SR_CONF_COUPLING | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+};
+
static int check_manufacturer(const char *manufacturer)
{
unsigned int i;
devc = NULL;
hw_info = NULL;
- sr_scpi_send(scpi, "COMM_HEADER OFF,WORD,BIN");
if (sr_scpi_get_hw_id(scpi, &hw_info) != SR_OK) {
sr_info("Couldn't get IDN response.");
goto fail;
fail:
sr_scpi_hw_info_free(hw_info);
- if (sdi)
- sr_dev_inst_free(sdi);
+ sr_dev_inst_free(sdi);
g_free(devc);
return NULL;
}
static int config_get(uint32_t key, GVariant **data,
- const struct sr_dev_inst *sdi,
- const struct sr_channel_group *cg)
+ const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
{
int ret;
unsigned int i;
model = devc->model_config;
state = devc->model_state;
*data = NULL;
+
switch (key) {
case SR_CONF_NUM_HDIV:
*data = g_variant_new_int32(model->num_xdivs);
break;
case SR_CONF_TIMEBASE:
*data = g_variant_new("(tt)",
- model->timebases[state->timebase].p,
- model->timebases[state->timebase].q);
+ model->timebases[state->timebase].p,
+ model->timebases[state->timebase].q);
ret = SR_OK;
break;
case SR_CONF_NUM_VDIV:
if (cg != devc->analog_groups[i])
continue;
*data = g_variant_new("(tt)",
- model->vdivs[state->analog_channels[i].vdiv].p,
- model->vdivs[state->analog_channels[i].vdiv].q);
+ model->vdivs[state->analog_channels[i].vdiv].p,
+ model->vdivs[state->analog_channels[i].vdiv].q);
ret = SR_OK;
}
break;
ret = SR_OK;
break;
case SR_CONF_COUPLING:
-
for (i = 0; i < model->analog_channels; i++) {
- if (cg != devc->analog_groups[i]) {
+ if (cg != devc->analog_groups[i])
continue;
- }
*data = g_variant_new_string((*model->coupling_options)[state->analog_channels[i].coupling]);
ret = SR_OK;
}
default:
ret = SR_ERR_NA;
}
+
return ret;
}
return g_variant_builder_end(&gvb);
}
-static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
- const struct sr_channel_group *cg)
+static int config_set(uint32_t key, GVariant *data,
+ const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
{
int ret;
unsigned int i, j;
}
break;
case SR_CONF_COUPLING:
-
tmp = g_variant_get_string(data, NULL);
for (i = 0; (*model->coupling_options)[i]; i++) {
for (j = 1; j <= model->analog_channels; j++) {
if (cg != devc->analog_groups[j - 1])
continue;
- state->analog_channels[j-1].coupling = i;
+ state->analog_channels[j - 1].coupling = i;
g_snprintf(command, sizeof(command),
"C%d:COUPLING %s", j, tmp);
return ret;
}
-static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
- const struct sr_channel_group *cg)
+static int config_list(uint32_t key, GVariant **data,
+ const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
{
struct dev_context *devc = NULL;
const struct scope_config *model = NULL;
+
(void)cg;
- if (sdi) {
- devc = sdi->priv;
- model = devc->model_config;
+ /* SR_CONF_SCAN_OPTIONS is always valid, regardless of sdi or channel group. */
+ if (key == SR_CONF_SCAN_OPTIONS) {
+ *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
+ scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t));
+ return SR_OK;
}
- switch (key) {
- case SR_CONF_SCAN_OPTIONS:
+ /* If sdi is NULL, nothing except SR_CONF_DEVICE_OPTIONS can be provided. */
+ if (key == SR_CONF_DEVICE_OPTIONS && !sdi) {
*data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
- scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t));
- break;
+ drvopts, ARRAY_SIZE(drvopts), sizeof(uint32_t));
+ return SR_OK;
+ }
+
+ /* Every other option requires a valid device instance. */
+ if (!sdi)
+ return SR_ERR_ARG;
+
+ devc = sdi->priv;
+ model = devc->model_config;
+
+ switch (key) {
case SR_CONF_DEVICE_OPTIONS:
if (!cg) {
+ /* If cg is NULL, only the SR_CONF_DEVICE_OPTIONS that are not
+ * specific to a channel group must be returned. */
*data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
- model->devopts,
- model->num_devopts,
- sizeof(uint32_t));
- break;
+ devopts, ARRAY_SIZE(devopts), sizeof(uint32_t));
+ return SR_OK;
}
*data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
- model->analog_devopts,
- model->num_analog_devopts,
- sizeof(uint32_t));
+ analog_devopts, ARRAY_SIZE(analog_devopts),
+ sizeof(uint32_t));
break;
case SR_CONF_COUPLING:
*data = g_variant_new_strv(*model->coupling_options,
return SR_ERR;
g_snprintf(command, sizeof(command),
- "COMM_FORMAT DEF9,WORD,BIN;C%d:WAVEFORM?", ch->index+1);
+ "COMM_FORMAT DEF9,WORD,BIN;C%d:WAVEFORM?", ch->index + 1);
return sr_scpi_send(sdi->conn, command);
}
-static int lecroy_setup_channels(const struct sr_dev_inst *sdi)
+static int setup_channels(const struct sr_dev_inst *sdi)
{
GSList *l;
gboolean setup_changed;
if (ch->enabled == state->analog_channels[ch->index].state)
break;
g_snprintf(command, sizeof(command), "C%d:TRACE %s",
- ch->index+1, ch->enabled ? "ON" : "OFF");
+ ch->index + 1, ch->enabled ? "ON" : "OFF");
if (sr_scpi_send(scpi, command) != SR_OK)
return SR_ERR;
* Configure the analog channels and the
* corresponding digital pods.
*/
- if (lecroy_setup_channels(sdi) != SR_OK) {
+ if (setup_channels(sdi) != SR_OK) {
sr_err("Failed to setup channel configuration!");
ret = SR_ERR;
goto free_enabled;
free_enabled:
g_slist_free(devc->enabled_channels);
devc->enabled_channels = NULL;
+
return ret;
}
static struct sr_dev_driver lecroy_xstream_driver_info = {
.name = "lecroy-xstream",
- .longname = "LeCroy Xstream based scopes",
+ .longname = "LeCroy X-Stream",
.api_version = 1,
.init = std_init,
.cleanup = std_cleanup,