async-gpiod

Crates.ioasync-gpiod
lib.rsasync-gpiod
version0.3.0
sourcesrc
created_at2024-05-11 04:59:35.148624
updated_at2024-05-11 04:59:35.148624
descriptionLinux GPIO character device with async interface
homepagehttps://github.com/katyo/gpiod-rs
repositoryhttps://github.com/katyo/gpiod-rs
max_upload_size
id1236635
size13,459
Kayo Phoenix (katyo)

documentation

README

libgpiod in Rust for async

github crate docs MIT CI

Rust crate for interfacing with Linux GPIO character devices. This crate supports various async runtimes like the smol and async-std.

It provides an interface to the Linux GPIO using the chardev module. This interface involves calling ioctl funcions which are unsafe and require some unintuitive variable mapping. To ease this process, this crate provides a [Chip] struct which encapsulates the interface in safe Rust functions. The functionality provided here is highly inspired by libgpiod.

Since all functionality is dependent on Linux function calls, this crate only compiles for Linux systems.

ABI compatibility

Both ABI v1 (linux >= 4.0) and v2 (linux >= v5.10) supported but edge detection implemented for v2 only. Deprecated sysfs-based API (linux < 4.0) currently is not supported at all.

Crates

  • gpiod-core - core abstractions and low level interface (not for end users)
  • gpiod - sync interface which supports synchronous operation only
  • tokio-gpiod - async interface for tokio fans
  • async-gpiod - async interface to use with non-tokio async runtimes

Usage examples

Input values:

use async_gpiod::{Chip, Options};

#[smol_potat::main]
async fn main() -> std::io::Result<()> {
    let chip = Chip::new(0).await?; // open chip

    let opts = Options::input([27, 3, 11]) // configure lines offsets
        .consumer("my-inputs"); // optionally set consumer string

    let inputs = chip.request_lines(opts).await?;

    let values = inputs.get_values([false; 3]).await?;

    println!("values: {:?}", values);

    Ok(())
}

Output values:

use async_gpiod::{Chip, Options};

#[smol_potat::main]
async fn main() -> std::io::Result<()> {
    let chip = Chip::new("gpiochip0").await?; // open chip

    let opts = Options::output([9, 21]) // configure lines offsets
        .values([false, true]) // optionally set initial values
        .consumer("my-outputs"); // optionally set consumer string

    let outputs = chip.request_lines(opts).await?;

    outputs.set_values([true, false]).await?;

    Ok(())
}

Monitor values:

use async_gpiod::{Chip, Options, EdgeDetect};

#[smol_potat::main]
async fn main() -> std::io::Result<()> {
    let chip = Chip::new("gpiochip0").await?; // open chip

    let opts = Options::input([4, 7]) // configure lines offsets
        .edge(EdgeDetect::Both) // configure edges to detect
        .consumer("my-inputs"); // optionally set consumer string

    let mut inputs = chip.request_lines(opts).await?;

    loop {
        let event = inputs.read_event().await?;

        println!("event: {:?}", event);
    }

    Ok(())
}
Commit count: 112

cargo fmt