hd44780_controller/device/
common.rs

1pub trait Device {
2    fn set_register_select(&mut self, mode: RegisterSelectMode);
3    fn set_rw(&mut self, mode: RWMode);
4    fn set_enable(&mut self, enabled: bool);
5    fn set_backlight(&mut self, enabled: bool);
6    fn set_data_nibble(&mut self, data: u8);
7}
8
9#[cfg(feature = "async")]
10#[cfg_attr(docsrs, doc(cfg(feature = "async")))]
11pub trait AsyncDevice: Device {
12    type Err;
13
14    async fn delay_us_async(&mut self, us: u32);
15    async fn flush_async(&mut self) -> Result<(), Self::Err>;
16
17    async fn write_nibble_async(
18        &mut self,
19        mode: RegisterSelectMode,
20        data: u8,
21    ) -> Result<(), Self::Err> {
22        self.set_register_select(mode);
23        self.set_rw(RWMode::Write);
24        self.set_data_nibble(data);
25
26        self.set_enable(true);
27        self.flush_async().await?;
28        self.set_enable(false);
29        self.flush_async().await?;
30
31        Ok(())
32    }
33
34    async fn write_byte_async(
35        &mut self,
36        mode: RegisterSelectMode,
37        byte: u8,
38    ) -> Result<(), Self::Err> {
39        let high = (byte >> 4) & 0x0F;
40        let low = byte & 0x0F;
41
42        self.write_nibble_async(mode, high).await?;
43        self.write_nibble_async(mode, low).await?;
44        Ok(())
45    }
46}
47
48pub trait SyncDevice: Device {
49    type Err;
50
51    fn delay_us(&mut self, us: u32);
52    fn flush(&mut self) -> Result<(), Self::Err>;
53
54    fn write_nibble(&mut self, mode: RegisterSelectMode, data: u8) -> Result<(), Self::Err> {
55        self.set_register_select(mode);
56        self.set_rw(RWMode::Write);
57        self.set_data_nibble(data);
58
59        self.set_enable(true);
60        self.flush()?;
61        self.set_enable(false);
62        self.flush()?;
63
64        Ok(())
65    }
66
67    fn write_byte(&mut self, mode: RegisterSelectMode, byte: u8) -> Result<(), Self::Err> {
68        let high = (byte >> 4) & 0x0F;
69        let low = byte & 0x0F;
70
71        self.write_nibble(mode, high)?;
72        self.write_nibble(mode, low)?;
73        Ok(())
74    }
75}
76
77#[derive(Copy, Clone, Eq, PartialEq, Debug)]
78pub enum RegisterSelectMode {
79    Command,
80    Data,
81}
82
83#[derive(Copy, Clone, Eq, PartialEq, Debug)]
84pub enum RWMode {
85    Read,
86    Write,
87}