use crate::{eeprom::types::MailboxProtocols, pdi::PdiSegment};
use core::fmt::{self, Debug};
#[derive(Default, Copy, Clone, PartialEq, ethercrab_wire::EtherCrabWireRead)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[wire(bytes = 16)]
#[doc(alias = "SlaveIdentity")]
pub struct SubDeviceIdentity {
#[wire(bytes = 4)]
pub vendor_id: u32,
#[wire(bytes = 4)]
pub product_id: u32,
#[wire(bytes = 4)]
pub revision: u32,
#[wire(bytes = 4)]
pub serial: u32,
}
impl fmt::Display for SubDeviceIdentity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_fmt(format_args!(
"vendor: {:#010x}, product {:#010x}, rev {}, serial {}",
self.vendor_id, self.product_id, self.revision, self.serial
))
}
}
impl Debug for SubDeviceIdentity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SubDeviceIdentity")
.field("vendor_id", &format_args!("{:#010x}", self.vendor_id))
.field("product_id", &format_args!("{:#010x}", self.product_id))
.field(
"revision",
&format_args!("{:#010x} ({})", self.revision, self.revision),
)
.field("serial", &self.serial)
.finish()
}
}
#[derive(Debug, Default, Clone, PartialEq)]
pub struct SubDeviceConfig {
pub io: IoRanges,
pub mailbox: MailboxConfig,
}
#[derive(Debug, Default, Clone, PartialEq)]
pub struct MailboxConfig {
pub read: Option<Mailbox>,
pub write: Option<Mailbox>,
pub supported_protocols: MailboxProtocols,
pub has_coe: bool,
pub complete_access: bool,
}
#[derive(Debug, Default, Clone, Copy, PartialEq)]
pub struct Mailbox {
pub address: u16,
pub len: u16,
pub sync_manager: u8,
}
#[derive(Debug, Default, Clone, PartialEq)]
pub struct IoRanges {
pub input: PdiSegment,
pub output: PdiSegment,
}