iowarrior_embedded_hal/digital/
input_pin.rs1use 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}