hd44780-controller 0.1.0-alpha.1

HD44780 LCD controller with async/sync support for embedded-hal
Documentation
pub trait Device {
    fn set_register_select(&mut self, mode: RegisterSelectMode);
    fn set_rw(&mut self, mode: RWMode);
    fn set_enable(&mut self, enabled: bool);
    fn set_backlight(&mut self, enabled: bool);
    fn set_data_nibble(&mut self, data: u8);
}

#[cfg(feature = "async")]
#[cfg_attr(docsrs, doc(cfg(feature = "async")))]
pub trait AsyncDevice: Device {
    type Err;

    async fn delay_us_async(&mut self, us: u32);
    async fn flush_async(&mut self) -> Result<(), Self::Err>;

    async fn write_nibble_async(
        &mut self,
        mode: RegisterSelectMode,
        data: u8,
    ) -> Result<(), Self::Err> {
        self.set_register_select(mode);
        self.set_rw(RWMode::Write);
        self.set_data_nibble(data);

        self.set_enable(true);
        self.flush_async().await?;
        self.set_enable(false);
        self.flush_async().await?;

        Ok(())
    }

    async fn write_byte_async(
        &mut self,
        mode: RegisterSelectMode,
        byte: u8,
    ) -> Result<(), Self::Err> {
        let high = (byte >> 4) & 0x0F;
        let low = byte & 0x0F;

        self.write_nibble_async(mode, high).await?;
        self.write_nibble_async(mode, low).await?;
        Ok(())
    }
}

pub trait SyncDevice: Device {
    type Err;

    fn delay_us(&mut self, us: u32);
    fn flush(&mut self) -> Result<(), Self::Err>;

    fn write_nibble(&mut self, mode: RegisterSelectMode, data: u8) -> Result<(), Self::Err> {
        self.set_register_select(mode);
        self.set_rw(RWMode::Write);
        self.set_data_nibble(data);

        self.set_enable(true);
        self.flush()?;
        self.set_enable(false);
        self.flush()?;

        Ok(())
    }

    fn write_byte(&mut self, mode: RegisterSelectMode, byte: u8) -> Result<(), Self::Err> {
        let high = (byte >> 4) & 0x0F;
        let low = byte & 0x0F;

        self.write_nibble(mode, high)?;
        self.write_nibble(mode, low)?;
        Ok(())
    }
}

#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum RegisterSelectMode {
    Command,
    Data,
}

#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum RWMode {
    Read,
    Write,
}