socketcan-alt 0.2.1

Rust binding for SocketCAN
Documentation
use socketcan_alt::*;
use std::ffi::CString;
use std::io::Result;
use std::sync::Arc;
use std::thread;
use std::time::Duration;
use structopt::StructOpt;

#[derive(StructOpt)]
struct Opt {
    ifname: String,
}

fn main() -> Result<()> {
    let opt = Opt::from_args();

    let socket = Arc::new(Socket::bind(CString::new(opt.ifname)?)?);
    socket.set_recv_own_msgs(true)?;
    socket.set_fd_frames(true)?;

    {
        let socket = socket.clone();
        thread::spawn(move || -> Result<()> {
            loop {
                println!("{:?}", socket.recv()?)
            }
        });
    }

    let mut count = 0_u64;
    loop {
        let id = if count % 3 == 0 {
            Id::Extended(42)
        } else {
            Id::Standard(42)
        };
        let frame = if count % 5 == 0 {
            Frame::FdData(FdDataFrame::new(id, false, false, &count.to_be_bytes()))
        } else {
            Frame::Data(DataFrame::new(id, &count.to_be_bytes()))
        };
        socket.send(&frame)?;
        count += 1;
        thread::sleep(Duration::new(1, 0));
    }
}