1use itertools::Itertools;
2
3pub fn get_bit_at_index(byte: u8, bit_index: u8) -> bool {
4 let mask = 0b10000000 >> bit_index;
5
6 mask & byte != 0
7}
8
9pub fn set_bit_at_index(byte: u8, bit_index: u8, enabled: bool) -> u8 {
10 let mask = 0b10000000 >> bit_index;
11
12 if enabled {
13 mask | byte
14 } else {
15 (mask ^ 0b11111111) & byte
16 }
17}
18
19pub fn shift_to_16_bit(hi: u8, lo: u8) -> u16 {
20 ((hi as u16) << 8) | lo as u16
21}
22
23pub fn shift_from_16_bit(value: u16) -> (u8, u8) {
24 ((value >> 8) as u8, value as u8)
25}
26
27pub fn shift_buffer_to_16_bit(buffer: &[u8]) -> Vec<u16> {
28 let mut shifted_buffer = Vec::new();
29 for (hi, lo) in buffer.iter().tuples() {
30 shifted_buffer.push(shift_to_16_bit(*hi, *lo));
31 }
32 shifted_buffer
33}
34
35pub fn shift_buffer_from_16_bit(buffer: &[u16]) -> Vec<u8> {
36 let mut flattened = Vec::new();
37 for value in buffer.iter() {
38 let (hi, lo) = shift_from_16_bit(*value);
39 flattened.push(hi);
40 flattened.push(lo);
41 }
42 flattened
43}