lm75/
conversion.rs

1//! Value conversions
2use crate::markers::BitMasks;
3
4pub fn convert_temp_from_register(msb: u8, lsb: u8, mask: u16) -> f32 {
5    // msb is stored as two's complement
6    let msb = f32::from(msb as i8);
7    let decimal = f32::from((lsb & mask as u8) >> 5) * 0.125;
8    msb + decimal
9}
10
11pub fn convert_temp_to_register(temp: f32, mask: u16) -> (u8, u8) {
12    let int = (temp / 0.125) as i16 as u16;
13    let binary = int << 5;
14    let msb = (binary >> 8) as u8;
15    let lsb = (binary & mask) as u8;
16    (msb, lsb)
17}
18
19pub fn convert_sample_rate_from_register(byte: u8) -> u16 {
20    // Bits [4:0] hold sample rate value
21    u16::from(byte & BitMasks::SAMPLE_RATE_MASK) * 100
22}
23
24pub fn convert_sample_rate_to_register(period: u16) -> u8 {
25    // Bits [4:0] hold sample rate value
26    (period / 100) as u8
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32    use crate::markers::BitMasks;
33
34    macro_rules! assert_near {
35        ($a:expr, $b:expr) => {
36            assert!(($a + 0.01) > $b);
37            assert!(($a - 0.01) < $b);
38        };
39    }
40
41    #[test]
42    fn can_convert_temperature_from_register() {
43        assert_near!(
44            convert_temp_from_register(0b0111_1101, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
45            125.0
46        );
47        assert_near!(
48            convert_temp_from_register(0b0001_1001, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
49            25.0
50        );
51        assert_near!(
52            convert_temp_from_register(0b1110_0111, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
53            -25.0
54        );
55        assert_near!(
56            convert_temp_from_register(0b1100_1001, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
57            -55.0
58        );
59        assert_near!(
60            convert_temp_from_register(0b0000_0000, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
61            0.0
62        );
63        assert_near!(
64            convert_temp_from_register(0b0000_0000, 0b1101_1010, BitMasks::RESOLUTION_9BIT),
65            0.5
66        );
67        assert_near!(
68            convert_temp_from_register(0b0010_0000, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
69            32.0
70        );
71        assert_near!(
72            convert_temp_from_register(0b0100_1011, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
73            75.0
74        );
75        assert_near!(
76            convert_temp_from_register(0b0101_0000, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
77            80.0
78        );
79        assert_near!(
80            convert_temp_from_register(0b0111_1111, 0b1101_1010, BitMasks::RESOLUTION_9BIT),
81            127.5
82        );
83        assert_near!(
84            convert_temp_from_register(0b1111_1111, 0b1101_1010, BitMasks::RESOLUTION_9BIT),
85            -0.5
86        );
87        assert_near!(
88            convert_temp_from_register(0b1111_1111, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
89            -1.0
90        );
91        assert_near!(
92            convert_temp_from_register(0b1111_1101, 0b1101_1010, BitMasks::RESOLUTION_9BIT),
93            -2.5
94        );
95        assert_near!(
96            convert_temp_from_register(0b1110_0000, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
97            -32.0
98        );
99        assert_near!(
100            convert_temp_from_register(0b1000_0000, 0b1101_1010, BitMasks::RESOLUTION_9BIT),
101            -127.5
102        );
103        assert_near!(
104            convert_temp_from_register(0b1000_0000, 0b0101_1010, BitMasks::RESOLUTION_9BIT),
105            -128.0
106        );
107
108        assert_near!(
109            convert_temp_from_register(0b0111_1101, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
110            125.250
111        );
112        assert_near!(
113            convert_temp_from_register(0b0001_1001, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
114            25.250
115        );
116        assert_near!(
117            convert_temp_from_register(0b1110_0111, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
118            -24.750
119        );
120        assert_near!(
121            convert_temp_from_register(0b1100_1001, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
122            -54.750
123        );
124        assert_near!(
125            convert_temp_from_register(0b0000_0000, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
126            0.250
127        );
128        assert_near!(
129            convert_temp_from_register(0b0000_0000, 0b1101_1010, BitMasks::RESOLUTION_11BIT),
130            0.750
131        );
132        assert_near!(
133            convert_temp_from_register(0b0010_0000, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
134            32.250
135        );
136        assert_near!(
137            convert_temp_from_register(0b0100_1011, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
138            75.250
139        );
140        assert_near!(
141            convert_temp_from_register(0b0101_0000, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
142            80.250
143        );
144        assert_near!(
145            convert_temp_from_register(0b0111_1111, 0b1101_1010, BitMasks::RESOLUTION_11BIT),
146            127.750
147        );
148        assert_near!(
149            convert_temp_from_register(0b1111_1111, 0b1101_1010, BitMasks::RESOLUTION_11BIT),
150            -0.250
151        );
152        assert_near!(
153            convert_temp_from_register(0b1111_1111, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
154            -0.750
155        );
156        assert_near!(
157            convert_temp_from_register(0b1111_1101, 0b1101_1010, BitMasks::RESOLUTION_11BIT),
158            -2.250
159        );
160        assert_near!(
161            convert_temp_from_register(0b1110_0000, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
162            -31.750
163        );
164        assert_near!(
165            convert_temp_from_register(0b1000_0000, 0b1101_1010, BitMasks::RESOLUTION_11BIT),
166            -127.250
167        );
168        assert_near!(
169            convert_temp_from_register(0b1000_0000, 0b0101_1010, BitMasks::RESOLUTION_11BIT),
170            -127.750
171        );
172    }
173
174    #[test]
175    fn can_convert_temperature_to_register() {
176        assert_eq!(
177            (0b0000_0010, 0b0000_0000),
178            convert_temp_to_register(2.4, BitMasks::RESOLUTION_9BIT)
179        );
180        assert_eq!(
181            (0b0000_0010, 0b1000_0000),
182            convert_temp_to_register(2.6, BitMasks::RESOLUTION_9BIT)
183        );
184        assert_eq!(
185            (0b1111_1110, 0b0000_0000),
186            convert_temp_to_register(-2.0, BitMasks::RESOLUTION_9BIT)
187        );
188        assert_eq!(
189            (0b1111_1101, 0b1000_0000),
190            convert_temp_to_register(-2.6, BitMasks::RESOLUTION_9BIT)
191        );
192        assert_eq!(
193            (0b0111_1101, 0b0000_0000),
194            convert_temp_to_register(125.0, BitMasks::RESOLUTION_9BIT)
195        );
196        assert_eq!(
197            (0b0001_1001, 0b0000_0000),
198            convert_temp_to_register(25.0, BitMasks::RESOLUTION_9BIT)
199        );
200        assert_eq!(
201            (0b1110_0111, 0b0000_0000),
202            convert_temp_to_register(-25.0, BitMasks::RESOLUTION_9BIT)
203        );
204        assert_eq!(
205            (0b1100_1001, 0b0000_0000),
206            convert_temp_to_register(-55.0, BitMasks::RESOLUTION_9BIT)
207        );
208        assert_eq!(
209            (0b0000_0000, 0b0000_0000),
210            convert_temp_to_register(0.0, BitMasks::RESOLUTION_9BIT)
211        );
212        assert_eq!(
213            (0b0000_0000, 0b1000_0000),
214            convert_temp_to_register(0.5, BitMasks::RESOLUTION_9BIT)
215        );
216        assert_eq!(
217            (0b0010_0000, 0b0000_0000),
218            convert_temp_to_register(32.0, BitMasks::RESOLUTION_9BIT)
219        );
220        assert_eq!(
221            (0b0111_1111, 0b1000_0000),
222            convert_temp_to_register(127.5, BitMasks::RESOLUTION_9BIT)
223        );
224        assert_eq!(
225            (0b1000_0000, 0b0000_0000),
226            convert_temp_to_register(-128.0, BitMasks::RESOLUTION_9BIT)
227        );
228
229        assert_eq!(
230            (0b0000_0010, 0b0110_0000),
231            convert_temp_to_register(2.4, BitMasks::RESOLUTION_11BIT)
232        );
233        assert_eq!(
234            (0b0000_0010, 0b1000_0000),
235            convert_temp_to_register(2.6, BitMasks::RESOLUTION_11BIT)
236        );
237        assert_eq!(
238            (0b1111_1110, 0b0000_0000),
239            convert_temp_to_register(-2.0, BitMasks::RESOLUTION_11BIT)
240        );
241        assert_eq!(
242            (0b1111_1101, 0b1000_0000),
243            convert_temp_to_register(-2.6, BitMasks::RESOLUTION_11BIT)
244        );
245        assert_eq!(
246            (0b0111_1101, 0b0000_0000),
247            convert_temp_to_register(125.0, BitMasks::RESOLUTION_11BIT)
248        );
249        assert_eq!(
250            (0b0001_1001, 0b0000_0000),
251            convert_temp_to_register(25.0, BitMasks::RESOLUTION_11BIT)
252        );
253        assert_eq!(
254            (0b1110_0111, 0b0000_0000),
255            convert_temp_to_register(-25.0, BitMasks::RESOLUTION_11BIT)
256        );
257        assert_eq!(
258            (0b1100_1001, 0b0000_0000),
259            convert_temp_to_register(-55.0, BitMasks::RESOLUTION_11BIT)
260        );
261        assert_eq!(
262            (0b0000_0000, 0b0000_0000),
263            convert_temp_to_register(0.0, BitMasks::RESOLUTION_11BIT)
264        );
265        assert_eq!(
266            (0b0000_0000, 0b1000_0000),
267            convert_temp_to_register(0.5, BitMasks::RESOLUTION_11BIT)
268        );
269        assert_eq!(
270            (0b0010_0000, 0b0000_0000),
271            convert_temp_to_register(32.0, BitMasks::RESOLUTION_11BIT)
272        );
273        assert_eq!(
274            (0b0111_1111, 0b1000_0000),
275            convert_temp_to_register(127.5, BitMasks::RESOLUTION_11BIT)
276        );
277        assert_eq!(
278            (0b1000_0000, 0b0000_0000),
279            convert_temp_to_register(-128.0, BitMasks::RESOLUTION_11BIT)
280        );
281    }
282
283    #[test]
284    fn can_convert_sample_rate_from_register() {
285        assert_eq!(convert_sample_rate_from_register(0b0001_1111), 3100);
286        assert_eq!(convert_sample_rate_from_register(0b1111_0000), 1600);
287        assert_eq!(convert_sample_rate_from_register(0b0000_0001), 100);
288    }
289
290    #[test]
291    fn can_convert_sample_rate_to_register() {
292        assert_eq!(convert_sample_rate_to_register(3100), 0b0001_1111);
293        assert_eq!(convert_sample_rate_to_register(1600), 0b0001_0000);
294        assert_eq!(convert_sample_rate_to_register(100), 0b0000_0001);
295    }
296}