use embedded_hal::digital::{ErrorType, InputPin, PinState};
#[cfg(feature = "async")]
use embedded_hal_async::digital::Wait;
use crate::{access::DriverHandler, types::PinId};
pub struct Input<'a, A: DriverHandler> {
pub(crate) access: &'a A,
pub(crate) pin: PinId,
}
impl<'a, A: DriverHandler> ErrorType for Input<'a, A> {
type Error = A::Error;
}
impl<'a, A: DriverHandler> InputPin for Input<'a, A> {
fn is_high(&mut self) -> Result<bool, Self::Error> {
Ok(self.access.get_level(self.pin)? == PinState::High)
}
fn is_low(&mut self) -> Result<bool, Self::Error> {
Ok(self.access.get_level(self.pin)? == PinState::Low)
}
}
impl<'a, A: DriverHandler> Input<'a, A> {
pub fn is_high(&mut self) -> Result<bool, A::Error> {
<Self as embedded_hal::digital::InputPin>::is_high(self)
}
pub fn is_low(&mut self) -> Result<bool, A::Error> {
<Self as embedded_hal::digital::InputPin>::is_low(self)
}
}
#[cfg(feature = "async")]
impl<'a, A: DriverHandler> Wait for Input<'a, A> {
async fn wait_for_high(&mut self) -> Result<(), Self::Error> {
let signal = self
.access
.register_wait(self.pin, crate::types::WaitMode::Rising);
signal.reset();
if !self.is_high()? {
signal.wait().await;
}
Ok(())
}
async fn wait_for_low(&mut self) -> Result<(), Self::Error> {
let signal = self
.access
.register_wait(self.pin, crate::types::WaitMode::Falling);
signal.reset();
if !self.is_low()? {
signal.wait().await;
}
Ok(())
}
async fn wait_for_rising_edge(&mut self) -> Result<(), Self::Error> {
let signal = self
.access
.register_wait(self.pin, crate::types::WaitMode::Rising);
signal.reset();
signal.wait().await;
Ok(())
}
async fn wait_for_falling_edge(&mut self) -> Result<(), Self::Error> {
let signal = self
.access
.register_wait(self.pin, crate::types::WaitMode::Falling);
signal.reset();
signal.wait().await;
Ok(())
}
async fn wait_for_any_edge(&mut self) -> Result<(), Self::Error> {
let signal = self
.access
.register_wait(self.pin, crate::types::WaitMode::AnyEdge);
signal.reset();
signal.wait().await;
Ok(())
}
}