From: Kent Gibson <warthog618@gmail.com>
To: Bartosz Golaszewski <brgl@bgdev.pl>
Cc: Linus Walleij <linus.walleij@linaro.org>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Viresh Kumar <viresh.kumar@linaro.org>,
linux-gpio@vger.kernel.org
Subject: Re: [libgpiod v2][PATCH v3 2/4] bindings: python: add examples
Date: Thu, 13 Oct 2022 11:09:33 +0800 [thread overview]
Message-ID: <Y0eBbUkzryyJZKwq@sol> (raw)
In-Reply-To: <20221007145521.329614-3-brgl@bgdev.pl>
On Fri, Oct 07, 2022 at 04:55:19PM +0200, Bartosz Golaszewski wrote:
> This adds the regular set of example programs implemented using libgpiod
> python bindings.
>
> Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
> ---
> bindings/python/examples/Makefile.am | 10 +++++++
> bindings/python/examples/gpiodetect.py | 17 ++++++++++++
> bindings/python/examples/gpiofind.py | 20 ++++++++++++++
> bindings/python/examples/gpioget.py | 31 +++++++++++++++++++++
> bindings/python/examples/gpioinfo.py | 35 ++++++++++++++++++++++++
> bindings/python/examples/gpiomon.py | 28 +++++++++++++++++++
> bindings/python/examples/gpioset.py | 37 ++++++++++++++++++++++++++
> 7 files changed, 178 insertions(+)
> create mode 100644 bindings/python/examples/Makefile.am
> create mode 100755 bindings/python/examples/gpiodetect.py
> create mode 100755 bindings/python/examples/gpiofind.py
> create mode 100755 bindings/python/examples/gpioget.py
> create mode 100755 bindings/python/examples/gpioinfo.py
> create mode 100755 bindings/python/examples/gpiomon.py
> create mode 100755 bindings/python/examples/gpioset.py
>
> diff --git a/bindings/python/examples/Makefile.am b/bindings/python/examples/Makefile.am
> new file mode 100644
> index 0000000..f42b80e
> --- /dev/null
> +++ b/bindings/python/examples/Makefile.am
> @@ -0,0 +1,10 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
> +
> +EXTRA_DIST = \
> + gpiodetect.py \
> + gpiofind.py \
> + gpioget.py \
> + gpioinfo.py \
> + gpiomon.py \
> + gpioset.py
> diff --git a/bindings/python/examples/gpiodetect.py b/bindings/python/examples/gpiodetect.py
> new file mode 100755
> index 0000000..c32014f
> --- /dev/null
> +++ b/bindings/python/examples/gpiodetect.py
> @@ -0,0 +1,17 @@
> +#!/usr/bin/env python3
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
> +
> +"""Reimplementation of the gpiodetect tool in Python."""
> +
> +import gpiod
> +import os
> +
> +if __name__ == "__main__":
> + for entry in os.scandir("/dev/"):
> + if gpiod.is_gpiochip_device(entry.path):
Add a helper generator function that returns the available chip paths?
And in order might be nice too.
> + with gpiod.Chip(entry.path) as chip:
> + info = chip.get_info()
> + print(
> + "{} [{}] ({} lines)".format(info.name, info.label, info.num_lines)
> + )
> diff --git a/bindings/python/examples/gpiofind.py b/bindings/python/examples/gpiofind.py
> new file mode 100755
> index 0000000..2f30445
> --- /dev/null
> +++ b/bindings/python/examples/gpiofind.py
> @@ -0,0 +1,20 @@
> +#!/usr/bin/env python3
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
> +
> +"""Reimplementation of the gpiofind tool in Python."""
> +
> +import gpiod
> +import os
> +import sys
> +
> +if __name__ == "__main__":
> + for entry in os.scandir("/dev/"):
> + if gpiod.is_gpiochip_device(entry.path):
> + with gpiod.Chip(entry.path) as chip:
> + offset = chip.map_line(sys.argv[1])
chip.offset_from_id(...
> + if offset is not None:
> + print("{} {}".format(chip.get_info().name, offset))
> + sys.exit(0)
> +
> + sys.exit(1)
> diff --git a/bindings/python/examples/gpioget.py b/bindings/python/examples/gpioget.py
> new file mode 100755
> index 0000000..d441535
> --- /dev/null
> +++ b/bindings/python/examples/gpioget.py
> @@ -0,0 +1,31 @@
> +#!/usr/bin/env python3
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
> +
> +"""Simplified reimplementation of the gpioget tool in Python."""
> +
> +import gpiod
> +import sys
> +
> +from gpiod.line import Direction
> +
> +if __name__ == "__main__":
> + if len(sys.argv) < 3:
> + raise TypeError("usage: gpioget.py <gpiochip> <offset1> <offset2> ...")
> +
> + path = sys.argv[1]
> + lines = []
> + for line in sys.argv[2:]:
> + lines.append(int(line) if line.isdigit() else line)
> +
Just leave the line ids as string?
else use a list comprehension:
lines = [ int(id) if id.isdigit() else id for id in sys.argv[2:] ]
Similarly elsewhere.
> + request = gpiod.request_lines(
> + path,
> + consumer="gpioget.py",
> + config={tuple(lines): gpiod.LineSettings(direction=Direction.INPUT)},
> + )
> +
> + vals = request.get_values()
> +
> + for val in vals:
> + print("{} ".format(val.value), end="")
> + print()
> diff --git a/bindings/python/examples/gpioinfo.py b/bindings/python/examples/gpioinfo.py
> new file mode 100755
> index 0000000..e8c7d46
> --- /dev/null
> +++ b/bindings/python/examples/gpioinfo.py
> @@ -0,0 +1,35 @@
> +#!/usr/bin/env python3
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
> +
> +"""Simplified reimplementation of the gpioinfo tool in Python."""
> +
> +import gpiod
> +import os
> +
> +if __name__ == "__main__":
> + for entry in os.scandir("/dev/"):
> + if gpiod.is_gpiochip_device(entry.path):
> + with gpiod.Chip(entry.path) as chip:
> + cinfo = chip.get_info()
> + print("{} - {} lines:".format(cinfo.name, cinfo.num_lines))
> +
> + for offset in range(0, cinfo.num_lines):
> + linfo = chip.get_line_info(offset)
> + offset = linfo.offset
> + name = linfo.name
> + consumer = linfo.consumer
> + direction = linfo.direction
is_input = linfo.direction == gpiod.line.Direction.INPUT
That is for space saving below.
Drop the others as they are only referenced once (if you follow the
suggestion below).
> + active_low = linfo.active_low
> +
> + print(
> + "\tline {:>3}: {:>18} {:>12} {:>8} {:>10}".format(
> + offset,
> + "unnamed" if name is None else name,
> + "unused" if consumer is None else consumer,
> + "input"
> + if direction == gpiod.line.Direction.INPUT
> + else "output",
> + "active-low" if active_low else "active-high",
linfo.offset,
linfo.name or "unnamed",
linfo.consumer or "unused",
is_input and "input" or "output",
linfo.active_low and "active_low" or "active-high",
> + )
> + )
> diff --git a/bindings/python/examples/gpiomon.py b/bindings/python/examples/gpiomon.py
> new file mode 100755
> index 0000000..e0db16f
> --- /dev/null
> +++ b/bindings/python/examples/gpiomon.py
> @@ -0,0 +1,28 @@
> +#!/usr/bin/env python3
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
> +
> +"""Simplified reimplementation of the gpiomon tool in Python."""
> +
> +import gpiod
> +import sys
> +
> +from gpiod.line import Edge
> +
> +if __name__ == "__main__":
> + if len(sys.argv) < 3:
> + raise TypeError("usage: gpiomon.py <gpiochip> <offset1> <offset2> ...")
> +
> + path = sys.argv[1]
> + lines = []
> + for line in sys.argv[2:]:
> + lines.append(int(line) if line.isdigit() else line)
> +
> + with gpiod.request_lines(
> + path,
> + consumer="gpiomon.py",
> + config={tuple(lines): gpiod.LineSettings(edge_detection=Edge.BOTH)},
> + ) as request:
> + while True:
> + for event in request.read_edge_event():
> + print(event)
> diff --git a/bindings/python/examples/gpioset.py b/bindings/python/examples/gpioset.py
> new file mode 100755
> index 0000000..f0b0681
> --- /dev/null
> +++ b/bindings/python/examples/gpioset.py
> @@ -0,0 +1,37 @@
> +#!/usr/bin/env python3
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
> +
> +"""Simplified reimplementation of the gpioset tool in Python."""
> +
> +import gpiod
> +import sys
> +
> +from gpiod.line import Direction, Value
> +
> +if __name__ == "__main__":
> + if len(sys.argv) < 3:
> + raise TypeError(
> + "usage: gpioset.py <gpiochip> <offset1>=<value1> <offset2>=<value2> ..."
> + )
> +
> + path = sys.argv[1]
> + values = dict()
> + lines = []
> + for arg in sys.argv[2:]:
> + arg = arg.split("=")
> + key = int(arg[0]) if arg[0].isdigit() else arg[0]
> + val = int(arg[1])
> +
> + lines.append(key)
> + values[key] = Value(val)
> +
lvs = [ arg.split('=') for arg in sys.argv[2:] ]
lines = [ x[0] for x in lvs ]
values = dict[lvs]
> + request = gpiod.request_lines(
> + path,
> + consumer="gpioset.py",
> + config={tuple(lines): gpiod.LineSettings(direction=Direction.OUTPUT)},
> + )
> +
> + vals = request.set_values(values)
> +
> + input()
> --
No gpiowatch?
Add some examples for features the tools don't use, like requests with
both inputs and outputs, and reconfigure?
Cheers,
Kent.
next prev parent reply other threads:[~2022-10-13 3:09 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-07 14:55 [libgpiod v2][PATCH v3 0/4] bindings: implement python bindings for libgpiod v2 Bartosz Golaszewski
2022-10-07 14:55 ` [libgpiod v2][PATCH v3 1/4] bindings: python: remove old version Bartosz Golaszewski
2022-10-07 14:55 ` [libgpiod v2][PATCH v3 2/4] bindings: python: add examples Bartosz Golaszewski
2022-10-13 3:09 ` Kent Gibson [this message]
2022-10-17 12:00 ` Bartosz Golaszewski
2022-10-17 12:11 ` Kent Gibson
2022-10-17 13:49 ` Andy Shevchenko
2022-10-17 14:07 ` Kent Gibson
2022-10-17 14:19 ` Andy Shevchenko
2022-10-17 15:53 ` Bartosz Golaszewski
2022-10-17 16:09 ` Kent Gibson
2022-10-17 16:20 ` Kent Gibson
2022-10-17 16:55 ` Andy Shevchenko
2022-10-17 16:57 ` Andy Shevchenko
2022-10-17 17:26 ` Bartosz Golaszewski
2022-10-17 16:24 ` Andy Shevchenko
2022-10-17 16:39 ` Kent Gibson
2022-10-07 14:55 ` [libgpiod v2][PATCH v3 3/4] bindings: python: add tests Bartosz Golaszewski
2022-10-13 3:09 ` Kent Gibson
2022-10-07 14:55 ` [libgpiod v2][PATCH v3 4/4] bindings: python: implement python bindings for libgpiod v2 Bartosz Golaszewski
2022-10-07 15:26 ` Andy Shevchenko
2022-10-07 18:19 ` Bartosz Golaszewski
2022-10-13 3:10 ` Kent Gibson
2022-10-13 11:12 ` Kent Gibson
2022-10-26 12:32 ` Bartosz Golaszewski
2022-10-26 12:56 ` Kent Gibson
2022-10-12 12:34 ` [libgpiod v2][PATCH v3 0/4] bindings: " Bartosz Golaszewski
2022-10-12 12:41 ` Kent Gibson
2022-10-12 12:51 ` Bartosz Golaszewski
2022-10-12 13:03 ` 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=Y0eBbUkzryyJZKwq@sol \
--to=warthog618@gmail.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=brgl@bgdev.pl \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=viresh.kumar@linaro.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.