X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Frigol-ds%2Fapi.c;h=a142a2d8c294455c79faba4bce13390978b7ed38;hb=c36f78f7728e8b5263bed440530a61caa6e30a26;hp=3ce237d7b857c0c1c4cf9f4e0dd914d2bb13188d;hpb=d50725e0126a5d52d97e7ea49e37c66c15108156;p=libsigrok.git diff --git a/src/hardware/rigol-ds/api.c b/src/hardware/rigol-ds/api.c index 3ce237d7..a142a2d8 100644 --- a/src/hardware/rigol-ds/api.c +++ b/src/hardware/rigol-ds/api.c @@ -41,15 +41,15 @@ static const uint32_t devopts[] = { 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, SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_SET, - SR_CONF_NUM_TIMEBASE | SR_CONF_GET, + SR_CONF_NUM_HDIV | SR_CONF_GET, SR_CONF_SAMPLERATE | SR_CONF_GET, + SR_CONF_DATA_SOURCE | 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, - SR_CONF_DATA_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, }; static const uint64_t timebases[][2] = { @@ -192,7 +192,7 @@ static const struct rigol_ds_series supported_series[] = { [DS1000] = {VENDOR(RIGOL), "DS1000", PROTOCOL_V2, FORMAT_IEEE488_2, {50, 1}, {2, 1000}, 12, 600, 1048576}, [DS2000] = {VENDOR(RIGOL), "DS2000", PROTOCOL_V3, FORMAT_IEEE488_2, - {500, 1}, {2, 1000}, 14, 1400, 14000}, + {500, 1}, {500, 1000000}, 14, 1400, 14000}, [DS2000A] = {VENDOR(RIGOL), "DS2000A", PROTOCOL_V3, FORMAT_IEEE488_2, {1000, 1}, {500, 1000000}, 14, 1400, 14000}, [DSO1000] = {VENDOR(AGILENT), "DSO1000", PROTOCOL_V3, FORMAT_IEEE488_2, @@ -250,7 +250,6 @@ static void clear_helper(void *priv) g_free(devc->trigger_source); g_free(devc->trigger_slope); g_free(devc->analog_groups); - g_free(devc->digital_group); g_free(devc); } @@ -345,8 +344,7 @@ static struct sr_dev_inst *probe_device(struct sr_scpi_dev_inst *scpi) for (i = 0; i < model->analog_channels; i++) { if (!(channel_name = g_strdup_printf("CH%d", i + 1))) return NULL; - ch = sr_channel_new(i, SR_CHANNEL_ANALOG, TRUE, channel_name); - sdi->channels = g_slist_append(sdi->channels, ch); + ch = sr_channel_new(sdi, i, SR_CHANNEL_ANALOG, TRUE, channel_name); devc->analog_groups[i] = g_malloc0(sizeof(struct sr_channel_group)); @@ -357,14 +355,13 @@ static struct sr_dev_inst *probe_device(struct sr_scpi_dev_inst *scpi) } if (devc->model->has_digital) { - devc->digital_group = g_malloc0(sizeof(struct sr_channel_group*)); + devc->digital_group = g_malloc0(sizeof(struct sr_channel_group)); for (i = 0; i < ARRAY_SIZE(devc->digital_channels); i++) { if (!(channel_name = g_strdup_printf("D%d", i))) return NULL; - ch = sr_channel_new(i, SR_CHANNEL_LOGIC, TRUE, channel_name); + ch = sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE, channel_name); g_free(channel_name); - sdi->channels = g_slist_append(sdi->channels, ch); devc->digital_group->channels = g_slist_append( devc->digital_group->channels, ch); } @@ -381,8 +378,10 @@ static struct sr_dev_inst *probe_device(struct sr_scpi_dev_inst *scpi) } for (i = 0; i < NUM_VDIV; i++) - if (!memcmp(&devc->model->series->min_vdiv, &vdivs[i], sizeof(uint64_t[2]))) + if (!memcmp(&devc->model->series->min_vdiv, &vdivs[i], sizeof(uint64_t[2]))) { devc->vdivs = &vdivs[i]; + devc->num_vdivs = NUM_VDIV - i; + } if (!(devc->buffer = g_try_malloc(ACQ_BUFFER_SIZE))) return NULL; @@ -502,7 +501,7 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s const char *tmp_str; uint64_t samplerate; int analog_channel = -1; - float smallest_diff = 0.0000000001; + float smallest_diff = INFINITY; int idx = -1; unsigned i; @@ -527,11 +526,12 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s } switch (key) { - case SR_CONF_NUM_TIMEBASE: + case SR_CONF_NUM_HDIV: *data = g_variant_new_int32(devc->model->series->num_horizontal_divs); break; case SR_CONF_NUM_VDIV: - *data = g_variant_new_int32(NUM_VDIV); + *data = g_variant_new_int32(devc->num_vdivs); + break; case SR_CONF_DATA_SOURCE: if (devc->data_source == DATA_SOURCE_LIVE) *data = g_variant_new_string("Live"); @@ -818,14 +818,9 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * return SR_ERR_ARG; /* If a channel group is specified, it must be a valid one. */ - if (cg) { - for (i = 0; i < devc->model->analog_channels; i++) - if (cg == devc->analog_groups[i]) - break; - if (i >= devc->model->analog_channels) { - sr_err("Invalid channel group specified."); - return SR_ERR; - } + if (cg && !g_slist_find(sdi->channel_groups, cg)) { + sr_err("Invalid channel group specified."); + return SR_ERR; } switch (key) { @@ -865,7 +860,7 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * return SR_ERR_CHANNEL_GROUP; } g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); - for (i = 0; i < NUM_VDIV; i++) { + for (i = 0; i < devc->num_vdivs; i++) { rational[0] = g_variant_new_uint64(devc->vdivs[i][0]); rational[1] = g_variant_new_uint64(devc->vdivs[i][1]); tuple = g_variant_new_tuple(rational, 2);