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.
This commit is contained in:
Gerhard Sittig 2017-01-06 18:56:40 +01:00
parent b23eb1d4d1
commit 1b0f62df22
2 changed files with 25 additions and 6 deletions

View 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);

View 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];