]> sigrok.org Git - libsigrok.git/commitdiff
hameg-hmo: Do read from second digital pod during acquisition
authorGerhard Sittig <redacted>
Fri, 6 Jan 2017 17:56:40 +0000 (18:56 +0100)
committerGerhard Sittig <redacted>
Sat, 7 Jan 2017 20:36:53 +0000 (21:36 +0100)
The previous implementation only added one of the digital channels to
the list of enabled channels that are involved in the acquisition (the
first one that was found). This means that when the set of used digital
channels spans more than one pod/group, the second pod will never be
read from.

Make sure to enable one digital channel per pod/group, such that
acquisition will retrieve data from all involved input sources.

Add comments while we are here. Mention how the different setup, check,
start, and receive routines which are spread across several files do
interact to achieve acquisition.

src/hardware/hameg-hmo/api.c
src/hardware/hameg-hmo/protocol.h

index ead97cd4cef46eb48c4a28007d0bf3783c1c79d4..f47489315d903f63a9515bc1ba09ee43b639f1f7 100644 (file)
@@ -706,7 +706,8 @@ static int hmo_setup_channels(const struct sr_dev_inst *sdi)
 static int dev_acquisition_start(const struct sr_dev_inst *sdi)
 {
        GSList *l;
-       gboolean digital_added;
+       gboolean digital_added[MAX_DIGITAL_GROUP_COUNT];
+       size_t group;
        struct sr_channel *ch;
        struct dev_context *devc;
        struct sr_scpi_dev_inst *scpi;
@@ -717,39 +718,56 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
 
        scpi = sdi->conn;
        devc = sdi->priv;
-       digital_added = FALSE;
 
+       /* Preset empty results. */
+       for (group = 0; group < ARRAY_SIZE(digital_added); group++)
+               digital_added[group] = FALSE;
        g_slist_free(devc->enabled_channels);
        devc->enabled_channels = NULL;
 
+       /*
+        * Contruct the list of enabled channels.
+        */
        for (l = sdi->channels; l; l = l->next) {
                ch = l->data;
                if (!ch->enabled)
                        continue;
-               /* Only add a single digital channel. */
-               if (ch->type != SR_CHANNEL_LOGIC || !digital_added) {
+               /* Only add a single digital channel per group (pod). */
+               group = ch->index / 8;
+               if (ch->type != SR_CHANNEL_LOGIC || !digital_added[group]) {
                        devc->enabled_channels = g_slist_append(
                                        devc->enabled_channels, ch);
                        if (ch->type == SR_CHANNEL_LOGIC)
-                               digital_added = TRUE;
+                               digital_added[group] = TRUE;
                }
        }
-
        if (!devc->enabled_channels)
                return SR_ERR;
 
+       /*
+        * Check constraints. Some channels can be either analog or
+        * digital, but not both at the same time.
+        */
        if (hmo_check_channels(devc->enabled_channels) != SR_OK) {
                sr_err("Invalid channel configuration specified!");
                ret = SR_ERR_NA;
                goto free_enabled;
        }
 
+       /*
+        * Configure the analog and digital channels and the
+        * corresponding digital pods.
+        */
        if (hmo_setup_channels(sdi) != SR_OK) {
                sr_err("Failed to setup channel configuration!");
                ret = SR_ERR;
                goto free_enabled;
        }
 
+       /*
+        * Start acquisition on the first enabled channel. The
+        * receive routine will continue driving the acquisition.
+        */
        sr_scpi_source_add(sdi->session, scpi, G_IO_IN, 50,
                        hmo_receive_data, (void *)sdi);
 
index 92c9b6754e2affd59d28a38e99088f48f8027a0a..24deb3f759ae99b39e8d720d6250f3630093f08d 100644 (file)
@@ -30,6 +30,7 @@
 
 #define MAX_INSTRUMENT_VERSIONS 10
 #define MAX_COMMAND_SIZE 48
+#define MAX_DIGITAL_GROUP_COUNT        2
 
 struct scope_config {
        const char *name[MAX_INSTRUMENT_VERSIONS];