1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
use parking_lot::Mutex; #[cfg(target_arch = "armv7")] use rppal::gpio::{Error::InstanceExists, Gpio}; use std::io::{Error, ErrorKind}; use std::sync::Arc; #[cfg(not(target_arch = "armv7"))] pub type GpioArcMutex = Arc<Mutex<i32>>; #[cfg(target_arch = "armv7")] pub type GpioArcMutex = Arc<Mutex<Gpio>>; #[cfg(not(target_arch = "armv7"))] pub fn create_gpio_arc_mutex() -> Result<GpioArcMutex, String> { Ok(Arc::new(Mutex::new(0))) } #[cfg(target_arch = "armv7")] pub fn create_gpio_arc_mutex() -> Result<GpioArcMutex, InstanceExists> { Arc::new(Mutex::new(Gpio::new()))? } #[cfg(not(target_arch = "armv7"))] pub fn set_gpio_level_rpi( _gpio_num: i32, level: &str, gpio_arc_mutex: GpioArcMutex, ) -> Result<(), Error> { let mut data = gpio_arc_mutex.lock(); match level { "high" => *data += 1, "low" => *data += 1, _ => { return Err(Error::new( ErrorKind::Other, format!("Invalid level: '{}'", level), )) } } Ok(()) } #[cfg(target_arch = "armv7")] pub fn set_gpio_level_rpi( gpio_num: i32, level: &str, gpio_arc_mutex: GpioArcMutex, ) -> Result<(), Error> { let gpio_instance = gpio_arc_mutex.lock(); let mut gpio = gpio_instance.get(gpio_num)?.into_output(); match level { "high" => gpio_instance.set_high(), "low" => gpio_instance.set_low(), _ => { return Err(Error::new( ErrorKind::Other, format!("Invalid level: '{}'", level), )) } } Ok(()) }