Description
Hello!
First, thanks a lot for creating this crate and the work you put into it.
I have a small suggestion that could improve the documentation. Consider the following program which is a simplified version of the driveoutput.rs
example:
use gpio_cdev::{Chip, LineRequestFlags};
fn main() {
let mut chip = Chip::new("/dev/gpiochip0").unwrap();
chip
.get_line(4).unwrap()
.request(LineRequestFlags::OUTPUT, 1, "set-pin").unwrap();
println!("Press Enter to exit");
let mut buf = String::new();
::std::io::stdin().read_line(&mut buf).unwrap();
}
This program compiles and does not panic, but seemingly does nothing as the pin remains in an unset state while the program waits on the user to press Enter
. However, if we assign the LineHandle
instance to a variable like this:
let _handle = chip
.get_line(4).unwrap()
.request(LineRequestFlags::OUTPUT, 1, "set-pin").unwrap();
Then the pin state is correctly set, presumably because the file descriptor contained inside the LineHandle
doesn't immediately get dropped after request
is called.
I think that it is important to note in the comments that the LineHandle
needs to remain in scope or assigned to a persistent variable to prevent these sorts of "silent failures." It may be obvious in the above example, but in my case I do some initialization of the chip and store it inside a struct that is passed around; it took me about a day of debugging to realize that I needed initialize and store the LineHandle
instance in addition to the Chip
.
If you agree, then I will open a small PR to update the examples and docstrings to make note of this.