autd3capi_driver/firmware/fpga/
sampling_config.rs

1use std::num::NonZeroU16;
2
3use autd3::core::{common::Hz, sampling_config::SamplingConfig};
4
5#[repr(u8)]
6#[derive(Debug, Clone, Copy)]
7pub enum SamplingConfigTag {
8    Divide = 0,
9    Frequency = 1,
10    Period = 2,
11    FrequencyNearest = 3,
12    PeriodNearest = 4,
13}
14
15#[repr(C)]
16#[derive(Clone, Copy)]
17pub union SamplingConfigValue {
18    pub divide: u16,
19    pub freq: f32,
20    pub period_ns: u64,
21}
22
23#[repr(C)]
24#[derive(Clone, Copy)]
25pub struct SamplingConfigWrap {
26    pub tag: SamplingConfigTag,
27    pub value: SamplingConfigValue,
28}
29
30impl PartialEq for SamplingConfigWrap {
31    fn eq(&self, other: &Self) -> bool {
32        SamplingConfig::from(*self) == SamplingConfig::from(*other)
33    }
34}
35
36impl std::fmt::Debug for SamplingConfigWrap {
37    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
38        unsafe {
39            match self.tag {
40                SamplingConfigTag::Divide => {
41                    write!(f, "{:?}", NonZeroU16::new_unchecked(self.value.divide))
42                }
43                SamplingConfigTag::Frequency => write!(f, "{:?}", self.value.freq * Hz),
44                SamplingConfigTag::Period => write!(
45                    f,
46                    "{:?}",
47                    std::time::Duration::from_nanos(self.value.period_ns)
48                ),
49                SamplingConfigTag::FrequencyNearest => {
50                    write!(f, "{:?}", self.value.freq * Hz)
51                }
52                SamplingConfigTag::PeriodNearest => {
53                    write!(
54                        f,
55                        "{:?}",
56                        std::time::Duration::from_nanos(self.value.period_ns)
57                    )
58                }
59            }
60        }
61    }
62}
63
64impl From<SamplingConfig> for SamplingConfigWrap {
65    fn from(value: SamplingConfig) -> Self {
66        match value {
67            SamplingConfig::Divide(div) => SamplingConfigWrap {
68                tag: SamplingConfigTag::Divide,
69                value: SamplingConfigValue { divide: div.get() },
70            },
71            SamplingConfig::Freq(freq) => SamplingConfigWrap {
72                tag: SamplingConfigTag::Frequency,
73                value: SamplingConfigValue { freq: freq.hz() },
74            },
75            SamplingConfig::Period(period) => SamplingConfigWrap {
76                tag: SamplingConfigTag::Period,
77                value: SamplingConfigValue {
78                    period_ns: period.as_nanos() as u64,
79                },
80            },
81            SamplingConfig::FreqNearest(freq) => SamplingConfigWrap {
82                tag: SamplingConfigTag::FrequencyNearest,
83                value: SamplingConfigValue { freq: freq.0.hz() },
84            },
85            SamplingConfig::PeriodNearest(period) => SamplingConfigWrap {
86                tag: SamplingConfigTag::PeriodNearest,
87                value: SamplingConfigValue {
88                    period_ns: period.0.as_nanos() as u64,
89                },
90            },
91        }
92    }
93}
94
95impl From<SamplingConfigWrap> for SamplingConfig {
96    fn from(value: SamplingConfigWrap) -> Self {
97        unsafe {
98            match value.tag {
99                SamplingConfigTag::Divide => {
100                    SamplingConfig::new(NonZeroU16::new_unchecked(value.value.divide))
101                }
102                SamplingConfigTag::Frequency => SamplingConfig::new(value.value.freq * Hz),
103                SamplingConfigTag::Period => {
104                    SamplingConfig::new(std::time::Duration::from_nanos(value.value.period_ns))
105                }
106                SamplingConfigTag::FrequencyNearest => {
107                    SamplingConfig::new(value.value.freq * Hz).into_nearest()
108                }
109                SamplingConfigTag::PeriodNearest => {
110                    SamplingConfig::new(std::time::Duration::from_nanos(value.value.period_ns))
111                        .into_nearest()
112                }
113            }
114        }
115    }
116}