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}