From e3e50b95e57a70d54c88aace35d90fa26845fa03 Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Fri, 8 Dec 2023 17:51:13 -0800 Subject: [PATCH] simplify packet reading a bit --- src/diag_device.rs | 39 +++++++++++++++++++++------------------ src/main.rs | 6 +++++- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/diag_device.rs b/src/diag_device.rs index b57ed46..591f947 100644 --- a/src/diag_device.rs +++ b/src/diag_device.rs @@ -68,24 +68,22 @@ const MEMORY_DEVICE_MODE: i32 = 2; const DIAG_IOCTL_REMOTE_DEV: u32 = 32; const DIAG_IOCTL_SWITCH_LOGGING: u32 = 7; -pub struct DiagDevice { - file: File, +pub struct DiagDevice<'a> { + file: &'a File, + accumulator: Vec, use_mdm: i32, crc: Crc, } -impl DiagDevice { - pub fn new() -> DiagResult { - let file = File::options() - .read(true) - .write(true) - .open("/dev/diag")?; +impl<'a> DiagDevice<'a> { + pub fn new(file: &'a File) -> DiagResult { let fd = file.as_raw_fd(); enable_frame_readwrite(fd, MEMORY_DEVICE_MODE)?; let use_mdm = determine_use_mdm(fd)?; Ok(DiagDevice { + accumulator: vec![], file, crc: Crc::::new(&CRC_CCITT_ALG), use_mdm, @@ -117,18 +115,23 @@ impl DiagDevice { Ok(result) } - pub fn read_response(&mut self) -> DiagResult> { - let mut packet_buf = vec![0; BUFFER_LEN]; + fn next_packet(&mut self) -> DiagResult> { + let mut read_buf = vec![0; BUFFER_LEN]; + while !self.accumulator.contains(&0x7e) { + let bytes_read = self.file.read(&mut read_buf).unwrap(); + self.accumulator.extend(&read_buf[0..bytes_read]); + // clear out the buffer so we don't accidentally read stale data + read_buf.clear(); + read_buf.resize(BUFFER_LEN, 0); + } + let idx = self.accumulator.iter().position(|&x| x == 0x7e).unwrap(); + Ok(self.accumulator.drain(0..idx + 1).collect::>()) + } + + pub fn read_response(&mut self) -> DiagResult> { loop { - let mut packet = vec![]; - while !packet.ends_with(&[0x7e]) { - let bytes_read = self.file.read(&mut packet_buf)?; - packet.extend(&packet_buf[0..bytes_read]); - // clear out the buffer so we don't accidentally read stale data - packet_buf.clear(); - packet_buf.resize(BUFFER_LEN, 0); - } + let packet = self.next_packet()?; let ((leftover_bytes, _), res_container) = MessagesContainer::from_bytes((&packet, 0))?; if leftover_bytes.len() > 0 { println!("warning: {} leftover bytes when parsing ResponseContainer", leftover_bytes.len()); diff --git a/src/main.rs b/src/main.rs index b7da4fc..1d56fa4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,11 @@ fn main() -> diag_device::DiagResult<()> { // this should eventually be removed for prod env_logger::init(); - let mut dev = DiagDevice::new()?; + let file = std::fs::File::options() + .read(true) + .write(true) + .open("/dev/diag")?; + let mut dev = DiagDevice::new(&file)?; dev.config_logs()?; loop {