use crate::utils::ffi;
#[derive(Clone, Debug, Default)]
pub struct SlaveErrorCounters {
pub slave_index: u16,
pub port0_crc_errors: u8,
pub port1_crc_errors: u8,
pub port2_crc_errors: u8,
pub port3_crc_errors: u8,
pub frame_errors: u8,
pub lost_frames: u8,
}
pub fn read_slave_error_counters(master_index: u16, slave_index: u16) -> SlaveErrorCounters {
let mut counters = SlaveErrorCounters {
slave_index,
..Default::default()
};
let mut crc_data = [0u8; 8];
unsafe {
if ffi::ReadSlaveRegister(
master_index, slave_index, 0x0300,
crc_data.as_mut_ptr(), 8,
) != 0 {
counters.port0_crc_errors = crc_data[0];
counters.port1_crc_errors = crc_data[2];
counters.port2_crc_errors = crc_data[4];
counters.port3_crc_errors = crc_data[6];
}
let mut frame_data = [0u8; 4];
if ffi::ReadSlaveRegister(
master_index, slave_index, 0x0308,
frame_data.as_mut_ptr(), 4,
) != 0 {
counters.frame_errors = frame_data[0];
counters.lost_frames = frame_data[2];
}
}
counters
}
#[derive(Clone, Debug, Default)]
pub struct PdoFrameLossInfo {
pub total_lost: u32,
pub consecutive_lost: u32,
pub max_consecutive_lost: u32,
}
pub fn get_pdo_frame_loss_stats(master_index: u16, group: u8) -> PdoFrameLossInfo {
let mut total = 0u32;
let mut consecutive = 0u32;
let mut max_consecutive = 0u32;
unsafe {
ffi::GetPDOFrameLossStats(
master_index, group,
&mut total, &mut consecutive, &mut max_consecutive,
);
}
PdoFrameLossInfo {
total_lost: total,
consecutive_lost: consecutive,
max_consecutive_lost: max_consecutive,
}
}
pub fn get_all_pdo_frame_loss_stats(master_index: u16) -> PdoFrameLossInfo {
let mut total_sum = 0u32;
let mut consecutive_max = 0u32;
let mut max_consecutive_max = 0u32;
for g in 0..8u8 {
let stats = get_pdo_frame_loss_stats(master_index, g);
total_sum += stats.total_lost;
if stats.consecutive_lost > consecutive_max {
consecutive_max = stats.consecutive_lost;
}
if stats.max_consecutive_lost > max_consecutive_max {
max_consecutive_max = stats.max_consecutive_lost;
}
}
PdoFrameLossInfo {
total_lost: total_sum,
consecutive_lost: consecutive_max,
max_consecutive_lost: max_consecutive_max,
}
}
pub fn reset_pdo_frame_loss_stats(master_index: u16, group: u8) {
unsafe { ffi::ResetPDOFrameLossStats(master_index, group); }
}
pub fn reset_all_pdo_frame_loss_stats(master_index: u16) {
for g in 0..8u8 {
reset_pdo_frame_loss_stats(master_index, g);
}
}