use crate::types::errors::MessageLayoutError;
use crate::types::signal::Endianness;
pub fn check_signal_fits(
dlc: u16,
bit_start: u16,
bit_length: u16,
endianness: Endianness,
) -> Result<(), MessageLayoutError> {
if bit_length == 0 {
return Err(MessageLayoutError::ZeroBitLength);
}
let total_bits: usize = (dlc as usize) * 8;
match endianness {
Endianness::Intel => {
let start: usize = bit_start as usize;
let end: usize = start + (bit_length as usize) - 1;
if end < total_bits {
Ok(())
} else {
Err(MessageLayoutError::IntelOutOfBounds {
end,
total_bits,
dlc,
})
}
}
Endianness::Motorola => {
let s: usize = bit_start as usize;
let linearized_start: usize = (s & !7) + (7 - (s & 7)); let linearized_end: isize = linearized_start as isize - (bit_length as isize - 1);
if linearized_start >= total_bits {
return Err(MessageLayoutError::MotorolaStartOutOfBounds {
start: linearized_start,
total_bits,
dlc,
});
}
if linearized_end < 0 {
return Err(MessageLayoutError::MotorolaEndOutOfBounds {
end: linearized_end,
dlc,
});
}
Ok(())
}
}
}