max7219_display/
registers.rs1use crate::{Error, Result};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14#[repr(u8)]
15pub enum Register {
16 NoOp = 0x00,
18 Digit0 = 0x01,
20 Digit1 = 0x02,
22 Digit2 = 0x03,
24 Digit3 = 0x04,
26 Digit4 = 0x05,
28 Digit5 = 0x06,
30 Digit6 = 0x07,
32 Digit7 = 0x08,
34 DecodeMode = 0x09,
36 Intensity = 0x0A,
38 ScanLimit = 0x0B,
40 Shutdown = 0x0C,
42 DisplayTest = 0x0F,
44}
45
46impl Register {
47 pub const fn addr(self) -> u8 {
49 self as u8
50 }
51
52 pub(crate) fn try_digit(digit: u8) -> Result<Self> {
54 match digit {
55 0 => Ok(Register::Digit0),
56 1 => Ok(Register::Digit1),
57 2 => Ok(Register::Digit2),
58 3 => Ok(Register::Digit3),
59 4 => Ok(Register::Digit4),
60 5 => Ok(Register::Digit5),
61 6 => Ok(Register::Digit6),
62 7 => Ok(Register::Digit7),
63 _ => Err(Error::InvalidDigit),
64 }
65 }
66
67 pub fn digits() -> impl Iterator<Item = Register> {
72 [
73 Register::Digit0,
74 Register::Digit1,
75 Register::Digit2,
76 Register::Digit3,
77 Register::Digit4,
78 Register::Digit5,
79 Register::Digit6,
80 Register::Digit7,
81 ]
82 .into_iter()
83 }
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, Eq)]
95#[repr(u8)]
96pub enum DecodeMode {
97 NoDecode = 0x00,
102
103 Digit0 = 0x01,
107
108 Digits0To3 = 0x0F,
112
113 AllDigits = 0xFF,
117}
118
119impl DecodeMode {
120 pub const fn value(self) -> u8 {
122 self as u8
123 }
124}
125
126#[cfg(test)]
127mod tests {
128 use super::*;
129
130 #[test]
131 fn test_register_addr() {
132 assert_eq!(Register::NoOp.addr(), 0x00);
133 assert_eq!(Register::Digit0.addr(), 0x01);
134 assert_eq!(Register::Digit7.addr(), 0x08);
135 assert_eq!(Register::DecodeMode.addr(), 0x09);
136 assert_eq!(Register::Intensity.addr(), 0x0A);
137 assert_eq!(Register::ScanLimit.addr(), 0x0B);
138 assert_eq!(Register::Shutdown.addr(), 0x0C);
139 assert_eq!(Register::DisplayTest.addr(), 0x0F);
140 }
141
142 #[test]
143 fn test_try_digit_valid() {
144 assert_eq!(Register::try_digit(0), Ok(Register::Digit0));
145 assert_eq!(Register::try_digit(1), Ok(Register::Digit1));
146 assert_eq!(Register::try_digit(2), Ok(Register::Digit2));
147 assert_eq!(Register::try_digit(3), Ok(Register::Digit3));
148 assert_eq!(Register::try_digit(4), Ok(Register::Digit4));
149 assert_eq!(Register::try_digit(5), Ok(Register::Digit5));
150 assert_eq!(Register::try_digit(6), Ok(Register::Digit6));
151 assert_eq!(Register::try_digit(7), Ok(Register::Digit7));
152 }
153
154 #[test]
155 fn test_try_digit_invalid() {
156 assert_eq!(Register::try_digit(8), Err(Error::InvalidDigit));
157 assert_eq!(Register::try_digit(255), Err(Error::InvalidDigit));
158 }
159
160 #[test]
161 fn test_digits_iterator() {
162 let expected = [
163 Register::Digit0,
164 Register::Digit1,
165 Register::Digit2,
166 Register::Digit3,
167 Register::Digit4,
168 Register::Digit5,
169 Register::Digit6,
170 Register::Digit7,
171 ];
172 let actual: Vec<Register> = Register::digits().collect();
173 assert_eq!(actual, expected);
174 }
175
176 #[test]
177 fn test_decode_mode_value() {
178 assert_eq!(DecodeMode::NoDecode.value(), 0x00);
179 assert_eq!(DecodeMode::Digit0.value(), 0x01);
180 assert_eq!(DecodeMode::Digits0To3.value(), 0x0F);
181 assert_eq!(DecodeMode::AllDigits.value(), 0xFF);
182 }
183}