use core::time::Duration;
use arbitrary_int::{i24, u24};
use crate::messages::CanMessage;
pub trait ReadSize {
const READ_SIZE: usize;
}
macro_rules! impl_read_size_builtin {
($($rust_type:ty),+ $(,)?) => {
$(
impl ReadSize for $rust_type {
const READ_SIZE: usize = core::mem::size_of::<$rust_type>();
}
)+
};
}
impl_read_size_builtin!(bool, u8, u16, u32, u64, i8, i16, i32, i64, f32, f64);
macro_rules! impl_read_size_arbitrary {
($($rust_type:ty),+ $(,)?) => {
$(
impl ReadSize for $rust_type {
const READ_SIZE: usize = <$rust_type>::BITS.div_ceil(8);
}
)+
};
}
impl_read_size_arbitrary!(u24, i24);
pub trait LoadStore<T> {
fn load(&self) -> T;
fn store(&self, value: T);
}
pub trait CanSender {
fn send(&mut self, msg: CanMessage) -> Result<(), CanMessage>;
}
pub trait CanReceiver {
type Error;
fn try_recv(&mut self) -> Option<CanMessage>;
fn recv(&mut self, timeout: Duration) -> Result<CanMessage, Self::Error>;
}
pub trait AsyncCanSender: Send {
type Error: CanSendError;
fn send(
&mut self,
msg: CanMessage,
) -> impl core::future::Future<Output = Result<(), Self::Error>>;
}
pub trait CanSendError: core::fmt::Debug {
fn into_can_message(self) -> CanMessage;
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
fn message(&self) -> String;
}
pub trait AsyncCanReceiver: Send {
type Error: core::fmt::Debug + Send;
fn try_recv(&mut self) -> Option<CanMessage>;
fn recv(
&mut self,
) -> impl core::future::Future<Output = Result<CanMessage, Self::Error>> + Send;
fn flush(&mut self) {
while self.try_recv().is_some() {}
}
}