]> sigrok.org Git - libsigrok.git/commitdiff
lecroy-xstream: Fix capabilities listing in config_list()
authorSoeren Apel <redacted>
Sun, 26 Feb 2017 20:01:26 +0000 (21:01 +0100)
committerUwe Hermann <redacted>
Wed, 8 Mar 2017 00:10:39 +0000 (01:10 +0100)
This fixes bug #913.

src/hardware/lecroy-xstream/api.c
src/hardware/lecroy-xstream/protocol.c
src/hardware/lecroy-xstream/protocol.h

index d859681545f6a1bac236ab6496105b1ceb7b8186..25c11485b77318dd85df49f6fe1187d0227a7870 100644 (file)
@@ -32,6 +32,26 @@ static const uint32_t scanopts[] = {
        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_TRIGGER_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+       SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+       SR_CONF_NUM_HDIV | SR_CONF_GET,
+       SR_CONF_TRIGGER_SLOPE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+       SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_GET | SR_CONF_SET,
+       SR_CONF_SAMPLERATE | SR_CONF_GET,
+};
+
+static const uint32_t analog_devopts[] = {
+       SR_CONF_NUM_VDIV | SR_CONF_GET,
+       SR_CONF_COUPLING | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+       SR_CONF_VDIV | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+};
+
 static int check_manufacturer(const char *manufacturer)
 {
        unsigned int i;
@@ -402,24 +422,38 @@ static int config_list(uint32_t key, GVariant **data,
 
        (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,
+                       analog_devopts, ARRAY_SIZE(analog_devopts),
                        sizeof(uint32_t));
                break;
        case SR_CONF_COUPLING:
index 73691081df0d77353e285b503ae9f4b0dec414c0..ec7e958c932c871e79fbff32d03747cf0da41fdb 100644 (file)
@@ -74,23 +74,6 @@ struct lecroy_wavedesc {
        };
 } __attribute__((packed));
 
-static const uint32_t devopts[] = {
-       SR_CONF_OSCILLOSCOPE,
-       SR_CONF_LIMIT_FRAMES | SR_CONF_GET | SR_CONF_SET,
-       SR_CONF_TRIGGER_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
-       SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
-       SR_CONF_NUM_HDIV | SR_CONF_GET,
-       SR_CONF_TRIGGER_SLOPE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
-       SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_GET | SR_CONF_SET,
-       SR_CONF_SAMPLERATE | SR_CONF_GET,
-};
-
-static const uint32_t analog_devopts[] = {
-       SR_CONF_NUM_VDIV | SR_CONF_GET,
-       SR_CONF_COUPLING | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
-       SR_CONF_VDIV | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
-};
-
 static const char *coupling_options[] = {
        "A1M", // AC with 1 MOhm termination
        "D50", // DC with 50 Ohm termination
@@ -200,12 +183,6 @@ static const struct scope_config scope_models[] = {
                .analog_channels = 4,
                .analog_names = &scope_analog_channel_names,
 
-               .devopts = &devopts,
-               .num_devopts = ARRAY_SIZE(devopts),
-
-               .analog_devopts = &analog_devopts,
-               .num_analog_devopts = ARRAY_SIZE(analog_devopts),
-
                .coupling_options = &coupling_options,
                .trigger_sources = &trigger_sources,
                .trigger_slopes = &scope_trigger_slopes,
index 3cec92981e74e84b7caea49ad94d132b03613b93..0200c197d4b3659ff7dc0572bfbdc32e2a482e4f 100644 (file)
@@ -38,12 +38,6 @@ struct scope_config {
 
        const char *(*analog_names)[];
 
-       const uint32_t (*devopts)[];
-       const uint8_t num_devopts;
-
-       const uint32_t (*analog_devopts)[];
-       const uint8_t num_analog_devopts;
-
        const char *(*coupling_options)[];
        const uint8_t num_coupling_options;