Add new comm mode

This commit is contained in:
Ashcon Mohseninia 2022-10-02 09:19:29 +01:00
parent 30f7b32267
commit 32f1bd9ac6
3 changed files with 40 additions and 11 deletions

View File

@ -87,11 +87,16 @@ impl Launcher {
impl Launcher {
pub fn open_device(&self, name: &str) -> HardwareResult<DynamicDevice> {
let mut tmp = name.to_string();
if tmp.contains(" API") {
tmp = tmp.split(" API").next().unwrap().to_string();
}
println!("Opening '{}'", tmp);
Ok(match self.curr_api_type {
DeviceType::Passthru => DynamicDevice::Passthru(self.pt_scanner.open_device_by_name(name)?),
DeviceType::Passthru => DynamicDevice::Passthru(self.pt_scanner.open_device_by_name(&tmp)?),
#[cfg(unix)]
DeviceType::SocketCan => DynamicDevice::SocketCAN(self.scan_scanner.open_device_by_name(name)?),
DeviceType::Usb => DynamicDevice::Usb(self.usb_scanner.open_device_by_name(name)?),
DeviceType::SocketCan => DynamicDevice::SocketCAN(self.scan_scanner.open_device_by_name(&tmp)?),
DeviceType::Usb => DynamicDevice::Usb(self.usb_scanner.open_device_by_name(&tmp)?),
})
}
@ -99,7 +104,13 @@ impl Launcher {
return scanner
.list_devices()
.iter()
.map(|x| (x.name.clone()))
.map(|x| {
let mut s = x.name.clone();
if let Some(api) = &x.api_version {
s.push_str(&format!(" API {}", api));
}
s
})
.collect();
}
}

View File

@ -43,13 +43,14 @@ pub struct Nag52USB {
is_running: Arc<AtomicBool>,
tx_id: u32,
rx_id: u32,
legacy_tx_mode: bool
}
unsafe impl Sync for Nag52USB {}
unsafe impl Send for Nag52USB {}
impl Nag52USB {
pub fn new(path: &str, info: PortInfo) -> HardwareResult<Self> {
pub fn new(path: &str, info: PortInfo, legacy_tx_mode: bool) -> HardwareResult<Self> {
let mut port = serial_rs::new_from_path(path, Some(SerialPortSettings::default()
.baud(921600)
.read_timeout(Some(100))
@ -136,6 +137,7 @@ impl Nag52USB {
rx_log: Some(read_rx_log),
tx_id: 0,
rx_id: 0,
legacy_tx_mode
})
}
@ -232,6 +234,7 @@ impl PayloadChannel for Nag52USB {
// Just write buffer
match self.port.as_mut() {
Some(p) => {
if self.legacy_tx_mode {
let mut buf = String::with_capacity(buffer.len()*2 + 6);
write!(buf, "#{:04X}", addr);
for x in buffer {
@ -239,6 +242,16 @@ impl PayloadChannel for Nag52USB {
}
write!(buf, "\n");
p.write_all(buf.as_bytes()).map_err(|e| ChannelError::IOError(e))?;
} else {
let mut to_write = Vec::with_capacity(buffer.len()+4);
let size: u16 = (buffer.len()+2) as u16;
to_write.push((size >> 8) as u8);
to_write.push((size & 0xFF) as u8);
to_write.push((addr >> 8) as u8);
to_write.push((addr & 0xFF) as u8);
to_write.extend_from_slice(&buffer);
p.write_all(&to_write)?;
}
Ok(())
}
None => Err(ChannelError::InterfaceNotOpen),

View File

@ -13,8 +13,7 @@ pub struct Nag52UsbScanner {
impl Nag52UsbScanner {
pub fn new() -> Self {
Self {
ports: match serial_rs::list_ports() {
let mut tmp = match serial_rs::list_ports() {
Ok(ports) => ports
.iter()
.map(|i| (HardwareInfo {
@ -36,8 +35,14 @@ impl Nag52UsbScanner {
}, i.clone()))
.collect::<Vec<(HardwareInfo, PortInfo)>>(),
Err(_) => Vec::new(),
},
}
};
let l: Vec<(HardwareInfo, PortInfo)> = tmp.clone().iter_mut().map(|mut x| {
x.0.api_version = Some("Legacy".into());
x.clone()
}).collect();
tmp.extend_from_slice(&l);
Self {ports: tmp}
}
}
@ -51,7 +56,7 @@ impl ecu_diagnostics::hardware::HardwareScanner<Nag52USB> for Nag52UsbScanner {
idx: usize,
) -> ecu_diagnostics::hardware::HardwareResult<std::sync::Arc<std::sync::Mutex<Nag52USB>>> {
match self.ports.get(idx) {
Some((p, port)) => Ok(Arc::new(Mutex::new(Nag52USB::new(&p.name, port.clone())?))),
Some((p, port)) => Ok(Arc::new(Mutex::new(Nag52USB::new(&p.name, port.clone(), false)?))),
None => Err(HardwareError::DeviceNotFound),
}
}
@ -61,7 +66,7 @@ impl ecu_diagnostics::hardware::HardwareScanner<Nag52USB> for Nag52UsbScanner {
name: &str,
) -> ecu_diagnostics::hardware::HardwareResult<std::sync::Arc<std::sync::Mutex<Nag52USB>>> {
match self.ports.iter().find(|(i, p)| i.name == name) {
Some((p, port)) => Ok(Arc::new(Mutex::new(Nag52USB::new(&p.name, port.clone())?))),
Some((p, port)) => Ok(Arc::new(Mutex::new(Nag52USB::new(&p.name, port.clone(), p.api_version.is_none())?))),
None => Err(HardwareError::DeviceNotFound),
}
}