diff --git a/Cargo.lock b/Cargo.lock index 9b95941..29e7388 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,24 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "libc" +version = "0.2.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" + +[[package]] +name = "rppal" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612e1a22e21f08a246657c6433fe52b773ae43d07c9ef88ccfc433cc8683caba" +dependencies = [ + "libc", +] + [[package]] name = "rust-simple-gpio" version = "0.1.0" +dependencies = [ + "rppal", +] diff --git a/Cargo.toml b/Cargo.toml index 47cedb4..93a72f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +rppal = "0.14.1" diff --git a/src/main.rs b/src/main.rs index b361fe4..31589c7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,47 @@ -fn main() { - println!("Hello, world!"); +use std::thread; - let x = 5; - println!("The value of x is: {}", x); +use rppal::gpio::{Gpio, Level, Pin}; + +const BUTTON_PIN: u8 = 17; + +// with internal pull up resistor, we get a low reading as +// the electrons flow to ground due to the voltage difference and less resistance path. +// so the mcu reads low when the button is pressed. +fn is_button_pressed(pin: &rppal::gpio::InputPin) -> bool { + pin.is_low() +} + +fn is_button_pressed2(pin: &rppal::gpio::InputPin) -> bool { + match pin.read() { + Ok(Level::Low) => true, + Ok(Level::High) => false, + Err(_) => { + println!("Error reading pin"); + false + }, + } +} + +fn read_loop(pin: &rppal::gpio::InputPin) { + loop { + if is_button_pressed(pin) { + println!("Button is pressed mate!"); + } + + thread::sleep(Duration::from_secs(1)); + } +} + +fn main() -> Result<(), rppal::gpio::Error> { + println!("Hello world"); + + let gpio = Gpio::new()?; + let pin = gpio.get(BUTTON_PIN)?.into_input_pullup(); + + // spawn a thread to read the pin + thread::spawn(|| { + read_loop(&pin); + }); + + Ok(()) }