Skip to main content

hd44780_driver/
display_mode.rs

1use crate::{Cursor, CursorBlink, Display};
2
3pub struct DisplayMode {
4    pub cursor_visibility: Cursor,
5    pub cursor_blink: CursorBlink,
6    pub display: Display,
7}
8
9impl Default for DisplayMode {
10    fn default() -> DisplayMode {
11        DisplayMode {
12            cursor_visibility: Cursor::Visible,
13            cursor_blink: CursorBlink::On,
14            display: Display::On,
15        }
16    }
17}
18
19impl DisplayMode {
20    pub fn as_byte(&self) -> u8 {
21        let cursor_blink_bits = match self.cursor_blink {
22            CursorBlink::On => 0b0000_0001,
23            CursorBlink::Off => 0,
24        };
25
26        let cursor_visible_bits = match self.cursor_visibility {
27            Cursor::Visible => 0b0000_0010,
28            Cursor::Invisible => 0,
29        };
30
31        let display_bits = match self.display {
32            Display::On => 0b0000_0100,
33            Display::Off => 0,
34        };
35
36        0b0000_1000 | cursor_visible_bits | cursor_blink_bits | display_bits
37    }
38}
39
40#[cfg(test)]
41mod tests {
42
43    use super::*;
44
45    #[test]
46    fn cursor_visible() {
47        let dm = DisplayMode {
48            cursor_visibility: Cursor::Visible,
49            ..Default::default()
50        };
51
52        assert!(dm.as_byte() & 0b0000_0010 != 0);
53
54        let dm = DisplayMode {
55            cursor_visibility: Cursor::Invisible,
56            ..Default::default()
57        };
58
59        assert!(dm.as_byte() & 0b0000_0010 == 0);
60    }
61
62    #[test]
63    fn cursor_blink() {
64        let dm = DisplayMode {
65            cursor_blink: CursorBlink::On,
66            ..Default::default()
67        };
68
69        assert!(dm.as_byte() & 0b0000_0001 != 0);
70
71        let dm = DisplayMode {
72            cursor_blink: CursorBlink::Off,
73            ..Default::default()
74        };
75
76        assert!(dm.as_byte() & 0b0000_0001 == 0);
77    }
78
79    #[test]
80    fn display_visible() {
81        let dm = DisplayMode {
82            display: Display::On,
83            ..Default::default()
84        };
85
86        assert!(dm.as_byte() & 0b0000_0100 != 0);
87
88        let dm = DisplayMode {
89            display: Display::Off,
90            ..Default::default()
91        };
92
93        assert!(dm.as_byte() & 0b0000_0100 == 0);
94    }
95}