use super::generated::Board;
use crate::chip::ChipType;
use crate::mcu::PinTolerance;
impl Board {
pub fn gpios_for_socket_pin(&self, socket_pin: u8) -> &'static [u8] {
self.socket_pin_map()
.iter()
.find(|(pin, _)| *pin == socket_pin)
.map(|(_, gpios)| *gpios)
.unwrap_or(&[])
}
pub fn socket_pin_for_gpio(&self, gpio: u8) -> Option<u8> {
self.socket_pin_map()
.iter()
.find(|(_, gpios)| gpios.contains(&gpio))
.map(|(pin, _)| *pin)
}
pub fn gpios_for_x_pin(&self, x_pin: u8) -> &'static [u8] {
self.x_pin_map()
.iter()
.find(|(pin, _)| *pin == x_pin)
.map(|(_, gpios)| *gpios)
.unwrap_or(&[])
}
pub fn x_pin_for_gpio(&self, gpio: u8) -> Option<u8> {
self.x_pin_map()
.iter()
.find(|(_, gpios)| gpios.contains(&gpio))
.map(|(pin, _)| *pin)
}
pub fn allows_chip_type(&self, chip_type: ChipType) -> bool {
self.supports_chip_type(chip_type) || self.extra_chip_types().contains(&chip_type)
}
pub fn gpio_tolerance(&self, gpio: u8) -> Option<PinTolerance> {
self.rp_variant().map(|v| v.gpio_tolerance(gpio))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::hw::BOARDS;
#[test]
fn gpio_tolerance_only_characterised_on_rp2350_boards() {
for board in BOARDS {
match board.rp_variant() {
Some(variant) => {
for &adc in variant.adc_gpios() {
assert_eq!(
board.gpio_tolerance(adc),
Some(PinTolerance::ThreeVolt3),
"{board:?} GPIO{adc}"
);
}
assert_eq!(board.gpio_tolerance(0), Some(PinTolerance::FiveVolt));
}
None => {
assert_eq!(board.gpio_tolerance(0), None, "{board:?}");
assert_eq!(board.gpio_tolerance(26), None, "{board:?}");
}
}
}
}
}