1use crate::rtc::Rtc;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum SquareWaveFreq {
8 Hz1,
10 Hz1024,
12 Hz4096,
14 Hz8192,
16 Hz32768,
18 Custom(u32),
20}
21
22impl SquareWaveFreq {
23 pub fn to_hz(&self) -> u32 {
25 match self {
26 Self::Hz1 => 1,
27 Self::Hz1024 => 1024,
28 Self::Hz4096 => 4096,
29 Self::Hz8192 => 8192,
30 Self::Hz32768 => 32768,
31 Self::Custom(freq) => *freq,
32 }
33 }
34
35 pub fn from_hz(hz: u32) -> Self {
37 match hz {
38 1 => Self::Hz1,
39 1024 => Self::Hz1024,
40 4096 => Self::Hz4096,
41 8192 => Self::Hz8192,
42 32768 => Self::Hz32768,
43 other => Self::Custom(other),
44 }
45 }
46}
47
48pub trait SquareWave: Rtc {
50 fn start_square_wave(&mut self, freq: SquareWaveFreq) -> Result<(), Self::Error>;
52
53 fn enable_square_wave(&mut self) -> Result<(), Self::Error>;
55
56 fn disable_square_wave(&mut self) -> Result<(), Self::Error>;
58
59 fn set_square_wave_frequency(&mut self, freq: SquareWaveFreq) -> Result<(), Self::Error>;
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 #[test]
68 fn test_to_hz_standard_frequencies() {
69 assert_eq!(SquareWaveFreq::Hz1.to_hz(), 1);
70 assert_eq!(SquareWaveFreq::Hz1024.to_hz(), 1024);
71 assert_eq!(SquareWaveFreq::Hz4096.to_hz(), 4096);
72 assert_eq!(SquareWaveFreq::Hz8192.to_hz(), 8192);
73 assert_eq!(SquareWaveFreq::Hz32768.to_hz(), 32768);
74 }
75
76 #[test]
77 fn test_to_hz_custom_frequencies() {
78 assert_eq!(SquareWaveFreq::Custom(0).to_hz(), 0);
79 assert_eq!(SquareWaveFreq::Custom(100).to_hz(), 100);
80 assert_eq!(SquareWaveFreq::Custom(12345).to_hz(), 12345);
81 assert_eq!(SquareWaveFreq::Custom(u32::MAX).to_hz(), u32::MAX);
82 }
83
84 #[test]
85 fn test_from_hz_standard_frequencies() {
86 assert_eq!(SquareWaveFreq::from_hz(1), SquareWaveFreq::Hz1);
87 assert_eq!(SquareWaveFreq::from_hz(1024), SquareWaveFreq::Hz1024);
88 assert_eq!(SquareWaveFreq::from_hz(4096), SquareWaveFreq::Hz4096);
89 assert_eq!(SquareWaveFreq::from_hz(8192), SquareWaveFreq::Hz8192);
90 assert_eq!(SquareWaveFreq::from_hz(32768), SquareWaveFreq::Hz32768);
91 }
92
93 #[test]
94 fn test_from_hz_custom_frequencies() {
95 assert_eq!(SquareWaveFreq::from_hz(0), SquareWaveFreq::Custom(0));
96 assert_eq!(SquareWaveFreq::from_hz(50), SquareWaveFreq::Custom(50));
97 assert_eq!(SquareWaveFreq::from_hz(2048), SquareWaveFreq::Custom(2048));
98 assert_eq!(SquareWaveFreq::from_hz(9999), SquareWaveFreq::Custom(9999));
99 assert_eq!(
100 SquareWaveFreq::from_hz(u32::MAX),
101 SquareWaveFreq::Custom(u32::MAX)
102 );
103 }
104
105 #[test]
106 fn test_round_trip_conversion() {
107 let test_frequencies = vec![
108 SquareWaveFreq::Hz1,
109 SquareWaveFreq::Hz1024,
110 SquareWaveFreq::Hz4096,
111 SquareWaveFreq::Hz8192,
112 SquareWaveFreq::Hz32768,
113 SquareWaveFreq::Custom(0),
114 SquareWaveFreq::Custom(42),
115 SquareWaveFreq::Custom(2048),
116 SquareWaveFreq::Custom(9876),
117 SquareWaveFreq::Custom(u32::MAX),
118 ];
119
120 for original_freq in test_frequencies {
121 let hz_value = original_freq.to_hz();
122 let converted_back = SquareWaveFreq::from_hz(hz_value);
123 assert_eq!(original_freq, converted_back);
124 }
125 }
126
127 #[test]
128 fn test_frequency_ordering() {
129 let frequencies = [
130 SquareWaveFreq::Hz1,
131 SquareWaveFreq::Hz1024,
132 SquareWaveFreq::Hz4096,
133 SquareWaveFreq::Hz8192,
134 SquareWaveFreq::Hz32768,
135 ];
136
137 let hz_values: Vec<u32> = frequencies.iter().map(|f| f.to_hz()).collect();
138
139 for i in 1..hz_values.len() {
140 assert!(hz_values[i] > hz_values[i - 1]);
141 }
142 }
143
144 #[test]
145 fn test_custom_frequency_edge_cases() {
146 let edge_cases = vec![
147 (0, SquareWaveFreq::Custom(0)),
148 (2, SquareWaveFreq::Custom(2)),
149 (1023, SquareWaveFreq::Custom(1023)),
150 (1025, SquareWaveFreq::Custom(1025)),
151 (4095, SquareWaveFreq::Custom(4095)),
152 (4097, SquareWaveFreq::Custom(4097)),
153 (8191, SquareWaveFreq::Custom(8191)),
154 (8193, SquareWaveFreq::Custom(8193)),
155 (32767, SquareWaveFreq::Custom(32767)),
156 (32769, SquareWaveFreq::Custom(32769)),
157 ];
158
159 for (hz, expected) in edge_cases {
160 assert_eq!(SquareWaveFreq::from_hz(hz), expected);
161 assert_eq!(expected.to_hz(), hz);
162 }
163 }
164
165 #[test]
166 fn test_standard_frequencies_are_powers_of_two() {
167 assert_eq!(SquareWaveFreq::Hz1024.to_hz(), 1024);
168 assert_eq!(SquareWaveFreq::Hz4096.to_hz(), 4096);
169 assert_eq!(SquareWaveFreq::Hz8192.to_hz(), 8192);
170 assert_eq!(SquareWaveFreq::Hz32768.to_hz(), 32768);
171
172 let freq_1024 = SquareWaveFreq::Hz1024.to_hz();
173 let freq_4096 = SquareWaveFreq::Hz4096.to_hz();
174 let freq_8192 = SquareWaveFreq::Hz8192.to_hz();
175 let freq_32768 = SquareWaveFreq::Hz32768.to_hz();
176
177 assert_eq!(freq_4096, freq_1024 * 4);
178 assert_eq!(freq_8192, freq_4096 * 2);
179 assert_eq!(freq_32768, freq_8192 * 4);
180 }
181
182 #[test]
183 fn test_custom_with_standard_values() {
184 let custom_1024 = SquareWaveFreq::Custom(1024);
185 let custom_4096 = SquareWaveFreq::Custom(4096);
186
187 assert_eq!(custom_1024.to_hz(), 1024);
188 assert_eq!(custom_4096.to_hz(), 4096);
189
190 assert_ne!(custom_1024, SquareWaveFreq::Hz1024);
191 assert_ne!(custom_4096, SquareWaveFreq::Hz4096);
192 }
193}