Crates.io | async-std-gpiod |
lib.rs | async-std-gpiod |
version | 0.2.3 |
source | src |
created_at | 2022-07-31 05:33:13.153038 |
updated_at | 2023-01-21 20:08:29.911254 |
description | Linux GPIO character device interfacing with async-std |
homepage | |
repository | |
max_upload_size | |
id | 635971 |
size | 14,385 |
Rust crate for interfacing with Linux GPIO character devices. This crate supports async-std async runtime.
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.
Both v1 (>= 4.0) and v2 (>= v5.10) ABI currently supported but edge detection implemented for v2 only. Sysfs-based API (< 4.0) does not supported.
Input values:
use async_std_gpiod::{Chip, Options};
#[async_std::main]
async fn main() -> std::io::Result<()> {
let chip = Chip::new("gpiochip0").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_std_gpiod::{Chip, Options};
#[async_std::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_std_gpiod::{Chip, Options, EdgeDetect};
#[async_std::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(())
}