1use crate::markers::BitMasks;
3
4pub fn convert_temp_from_register(msb: u8, lsb: u8, mask: u16) -> f32 {
5 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 u16::from(byte & BitMasks::SAMPLE_RATE_MASK) * 100
22}
23
24pub fn convert_sample_rate_to_register(period: u16) -> u8 {
25 (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}