autd3_core/firmware/
intensity.rs

1/// The intensity of the ultrasound.
2///
3/// The arithmetic operations of [`Intensity`] are saturated.
4#[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    /// Maximum intensity.
16    pub const MAX: Intensity = Intensity(0xFF);
17    /// Minimum intensity.
18    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}