extern crate futures; extern crate mio; extern crate socketcan; extern crate tokio; #[macro_use] extern crate log; extern crate env_logger; mod canstream; mod isotp; use tokio::prelude::*; fn main() { env_logger::init(); let (sink, stream) = canstream::CANStream::from_name("vcan0").unwrap().split(); let mut waiter = sink.wait(); let mut mytp = isotp::ISOTP::new(); tokio::run( stream .map_err(|e| error!("error = {:?}", e)) .for_each(move |frame| { info!("Received CAN frame: {:X}", frame); match mytp.handle_frame(&frame) { None => {} Some((id, data)) => { info!("Received from {:03x} data {:?}", id, data); mytp.send_packet(0x123, &data); } } while let Some(packet) = mytp.get_txqueue() { info!(" Sending CAN frame: {:X}", packet); waiter.send(packet).map_err(|_| ())?; waiter.flush().map_err(|_| ())?; } Ok(()) }), ); }