From 004aca4cfc3110b3681c4c80d4dfcdae5d01e4f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Tue, 28 Sep 2021 10:30:24 -0300 Subject: [PATCH 1/4] Cargo: Move from serial to serialport library MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1b3fe8593b..2045294332 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,7 +28,7 @@ bytes = { version = "1.0", default-features = false } num-traits = { version = "0.2", default-features = false } num-derive = "0.3.2" bitflags = "1.2.1" -serial = { version = "0.4", optional = true } +serialport = { version = "4.0", optional = true } serde = { version = "1.0.115", optional = true } byteorder = { version = "1.3.4", default-features = false } embedded-hal = { version = "0.2", optional = true } @@ -74,7 +74,7 @@ nb = { version = "0.1", optional = true } "tcp" = [] "direct-serial" = [] "embedded" = ["embedded-hal", "nb"] -default= ["std", "tcp", "udp", "direct-serial", "serial", "serde", "common"] +default= ["std", "tcp", "udp", "direct-serial", "serialport", "serde", "common"] # build with all features on docs.rs so that users viewing documentation # can see everything From 2ec1dac0093b7e4b9f3fedfc3a62480b51066929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Tue, 28 Sep 2021 10:30:37 -0300 Subject: [PATCH 2/4] Cargo: Update byteorder version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 2045294332..a5d6b48c4b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ num-derive = "0.3.2" bitflags = "1.2.1" serialport = { version = "4.0", optional = true } serde = { version = "1.0.115", optional = true } -byteorder = { version = "1.3.4", default-features = false } +byteorder = { version = "1.4.3", default-features = false } embedded-hal = { version = "0.2", optional = true } nb = { version = "0.1", optional = true } From 4605444a52ab26833dcaff280058c15f1880c175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Tue, 28 Sep 2021 10:31:28 -0300 Subject: [PATCH 3/4] connection: Update direct_serial to use new serialport library MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/connection/direct_serial.rs | 44 ++++++++++++++------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/src/connection/direct_serial.rs b/src/connection/direct_serial.rs index ab20df006d..dae28cfb7f 100644 --- a/src/connection/direct_serial.rs +++ b/src/connection/direct_serial.rs @@ -1,14 +1,12 @@ -extern crate serial; - use crate::connection::MavConnection; use crate::{read_versioned_msg, write_versioned_msg, MavHeader, MavlinkVersion, Message}; -use std::io::{self}; +use std::io; use std::sync::Mutex; -//TODO why is this import so hairy? -use crate::connection::direct_serial::serial::prelude::*; use crate::error::{MessageReadError, MessageWriteError}; +use serialport::{self, SerialPort}; + /// Serial MAVLINK connection pub fn open(settings: &str) -> io::Result { @@ -20,7 +18,7 @@ pub fn open(settings: &str) -> io::Result { )); } - let baud_opt = settings_toks[1].parse::(); + let baud_opt = settings_toks[1].parse::(); if baud_opt.is_err() { return Err(io::Error::new( io::ErrorKind::AddrNotAvailable, @@ -28,39 +26,35 @@ pub fn open(settings: &str) -> io::Result { )); } - let baud = serial::core::BaudRate::from_speed(baud_opt.unwrap()); - - let settings = serial::core::PortSettings { - baud_rate: baud, - char_size: serial::Bits8, - parity: serial::ParityNone, - stop_bits: serial::Stop1, - flow_control: serial::FlowNone, - }; - let port_name = settings_toks[0]; - let mut port = serial::open(port_name)?; - port.configure(&settings)?; + let builder = serialport::new(port_name, baud_opt.unwrap()) + .data_bits(serialport::DataBits::Eight) + .parity(serialport::Parity::None) + .stop_bits(serialport::StopBits::One) + .flow_control(serialport::FlowControl::None); + let reader = builder.open()?; + let writer = reader.try_clone()?; Ok(SerialConnection { - port: Mutex::new(port), + reader: Mutex::new(reader), + writer: Mutex::new(writer), sequence: Mutex::new(0), protocol_version: MavlinkVersion::V2, }) } pub struct SerialConnection { - port: Mutex, + reader: Mutex>, + writer: Mutex>, sequence: Mutex, protocol_version: MavlinkVersion, } impl MavConnection for SerialConnection { fn recv(&self) -> Result<(MavHeader, M), MessageReadError> { - let mut port = self.port.lock().unwrap(); - + let mut reader = self.reader.lock().unwrap(); loop { - match read_versioned_msg(&mut *port, self.protocol_version) { + match read_versioned_msg(&mut *reader, self.protocol_version) { ok @ Ok(..) => { return ok; } @@ -75,8 +69,8 @@ impl MavConnection for SerialConnection { } fn send(&self, header: &MavHeader, data: &M) -> Result { - let mut port = self.port.lock().unwrap(); let mut sequence = self.sequence.lock().unwrap(); + let mut writer = self.writer.lock().unwrap(); let header = MavHeader { sequence: *sequence, @@ -86,7 +80,7 @@ impl MavConnection for SerialConnection { *sequence = sequence.wrapping_add(1); - write_versioned_msg(&mut *port, self.protocol_version, header, data) + write_versioned_msg(&mut *writer, self.protocol_version, header, data) } fn set_protocol_version(&mut self, version: MavlinkVersion) { From 0c751904f075da3c925908e8ecfdb499692831a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Tue, 28 Sep 2021 10:31:47 -0300 Subject: [PATCH 4/4] lib: Write with single call and flush to the target MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/lib.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 55e6095662..f1a5cff4e8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -399,9 +399,8 @@ pub fn write_v2_msg( let len = payload.len() + header.len() + crc_bytes.len(); - w.write_all(header)?; - w.write_all(&payload[..])?; - w.write_all(&crc_bytes)?; + w.write_all(&[header, &payload[..], &crc_bytes].concat())?; + w.flush()?; Ok(len) }