use futures_util::StreamExt;
use socketcan::{CanErrorFrame, CanFrame, SocketOptions, id::ERR_MASK_ALL, tokio::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);
}
}
}
#[tokio::main]
async fn main() -> std::io::Result<()> {
let iface = env::args().nth(1).unwrap_or_else(|| "can0".into());
let mut sock = CanSocket::open(&iface).unwrap();
sock.set_error_mask(ERR_MASK_ALL).unwrap();
println!("Reading on {}", iface);
while let Some(res) = sock.next().await {
match res {
Ok(CanFrame::Data(frame)) => println!("{:?}", frame),
Ok(CanFrame::Remote(frame)) => println!("{:?}", frame),
Ok(CanFrame::Error(frame)) => print_error_frame(frame),
Err(err) => eprintln!("{}", err),
}
}
Ok(())
}