use super::{EcLevel, Version};
pub const MAX_VERSION: u8 = 3;
const TOTAL_CODEWORDS: [usize; 3] = [25, 37, 50];
#[derive(Debug, Clone, Copy)]
pub struct EcBlocks {
pub batches: [(usize, usize, usize); 3],
}
impl EcBlocks {
pub fn total_data(&self) -> usize {
self.batches.iter().map(|(b, d, _)| b * d).sum()
}
}
#[rustfmt::skip]
const TABLE_D1: [[[(usize, usize, usize); 3]; 4]; 3] = [
[
[(1, 21, 4), (0, 0, 0), (0, 0, 0)],
[(1, 17, 8), (0, 0, 0), (0, 0, 0)],
[(1, 13, 12), (0, 0, 0), (0, 0, 0)],
[(1, 9, 16), (0, 0, 0), (0, 0, 0)],
],
[
[(1, 31, 6), (0, 0, 0), (0, 0, 0)],
[(1, 25, 12), (0, 0, 0), (0, 0, 0)],
[(1, 19, 18), (0, 0, 0), (0, 0, 0)],
[(1, 15, 22), (0, 0, 0), (0, 0, 0)],
],
[
[(1, 42, 8), (0, 0, 0), (0, 0, 0)],
[(1, 34, 16), (0, 0, 0), (0, 0, 0)],
[(1, 26, 24), (0, 0, 0), (0, 0, 0)],
[(1, 20, 30), (0, 0, 0), (0, 0, 0)],
],
];
fn level_index(level: EcLevel) -> usize {
match level {
EcLevel::L1 => 0,
EcLevel::L2 => 1,
EcLevel::L3 => 2,
EcLevel::L4 => 3,
}
}
pub fn ec_blocks(version: Version, level: EcLevel) -> EcBlocks {
EcBlocks {
batches: TABLE_D1[version.number() as usize - 1][level_index(level)],
}
}
pub fn total_codewords(version: Version) -> usize {
TOTAL_CODEWORDS[version.number() as usize - 1]
}
pub fn data_codewords(version: Version, level: EcLevel) -> usize {
ec_blocks(version, level).total_data()
}
pub const FINDER_TOP_LEFT: [u8; 7] = [0x7F, 0x40, 0x5F, 0x50, 0x57, 0x57, 0x57];
pub const FINDER_SIDE: [u8; 7] = [0x7F, 0x01, 0x7D, 0x05, 0x75, 0x75, 0x75];
pub const FINDER_BOTTOM_RIGHT: [u8; 7] = [0x75, 0x75, 0x75, 0x05, 0x7D, 0x01, 0x7F];