bindings: rust: make request_config optional in Chip.request_lines()
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 13 Jan 2023 13:51:09 +0000 (14:51 +0100)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Thu, 19 Jan 2023 12:58:50 +0000 (13:58 +0100)
Request config is not necessary to request lines. In C API we accept
a NULL pointer, in C++ it's not necessary to assign a request_config
to the request builder, in Python the consumer and event buffer size
arguments are optional. Let's make rust bindings consistent and not
require the request config to be always present. Convert the argument
in request_lines to Option and update the rest of the code.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
bindings/rust/libgpiod/examples/gpio_events.rs
bindings/rust/libgpiod/examples/gpio_threaded_info_events.rs
bindings/rust/libgpiod/examples/gpioget.rs
bindings/rust/libgpiod/examples/gpiomon.rs
bindings/rust/libgpiod/examples/gpioset.rs
bindings/rust/libgpiod/src/chip.rs
bindings/rust/libgpiod/tests/common/config.rs
bindings/rust/libgpiod/tests/info_event.rs

index 04267d9d39c7b2370eb7579fa87d5683fdaacc48..cbdf1b59d84541f7c8176dde6c819fe2b1edac18 100644 (file)
@@ -42,7 +42,7 @@ fn main() -> Result<()> {
     let rconfig = request::Config::new()?;
 
     let mut buffer = request::Buffer::new(1)?;
-    let request = chip.request_lines(&rconfig, &lconfig)?;
+    let request = chip.request_lines(Some(&rconfig), &lconfig)?;
 
     loop {
         match request.wait_edge_events(None) {
index e17f0f08bcfa6f98c96825b6e4fda7149c96397d..367b2f6283d75222532cc8a788f074edbd8b4f26 100644 (file)
@@ -40,7 +40,7 @@ fn request_reconfigure_line(
         let request = chip
             .lock()
             .unwrap()
-            .request_lines(&rconfig, &lconfig)
+            .request_lines(Some(&rconfig), &lconfig)
             .unwrap();
 
         // Signal the parent to continue
index 6e60833e243fcb08286cf4967c0b9a4c71eba54b..74baf30115e913c089cf3b77bfbbcf554d326378 100644 (file)
@@ -37,7 +37,7 @@ fn main() -> Result<()> {
     let rconfig = request::Config::new()?;
     rconfig.set_consumer(&args[0])?;
 
-    let request = chip.request_lines(&rconfig, &lconfig)?;
+    let request = chip.request_lines(Some(&rconfig), &lconfig)?;
     let map = request.values()?;
 
     println!("{:?}", map);
index f17a81f3c23d487a453a96e670586b3ff9ea4137..a09ddfc6bb8c3265aa182db869c9a335661e7745 100644 (file)
@@ -41,7 +41,7 @@ fn main() -> Result<()> {
     let rconfig = request::Config::new()?;
 
     let mut buffer = request::Buffer::new(1)?;
-    let request = chip.request_lines(&rconfig, &lconfig)?;
+    let request = chip.request_lines(Some(&rconfig), &lconfig)?;
 
     loop {
         match request.wait_edge_events(None) {
index 875a3ad72391fc822e9b9b43ff921777b9c79f86..624799671e51ab9b67bc0cb8fdf84e533a79981c 100644 (file)
@@ -54,7 +54,7 @@ fn main() -> Result<()> {
     let rconfig = request::Config::new()?;
     rconfig.set_consumer(&args[0])?;
 
-    chip.request_lines(&rconfig, &lconfig)?;
+    chip.request_lines(Some(&rconfig), &lconfig)?;
 
     // Wait for keypress, let user verify line status.
     stdin().read_exact(&mut [0u8]).unwrap();
index 91b4c947547b60cac2d083f6f182bf82a487a6fa..9c3c2b41417006e05aec7b8002485095e376579a 100644 (file)
@@ -11,6 +11,7 @@ use std::cmp::Ordering;
 use std::ffi::{CStr, CString};
 use std::os::{raw::c_char, unix::prelude::AsRawFd};
 use std::path::Path;
+use std::ptr;
 use std::str;
 use std::sync::Arc;
 use std::time::Duration;
@@ -195,13 +196,18 @@ impl Chip {
     /// Request a set of lines for exclusive usage.
     pub fn request_lines(
         &self,
-        rconfig: &request::Config,
+        rconfig: Option<&request::Config>,
         lconfig: &line::Config,
     ) -> Result<request::Request> {
+        let req_cfg = match rconfig {
+            Some(cfg) => cfg.config,
+            _ => ptr::null(),
+        } as *mut gpiod::gpiod_request_config;
+
         // SAFETY: The `gpiod_line_request` returned by libgpiod is guaranteed to live as long
         // as the `struct Request`.
         let request = unsafe {
-            gpiod::gpiod_chip_request_lines(self.ichip.chip, rconfig.config, lconfig.config)
+            gpiod::gpiod_chip_request_lines(self.ichip.chip, req_cfg, lconfig.config)
         };
 
         if request.is_null() {
index 842a70a9d70e84815fbf540b3485ab5d30c5c79c..b838b66f66edeb577e9f885ec58851e972593927 100644 (file)
@@ -106,7 +106,7 @@ impl TestConfig {
     pub(crate) fn request_lines(&mut self) -> Result<()> {
         let chip = Chip::open(&self.sim.lock().unwrap().dev_path())?;
 
-        self.request = Some(chip.request_lines(&self.rconfig, &self.lconfig)?);
+        self.request = Some(chip.request_lines(Some(&self.rconfig), &self.lconfig)?);
         self.chip = Some(chip);
 
         Ok(())
index bfa0058e313e0d58a1c6cee2ca939c606925152d..6bf7a0f00ab9850a5c13f7ed14562130077d8973 100644 (file)
@@ -32,7 +32,7 @@ mod info_event {
             let request = chip
                 .lock()
                 .unwrap()
-                .request_lines(&rconfig, &lconfig1)
+                .request_lines(Some(&rconfig), &lconfig1)
                 .unwrap();
 
             // Signal the parent to continue