From: Viresh Kumar <viresh.kumar@linaro.org>
To: Linus Walleij <linus.walleij@linaro.org>,
Bartosz Golaszewski <brgl@bgdev.pl>
Cc: "Viresh Kumar" <viresh.kumar@linaro.org>,
"Vincent Guittot" <vincent.guittot@linaro.org>,
linux-gpio@vger.kernel.org, "Kent Gibson" <warthog618@gmail.com>,
"Miguel Ojeda" <miguel.ojeda.sandonis@gmail.com>,
"Wedson Almeida Filho" <wedsonaf@google.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
stratos-dev@op-lists.linaro.org,
"Gerard Ryan" <g.m0n3y.2503@gmail.com>
Subject: [PATCH V6 4/8] libgpiod: Add rust examples
Date: Mon, 26 Sep 2022 16:38:16 +0530 [thread overview]
Message-ID: <11e31698d4e01c487a0346ea721519c7b4da3f15.1664189248.git.viresh.kumar@linaro.org> (raw)
In-Reply-To: <cover.1664189248.git.viresh.kumar@linaro.org>
Add examples for the usage of the rust bindings, quite similar to the
ones in cxx bindings.
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
bindings/rust/libgpiod/examples/gpiodetect.rs | 30 ++++++
bindings/rust/libgpiod/examples/gpiofind.rs | 35 +++++++
bindings/rust/libgpiod/examples/gpioget.rs | 42 ++++++++
bindings/rust/libgpiod/examples/gpioinfo.rs | 95 +++++++++++++++++++
bindings/rust/libgpiod/examples/gpiomon.rs | 73 ++++++++++++++
bindings/rust/libgpiod/examples/gpioset.rs | 60 ++++++++++++
bindings/rust/libgpiod/examples/gpiowatch.rs | 54 +++++++++++
7 files changed, 389 insertions(+)
create mode 100644 bindings/rust/libgpiod/examples/gpiodetect.rs
create mode 100644 bindings/rust/libgpiod/examples/gpiofind.rs
create mode 100644 bindings/rust/libgpiod/examples/gpioget.rs
create mode 100644 bindings/rust/libgpiod/examples/gpioinfo.rs
create mode 100644 bindings/rust/libgpiod/examples/gpiomon.rs
create mode 100644 bindings/rust/libgpiod/examples/gpioset.rs
create mode 100644 bindings/rust/libgpiod/examples/gpiowatch.rs
diff --git a/bindings/rust/libgpiod/examples/gpiodetect.rs b/bindings/rust/libgpiod/examples/gpiodetect.rs
new file mode 100644
index 000000000000..f24ac72e2d48
--- /dev/null
+++ b/bindings/rust/libgpiod/examples/gpiodetect.rs
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
+//
+// Copyright 2022 Linaro Ltd. All Rights Reserved.
+// Viresh Kumar <viresh.kumar@linaro.org>
+//
+// Simplified Rust implementation of gpiodetect tool.
+
+use std::env;
+use std::path::Path;
+
+use libgpiod::{gpiochip_devices, Error, Result};
+
+fn main() -> Result<()> {
+ let args: Vec<String> = env::args().collect();
+ if args.len() > 1 {
+ println!("Usage: {}", args[0]);
+ return Err(Error::InvalidArguments);
+ }
+
+ for chip in gpiochip_devices(&Path::new("/dev"))? {
+ println!(
+ "{} [{}] ({})",
+ chip.name()?,
+ chip.label()?,
+ chip.num_lines(),
+ );
+ }
+
+ Ok(())
+}
diff --git a/bindings/rust/libgpiod/examples/gpiofind.rs b/bindings/rust/libgpiod/examples/gpiofind.rs
new file mode 100644
index 000000000000..07e886bc3896
--- /dev/null
+++ b/bindings/rust/libgpiod/examples/gpiofind.rs
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
+//
+// Copyright 2022 Linaro Ltd. All Rights Reserved.
+// Viresh Kumar <viresh.kumar@linaro.org>
+//
+// Simplified Rust implementation of gpiofind tool.
+
+use std::env;
+use std::path::Path;
+
+use libgpiod::{gpiochip_devices, Error, Result};
+
+fn main() -> Result<()> {
+ let args: Vec<String> = env::args().collect();
+ if args.len() != 2 {
+ println!("Usage: {} <line-name>", args[0]);
+ return Err(Error::InvalidArguments);
+ }
+
+ for chip in gpiochip_devices(&Path::new("/dev"))? {
+ let offset = chip.line_offset_from_name(&args[1]);
+ if offset.is_ok() {
+ println!(
+ "Line {} found: Chip: {}, offset: {}",
+ args[1],
+ chip.name()?,
+ offset?
+ );
+ return Ok(());
+ }
+ }
+
+ println!("Failed to find line: {}", args[1]);
+ Ok(())
+}
diff --git a/bindings/rust/libgpiod/examples/gpioget.rs b/bindings/rust/libgpiod/examples/gpioget.rs
new file mode 100644
index 000000000000..f4c111987d96
--- /dev/null
+++ b/bindings/rust/libgpiod/examples/gpioget.rs
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
+//
+// Copyright 2022 Linaro Ltd. All Rights Reserved.
+// Viresh Kumar <viresh.kumar@linaro.org>
+//
+// Simplified Rust implementation of gpioget tool.
+
+use std::env;
+
+use libgpiod::{chip::Chip, line, request, Direction, Error, Offset, Result, SettingVal};
+
+fn main() -> Result<()> {
+ let args: Vec<String> = env::args().collect();
+ if args.len() < 3 {
+ println!("Usage: {} <chip> <line_offset0> ...", args[0]);
+ return Err(Error::InvalidArguments);
+ }
+
+ let mut lsettings = line::Settings::new()?;
+ let lconfig = line::Config::new()?;
+ let mut offsets = Vec::<Offset>::new();
+
+ for arg in &args[2..] {
+ let offset = arg.parse::<Offset>().map_err(|_| Error::InvalidArguments)?;
+ offsets.push(offset);
+ }
+
+ lsettings.set_prop(&[SettingVal::Direction(Direction::Input)])?;
+ lconfig.add_line_settings(&offsets, lsettings)?;
+
+ let path = format!("/dev/gpiochip{}", args[1]);
+ let chip = Chip::open(&path)?;
+
+ let rconfig = request::Config::new()?;
+ rconfig.set_consumer(&args[0]);
+
+ let request = chip.request_lines(&rconfig, &lconfig)?;
+ let map = request.values()?;
+
+ println!("{:?}", map);
+ Ok(())
+}
diff --git a/bindings/rust/libgpiod/examples/gpioinfo.rs b/bindings/rust/libgpiod/examples/gpioinfo.rs
new file mode 100644
index 000000000000..8b9fcb000f63
--- /dev/null
+++ b/bindings/rust/libgpiod/examples/gpioinfo.rs
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
+//
+// Copyright 2022 Linaro Ltd. All Rights Reserved.
+// Viresh Kumar <viresh.kumar@linaro.org>
+//
+// Simplified Rust implementation of gpioinfo tool.
+
+use std::env;
+use std::path::Path;
+
+use libgpiod::{
+ chip::Chip, gpiochip_devices, is_gpiochip_device, Direction, Error, Offset, Result,
+};
+
+fn line_info(chip: &Chip, offset: Offset) -> Result<()> {
+ let info = chip.line_info(offset)?;
+ let off = info.offset();
+
+ let name = match info.name() {
+ Ok(name) => name,
+ _ => "unused",
+ };
+
+ let consumer = match info.consumer() {
+ Ok(name) => name,
+ _ => "unnamed",
+ };
+
+ let low = if info.is_active_low() {
+ "active-low"
+ } else {
+ "active-high"
+ };
+
+ let dir = match info.direction()? {
+ Direction::AsIs => "None",
+ Direction::Input => "Input",
+ Direction::Output => "Output",
+ };
+
+ println!(
+ "\tline {:>3}\
+ \t{:>10}\
+ \t{:>10}\
+ \t{:>6}\
+ \t{:>14}",
+ off, name, consumer, dir, low
+ );
+
+ Ok(())
+}
+
+fn chip_info(chip: &Chip) -> Result<()> {
+ let ngpio = chip.num_lines();
+
+ println!("GPIO Chip name: {}", chip.name()?);
+ println!("\tlabel: {}", chip.label()?);
+ println!("\tpath: {}", chip.path()?);
+ println!("\tngpio: {}\n", ngpio);
+
+ println!("\tLine information:");
+
+ for offset in 0..ngpio {
+ line_info(chip, offset as Offset)?;
+ }
+ println!("\n");
+
+ Ok(())
+}
+
+fn main() -> Result<()> {
+ let args: Vec<String> = env::args().collect();
+ if args.len() > 2 {
+ println!("Usage: {}", args[0]);
+ return Err(Error::InvalidArguments);
+ }
+
+ if args.len() == 1 {
+ for chip in gpiochip_devices(&Path::new("/dev"))? {
+ chip_info(&chip)?;
+ }
+ } else {
+ let index = args[1]
+ .parse::<u32>()
+ .map_err(|_| Error::InvalidArguments)?;
+ let path = format!("/dev/gpiochip{}", index);
+ if is_gpiochip_device(&path) {
+ let chip = Chip::open(&path)?;
+
+ chip_info(&chip)?;
+ }
+ }
+
+ Ok(())
+}
diff --git a/bindings/rust/libgpiod/examples/gpiomon.rs b/bindings/rust/libgpiod/examples/gpiomon.rs
new file mode 100644
index 000000000000..bf01b5717963
--- /dev/null
+++ b/bindings/rust/libgpiod/examples/gpiomon.rs
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
+//
+// Copyright 2022 Linaro Ltd. All Rights Reserved.
+// Viresh Kumar <viresh.kumar@linaro.org>
+//
+// Simplified Rust implementation of the gpiomon tool.
+
+use std::env;
+
+use libgpiod::{
+ chip::Chip, edge, line, request, Edge, EdgeKind, Error, Offset, Result, SettingVal,
+};
+
+fn usage(name: &str) {
+ println!("Usage: {} <chip> <offset0> ...", name);
+}
+
+fn main() -> Result<()> {
+ let args: Vec<String> = env::args().collect();
+ if args.len() < 3 {
+ usage(&args[0]);
+ return Err(Error::InvalidArguments);
+ }
+
+ let mut lsettings = line::Settings::new()?;
+ let lconfig = line::Config::new()?;
+ let mut offsets = Vec::<Offset>::new();
+
+ for arg in &args[2..] {
+ let offset = arg.parse::<Offset>().map_err(|_| Error::InvalidArguments)?;
+ offsets.push(offset);
+ }
+
+ lsettings.set_prop(&[SettingVal::EdgeDetection(Some(Edge::Both))])?;
+ lconfig.add_line_settings(&offsets, lsettings)?;
+
+ let path = format!("/dev/gpiochip{}", args[1]);
+ let chip = Chip::open(&path)?;
+
+ let rconfig = request::Config::new()?;
+
+ let buffer = edge::event::Buffer::new(1)?;
+ let request = chip.request_lines(&rconfig, &lconfig)?;
+
+ loop {
+ match request.wait_edge_event(None) {
+ Err(x) => {
+ println!("{:?}", x);
+ return Err(Error::InvalidArguments);
+ }
+
+ Ok(false) => {
+ // This shouldn't happen as the call is blocking.
+ panic!();
+ }
+ Ok(true) => (),
+ }
+
+ let count = request.read_edge_events(&buffer)?;
+ if count == 1 {
+ let event = buffer.event(0)?;
+ println!(
+ "line: {} type: {}, time: {:?}",
+ event.line_offset(),
+ match event.event_type()? {
+ EdgeKind::Rising => "Rising",
+ EdgeKind::Falling => "Falling",
+ },
+ event.timestamp()
+ );
+ }
+ }
+}
diff --git a/bindings/rust/libgpiod/examples/gpioset.rs b/bindings/rust/libgpiod/examples/gpioset.rs
new file mode 100644
index 000000000000..56ed241ce9de
--- /dev/null
+++ b/bindings/rust/libgpiod/examples/gpioset.rs
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
+//
+// Copyright 2022 Linaro Ltd. All Rights Reserved.
+// Viresh Kumar <viresh.kumar@linaro.org>
+//
+// Simplified Rust implementation of the gpioset tool.
+
+use std::env;
+use std::io::{stdin, Read};
+
+use libgpiod::{chip::Chip, line, request, Direction, Error, Offset, Result, SettingVal, Value};
+
+fn usage(name: &str) {
+ println!("Usage: {} <chip> <line_offset0>=<value0> ...", name);
+}
+
+fn main() -> Result<()> {
+ let args: Vec<String> = env::args().collect();
+ if args.len() < 3 {
+ usage(&args[0]);
+ return Err(Error::InvalidArguments);
+ }
+
+ let lconfig = line::Config::new()?;
+
+ for arg in &args[2..] {
+ let pair: Vec<&str> = arg.split('=').collect();
+ if pair.len() != 2 {
+ usage(&args[0]);
+ return Err(Error::InvalidArguments);
+ }
+
+ let offset = pair[0]
+ .parse::<Offset>()
+ .map_err(|_| Error::InvalidArguments)?;
+ let value = pair[1]
+ .parse::<i32>()
+ .map_err(|_| Error::InvalidArguments)?;
+
+ let mut lsettings = line::Settings::new()?;
+ lsettings.set_prop(&[
+ SettingVal::Direction(Direction::Output),
+ SettingVal::OutputValue(Value::new(value)?),
+ ])?;
+ lconfig.add_line_settings(&[offset], lsettings)?;
+ }
+
+ let path = format!("/dev/gpiochip{}", args[1]);
+ let chip = Chip::open(&path)?;
+
+ let rconfig = request::Config::new()?;
+ rconfig.set_consumer(&args[0]);
+
+ chip.request_lines(&rconfig, &lconfig)?;
+
+ // Wait for keypress, let user verify line status.
+ stdin().read_exact(&mut [0u8]).unwrap();
+
+ Ok(())
+}
diff --git a/bindings/rust/libgpiod/examples/gpiowatch.rs b/bindings/rust/libgpiod/examples/gpiowatch.rs
new file mode 100644
index 000000000000..030168ba9788
--- /dev/null
+++ b/bindings/rust/libgpiod/examples/gpiowatch.rs
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
+//
+// Copyright 2022 Linaro Ltd. All Rights Reserved.
+// Viresh Kumar <viresh.kumar@linaro.org>
+//
+// Simplified Rust implementation of the gpiowatch tool.
+
+use std::env;
+
+use libgpiod::{chip::Chip, Error, Offset, Result};
+
+fn usage(name: &str) {
+ println!("Usage: {} <chip> <offset0> ...", name);
+}
+
+fn main() -> Result<()> {
+ let args: Vec<String> = env::args().collect();
+ if args.len() < 2 {
+ usage(&args[0]);
+ return Err(Error::InvalidArguments);
+ }
+
+ let path = format!("/dev/gpiochip{}", args[1]);
+ let offset = args[2]
+ .parse::<Offset>()
+ .map_err(|_| Error::InvalidArguments)?;
+
+ let chip = Chip::open(&path)?;
+ let _info = chip.watch_line_info(offset)?;
+
+ match chip.wait_info_event(None) {
+ Err(x) => {
+ println!("{:?}", x);
+ return Err(Error::InvalidArguments);
+ }
+
+ Ok(false) => {
+ // This shouldn't happen as the call is blocking.
+ panic!();
+ }
+ Ok(true) => (),
+ }
+
+ let event = chip.read_info_event()?;
+ println!(
+ "line: {} type: {:?}, time: {:?}",
+ offset,
+ event.event_type()?,
+ event.timestamp()
+ );
+
+ chip.unwatch(offset);
+ Ok(())
+}
--
2.31.1.272.g89b43f80a514
next prev parent reply other threads:[~2022-09-26 13:03 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-26 11:08 [PATCH V6 0/8] libgpiod: Add Rust bindings Viresh Kumar
2022-09-26 11:08 ` [PATCH V6 1/8] libgpiod: Add libgpiod-sys rust crate Viresh Kumar
2022-09-26 11:08 ` [PATCH V6 2/8] libgpiod-sys: Add pre generated rust bindings Viresh Kumar
2022-09-26 11:08 ` [PATCH V6 3/8] libgpiod: Add rust wrapper crate Viresh Kumar
2022-09-26 13:29 ` Bartosz Golaszewski
2022-09-26 15:26 ` Viresh Kumar
2022-09-27 13:18 ` Bartosz Golaszewski
2022-09-27 13:57 ` Viresh Kumar
2022-09-27 15:25 ` Bartosz Golaszewski
2022-09-28 11:10 ` Viresh Kumar
2022-09-28 12:20 ` Bartosz Golaszewski
2022-09-28 15:17 ` Viresh Kumar
2022-09-28 17:54 ` Bartosz Golaszewski
2022-09-29 6:54 ` Viresh Kumar
2022-09-29 7:37 ` Bartosz Golaszewski
2022-09-29 8:58 ` Viresh Kumar
2022-09-29 11:16 ` Bartosz Golaszewski
2022-09-29 11:43 ` Kent Gibson
2022-09-29 13:55 ` Miguel Ojeda
2022-10-11 4:16 ` Viresh Kumar
2022-10-11 4:25 ` Kent Gibson
2022-10-11 4:37 ` Viresh Kumar
2022-10-11 4:46 ` Viresh Kumar
2022-10-13 6:12 ` Viresh Kumar
2022-10-14 9:45 ` Bartosz Golaszewski
2022-10-14 9:57 ` Viresh Kumar
2022-10-14 14:25 ` Bartosz Golaszewski
2022-10-14 16:06 ` Kent Gibson
2022-10-17 11:26 ` Viresh Kumar
2022-10-17 11:34 ` Kent Gibson
2022-10-17 11:37 ` Viresh Kumar
2022-09-26 11:08 ` Viresh Kumar [this message]
2022-09-26 11:08 ` [PATCH V6 5/8] libgpiod: Add gpiosim rust crate Viresh Kumar
2022-09-26 11:08 ` [PATCH V6 6/8] gpiosim: Add pre generated rust bindings Viresh Kumar
2022-09-26 11:08 ` [PATCH V6 7/8] libgpiod: Add rust tests Viresh Kumar
2022-09-26 11:08 ` [PATCH V6 8/8] libgpiod: Integrate building of rust bindings with make Viresh Kumar
2022-09-26 15:57 ` [PATCH V6 0/8] libgpiod: Add Rust bindings Viresh Kumar
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=11e31698d4e01c487a0346ea721519c7b4da3f15.1664189248.git.viresh.kumar@linaro.org \
--to=viresh.kumar@linaro.org \
--cc=alex.bennee@linaro.org \
--cc=brgl@bgdev.pl \
--cc=g.m0n3y.2503@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=miguel.ojeda.sandonis@gmail.com \
--cc=stratos-dev@op-lists.linaro.org \
--cc=vincent.guittot@linaro.org \
--cc=warthog618@gmail.com \
--cc=wedsonaf@google.com \
/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).