use ace_can::IsoTpAddressingMode;
use ace_doip::{payload::ActivationType, session::ConnectionConfig};
#[derive(Debug, Clone)]
pub struct CanNodeEntry {
pub logical_address: u16,
pub request_can_id: u32,
pub response_can_id: u32,
pub functional_can_id: u32,
}
#[derive(Debug, Clone)]
pub struct GatewayConfig {
pub logical_address: u16,
pub nodes: heapless::Vec<CanNodeEntry, 16>,
pub registered_testers: heapless::Vec<u16, 16>,
pub supported_activation_types: heapless::Vec<ActivationType, 4>,
pub isotp_addressing_mode: IsoTpAddressingMode,
pub connection_config: ConnectionConfig,
}
impl GatewayConfig {
pub fn new(logical_address: u16) -> Self {
let mut supported = heapless::Vec::new();
let _ = supported.push(ActivationType::Default);
Self {
logical_address,
nodes: heapless::Vec::new(),
registered_testers: heapless::Vec::new(),
supported_activation_types: supported,
isotp_addressing_mode: IsoTpAddressingMode::Normal,
connection_config: ConnectionConfig::default(),
}
}
pub fn with_node(mut self, node: CanNodeEntry) -> Self {
let _ = self.nodes.push(node);
self
}
pub fn with_tester(mut self, address: u16) -> Self {
let _ = self.registered_testers.push(address);
self
}
pub fn with_activation_type(mut self, activation_type: ActivationType) -> Self {
let _ = self.supported_activation_types.push(activation_type);
self
}
pub fn with_isotp_address(mut self, mode: IsoTpAddressingMode) -> Self {
self.isotp_addressing_mode = mode;
self
}
pub fn find_node(&self, logical_address: u16) -> Option<&CanNodeEntry> {
self.nodes
.iter()
.find(|n| n.logical_address == logical_address)
}
}