#![allow(dead_code)]
#![allow(unused_variables)]
#![cfg_attr(not(any(feature = "std", test)), no_std)]
mod consts;
pub mod dp;
pub mod fdl;
pub mod phy;
pub mod time;
#[cfg(all(test, feature = "std"))]
pub mod test_utils;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
#[repr(u8)]
pub enum Baudrate {
B9600,
B19200,
B31250,
B45450,
B93750,
B187500,
B500000,
B1500000,
B3000000,
B6000000,
B12000000,
}
impl Baudrate {
pub fn to_rate(self) -> u64 {
match self {
Baudrate::B9600 => 9600,
Baudrate::B19200 => 19200,
Baudrate::B31250 => 31250,
Baudrate::B45450 => 45450,
Baudrate::B93750 => 93750,
Baudrate::B187500 => 187500,
Baudrate::B500000 => 500000,
Baudrate::B1500000 => 1500000,
Baudrate::B3000000 => 3000000,
Baudrate::B6000000 => 6000000,
Baudrate::B12000000 => 12000000,
}
}
pub fn bits_to_time(self, bits: u32) -> crate::time::Duration {
crate::time::Duration::from_micros(u64::from(bits) * 1000000 / self.to_rate())
}
pub fn time_to_bits(self, time: crate::time::Duration) -> u64 {
time.total_micros() * self.to_rate() / 1000000
}
}
pub type Address = u8;
#[inline(always)]
#[track_caller]
pub(crate) fn debug_assert_address(addr: Address) {
debug_assert!(
addr <= 127,
"PROFIBUS address cannot be bigger than 127, got {addr}!"
);
}
#[cfg(test)]
mod tests {
#[test]
fn baudrate_time_conversions() {
let all_bauds = &[
crate::Baudrate::B9600,
crate::Baudrate::B19200,
crate::Baudrate::B31250,
crate::Baudrate::B45450,
crate::Baudrate::B93750,
crate::Baudrate::B187500,
crate::Baudrate::B500000,
crate::Baudrate::B1500000,
crate::Baudrate::B3000000,
crate::Baudrate::B6000000,
crate::Baudrate::B12000000,
];
let test_values = &[0, 1, 10, 100, 2000, 65536, u32::MAX];
for baud in all_bauds.iter().copied() {
for bits in test_values.iter().copied() {
let time = baud.bits_to_time(bits);
let micros = time.total_micros();
let bits2 = baud.time_to_bits(time);
let max_difference = match baud {
crate::Baudrate::B9600 => 1,
crate::Baudrate::B19200 => 1,
crate::Baudrate::B31250 => 1,
crate::Baudrate::B45450 => 1,
crate::Baudrate::B93750 => 1,
crate::Baudrate::B187500 => 1,
crate::Baudrate::B500000 => 1,
crate::Baudrate::B1500000 => 1,
crate::Baudrate::B3000000 => 2,
crate::Baudrate::B6000000 => 4,
crate::Baudrate::B12000000 => 10,
};
assert!(
u64::from(bits) - bits2 <= max_difference,
"{bits} (={micros}us) was converted to {bits2} (at {baud:?})"
);
}
}
}
}