aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerhard Sittig <gerhard.sittig@gmx.net>2017-01-06 22:00:28 +0100
committerUwe Hermann <uwe@hermann-uwe.de>2017-01-20 18:53:43 +0100
commit4889acefb2178f0c7f52ff9d97aa50d2b5607aa6 (patch)
tree6ea7dfc7543e6b1b32f56fd469354eac90aca278
parente06875b2ce47e128922d63f09ca4e9b3d8105722 (diff)
hameg-hmo: Rephrase the channel constraints check (analog vs digital)
Phrase the logic which checks the use of analog channels and digital pods in more generic terms. Place a comment about the contraints' being potentially dependent on the specific HMO model. This implementation should lend itself better to future adjustment (HMO1002?).
-rw-r--r--src/hardware/hameg-hmo/api.c42
-rw-r--r--src/hardware/hameg-hmo/protocol.h2
2 files changed, 31 insertions, 13 deletions
diff --git a/src/hardware/hameg-hmo/api.c b/src/hardware/hameg-hmo/api.c
index 00d57c5..f8fc644 100644
--- a/src/hardware/hameg-hmo/api.c
+++ b/src/hardware/hameg-hmo/api.c
@@ -592,34 +592,50 @@ static int hmo_check_channels(GSList *channels)
{
GSList *l;
struct sr_channel *ch;
- gboolean enabled_pod1, enabled_pod2, enabled_chan3, enabled_chan4;
+ gboolean enabled_chan[MAX_ANALOG_CHANNEL_COUNT];
+ gboolean enabled_pod[MAX_DIGITAL_GROUP_COUNT];
+ size_t idx;
- enabled_pod1 = enabled_pod2 = enabled_chan3 = enabled_chan4 = FALSE;
+ /* Preset "not enabled" for all channels / pods. */
+ for (idx = 0; idx < ARRAY_SIZE(enabled_chan); idx++)
+ enabled_chan[idx] = FALSE;
+ for (idx = 0; idx < ARRAY_SIZE(enabled_pod); idx++)
+ enabled_pod[idx] = FALSE;
+ /*
+ * Determine which channels / pods are required for the caller's
+ * specified configuration.
+ */
for (l = channels; l; l = l->next) {
ch = l->data;
switch (ch->type) {
case SR_CHANNEL_ANALOG:
- if (ch->index == 2)
- enabled_chan3 = TRUE;
- else if (ch->index == 3)
- enabled_chan4 = TRUE;
+ idx = ch->index;
+ if (idx < ARRAY_SIZE(enabled_chan))
+ enabled_chan[idx] = TRUE;
break;
case SR_CHANNEL_LOGIC:
- if (ch->index < 8)
- enabled_pod1 = TRUE;
- else
- enabled_pod2 = TRUE;
+ idx = ch->index / 8;
+ if (idx < ARRAY_SIZE(enabled_pod))
+ enabled_pod[idx] = TRUE;
break;
default:
return SR_ERR;
}
}
- if ((enabled_pod1 && enabled_chan3) ||
- (enabled_pod2 && enabled_chan4))
+ /*
+ * Check for resource conflicts. Some channels can be either
+ * analog or digital, but never both at the same time.
+ *
+ * Note that the constraints might depend on the specific model.
+ * These tests might need some adjustment when support for more
+ * models gets added to the driver.
+ */
+ if (enabled_pod[0] && enabled_chan[2])
+ return SR_ERR;
+ if (enabled_pod[1] && enabled_chan[3])
return SR_ERR;
-
return SR_OK;
}
diff --git a/src/hardware/hameg-hmo/protocol.h b/src/hardware/hameg-hmo/protocol.h
index b251bc8..ccdcb90 100644
--- a/src/hardware/hameg-hmo/protocol.h
+++ b/src/hardware/hameg-hmo/protocol.h
@@ -30,6 +30,8 @@
#define MAX_INSTRUMENT_VERSIONS 10
#define MAX_COMMAND_SIZE 48
+#define MAX_ANALOG_CHANNEL_COUNT 4
+#define MAX_DIGITAL_CHANNEL_COUNT 16
#define MAX_DIGITAL_GROUP_COUNT 2
struct scope_config {