use std::time::{Duration, Instant};
use gs_usb::{
GsUsb, GsUsbError, GsUsbFrame, CAN_EFF_FLAG, CAN_ERR_FLAG, CAN_RTR_FLAG,
GS_CAN_MODE_HW_TIMESTAMP, GS_CAN_MODE_NORMAL,
};
fn main() {
env_logger::init();
if let Err(e) = run() {
eprintln!("Error: {}", e);
std::process::exit(1);
}
}
fn run() -> gs_usb::Result<()> {
let devices = GsUsb::scan()?;
if devices.is_empty() {
println!("Can not find gs_usb device");
return Ok(());
}
let mut dev = devices.into_iter().next().unwrap();
println!("Found device: {}", dev);
dev.set_bitrate(250000)?;
println!("Bitrate set to 250 kbps");
dev.start(GS_CAN_MODE_NORMAL | GS_CAN_MODE_HW_TIMESTAMP)?;
println!("Device started");
let data: [u8; 8] = [0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0];
let frames = [
GsUsbFrame::with_data(0x7FF, &data),
GsUsbFrame::with_data(0x7FF, &[]),
GsUsbFrame::with_data(0x7FF | CAN_ERR_FLAG, &data),
GsUsbFrame::with_data(0x12345678 | CAN_EFF_FLAG, &data),
GsUsbFrame::with_data(0x12345678 | CAN_EFF_FLAG, &[]),
GsUsbFrame::with_data(0x7FF | CAN_RTR_FLAG, &[]),
GsUsbFrame::with_data(0x12345678 | CAN_RTR_FLAG | CAN_EFF_FLAG, &[]),
GsUsbFrame::with_data(0x7FF | CAN_RTR_FLAG, &data),
];
println!("\nStarting CAN communication (press Ctrl+C to stop)...\n");
let mut next_send_time = Instant::now();
let mut frame_index = 0;
loop {
match dev.read(Duration::from_millis(1)) {
Ok(frame) => {
println!("RX {}", frame);
}
Err(GsUsbError::ReadTimeout) => {
}
Err(e) => {
eprintln!("Read error: {}", e);
break;
}
}
if Instant::now() >= next_send_time {
next_send_time = Instant::now() + Duration::from_secs(1);
let frame = &frames[frame_index];
frame_index = (frame_index + 1) % frames.len();
match dev.send(frame) {
Ok(()) => {
println!("TX {}", frame);
}
Err(e) => {
eprintln!("Send error: {}", e);
}
}
}
}
Ok(())
}