Hello Alexis, I wrote a small patch to improve a4l_find_range(). As many every other functions expect to have the range specified as its idx into the struct describing the subdevice it is useful have it returned from a4l_find_range(). I also made returning a pointer to the range struncture optional.
I also attache a simple patch to clean up trailing whitespaces in the range.c file. Cheers, -- Daniele
commit ec80d59f5ecfdc74b45d9da7edfdb54f6cab555a Author: Daniele Nicolodi <nicol...@science.unitn.it> Date: Mon Mar 29 22:11:44 2010 +0200 Make a4l_find_range() more useful by returning the idx of the most suitable range too. diff --git a/src/drvlib/analogy/range.c b/src/drvlib/analogy/range.c index 934c52a..fc4e302 100644 --- a/src/drvlib/analogy/range.c +++ b/src/drvlib/analogy/range.c @@ -154,8 +154,9 @@ int a4l_sizeof_subd(a4l_sbinfo_t *subd) * @param[in] max Maximal limit value * @param[out] rng Found range * - * @return 0 on success. Otherwise: + * @return The index of the most suitable range on success. Otherwise: * + * - -ENOENT is returned if a suitable range is not found. * - -EINVAL is returned if some argument is missing or wrong; * idx_subd, idx_chan and the dsc pointer should be checked; check * also the kernel log ("dmesg"); WARNING: a4l_fill_desc() should @@ -171,10 +172,14 @@ int a4l_find_range(a4l_desc_t * dsc, int i, ret; long lmin, lmax; a4l_chinfo_t *chinfo; - a4l_rnginfo_t *rnginfo; + a4l_rnginfo_t *rnginfo, *tmp = NULL; + unsigned int idx_rng = -ENOENT; + + if (rng != NULL) + *rng = NULL; /* Basic checkings */ - if (dsc == NULL || rng == NULL) + if (dsc == NULL) return -EINVAL; /* a4l_fill_desc() must have been called on this descriptor */ @@ -184,38 +189,39 @@ int a4l_find_range(a4l_desc_t * dsc, /* Retrieves the ranges count */ ret = a4l_get_chinfo(dsc, idx_subd, idx_chan, &chinfo); if (ret < 0) - goto out_get_range; + return ret; /* Initializes variables */ lmin = (long)(min * A4L_RNG_FACTOR); lmax = (long)(max * A4L_RNG_FACTOR); - *rng = NULL; /* Performs the research */ for (i = 0; i < chinfo->nb_rng; i++) { ret = a4l_get_rnginfo(dsc, idx_subd, idx_chan, i, &rnginfo); if (ret < 0) - goto out_get_range; + return ret; if (A4L_RNG_UNIT(rnginfo->flags) == unit && rnginfo->min <= lmin && rnginfo->max >= lmax) { - if (*rng != NULL) { - if (rnginfo->min >= (*rng)->min && - rnginfo->max <= (*rng)->max) - *rng = rnginfo; - } else - *rng = rnginfo; + if (tmp != NULL) { + if (rnginfo->min >= tmp->min && + rnginfo->max <= tmp->max) { + idx_rng = i; + tmp = rnginfo; + } + } else { + idx_rng = i; + tmp = rnginfo; + } } } -out_get_range: - - if (ret < 0) - *rng = NULL; + if (rng != NULL) + *rng = tmp; - return ret; + return idx_rng; } /**
commit 10dca3a6ae97cff6b2ebf9cf595283ffac94af44 Author: Daniele Nicolodi <nicol...@science.unitn.it> Date: Mon Mar 29 22:13:03 2010 +0200 Remove trailing white spaces. diff --git a/src/drvlib/analogy/range.c b/src/drvlib/analogy/range.c index fc4e302..51b0405 100644 --- a/src/drvlib/analogy/range.c +++ b/src/drvlib/analogy/range.c @@ -130,7 +130,7 @@ int a4l_sizeof_subd(a4l_sbinfo_t *subd) channels are acquired in one shot); for other kind of subdevice, the user must use a4l_sizeof_chan() so as to find out the size of the channel he wants to use */ - if ((subd->flags & A4L_SUBD_TYPES) != A4L_SUBD_DIO && + if ((subd->flags & A4L_SUBD_TYPES) != A4L_SUBD_DIO && (subd->flags & A4L_SUBD_TYPES) != A4L_SUBD_DI && (subd->flags & A4L_SUBD_TYPES) != A4L_SUBD_DO) return -EINVAL; @@ -233,7 +233,7 @@ int a4l_find_range(a4l_desc_t * dsc, * * @param[in] chan Channel descriptor * @param[in] rng Range descriptor - * @param[out] dst Ouput buffer + * @param[out] dst Ouput buffer * @param[in] src Input buffer * @param[in] cnt Count of transfer to copy * @@ -257,7 +257,7 @@ int a4l_rawtoul(a4l_chinfo_t * chan, unsigned long *dst, void *src, int cnt) if (chan == NULL) return -EINVAL; - /* Find out the size in memory */ + /* Find out the size in memory */ size = a4l_sizeof_chan(chan); /* Get the suitable accessor */ @@ -285,7 +285,7 @@ int a4l_rawtoul(a4l_chinfo_t * chan, unsigned long *dst, void *src, int cnt) j++; } - return j; + return j; } /** @@ -293,7 +293,7 @@ int a4l_rawtoul(a4l_chinfo_t * chan, unsigned long *dst, void *src, int cnt) * * @param[in] chan Channel descriptor * @param[in] rng Range descriptor - * @param[out] dst Ouput buffer + * @param[out] dst Ouput buffer * @param[in] src Input buffer * @param[in] cnt Count of conversion to perform * @@ -322,7 +322,7 @@ int a4l_rawtof(a4l_chinfo_t * chan, if (rng == NULL || chan == NULL) return -EINVAL; - /* Find out the size in memory */ + /* Find out the size in memory */ size = a4l_sizeof_chan(chan); /* Get the suitable accessor */ @@ -366,7 +366,7 @@ int a4l_rawtof(a4l_chinfo_t * chan, * * @param[in] chan Channel descriptor * @param[in] rng Range descriptor - * @param[out] dst Ouput buffer + * @param[out] dst Ouput buffer * @param[in] src Input buffer * @param[in] cnt Count of conversion to perform * @@ -395,7 +395,7 @@ int a4l_rawtod(a4l_chinfo_t * chan, if (rng == NULL || chan == NULL) return -EINVAL; - /* Find out the size in memory */ + /* Find out the size in memory */ size = a4l_sizeof_chan(chan); /* Get the suitable accessor */ @@ -443,7 +443,7 @@ int a4l_rawtod(a4l_chinfo_t * chan, * * @param[in] chan Channel descriptor * @param[in] rng Range descriptor - * @param[out] dst Ouput buffer + * @param[out] dst Ouput buffer * @param[in] src Input buffer * @param[in] cnt Count of transfer to copy * @@ -495,7 +495,7 @@ int a4l_ultoraw(a4l_chinfo_t * chan, void *dst, unsigned long *src, int cnt) j++; } - return j; + return j; } /** @@ -503,7 +503,7 @@ int a4l_ultoraw(a4l_chinfo_t * chan, void *dst, unsigned long *src, int cnt) * * @param[in] chan Channel descriptor * @param[in] rng Range descriptor - * @param[out] dst Ouput buffer + * @param[out] dst Ouput buffer * @param[in] src Input buffer * @param[in] cnt Count of conversion to perform * @@ -573,7 +573,7 @@ int a4l_ftoraw(a4l_chinfo_t * chan, * * @param[in] chan Channel descriptor * @param[in] rng Range descriptor - * @param[out] dst Ouput buffer + * @param[out] dst Ouput buffer * @param[in] src Input buffer * @param[in] cnt Count of conversion to perform *
_______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core