xl9555-hal 0.3.0

embedded-hal driver for the XL9555 GPIO expander
Documentation
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(())
    }
}