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