From: Kent Gibson <warthog618@gmail.com>
To: Bartosz Golaszewski <brgl@bgdev.pl>
Cc: "Linus Walleij" <linus.walleij@linaro.org>,
"Gunnar Thörnqvist" <gunnar@igl.se>,
linux-gpio@vger.kernel.org,
"Bartosz Golaszewski" <bartosz.golaszewski@linaro.org>
Subject: Re: [libgpiod][PATCH 2/2] tools: allow longer time periods
Date: Wed, 10 Apr 2024 07:32:57 +0800 [thread overview]
Message-ID: <20240409233257.GA3000@rigel> (raw)
In-Reply-To: <CAMRc=MfiUAfZ6RjNWJQQpD-Z20_L9n6P=2QGN1NtzSpTtvraxA@mail.gmail.com>
On Tue, Apr 09, 2024 at 05:59:59PM +0200, Bartosz Golaszewski wrote:
> On Tue, Apr 9, 2024 at 2:56 PM Kent Gibson <warthog618@gmail.com> wrote:
> >
> > On Tue, Apr 09, 2024 at 11:33:33AM +0200, Bartosz Golaszewski wrote:
> > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> > >
> > > We currently store time as milliseconds in 32-bit integers and allow
> > > seconds as the longest time unit when parsing command-line arguments
> > > limiting the time period possible to specify when passing arguments such
> > > as --hold-period to 35 minutes. Let's use 64-bit integers to vastly
> > > increase that.
> > >
> >
> > I don't think all timers should be extended, only where it
> > makes sense to do so, so gpioset (toggle and hold periods).
> > And maybe gpiomon (idle timeout), though you haven't extended that one,
> > cos poll()? Maybe switch that to ppoll()?
> >
> > More on this below.
>
> Makes sense.
>
> >
> > > Use nanosleep() instead of usleep() to extend the possible sleep time
> > > range.
> > >
> > > Reported-by: Gunnar Thörnqvist <gunnar@igl.se>
> > > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> > > ---
> > > configure.ac | 2 ++
> > > tools/gpioget.c | 4 ++--
> > > tools/gpiomon.c | 19 ++++++++++++++-----
> > > tools/gpioset.c | 16 ++++++++--------
> > > tools/tools-common.c | 22 ++++++++++++++++------
> > > tools/tools-common.h | 5 +++--
> > > 6 files changed, 45 insertions(+), 23 deletions(-)
> > >
> > > diff --git a/configure.ac b/configure.ac
> > > index 3b5bbf2..a2370c5 100644
> > > --- a/configure.ac
> > > +++ b/configure.ac
> > > @@ -120,6 +120,8 @@ AS_IF([test "x$with_tools" = xtrue],
> > > AC_CHECK_FUNC([asprintf], [], [FUNC_NOT_FOUND_TOOLS([asprintf])])
> > > AC_CHECK_FUNC([scandir], [], [FUNC_NOT_FOUND_TOOLS([scandir])])
> > > AC_CHECK_FUNC([versionsort], [], [FUNC_NOT_FOUND_TOOLS([versionsort])])
> > > + AC_CHECK_FUNC([strtoull], [], [FUNC_NOT_FOUND_TOOLS([strtoull])])
> > > + AC_CHECK_FUNC([nanosleep], [], [FUNC_NOT_FOUND_TOOLS([nanosleep])])
> > > AS_IF([test "x$with_gpioset_interactive" = xtrue],
> > > [PKG_CHECK_MODULES([LIBEDIT], [libedit >= 3.1])])
> > > ])
> > > diff --git a/tools/gpioget.c b/tools/gpioget.c
> > > index f611737..bad7667 100644
> > > --- a/tools/gpioget.c
> > > +++ b/tools/gpioget.c
> > > @@ -19,7 +19,7 @@ struct config {
> > > bool unquoted;
> > > enum gpiod_line_bias bias;
> > > enum gpiod_line_direction direction;
> > > - unsigned int hold_period_us;
> > > + unsigned long long hold_period_us;
> > > const char *chip_id;
> > > const char *consumer;
> > > };
> > > @@ -205,7 +205,7 @@ int main(int argc, char **argv)
> > > die_perror("unable to request lines");
> > >
> > > if (cfg.hold_period_us)
> > > - usleep(cfg.hold_period_us);
> > > + sleep_us(cfg.hold_period_us);
> >
> > Got a use case where a hold period is measured in more than seconds?
> > Specifically for a get.
> >
>
> Yeah, like Gunnar responded, he needs to hold the line for an hour. I
> think it makes sense.
>
And as I noted, I was interested in the get, the point being is a long
period always necessary and appropriate?
> > >
> > > ret = gpiod_line_request_get_values(request, values);
> > > if (ret)
> > > diff --git a/tools/gpiomon.c b/tools/gpiomon.c
> > > index e3abb2d..a8a3302 100644
> > > --- a/tools/gpiomon.c
> > > +++ b/tools/gpiomon.c
> > > @@ -5,6 +5,7 @@
> > > #include <getopt.h>
> > > #include <gpiod.h>
> > > #include <inttypes.h>
> > > +#include <limits.h>
> > > #include <poll.h>
> > > #include <stdio.h>
> > > #include <stdlib.h>
> > > @@ -24,13 +25,13 @@ struct config {
> > > enum gpiod_line_bias bias;
> > > enum gpiod_line_edge edges;
> > > int events_wanted;
> > > - unsigned int debounce_period_us;
> > > + unsigned long long debounce_period_us;
> > > const char *chip_id;
> > > const char *consumer;
> > > const char *fmt;
> > > enum gpiod_line_clock event_clock;
> > > int timestamp_fmt;
> > > - int timeout;
> > > + long long timeout;
> >
> > Can we rename this to idle_timeout? A variable named "timeout" is
> > lacking context.
> >
>
> Sure but it's a different patch. Also: it's your code, just send me
> the patch. :)
>
Check the blame - NOT my code.
> > > };
> > >
> > > static void print_help(void)
> > > @@ -389,9 +390,17 @@ int main(int argc, char **argv)
> > > if (cfg.active_low)
> > > gpiod_line_settings_set_active_low(settings, true);
> > >
> > > - if (cfg.debounce_period_us)
> > > + if (cfg.debounce_period_us) {
> > > + if (cfg.debounce_period_us > UINT_MAX)
> > > + die("invalid debounce period: %llu",
> > > + cfg.debounce_period_us);
> > > +
> > > gpiod_line_settings_set_debounce_period_us(
> > > - settings, cfg.debounce_period_us);
> > > + settings, (unsigned long)cfg.debounce_period_us);
> > > + }
> > > +
> > > + if (cfg.timeout > INT_MAX)
> > > + die("invalid idle timeout: %llu", cfg.timeout);
> > >
> >
> > Not a fan of parsing to long, only to do a smaller range check here.
> > How about providing two parsers - one for int sized periods and
> > one for long periods, e.g. parse_long_period().
>
> I actually prefer to parse the larger range and then limit the max
> size. I would be fine with adding a limit argument to parse_period()
> like long long parse_period(const char *option, long long limit);
>
I can live with that.
Cheers,
Kent.
next prev parent reply other threads:[~2024-04-09 23:33 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-09 9:33 [libgpiod][PATCH 0/2] gpio-tools: allow specifying longer time periods Bartosz Golaszewski
2024-04-09 9:33 ` [libgpiod][PATCH 1/2] build: fix configure error messages on missing functions Bartosz Golaszewski
2024-04-10 7:47 ` Bartosz Golaszewski
2024-04-09 9:33 ` [libgpiod][PATCH 2/2] tools: allow longer time periods Bartosz Golaszewski
2024-04-09 12:55 ` Kent Gibson
2024-04-09 15:59 ` Bartosz Golaszewski
2024-04-09 23:32 ` Kent Gibson [this message]
[not found] ` <3f31c7bc-de8a-4552-ba48-4432b335f413@igl.se>
2024-04-09 16:05 ` Kent Gibson
2024-04-09 17:24 ` Bartosz Golaszewski
2024-04-09 23:37 ` Kent Gibson
2024-04-10 7:53 ` Bartosz Golaszewski
2024-04-10 10:19 ` Kent Gibson
2024-04-09 23:52 ` Kent Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240409233257.GA3000@rigel \
--to=warthog618@gmail.com \
--cc=bartosz.golaszewski@linaro.org \
--cc=brgl@bgdev.pl \
--cc=gunnar@igl.se \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).