iowarrior_embedded_hal/digital/
output_pin.rs

1use crate::digital::{digital_service, PinError};
2use crate::iowarrior::{peripheral_service, IOWarriorData, IOWarriorMutData};
3use embedded_hal::digital::PinState;
4use std::cell::RefCell;
5use std::fmt;
6use std::rc::Rc;
7
8#[derive(Debug)]
9pub struct OutputPin {
10    pub(crate) data: Rc<IOWarriorData>,
11    pub(crate) mut_data_refcell: Rc<RefCell<IOWarriorMutData>>,
12    pub(crate) pin: u8,
13}
14
15impl embedded_hal::digital::ErrorType for OutputPin {
16    type Error = PinError;
17}
18
19impl embedded_hal::digital::OutputPin for OutputPin {
20    #[inline]
21    fn set_low(&mut self) -> Result<(), Self::Error> {
22        digital_service::set_pin_output_state(
23            &self.data,
24            &mut self.mut_data_refcell.borrow_mut(),
25            self.pin,
26            PinState::Low,
27        )
28    }
29
30    #[inline]
31    fn set_high(&mut self) -> Result<(), Self::Error> {
32        digital_service::set_pin_output_state(
33            &self.data,
34            &mut self.mut_data_refcell.borrow_mut(),
35            self.pin,
36            PinState::High,
37        )
38    }
39}
40
41impl embedded_hal::digital::StatefulOutputPin for OutputPin {
42    #[inline]
43    fn is_set_high(&mut self) -> Result<bool, Self::Error> {
44        digital_service::is_pin_output_state(
45            &self.data,
46            &mut self.mut_data_refcell.borrow_mut(),
47            self.pin,
48            PinState::High,
49        )
50    }
51
52    #[inline]
53    fn is_set_low(&mut self) -> Result<bool, Self::Error> {
54        digital_service::is_pin_output_state(
55            &self.data,
56            &mut self.mut_data_refcell.borrow_mut(),
57            self.pin,
58            PinState::Low,
59        )
60    }
61}
62
63#[cfg(feature = "embedded-hal-0")]
64impl embedded_hal_0::digital::v2::OutputPin for OutputPin {
65    type Error = PinError;
66
67    #[inline]
68    fn set_low(&mut self) -> Result<(), Self::Error> {
69        digital_service::set_pin_output_state(
70            &self.data,
71            &mut self.mut_data_refcell.borrow_mut(),
72            self.pin,
73            PinState::Low,
74        )
75    }
76
77    #[inline]
78    fn set_high(&mut self) -> Result<(), Self::Error> {
79        digital_service::set_pin_output_state(
80            &self.data,
81            &mut self.mut_data_refcell.borrow_mut(),
82            self.pin,
83            PinState::High,
84        )
85    }
86}
87
88#[cfg(feature = "embedded-hal-0")]
89impl embedded_hal_0::digital::v2::StatefulOutputPin for OutputPin {
90    #[inline]
91    fn is_set_high(&self) -> Result<bool, Self::Error> {
92        digital_service::is_pin_output_state(
93            &self.data,
94            &mut self.mut_data_refcell.borrow_mut(),
95            self.pin,
96            PinState::High,
97        )
98    }
99
100    #[inline]
101    fn is_set_low(&self) -> Result<bool, Self::Error> {
102        digital_service::is_pin_output_state(
103            &self.data,
104            &mut self.mut_data_refcell.borrow_mut(),
105            self.pin,
106            PinState::Low,
107        )
108    }
109}
110
111impl fmt::Display for OutputPin {
112    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
113        write!(f, "{:?}", self)
114    }
115}
116
117impl Drop for OutputPin {
118    #[inline]
119    fn drop(&mut self) {
120        peripheral_service::disable_gpio(
121            &self.data,
122            &mut self.mut_data_refcell.borrow_mut(),
123            self.pin,
124        );
125    }
126}