use alloc::vec::Vec;
use onerom_config::chip::ChipType;
use onerom_config::hw::Board;
use onerom_metadata::BitModes;
use crate::image::{ChipSetType, CsConfig};
use super::multi_cs_config::MultiChipCsConfig;
pub fn socket_pin_offset(chip_pins: u8, board_pins: u8) -> Option<i16> {
match (chip_pins, board_pins) {
(24, 24) | (28, 28) | (32, 32) | (40, 40) => Some(0),
(24, 28) | (28, 32) => Some(2),
(24, 32) => Some(4),
(28, 24) | (32, 28) => Some(-2),
(32, 24) => Some(-4),
_ => None,
}
}
pub struct SlotContext {
pub board: Board,
pub set_type: ChipSetType,
pub chip_types: Vec<ChipType>,
pub cs_config: CsConfig,
pub bit_mode: BitModes,
pub pin_offset: i16,
pub force_16_bit: bool,
pub multi_cs_config: Option<MultiChipCsConfig>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn same_size_no_offset() {
assert_eq!(socket_pin_offset(24, 24), Some(0i16));
assert_eq!(socket_pin_offset(28, 28), Some(0i16));
assert_eq!(socket_pin_offset(32, 32), Some(0i16));
assert_eq!(socket_pin_offset(40, 40), Some(0i16));
}
#[test]
fn valid_cross_size_offsets() {
assert_eq!(socket_pin_offset(24, 28), Some(2i16));
assert_eq!(socket_pin_offset(28, 32), Some(2i16));
assert_eq!(socket_pin_offset(24, 32), Some(4i16));
}
#[test]
fn fly_lead_offsets() {
assert_eq!(socket_pin_offset(28, 24), Some(-2i16));
assert_eq!(socket_pin_offset(32, 28), Some(-2i16));
assert_eq!(socket_pin_offset(32, 24), Some(-4i16));
}
#[test]
fn unsupported_combinations_return_none() {
assert_eq!(socket_pin_offset(40, 24), None);
assert_eq!(socket_pin_offset(40, 28), None);
assert_eq!(socket_pin_offset(40, 32), None);
assert_eq!(socket_pin_offset(24, 40), None);
assert_eq!(socket_pin_offset(28, 40), None);
assert_eq!(socket_pin_offset(32, 40), None);
}
}