diff --git a/src/icm20689.rs b/src/icm20689.rs index 9492c0287..fed0434ad 100644 --- a/src/icm20689.rs +++ b/src/icm20689.rs @@ -1,16 +1,19 @@ -use std::error::Error; +use std::{error::Error, thread::sleep, time::Duration}; use icm20689::{self, Builder as ImuBuilder, SpiInterface, ICM20689}; use linux_embedded_hal::spidev::{SpiModeFlags, SpidevOptions}; -use linux_embedded_hal::sysfs_gpio::Direction; -use linux_embedded_hal::{Delay, Pin, Spidev}; +use linux_embedded_hal::{ + gpio_cdev::{Chip, LineRequestFlags}, + CdevPin, +}; +use linux_embedded_hal::{Delay, Spidev}; use crate::peripherals::{ AccelerometerSensor, AnyHardware, GyroscopeSensor, PeripheralClass, PeripheralInfo, Peripherals, }; pub struct Icm20689Device { - imu: ICM20689>, + imu: ICM20689>, info: PeripheralInfo, } @@ -36,7 +39,7 @@ impl AnyHardware for Icm20689Device { pub struct Icm20689Builder { spi_device: String, - cs_pin_number: u64, + cs_pin_number: u32, info: PeripheralInfo, } @@ -67,7 +70,7 @@ impl Icm20689Builder { /// # Arguments /// /// * `pin_number` - The SPI pin number (e.g., 16). - pub fn with_cs_pin(mut self, pin_number: u64) -> Self { + pub fn with_cs_pin(mut self, pin_number: u32) -> Self { self.cs_pin_number = pin_number; self } @@ -86,11 +89,18 @@ impl Icm20689Builder { .build(); spi.configure(&options)?; - let cs_pin = Pin::new(self.cs_pin_number); - cs_pin.export()?; - std::thread::sleep(std::time::Duration::from_millis(60)); - cs_pin.set_direction(Direction::Out)?; - cs_pin.set_value(1)?; + let cs_pin = { + let mut chip = Chip::new("/dev/gpiochip0").unwrap(); + let line = chip + .get_line(self.cs_pin_number) + .unwrap() + .request(LineRequestFlags::OUTPUT, 1, "cs-icm20689") + .expect("Failed to request CS pin"); + let pin = CdevPin::new(line)?; + sleep(Duration::from_millis(30)); + pin.set_value(1)?; + pin + }; let mut imu = ImuBuilder::new_spi(spi, cs_pin); diff --git a/src/leak.rs b/src/leak.rs index 5dbbee886..675fc9067 100644 --- a/src/leak.rs +++ b/src/leak.rs @@ -1,11 +1,11 @@ use std::{error::Error, thread::sleep, time::Duration}; -use linux_embedded_hal::sysfs_gpio::{Direction, Pin}; +use linux_embedded_hal::gpio_cdev::{Chip, LineHandle, LineRequestFlags}; use crate::peripherals::{AnyHardware, LeakSensor, PeripheralClass, PeripheralInfo, Peripherals}; pub struct LeakDetector { - pin: Pin, + pin: LineHandle, info: PeripheralInfo, } @@ -26,7 +26,7 @@ impl AnyHardware for LeakDetector { } pub struct LeakBuilder { - pin_number: u64, + pin_number: u32, info: PeripheralInfo, } @@ -46,7 +46,7 @@ impl LeakBuilder { /// # Arguments /// /// * `pin_number` - The GPIO pin number. - pub fn with_pin(mut self, pin_number: u64) -> Self { + pub fn with_pin(mut self, pin_number: u32) -> Self { self.pin_number = pin_number; self } @@ -57,10 +57,17 @@ impl LeakBuilder { } pub fn build(self) -> Result> { - let pin = Pin::new(self.pin_number); - pin.export()?; - sleep(Duration::from_millis(60)); - pin.set_direction(Direction::In)?; + let pin = { + let mut chip = Chip::new("/dev/gpiochip0")?; + let pin = chip + .get_line(self.pin_number) + .unwrap() + .request(LineRequestFlags::INPUT, 1, "pin-leak") + .expect("Failed to configure LEAK pin"); + sleep(Duration::from_millis(30)); + pin + }; + Ok(LeakDetector { pin, info: self.info, diff --git a/src/led.rs b/src/led.rs index df435e31d..d249329e7 100644 --- a/src/led.rs +++ b/src/led.rs @@ -1,11 +1,11 @@ use std::{thread::sleep, time::Duration}; -use linux_embedded_hal::{sysfs_gpio::Direction, Pin}; +use linux_embedded_hal::gpio_cdev::{Chip, LineHandle, LineRequestFlags}; use crate::peripherals::{AnyHardware, LedBehaviour, PeripheralClass, PeripheralInfo, Peripherals}; pub struct LedController { - pub leds: Vec, + pub leds: Vec, pub info: PeripheralInfo, } @@ -26,7 +26,7 @@ impl AnyHardware for LedController { } pub struct LedControllerBuilder { - pub pins: Vec, + pub pins: Vec, pub info: PeripheralInfo, } @@ -42,7 +42,7 @@ impl LedControllerBuilder { } /// Adds a GPIO pin to control an LED. - pub fn add_led_pin(mut self, pin_number: u64) -> Self { + pub fn add_led_pin(mut self, pin_number: u32) -> Self { self.pins.push(pin_number); self } @@ -65,12 +65,18 @@ impl LedControllerBuilder { self = self.configure_navigator(); } + let mut chip = Chip::new("/dev/gpiochip0").unwrap(); for &pin_number in &self.pins { - let pin = Pin::new(pin_number); - pin.export().expect("Failed to export LED pin"); - sleep(Duration::from_millis(60)); - pin.set_direction(Direction::Out) - .expect("Failed to set direction"); + let pin = chip + .get_line(pin_number) + .unwrap() + .request( + LineRequestFlags::OUTPUT, + 1, + &format!("user-led-{pin_number}"), + ) + .expect("Failed to request LED pin"); + sleep(Duration::from_millis(30)); pin.set_value(1).expect("Failed to set initial LED value"); leds.push(pin); } diff --git a/src/pca9685.rs b/src/pca9685.rs index a8b599765..130ba9988 100644 --- a/src/pca9685.rs +++ b/src/pca9685.rs @@ -1,13 +1,16 @@ use std::{error::Error, thread::sleep, time::Duration}; -use linux_embedded_hal::{sysfs_gpio::Direction, I2cdev, Pin}; +use linux_embedded_hal::{ + gpio_cdev::{Chip, LineHandle, LineRequestFlags}, + I2cdev, +}; use pwm_pca9685::{Address as PwmAddress, Channel, Pca9685}; use crate::peripherals::{AnyHardware, PeripheralClass, PeripheralInfo, Peripherals, PwmBehaviour}; pub struct Pca9685Device { pwm: Pca9685, - oe_pin: Pin, + oe_pin: LineHandle, info: PeripheralInfo, } @@ -30,7 +33,7 @@ impl AnyHardware for Pca9685Device { pub struct Pca9685DeviceBuilder { i2c_bus: String, address: PwmAddress, - oe_pin_number: u64, + oe_pin_number: u32, info: PeripheralInfo, } @@ -72,7 +75,7 @@ impl Pca9685DeviceBuilder { /// # Arguments /// /// * `pin_number` - The GPIO pin number for OE. - pub fn with_oe_pin(mut self, pin_number: u64) -> Self { + pub fn with_oe_pin(mut self, pin_number: u32) -> Self { self.oe_pin_number = pin_number; self } @@ -89,10 +92,14 @@ impl Pca9685DeviceBuilder { let mut pwm = Pca9685::new(device, self.address).expect("Failed to open PWM controller"); let oe_pin = { - let pin = Pin::new(self.oe_pin_number); - pin.export()?; - sleep(Duration::from_millis(60)); - pin.set_direction(Direction::High)?; + let mut chip = Chip::new("/dev/gpiochip0")?; + let pin = chip + .get_line(self.oe_pin_number) + .unwrap() + .request(LineRequestFlags::OUTPUT, 1, "oe-pin-pca9685") + .expect("Failed to request OE pin"); + sleep(Duration::from_millis(30)); + pin.set_value(1)?; pin }; @@ -110,12 +117,9 @@ impl Pca9685DeviceBuilder { impl PwmBehaviour for Pca9685Device { fn enable_output(&mut self, enable: bool) -> Result<(), Box> { - let value = if enable { - Direction::Low - } else { - Direction::High - }; // Active low OE pin - self.oe_pin.set_direction(value).unwrap(); + // Active low OE pin + let value = if enable { 0 } else { 1 }; + self.oe_pin.set_value(value).unwrap(); Ok(()) }