Skip to main content

rcvbp/spec/
generate.rs

1//! Spec to `.rcvbp` and basic pack: record 0x01 from defaults + spec + chip
2//! library, the mapping from geometry, record 0x84 from the library, the rest
3//! from decoded defaults, and the pack from the finished record 0x01.
4
5use super::{basic_pack, mapping, record01, records};
6use crate::record01::View;
7use crate::Rcvbp;
8use anyhow::Result;
9use panelspec::{ChipLibrary, PanelSpec};
10
11pub struct Generated {
12    pub rcvbp: Rcvbp,
13    pub basic_pack: [u8; 256],
14    /// One line per byte range placed, with its source.
15    pub sources: Vec<String>,
16}
17
18/// # Errors
19/// Fails on an invalid spec or a chip library the record cannot hold.
20pub fn generate(spec: &PanelSpec, chip: &ChipLibrary) -> Result<Generated> {
21    spec.validate()?;
22    let mut prov = Vec::new();
23    let rec01 = record01::build(spec, chip, &mut prov)?.to_vec();
24    let mapping = mapping::record(spec);
25    prov.push(format!(
26        "rcvbp record 0x03 <- generated ({}x{} stored, 1/{}, groups {}, lines {})",
27        spec.module.width,
28        spec.module.height / 2,
29        spec.module.scan,
30        if spec.mapping.reversed_groups { "reversed" } else { "forward" },
31        if spec.mapping.reversed_lines { "reversed" } else { "top-down" },
32    ));
33    let regs = chip.record_84(spec.module.scan)?.map(|r| r.to_vec());
34    match &regs {
35        Some(_) => prov.push(format!("rcvbp record 0x84 <- chip library {} (reg 0x02 = scan-1)", chip.name)),
36        None => prov.push(format!("rcvbp record 0x84 omitted: {} has no addressed register table", chip.name)),
37    }
38    prov.push("rcvbp other records <- decoded vendor defaults (records.rs)".into());
39    let basic_pack = basic_pack::body(spec, View::new(&rec01)?, &mut prov);
40    let rcvbp = records::assemble(spec, rec01, mapping, regs);
41    Ok(Generated {
42        rcvbp,
43        basic_pack,
44        sources: prov,
45    })
46}