use socketcan::{
CanErrorFrame, CanFrame, Error, Result, SocketOptions, id::ERR_MASK_ALL, smol::CanSocket,
};
use std::env;
fn print_error_frame(frame: CanErrorFrame) {
println!("{:?}", frame);
let errs = frame.into_error();
if errs.is_single() {
println!(" error: {}", errs.first());
} else {
println!(" {} errors:", errs.len());
for err in &errs {
println!(" - {}", err);
}
}
}
fn main() -> Result<()> {
smol::block_on(async {
let iface = env::args().nth(1).unwrap_or_else(|| "can0".into());
let sock = CanSocket::open(&iface)?;
sock.set_error_mask(ERR_MASK_ALL)?;
println!("Reading on {}", iface);
loop {
match sock.read_frame().await {
Ok(CanFrame::Data(frame)) => println!("{:?}", frame),
Ok(CanFrame::Remote(frame)) => println!("{:?}", frame),
Ok(CanFrame::Error(frame)) => print_error_frame(frame),
Err(err) => eprintln!("{}", err),
}
}
#[allow(unreachable_code)]
Ok::<(), Error>(())
})
}