Skip to main content

hd44780_driver/
entry_mode.rs

1/// Determines if the cursor should be incremented or decremented on write
2#[derive(Debug, PartialEq, Eq)]
3pub enum CursorMode {
4    Increment,
5    Decrement,
6}
7
8impl Default for CursorMode {
9    fn default() -> CursorMode {
10        CursorMode::Increment
11    }
12}
13
14/// Determines if the screen should be shifted on write
15#[derive(Debug, PartialEq, Eq)]
16pub enum ShiftMode {
17    Enabled,
18    Disabled,
19}
20
21impl From<bool> for ShiftMode {
22    fn from(b: bool) -> ShiftMode {
23        if b {
24            ShiftMode::Enabled
25        } else {
26            ShiftMode::Disabled
27        }
28    }
29}
30
31impl Default for ShiftMode {
32    fn default() -> ShiftMode {
33        ShiftMode::Disabled
34    }
35}
36
37#[derive(Default)]
38pub struct EntryMode {
39    pub cursor_mode: CursorMode,
40    pub shift_mode: ShiftMode,
41}
42
43impl EntryMode {
44    pub fn as_byte(&self) -> u8 {
45        let cursor_bits = match self.cursor_mode {
46            CursorMode::Increment => 0b0000_0010,
47            CursorMode::Decrement => 0,
48        };
49
50        let shift_bits = match self.shift_mode {
51            ShiftMode::Enabled => 0b0000_0001,
52            ShiftMode::Disabled => 0,
53        };
54
55        0b0000_0100 | cursor_bits | shift_bits
56    }
57}
58
59#[cfg(test)]
60mod tests {
61
62    use super::*;
63
64    #[test]
65    fn cursor_mode() {
66        let em = EntryMode {
67            cursor_mode: CursorMode::Increment,
68            shift_mode: Default::default(),
69        };
70
71        assert!(em.as_byte() & 0b0000_0010 != 0);
72
73        let em = EntryMode {
74            cursor_mode: CursorMode::Decrement,
75            shift_mode: Default::default(),
76        };
77
78        assert!(em.as_byte() & 0b0000_0010 == 0);
79    }
80
81    #[test]
82    fn shift_mode() {
83        let em = EntryMode {
84            cursor_mode: Default::default(),
85            shift_mode: ShiftMode::Enabled,
86        };
87
88        assert!(em.as_byte() & 0b0000_0001 != 0);
89
90        let em = EntryMode {
91            cursor_mode: Default::default(),
92            shift_mode: ShiftMode::Disabled,
93        };
94
95        assert!(em.as_byte() & 0b0000_0001 == 0);
96    }
97}