qmk_via_api/
utils.rs

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}