max7456/
character_memory.rs

1use super::registers::{CharacterMemoryMode, Registers};
2
3pub const CHAR_DATA_SIZE: usize = 64;
4pub const STORE_CHAR_BUFFER_SIZE: usize = 2 + CHAR_DATA_SIZE * 4 + 2;
5
6pub type CharData = [u8; CHAR_DATA_SIZE];
7
8pub fn build_store_char_operation(data: &CharData, index: u8, output: &mut [u8]) -> bool {
9    if output.len() < STORE_CHAR_BUFFER_SIZE {
10        return false;
11    }
12    output[0] = Registers::CharacterMemoryAddressHigh as u8;
13    output[1] = index;
14    let mut chunks = output[2..].chunks_mut(4);
15    for (i, &ch) in data.iter().enumerate() {
16        let chunk = chunks.next().unwrap();
17        chunk[0] = Registers::CharacterMemoryAddressLow as u8;
18        chunk[1] = i as u8;
19        chunk[2] = Registers::CharacterMemoryDataIn as u8;
20        chunk[3] = ch;
21    }
22    output[2 + CHAR_DATA_SIZE * 4] = Registers::CharacterMemoryMode as u8;
23    output[2 + CHAR_DATA_SIZE * 4 + 1] = CharacterMemoryMode::WriteToNVM as u8;
24    return true;
25}
26
27mod test {
28    #[test]
29    fn test_write_store_char_operation() {
30        use super::{CharData, CHAR_DATA_SIZE, STORE_CHAR_BUFFER_SIZE};
31        use crate::registers::{CharacterMemoryMode, Registers};
32
33        let data: CharData = [0x55u8; CHAR_DATA_SIZE];
34        let mut output = [0u8; STORE_CHAR_BUFFER_SIZE];
35        assert_eq!(super::build_store_char_operation(&data, 10, &mut output), true);
36        assert_eq!(output[0], Registers::CharacterMemoryAddressHigh as u8);
37        assert_eq!(output[2], Registers::CharacterMemoryAddressLow as u8);
38        assert_eq!(output[2 + CHAR_DATA_SIZE * 4 - 4], Registers::CharacterMemoryAddressLow as u8);
39        assert_eq!(output[2 + CHAR_DATA_SIZE * 4], Registers::CharacterMemoryMode as u8);
40        assert_eq!(output[2 + CHAR_DATA_SIZE * 4 + 1], CharacterMemoryMode::WriteToNVM as u8);
41    }
42}