autd3_core/gain/
emit_intensity.rs

1use derive_more::Debug;
2use zerocopy::{Immutable, IntoBytes};
3
4/// The intensity of the ultrasound.
5#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, IntoBytes, Immutable)]
6#[debug("{:#04X}", self.0)]
7#[repr(C)]
8pub struct EmitIntensity(pub u8);
9
10impl EmitIntensity {
11    /// Maximum intensity.
12    pub const MAX: EmitIntensity = EmitIntensity(0xFF);
13    /// Minimum intensity.
14    pub const MIN: EmitIntensity = EmitIntensity(0x00);
15}
16
17impl std::ops::Div<u8> for EmitIntensity {
18    type Output = Self;
19
20    fn div(self, rhs: u8) -> Self::Output {
21        Self(self.0 / rhs)
22    }
23}
24
25impl std::ops::Mul<u8> for EmitIntensity {
26    type Output = EmitIntensity;
27
28    fn mul(self, rhs: u8) -> Self::Output {
29        EmitIntensity(self.0.saturating_mul(rhs))
30    }
31}
32
33impl std::ops::Mul<EmitIntensity> for u8 {
34    type Output = EmitIntensity;
35
36    fn mul(self, rhs: EmitIntensity) -> Self::Output {
37        EmitIntensity(self.saturating_mul(rhs.0))
38    }
39}
40
41impl std::ops::Add<EmitIntensity> for EmitIntensity {
42    type Output = Self;
43
44    fn add(self, rhs: EmitIntensity) -> Self::Output {
45        Self(self.0.saturating_add(rhs.0))
46    }
47}
48
49impl std::ops::Sub<EmitIntensity> for EmitIntensity {
50    type Output = Self;
51
52    fn sub(self, rhs: EmitIntensity) -> Self::Output {
53        Self(self.0.saturating_sub(rhs.0))
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60
61    #[rstest::rstest]
62    #[test]
63    #[case::value_1_1(EmitIntensity(0x01), EmitIntensity(0x01), 1)]
64    #[case::value_1_2(EmitIntensity(0x00), EmitIntensity(0x01), 2)]
65    #[case::value_ff_2(EmitIntensity(0x7F), EmitIntensity(0xFF), 2)]
66    fn test_div(#[case] expected: EmitIntensity, #[case] target: EmitIntensity, #[case] div: u8) {
67        assert_eq!(expected, target / div);
68    }
69
70    #[rstest::rstest]
71    #[test]
72    #[case::value_1_1(EmitIntensity(0x01), EmitIntensity(0x01), 1)]
73    #[case::value_1_2(EmitIntensity(0x02), EmitIntensity(0x01), 2)]
74    #[case::value_7f_2(EmitIntensity(0xFE), EmitIntensity(0x7F), 2)]
75    #[case::value_7f_3(EmitIntensity(0xFF), EmitIntensity(0x7F), 3)]
76    fn test_mul(#[case] expected: EmitIntensity, #[case] target: EmitIntensity, #[case] mul: u8) {
77        assert_eq!(expected, target * mul);
78        assert_eq!(expected, mul * target);
79    }
80
81    #[rstest::rstest]
82    #[test]
83    #[case::value_1_1(EmitIntensity(0x02), EmitIntensity(0x01), EmitIntensity(0x01))]
84    #[case::value_7f_7f(EmitIntensity(0xFE), EmitIntensity(0x7F), EmitIntensity(0x7F))]
85    #[case::value_7f_ff(EmitIntensity(0xFF), EmitIntensity(0x7F), EmitIntensity(0xFF))]
86    fn test_add(
87        #[case] expected: EmitIntensity,
88        #[case] lhs: EmitIntensity,
89        #[case] rhs: EmitIntensity,
90    ) {
91        assert_eq!(expected, lhs + rhs);
92    }
93
94    #[rstest::rstest]
95    #[test]
96    #[case::value_1_1(EmitIntensity(0x00), EmitIntensity(0x01), EmitIntensity(0x01))]
97    #[case::value_7f_7f(EmitIntensity(0x01), EmitIntensity(0x02), EmitIntensity(0x01))]
98    #[case::value_7f_ff(EmitIntensity(0x00), EmitIntensity(0x7F), EmitIntensity(0xFF))]
99    fn test_sub(
100        #[case] expected: EmitIntensity,
101        #[case] lhs: EmitIntensity,
102        #[case] rhs: EmitIntensity,
103    ) {
104        assert_eq!(expected, lhs - rhs);
105    }
106
107    #[test]
108    fn dbg() {
109        assert_eq!(format!("{:?}", EmitIntensity(0x00)), "0x00");
110        assert_eq!(format!("{:?}", EmitIntensity(0x01)), "0x01");
111        assert_eq!(format!("{:?}", EmitIntensity(0xFF)), "0xFF");
112    }
113}