bindings: rust: examples: add a reimplementation of gpionotify
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 10 Mar 2023 10:16:30 +0000 (11:16 +0100)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 13 Mar 2023 09:15:23 +0000 (10:15 +0100)
Add a new rust example - a simplified reimplementation of the gpionotify
tool.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
bindings/rust/libgpiod/examples/Makefile.am
bindings/rust/libgpiod/examples/gpionotify.rs [new file with mode: 0644]

index 6028fff90dd2792414eb0dce19ec4e647b96c4a9..2e1ccbd63f3fda7c0724e43c23d8b8b673dd969b 100644 (file)
@@ -9,6 +9,7 @@ EXTRA_DIST = \
        gpioget.rs \
        gpioinfo.rs \
        gpiomon.rs \
+       gpionotify.rs \
        gpioset.rs \
        gpio_threaded_info_events.rs \
        gpiowatch.rs
diff --git a/bindings/rust/libgpiod/examples/gpionotify.rs b/bindings/rust/libgpiod/examples/gpionotify.rs
new file mode 100644 (file)
index 0000000..54445d2
--- /dev/null
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause
+// SPDX-FileCopyrightText: 2023 Linaro Ltd.
+// SPDX-FileCopyrightTest: 2023 Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
+//
+// Simplified Rust implementation of the gpionotify tool.
+
+use std::env;
+
+use libgpiod::{
+    chip::Chip,
+    line::{Offset, InfoChangeKind},
+    Error, Result,
+};
+
+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 offsets = Vec::<Offset>::new();
+
+    for arg in &args[2..] {
+        let offset = arg.parse::<Offset>().map_err(|_| Error::InvalidArguments)?;
+        offsets.push(offset);
+    }
+
+    let path = format!("/dev/gpiochip{}", args[1]);
+    let chip = Chip::open(&path)?;
+
+    for &offset in offsets.iter() {
+        let _info = chip.watch_line_info(offset).unwrap();
+    }
+
+    loop {
+        let event = chip.read_info_event().unwrap();
+        println!(
+            "event: {}, line: {}, timestamp: {:?}",
+            match event.event_type()? {
+                InfoChangeKind::LineRequested => "Line requested",
+                InfoChangeKind::LineReleased => "Line released",
+                InfoChangeKind::LineConfigChanged => "Line config changed",
+            },
+            event.line_info().unwrap().offset(),
+            event.timestamp()
+        );
+    }
+}