autd3_core/firmware/
intensity.rs

1use zerocopy::{Immutable, IntoBytes};
2
3/// The intensity of the ultrasound.
4#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, IntoBytes, Immutable)]
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<Intensity> 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::Sub<Intensity> for Intensity {
54    type Output = Self;
55
56    fn sub(self, rhs: Intensity) -> Self::Output {
57        Self(self.0.saturating_sub(rhs.0))
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64
65    #[rstest::rstest]
66    #[case::value_1_1(Intensity(0x01), Intensity(0x01), 1)]
67    #[case::value_1_2(Intensity(0x00), Intensity(0x01), 2)]
68    #[case::value_ff_2(Intensity(0x7F), Intensity(0xFF), 2)]
69    fn test_div(#[case] expected: Intensity, #[case] target: Intensity, #[case] div: u8) {
70        assert_eq!(expected, target / div);
71    }
72
73    #[rstest::rstest]
74    #[case::value_1_1(Intensity(0x01), Intensity(0x01), 1)]
75    #[case::value_1_2(Intensity(0x02), Intensity(0x01), 2)]
76    #[case::value_7f_2(Intensity(0xFE), Intensity(0x7F), 2)]
77    #[case::value_7f_3(Intensity(0xFF), Intensity(0x7F), 3)]
78    fn test_mul(#[case] expected: Intensity, #[case] target: Intensity, #[case] mul: u8) {
79        assert_eq!(expected, target * mul);
80        assert_eq!(expected, mul * target);
81    }
82
83    #[rstest::rstest]
84    #[case::value_1_1(Intensity(0x02), Intensity(0x01), Intensity(0x01))]
85    #[case::value_7f_7f(Intensity(0xFE), Intensity(0x7F), Intensity(0x7F))]
86    #[case::value_7f_ff(Intensity(0xFF), Intensity(0x7F), Intensity(0xFF))]
87    fn test_add(#[case] expected: Intensity, #[case] lhs: Intensity, #[case] rhs: Intensity) {
88        assert_eq!(expected, lhs + rhs);
89    }
90
91    #[rstest::rstest]
92    #[case::value_1_1(Intensity(0x00), Intensity(0x01), Intensity(0x01))]
93    #[case::value_7f_7f(Intensity(0x01), Intensity(0x02), Intensity(0x01))]
94    #[case::value_7f_ff(Intensity(0x00), Intensity(0x7F), Intensity(0xFF))]
95    fn test_sub(#[case] expected: Intensity, #[case] lhs: Intensity, #[case] rhs: Intensity) {
96        assert_eq!(expected, lhs - rhs);
97    }
98
99    #[test]
100    fn dbg() {
101        assert_eq!(alloc::format!("{:?}", Intensity(0x00)), "0x00");
102        assert_eq!(alloc::format!("{:?}", Intensity(0x01)), "0x01");
103        assert_eq!(alloc::format!("{:?}", Intensity(0xFF)), "0xFF");
104    }
105}