infrared_rs/
hardware.rs

1use gpio_cdev::{Chip, LineHandle, LineRequestFlags};
2use rppal::gpio::{InputPin, Level};
3
4use crate::errors::Result;
5
6pub enum HardwareInput {
7    RaspberryPi { pin: InputPin },
8    Cdev { handle: LineHandle },
9}
10
11impl HardwareInput {
12    pub fn new_cdev(pin_number: u32, device_path: String) -> Result<Self> {
13        let mut chip = Chip::new(device_path)?;
14        let handle = chip.get_line(pin_number)?.request(
15            LineRequestFlags::INPUT,
16            0,
17            env!("CARGO_PKG_NAME"),
18        )?;
19        Ok(Self::Cdev { handle })
20    }
21
22    pub fn new_raspberry(pin_number: u8) -> Result<Self> {
23        let pin = rppal::gpio::Gpio::new()?.get(pin_number)?.into_input();
24        Ok(Self::RaspberryPi { pin })
25    }
26
27    pub fn read_value(&self) -> Result<Level> {
28        match self {
29            HardwareInput::RaspberryPi { pin } => Ok(pin.read()),
30            HardwareInput::Cdev { handle } => {
31                let raw_value = handle.get_value()?;
32                Ok(if raw_value == 1 {
33                    Level::High
34                } else {
35                    Level::Low
36                })
37            }
38        }
39    }
40}