use std::marker::PhantomData;
use crate::device::Device;
use crate::error::Result;
use crate::functions::check;
use crate::sys;
pub struct Settings<'a> {
ptr: *mut sys::icsneoc2_device_t,
_marker: PhantomData<&'a Device>,
}
unsafe impl Send for Settings<'_> {}
unsafe impl Sync for Settings<'_> {}
impl<'a> Settings<'a> {
pub(crate) fn new(ptr: *mut sys::icsneoc2_device_t) -> Self {
Self {
ptr,
_marker: PhantomData,
}
}
pub fn apply(&self) -> Result<()> {
check(unsafe { sys::icsneoc2_settings_apply(self.ptr) })
}
pub fn refresh(&self) -> Result<()> {
check(unsafe { sys::icsneoc2_settings_refresh(self.ptr) })
}
pub fn apply_defaults(&self, save: bool) -> Result<()> {
check(unsafe { sys::icsneoc2_settings_apply_defaults(self.ptr, save) })
}
pub fn is_readonly(&self) -> Result<bool> {
let mut value = false;
check(unsafe { sys::icsneoc2_settings_readonly_get(self.ptr, &raw mut value) })?;
Ok(value)
}
pub fn is_disabled(&self) -> Result<bool> {
let mut value = false;
check(unsafe { sys::icsneoc2_settings_disabled_get(self.ptr, &raw mut value) })?;
Ok(value)
}
pub fn baudrate(&self, netid: sys::Netid) -> Result<i64> {
let mut value: i64 = 0;
check(unsafe {
sys::icsneoc2_settings_baudrate_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut value,
)
})?;
Ok(value)
}
pub fn set_baudrate(&self, netid: sys::Netid, baudrate: i64) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_baudrate_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
baudrate,
)
})
}
pub fn canfd_baudrate(&self, netid: sys::Netid) -> Result<i64> {
let mut value: i64 = 0;
check(unsafe {
sys::icsneoc2_settings_canfd_baudrate_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut value,
)
})?;
Ok(value)
}
pub fn set_canfd_baudrate(&self, netid: sys::Netid, baudrate: i64) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_canfd_baudrate_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
baudrate,
)
})
}
pub fn termination_is_supported(&self, netid: sys::Netid) -> Result<bool> {
let mut value = false;
check(unsafe {
sys::icsneoc2_settings_termination_is_supported(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut value,
)
})?;
Ok(value)
}
pub fn termination_can_enable(&self, netid: sys::Netid) -> Result<bool> {
let mut value = false;
check(unsafe {
sys::icsneoc2_settings_termination_can_enable(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut value,
)
})?;
Ok(value)
}
pub fn termination_is_enabled(&self, netid: sys::Netid) -> Result<bool> {
let mut value = false;
check(unsafe {
sys::icsneoc2_settings_termination_is_enabled(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut value,
)
})?;
Ok(value)
}
pub fn set_termination(&self, netid: sys::Netid, enable: bool) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_termination_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
enable,
)
})
}
pub fn commander_resistor_enabled(&self, netid: sys::Netid) -> Result<bool> {
let mut value = false;
check(unsafe {
sys::icsneoc2_settings_commander_resistor_enabled(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut value,
)
})?;
Ok(value)
}
pub fn set_commander_resistor(&self, netid: sys::Netid, enable: bool) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_commander_resistor_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
enable,
)
})
}
pub fn lin_mode(&self, netid: sys::Netid) -> Result<sys::LinMode> {
let mut raw: sys::icsneoc2_lin_mode_t = 0;
check(unsafe {
sys::icsneoc2_settings_lin_mode_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut raw,
)
})?;
Ok(sys::LinMode::try_from(raw)?)
}
pub fn set_lin_mode(&self, netid: sys::Netid, value: sys::LinMode) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_lin_mode_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
sys::icsneoc2_lin_mode_t::from(value),
)
})
}
pub fn lin_commander_response_time(&self, netid: sys::Netid) -> Result<u8> {
let mut value: u8 = 0;
check(unsafe {
sys::icsneoc2_settings_lin_commander_response_time_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut value,
)
})?;
Ok(value)
}
pub fn set_lin_commander_response_time(&self, netid: sys::Netid, value: u8) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_lin_commander_response_time_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
value,
)
})
}
pub fn phy_enable(&self, index: u8) -> Result<bool> {
let mut value = false;
check(unsafe { sys::icsneoc2_settings_phy_enable_get(self.ptr, index, &raw mut value) })?;
Ok(value)
}
pub fn set_phy_enable(&self, index: u8, value: bool) -> Result<()> {
check(unsafe { sys::icsneoc2_settings_phy_enable_set(self.ptr, index, value) })
}
pub fn phy_mode(&self, index: u8) -> Result<sys::AeLinkMode> {
let mut raw: sys::icsneoc2_ae_link_mode_t = 0;
check(unsafe { sys::icsneoc2_settings_phy_mode_get(self.ptr, index, &raw mut raw) })?;
Ok(sys::AeLinkMode::try_from(raw)?)
}
pub fn set_phy_mode(&self, index: u8, value: sys::AeLinkMode) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_phy_mode_set(
self.ptr,
index,
sys::icsneoc2_ae_link_mode_t::from(value),
)
})
}
pub fn phy_speed(&self, index: u8) -> Result<sys::EthPhyLinkMode> {
let mut raw: sys::icsneoc2_eth_phy_link_mode_t = 0;
check(unsafe { sys::icsneoc2_settings_phy_speed_get(self.ptr, index, &raw mut raw) })?;
Ok(sys::EthPhyLinkMode::try_from(raw)?)
}
pub fn set_phy_speed(&self, index: u8, value: sys::EthPhyLinkMode) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_phy_speed_set(
self.ptr,
index,
sys::icsneoc2_eth_phy_link_mode_t::from(value),
)
})
}
pub fn phy_role_for(&self, netid: sys::Netid) -> Result<sys::AeLinkMode> {
let mut raw: sys::icsneoc2_ae_link_mode_t = 0;
check(unsafe {
sys::icsneoc2_settings_phy_role_for_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut raw,
)
})?;
Ok(sys::AeLinkMode::try_from(raw)?)
}
pub fn set_phy_role_for(&self, netid: sys::Netid, value: sys::AeLinkMode) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_phy_role_for_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
sys::icsneoc2_ae_link_mode_t::from(value),
)
})
}
pub fn phy_link_mode_for(&self, netid: sys::Netid) -> Result<sys::EthPhyLinkMode> {
let mut raw: sys::icsneoc2_eth_phy_link_mode_t = 0;
check(unsafe {
sys::icsneoc2_settings_phy_link_mode_for_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut raw,
)
})?;
Ok(sys::EthPhyLinkMode::try_from(raw)?)
}
pub fn set_phy_link_mode_for(
&self,
netid: sys::Netid,
value: sys::EthPhyLinkMode,
) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_phy_link_mode_for_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
sys::icsneoc2_eth_phy_link_mode_t::from(value),
)
})
}
pub fn phy_enable_for(&self, netid: sys::Netid) -> Result<bool> {
let mut value = false;
check(unsafe {
sys::icsneoc2_settings_phy_enable_for_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut value,
)
})?;
Ok(value)
}
pub fn set_phy_enable_for(&self, netid: sys::Netid, value: bool) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_phy_enable_for_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
value,
)
})
}
pub fn supported_phy_link_modes_for(
&self,
netid: sys::Netid,
) -> Result<Vec<sys::EthPhyLinkMode>> {
let mut ptr: *mut sys::icsneoc2_eth_phy_link_mode_t = std::ptr::null_mut();
let mut count: usize = 0;
check(unsafe {
sys::icsneoc2_settings_supported_phy_link_modes_for(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&raw mut ptr,
&raw mut count,
)
})?;
if ptr.is_null() || count == 0 {
return Ok(vec![]);
}
let modes = unsafe { std::slice::from_raw_parts(ptr, count) }
.iter()
.map(|&raw| Ok(sys::EthPhyLinkMode::try_from(raw)?))
.collect::<Result<Vec<_>>>()?;
Ok(modes)
}
pub fn t1s_is_plca_enabled_for(&self, netid: sys::Netid) -> Result<bool> {
let mut value = false;
check(unsafe {
sys::icsneoc2_settings_t1s_is_plca_enabled_for(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&mut value,
)
})?;
Ok(value)
}
pub fn set_t1s_plca_enabled_for(&self, netid: sys::Netid, value: bool) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_t1s_plca_enabled_for_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
value,
)
})
}
pub fn t1s_local_id(&self, netid: sys::Netid) -> Result<u8> {
let mut value: u8 = 0;
check(unsafe {
sys::icsneoc2_settings_t1s_local_id_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&mut value,
)
})?;
Ok(value)
}
pub fn set_t1s_local_id(&self, netid: sys::Netid, value: u8) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_t1s_local_id_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
value,
)
})
}
pub fn t1s_max_nodes(&self, netid: sys::Netid) -> Result<u8> {
let mut value: u8 = 0;
check(unsafe {
sys::icsneoc2_settings_t1s_max_nodes_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&mut value,
)
})?;
Ok(value)
}
pub fn set_t1s_max_nodes(&self, netid: sys::Netid, value: u8) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_t1s_max_nodes_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
value,
)
})
}
pub fn t1s_tx_opp_timer(&self, netid: sys::Netid) -> Result<u8> {
let mut value: u8 = 0;
check(unsafe {
sys::icsneoc2_settings_t1s_tx_opp_timer_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&mut value,
)
})?;
Ok(value)
}
pub fn set_t1s_tx_opp_timer(&self, netid: sys::Netid, value: u8) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_t1s_tx_opp_timer_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
value,
)
})
}
pub fn t1s_max_burst_timer(&self, netid: sys::Netid) -> Result<u8> {
let mut value: u8 = 0;
check(unsafe {
sys::icsneoc2_settings_t1s_max_burst_timer_for_get(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
&mut value,
)
})?;
Ok(value)
}
pub fn set_t1s_max_burst_timer(&self, netid: sys::Netid, value: u8) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_t1s_max_burst_timer_for_set(
self.ptr,
sys::icsneoc2_netid_t::from(netid),
value,
)
})
}
pub fn set_misc_io_analog_output_enabled(&self, pin: u8, enable: bool) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_misc_io_analog_output_enabled_set(self.ptr, pin, enable as u8)
})
}
pub fn set_misc_io_analog_output(
&self,
pin: u8,
voltage: sys::MiscIoAnalogVoltage,
) -> Result<()> {
check(unsafe {
sys::icsneoc2_settings_misc_io_analog_output_set(
self.ptr,
pin,
sys::icsneoc2_misc_io_analog_voltage_t::from(voltage),
)
})
}
}