use crate::{Rcvbp, Record};
use panelspec::PanelSpec;
const CALI_HIGH: u16 = 0xBFFF;
const CALI_LOW: u16 = 0x5999;
fn secondary_params(spec: &PanelSpec) -> Vec<u8> {
let mut r = vec![0u8; 256];
r[0x00..0x04].copy_from_slice(&1u32.to_le_bytes()); r[0x04..0x06].copy_from_slice(&50u16.to_le_bytes());
r[0x06] = 31;
r[0x07] = 2; r[0x10..0x12].copy_from_slice(&spec.screen.height.to_le_bytes()); r[0x12..0x14].copy_from_slice(&spec.screen.width.to_le_bytes()); r[0x17] = 7; for at in [0x1D, 0x1F, 0x21] {
r[at..at + 2].copy_from_slice(&CALI_HIGH.to_le_bytes());
}
for at in [0x23, 0x25, 0x27] {
r[at..at + 2].copy_from_slice(&CALI_LOW.to_le_bytes());
}
for (at, v) in [(0x3B, 89u16), (0x3D, 127), (0x3F, 191), (0x41, 229)] {
r[at..at + 2].copy_from_slice(&v.to_le_bytes());
}
r[0x4E..0x52].copy_from_slice(&30.1f32.to_le_bytes()); r[0x52..0x56].copy_from_slice(&70.0f32.to_le_bytes()); r
}
fn rgb_trio(value: u8) -> Vec<u8> {
let mut r = vec![0u8; 10];
r[6..9].fill(value);
r
}
fn geometry_wide(spec: &PanelSpec) -> Vec<u8> {
let mut r = vec![0u8; 256];
r[0..2].copy_from_slice(&spec.module.width.to_le_bytes());
r[2..4].copy_from_slice(&(spec.module.height / 2).to_le_bytes());
r[4..6].copy_from_slice(&1u16.to_le_bytes()); r
}
fn table_8e() -> Vec<u8> {
let mut r = vec![0u8; 2591];
r[0xA1C..0xA1F].fill(0x14); r
}
#[must_use]
pub fn assemble(spec: &PanelSpec, rec01: Vec<u8>, mapping: Vec<u8>, chip_regs: Option<Vec<u8>>) -> Rcvbp {
let mut records = vec![
Record::new(0x0a01, rec01),
Record::new(0x0a8d, vec![0; 4096]), Record::new(0x0a91, vec![0; 6144]), Record::new(0x0a95, vec![0; 6144]), Record::new(0x0ad8, vec![0; 18433]), Record::new(0x0ada, vec![0; 36865]), Record::new(0x0a8e, table_8e()),
Record::new(0x0a03, mapping),
Record::new(0x0a07, vec![0; 32]), Record::new(0x0a83, rgb_trio(0xFF)),
Record::new(0x0a89, rgb_trio(0x80)),
Record::new(0x0a86, vec![0; 5]), Record::new(0x0a8a, secondary_params(spec)),
];
if let Some(regs) = chip_regs {
records.push(Record::new(0x0a84, regs));
}
records.extend([
Record::new(0x0acd, vec![0; 270]), Record::new(0x008f, vec![0; 580]), Record::new(0x0aca, geometry_wide(spec)),
]);
Rcvbp { version: 4, records }
}