use std::io::{BufReader, Read, Write};
use std::net::TcpStream;
use std::sync::mpsc;
use std::thread;
use byteorder::{NetworkEndian, ReadBytesExt, WriteBytesExt};
use socketcan::{CANFrame, CANSocket};
pub fn new_client_handler(
mut connection: TcpStream,
can_interface: String,
can_reader: mpsc::Receiver<CANFrame>,
) -> (thread::JoinHandle<()>, thread::JoinHandle<()>) {
let connection_clone = connection.try_clone().unwrap();
let tx_handle = thread::spawn(move || {
let ip = connection.peer_addr().unwrap();
loop {
let frame = can_reader.recv().unwrap();
if let Err(_) = write_frame(&mut connection, frame) {
println!("Connection to client {:?} dropped.", ip);
break;
}
}
});
let rx_handle = thread::spawn(move || {
let ip = connection_clone.peer_addr().unwrap();
let mut connection = BufReader::new(connection_clone);
let can_socket = CANSocket::open(&can_interface).unwrap();
loop {
let id;
if let Ok(inner) = connection.read_u32::<NetworkEndian>() {
id = inner;
} else {
println!("Connection to client {:?} dropped.", ip);
break;
}
let mut data = [0 as u8; 8];
if let Err(_) = connection.read_exact(&mut data) {
println!("Connection to client {:?} dropped.", ip);
break;
}
let frame = CANFrame::new(id, &data, false, false).unwrap();
can_socket.write_frame_insist(&frame).unwrap();
}
});
(tx_handle, rx_handle)
}
fn write_frame(connection: &mut TcpStream, frame: CANFrame) -> Result<(), std::io::Error> {
connection.write_u32::<NetworkEndian>(frame.id())?;
connection.write(&frame.data())?;
connection.flush().unwrap();
Ok(())
}