autd3_core/firmware/
intensity.rs1#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
5#[repr(C)]
6pub struct Intensity(pub u8);
7
8impl core::fmt::Debug for Intensity {
9 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
10 write!(f, "0x{:02X}", self.0)
11 }
12}
13
14impl Intensity {
15 pub const MAX: Intensity = Intensity(0xFF);
17 pub const MIN: Intensity = Intensity(0x00);
19}
20
21impl core::ops::Div<u8> for Intensity {
22 type Output = Self;
23
24 fn div(self, rhs: u8) -> Self::Output {
25 Self(self.0 / rhs)
26 }
27}
28
29impl core::ops::Mul<u8> for Intensity {
30 type Output = Intensity;
31
32 fn mul(self, rhs: u8) -> Self::Output {
33 Intensity(self.0.saturating_mul(rhs))
34 }
35}
36
37impl core::ops::Mul<Intensity> for u8 {
38 type Output = Intensity;
39
40 fn mul(self, rhs: Intensity) -> Self::Output {
41 Intensity(self.saturating_mul(rhs.0))
42 }
43}
44
45impl core::ops::Add for Intensity {
46 type Output = Self;
47
48 fn add(self, rhs: Intensity) -> Self::Output {
49 Self(self.0.saturating_add(rhs.0))
50 }
51}
52
53impl core::ops::AddAssign for Intensity {
54 fn add_assign(&mut self, rhs: Intensity) {
55 self.0 = self.0.saturating_add(rhs.0);
56 }
57}
58
59impl core::ops::Sub for Intensity {
60 type Output = Self;
61
62 fn sub(self, rhs: Intensity) -> Self::Output {
63 Self(self.0.saturating_sub(rhs.0))
64 }
65}
66
67impl core::ops::SubAssign for Intensity {
68 fn sub_assign(&mut self, rhs: Intensity) {
69 self.0 = self.0.saturating_sub(rhs.0);
70 }
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76
77 #[rstest::rstest]
78 #[case(Intensity(0x01), Intensity(0x01), 1)]
79 #[case(Intensity(0x00), Intensity(0x01), 2)]
80 #[case(Intensity(0x7F), Intensity(0xFF), 2)]
81 fn div(#[case] expected: Intensity, #[case] target: Intensity, #[case] d: u8) {
82 assert_eq!(expected, target / d);
83 }
84
85 #[rstest::rstest]
86 #[case(Intensity(0x01), Intensity(0x01), 1)]
87 #[case(Intensity(0x02), Intensity(0x01), 2)]
88 #[case(Intensity(0xFE), Intensity(0x7F), 2)]
89 #[case(Intensity(0xFF), Intensity(0x7F), 3)]
90 fn mul(#[case] expected: Intensity, #[case] target: Intensity, #[case] m: u8) {
91 assert_eq!(expected, target * m);
92 assert_eq!(expected, m * target);
93 }
94
95 #[rstest::rstest]
96 #[case(Intensity(0x02), Intensity(0x01), Intensity(0x01))]
97 #[case(Intensity(0xFE), Intensity(0x7F), Intensity(0x7F))]
98 #[case(Intensity(0xFF), Intensity(0x7F), Intensity(0xFF))]
99 fn add(#[case] expected: Intensity, #[case] lhs: Intensity, #[case] rhs: Intensity) {
100 assert_eq!(expected, lhs + rhs);
101 }
102
103 #[rstest::rstest]
104 #[case(Intensity(0x02), Intensity(0x01), Intensity(0x01))]
105 #[case(Intensity(0xFE), Intensity(0x7F), Intensity(0x7F))]
106 #[case(Intensity(0xFF), Intensity(0x7F), Intensity(0xFF))]
107 fn add_assign(#[case] expected: Intensity, #[case] mut lhs: Intensity, #[case] rhs: Intensity) {
108 lhs += rhs;
109 assert_eq!(expected, lhs);
110 }
111
112 #[rstest::rstest]
113 #[case(Intensity(0x00), Intensity(0x01), Intensity(0x01))]
114 #[case(Intensity(0x01), Intensity(0x02), Intensity(0x01))]
115 #[case(Intensity(0x00), Intensity(0x7F), Intensity(0xFF))]
116 fn sub(#[case] expected: Intensity, #[case] lhs: Intensity, #[case] rhs: Intensity) {
117 assert_eq!(expected, lhs - rhs);
118 }
119
120 #[rstest::rstest]
121 #[case(Intensity(0x00), Intensity(0x01), Intensity(0x01))]
122 #[case(Intensity(0x01), Intensity(0x02), Intensity(0x01))]
123 #[case(Intensity(0x00), Intensity(0x7F), Intensity(0xFF))]
124 fn sub_assign(#[case] expected: Intensity, #[case] mut lhs: Intensity, #[case] rhs: Intensity) {
125 lhs -= rhs;
126 assert_eq!(expected, lhs);
127 }
128
129 #[test]
130 fn dbg() {
131 assert_eq!(format!("{:?}", Intensity(0x00)), "0x00");
132 assert_eq!(format!("{:?}", Intensity(0x01)), "0x01");
133 assert_eq!(format!("{:?}", Intensity(0xFF)), "0xFF");
134 }
135}