aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerhard Sittig <gerhard.sittig@gmx.net>2017-01-06 18:56:40 +0100
committerGerhard Sittig <gerhard.sittig@gmx.net>2017-01-07 21:36:53 +0100
commit1b0f62df2294af7f4fa9b8ecaed76a5658802095 (patch)
treee931d8243c1e7f5b7d9ac6968a471d8b39c2c723
parentb23eb1d4d13d5ccf23303bf0bd378504f84de580 (diff)
hameg-hmo: Do read from second digital pod during acquisition
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.
-rw-r--r--src/hardware/hameg-hmo/api.c30
-rw-r--r--src/hardware/hameg-hmo/protocol.h1
2 files changed, 25 insertions, 6 deletions
diff --git a/src/hardware/hameg-hmo/api.c b/src/hardware/hameg-hmo/api.c
index ead97cd..f474893 100644
--- a/src/hardware/hameg-hmo/api.c
+++ b/src/hardware/hameg-hmo/api.c
@@ -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);
diff --git a/src/hardware/hameg-hmo/protocol.h b/src/hardware/hameg-hmo/protocol.h
index 92c9b67..24deb3f 100644
--- a/src/hardware/hameg-hmo/protocol.h
+++ b/src/hardware/hameg-hmo/protocol.h
@@ -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];