rtc_hal/
square_wave.rs

1//! Traits for Square Wave control
2
3use crate::rtc::Rtc;
4
5/// Square wave output frequencies
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum SquareWaveFreq {
8    /// 1 Hz
9    Hz1,
10    /// 1024 Hz (1.024 kHz)
11    Hz1024,
12    /// 4096 Hz (4.096 kHz)
13    Hz4096,
14    /// 8192 Hz (8.192 kHz)
15    Hz8192,
16    /// 32768 Hz (32.768 kHz)
17    Hz32768,
18    /// Custom frequency (if supported by device)
19    Custom(u32),
20}
21
22impl SquareWaveFreq {
23    /// Get frequency value in Hz
24    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    /// Create from Hz value
36    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
48/// Square wave functionality trait
49pub trait SquareWave: Rtc {
50    /// Configure Frequency and enable square wave
51    fn start_square_wave(&mut self, freq: SquareWaveFreq) -> Result<(), Self::Error>;
52
53    /// Enable square wave output
54    fn enable_square_wave(&mut self) -> Result<(), Self::Error>;
55
56    /// Disable square wave output
57    fn disable_square_wave(&mut self) -> Result<(), Self::Error>;
58
59    /// Set the frequency (without enabling/disabling)
60    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}