qmk_oled_api/
utils.rs

1pub fn get_bit_at_index(byte: u8, bit_index: u8) -> bool {
2    let mask = 0b10000000 >> bit_index;
3
4    mask & byte != 0
5}
6
7pub fn set_bit_at_index(byte: u8, bit_index: u8, enabled: bool) -> u8 {
8    let mask = 0b10000000 >> bit_index;
9
10    if enabled {
11        mask | byte
12    } else {
13        (mask ^ 0b11111111) & byte
14    }
15}
16
17#[cfg(test)]
18mod tests {
19    use super::*;
20
21    #[test]
22    fn test_set_bit_at_index_enable() {
23        let input = 0b00000000;
24        let actual = set_bit_at_index(input, 3, true);
25
26        assert_eq!(actual, 0b00010000)
27    }
28
29    #[test]
30    fn test_set_bit_at_index_disable() {
31        let byte = 0b11111111;
32
33        let output = set_bit_at_index(byte, 3, false);
34        assert_eq!(output, 0b11101111)
35    }
36
37    #[test]
38    fn test_get_bit_at_index() {
39        let input = 0b00010000;
40        let bit_state = get_bit_at_index(input, 3);
41
42        assert!(bit_state)
43    }
44}