autd3_core/common/freq/
mod.rs

1mod float;
2mod int;
3
4/// \[Hz\]
5pub struct Hz;
6
7/// \[kHz\]
8#[allow(non_camel_case_types)]
9pub struct kHz;
10
11/// Frequency
12#[derive(Clone, Copy, PartialEq, PartialOrd)]
13pub struct Freq<T: Copy> {
14    pub(crate) freq: T,
15}
16
17impl<T: Copy> core::fmt::Debug for Freq<T>
18where
19    T: core::fmt::Display,
20{
21    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
22        write!(f, "{} Hz", self.freq)
23    }
24}
25
26impl<T: Copy> Freq<T> {
27    #[inline]
28    /// Returns the frequency in Hz.
29    pub const fn hz(&self) -> T {
30        self.freq
31    }
32}
33
34impl<T> core::ops::Add<Freq<T>> for Freq<T>
35where
36    T: core::ops::Add<Output = T> + Copy,
37{
38    type Output = Freq<T>;
39
40    fn add(self, rhs: Freq<T>) -> Self::Output {
41        Freq {
42            freq: self.freq + rhs.freq,
43        }
44    }
45}
46
47impl<T> core::ops::Sub<Freq<T>> for Freq<T>
48where
49    T: core::ops::Sub<Output = T> + Copy,
50{
51    type Output = Freq<T>;
52
53    fn sub(self, rhs: Freq<T>) -> Self::Output {
54        Freq {
55            freq: self.freq - rhs.freq,
56        }
57    }
58}
59
60impl<T, U> core::ops::Mul<U> for Freq<T>
61where
62    T: core::ops::Mul<U, Output = T> + Copy,
63{
64    type Output = Freq<T>;
65
66    fn mul(self, rhs: U) -> Self::Output {
67        Freq {
68            freq: self.freq * rhs,
69        }
70    }
71}
72
73impl<T, U> core::ops::Div<U> for Freq<T>
74where
75    T: core::ops::Div<U, Output = T> + Copy,
76{
77    type Output = Freq<T>;
78
79    fn div(self, rhs: U) -> Self::Output {
80        Freq {
81            freq: self.freq / rhs,
82        }
83    }
84}
85
86#[cfg(test)]
87mod tests {
88    use super::*;
89
90    #[test]
91    fn arithmetic() {
92        assert_eq!(200 * Hz, 100 * Hz + 100 * Hz);
93        assert_eq!(0 * Hz, 100 * Hz - 100 * Hz);
94        assert_eq!(200 * Hz, 100 * Hz * 2);
95        assert_eq!(50 * Hz, 100 * Hz / 2);
96    }
97
98    #[test]
99    fn dbg() {
100        assert_eq!(alloc::format!("{:?}", 100 * Hz), "100 Hz");
101        assert_eq!(alloc::format!("{:?}", 100 * kHz), "100000 Hz");
102    }
103}