iowarrior_embedded_hal/digital/
input_pin.rs

1use crate::digital::digital_service;
2use crate::digital::PinError;
3use crate::iowarrior::{peripheral_service, IOWarriorData, IOWarriorMutData};
4use embedded_hal::digital::PinState;
5use std::cell::RefCell;
6use std::fmt;
7use std::rc::Rc;
8
9#[derive(Debug)]
10pub struct InputPin {
11    pub(crate) data: Rc<IOWarriorData>,
12    pub(crate) mut_data_refcell: Rc<RefCell<IOWarriorMutData>>,
13    pub(crate) pin: u8,
14}
15
16impl embedded_hal::digital::ErrorType for InputPin {
17    type Error = PinError;
18}
19
20impl embedded_hal::digital::InputPin for InputPin {
21    #[inline]
22    fn is_high(&mut self) -> Result<bool, Self::Error> {
23        digital_service::is_pin_input_state(
24            &self.data,
25            &mut self.mut_data_refcell.borrow_mut(),
26            self.pin,
27            PinState::High,
28        )
29    }
30
31    #[inline]
32    fn is_low(&mut self) -> Result<bool, Self::Error> {
33        digital_service::is_pin_input_state(
34            &self.data,
35            &mut self.mut_data_refcell.borrow_mut(),
36            self.pin,
37            PinState::Low,
38        )
39    }
40}
41
42#[cfg(feature = "embedded-hal-0")]
43impl embedded_hal_0::digital::v2::InputPin for InputPin {
44    type Error = PinError;
45
46    #[inline]
47    fn is_high(&self) -> Result<bool, Self::Error> {
48        digital_service::is_pin_input_state(
49            &self.data,
50            &mut self.mut_data_refcell.borrow_mut(),
51            self.pin,
52            PinState::High,
53        )
54    }
55
56    #[inline]
57    fn is_low(&self) -> Result<bool, Self::Error> {
58        digital_service::is_pin_input_state(
59            &self.data,
60            &mut self.mut_data_refcell.borrow_mut(),
61            self.pin,
62            PinState::Low,
63        )
64    }
65}
66
67impl fmt::Display for InputPin {
68    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
69        write!(f, "{:?}", self)
70    }
71}
72
73impl Drop for InputPin {
74    #[inline]
75    fn drop(&mut self) {
76        peripheral_service::disable_gpio(
77            &self.data,
78            &mut self.mut_data_refcell.borrow_mut(),
79            self.pin,
80        );
81    }
82}