espforge_lib/nibblers/
esp32.rs

1use crate::{
2    config::EspforgeConfiguration,
3    nibblers::{ConfigNibbler, NibblerResult, NibblerStatus},
4    register_nibbler,
5};
6use espforge_macros::auto_register_nibbler;
7
8#[derive(Default)]
9#[auto_register_nibbler]
10pub struct HardwareNibbler;
11
12impl ConfigNibbler for HardwareNibbler {
13    fn name(&self) -> &str {
14        "HardwareNibbler"
15    }
16
17    fn priority(&self) -> u8 {
18        10
19    }
20
21    fn process(&self, config: &EspforgeConfiguration) -> Result<NibblerResult, String> {
22        let mut findings = Vec::new();
23        let mut status = NibblerStatus::Ok;
24
25        if let Some(esp32) = &config.esp32 {
26            // Check GPIOs
27            for (name, pin_config) in &esp32.gpio {
28                if pin_config.pin > 48 {
29                    findings.push(format!(
30                        "Error: GPIO '{}' uses pin {}, which is out of range.",
31                        name, pin_config.pin
32                    ));
33                    status = NibblerStatus::Error;
34                } else {
35                    findings.push(format!("GPIO '{}' mapped to pin {}.", name, pin_config.pin));
36                }
37            }
38
39            // Check SPIs
40            for (name, spi_config) in &esp32.spi {
41                findings.push(format!(
42                    "SPI '{}' configured (SCK:{}, MOSI:{}, MISO:{})",
43                    name, spi_config.sck, spi_config.mosi, spi_config.miso
44                ));
45                // Simple overlap check could go here
46            }
47        }
48
49        Ok(NibblerResult {
50            nibbler_name: self.name().to_string(),
51            findings,
52            status,
53        })
54    }
55}