autd3capi_driver/firmware/fpga/
sampling_config.rs1use 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}