extern crate candid_server;
use candid_server::{can_reader::CANReader, client_handler::new_client_handler};
use std::net::TcpListener;
use std::sync::mpsc;
use socketcan::CANSocket;
use clap::{App, Arg};
fn main() {
let matches = App::new("CANdid Server")
.version("0.1.0")
.author("Alex van de Sandt <avandesa@purdue.edu>")
.about("A server to read, parse, and relay messages from a CAN bus.")
.arg(
Arg::with_name("addr")
.value_name("ADDRESS")
.help("The address:port to bind to")
.takes_value(true)
.required(true),
)
.arg(
Arg::with_name("bus")
.value_name("INTERFACE")
.help("The CAN interface to listen to")
.takes_value(true)
.required(true),
)
.get_matches();
let addr = matches.value_of("addr").unwrap();
let can_interface = matches.value_of("bus").unwrap();
let can_socket = CANSocket::open(can_interface).expect("Could not open CAN socket");
let (can_reader, _) = CANReader::new(can_socket);
let listener = TcpListener::bind(addr).expect("Could not bind to address.");
let mut clients = Vec::new();
loop {
if let Ok((socket, addr)) = listener.accept() {
println!("New Client: {:?}", addr);
let (tx, rx) = mpsc::channel();
can_reader.add_client(tx);
clients.push(new_client_handler(
socket,
can_interface.clone().to_string(),
rx,
));
}
}
}