hd44780_driver/
display_mode.rs1use 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}