use can_socket::{CanFrame, CanId};
use can_socket::tokio::CanSocket;
#[derive(clap::Parser)]
struct Options {
#[clap(long, short)]
interface: String,
#[clap(long)]
id: CanId,
#[clap(long)]
data_length_code: Option<u8>,
#[clap(long, short)]
repeat: usize,
#[clap(num_args = 0..=8)]
data: Vec<u8>,
}
#[tokio::main]
async fn main() {
if let Err(()) = do_main(clap::Parser::parse()).await {
std::process::exit(1);
}
}
async fn do_main(options: Options) -> Result<(), ()> {
let frame = CanFrame::new(options.id, &options.data, options.data_length_code)
.map_err(|e| eprintln!("Invalid input: {e}"))?;
let socket = CanSocket::bind(&options.interface)
.map_err(|e| eprintln!("Failed to create CAN socket for interface {}: {e}", options.interface))?;
for i in 0.. {
if options.repeat != 0 && i == options.repeat {
break;
}
eprintln!("Sending frame {i}...");
socket.send(&frame)
.await
.map_err(|e| eprintln!("Failed to send frame on interface {}: {e}", options.interface))?;
eprintln!()
}
Ok(())
}