X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fhameg-hmo%2Fapi.c;h=8a4212af096d7610209f7419de1a36135405dee2;hb=d2f7c417fdd96a13d8fd86350d2fc13db16f626c;hp=f47489315d903f63a9515bc1ba09ee43b639f1f7;hpb=1b0f62df2294af7f4fa9b8ecaed76a5658802095;p=libsigrok.git diff --git a/src/hardware/hameg-hmo/api.c b/src/hardware/hameg-hmo/api.c index f4748931..8a4212af 100644 --- a/src/hardware/hameg-hmo/api.c +++ b/src/hardware/hameg-hmo/api.c @@ -98,10 +98,8 @@ static struct sr_dev_inst *hmo_probe_serial_device(struct sr_scpi_dev_inst *scpi return sdi; fail: - if (hw_info) - sr_scpi_hw_info_free(hw_info); - if (sdi) - sr_dev_inst_free(sdi); + sr_scpi_hw_info_free(hw_info); + sr_dev_inst_free(sdi); g_free(devc); return NULL; @@ -592,34 +590,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; } @@ -707,7 +721,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) { GSList *l; gboolean digital_added[MAX_DIGITAL_GROUP_COUNT]; - size_t group; + size_t group, pod_count; struct sr_channel *ch; struct dev_context *devc; struct sr_scpi_dev_inst *scpi; @@ -726,8 +740,10 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) devc->enabled_channels = NULL; /* - * Contruct the list of enabled channels. + * Contruct the list of enabled channels. Determine the highest + * number of digital pods involved in the acquisition. */ + pod_count = 0; for (l = sdi->channels; l; l = l->next) { ch = l->data; if (!ch->enabled) @@ -737,12 +753,17 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) 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) + if (ch->type == SR_CHANNEL_LOGIC) { digital_added[group] = TRUE; + if (pod_count < group + 1) + pod_count = group + 1; + } } } if (!devc->enabled_channels) return SR_ERR; + devc->pod_count = pod_count; + devc->logic_data = NULL; /* * Check constraints. Some channels can be either analog or @@ -790,9 +811,6 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi) std_session_send_df_end(sdi); - if (sdi->status != SR_ST_ACTIVE) - return SR_ERR_DEV_CLOSED; - devc = sdi->priv; devc->num_frames = 0;