use core::fmt;
use esp_hal::peripherals::{GPIO0, GPIO21, GPIO44, RMT};
use crate::{
AudioPins, Battery, BatteryPins, Button, DisplayPins, Error, I2cBus, IrTransmitter, Keyboard,
KeyboardPins, RgbLed, battery, button, i2c, ir_transmitter, keyboard_on, rgb_led, rmt,
};
#[expect(missing_docs, reason = "each field is the part it's named after")]
pub struct BoardPins {
pub display: DisplayPins,
pub keyboard: KeyboardPins,
pub audio: AudioPins,
pub battery: BatteryPins,
pub button: GPIO0<'static>,
pub rmt: RMT<'static>,
pub led: GPIO21<'static>,
pub ir: GPIO44<'static>,
}
#[non_exhaustive]
pub struct Board {
pub display: DisplayPins,
pub audio: AudioPins,
pub bus: &'static I2cBus,
pub keyboard: Keyboard,
pub button: Button,
pub battery: Battery,
pub led: RgbLed,
pub ir: IrTransmitter,
}
impl Board {
pub async fn new(pins: BoardPins) -> Result<Self, Error> {
let bus = i2c(pins.keyboard.i2c)?;
let keyboard = keyboard_on(bus, pins.keyboard.interrupt).await?;
let rmt = rmt(pins.rmt)?;
Ok(Self {
display: pins.display,
audio: pins.audio,
bus,
keyboard,
button: button(pins.button),
battery: battery(pins.battery),
led: rgb_led(rmt.channel0, pins.led)?,
ir: ir_transmitter(rmt.channel1, pins.ir)?,
})
}
}
impl fmt::Debug for Board {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Board")
.field("keyboard", &self.keyboard)
.finish_non_exhaustive()
}
}
impl fmt::Debug for BoardPins {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("BoardPins").finish_non_exhaustive()
}
}